From 4aefb809894c3ff7f98eb572b458df2edb6c9d40 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:25:05 +0200 Subject: [PATCH 01/61] feat: restrict app access for unverified users --- .../unverified-account/page.tsx | 80 +++++++++++++++++++ apps/web/src/components/forms/signin.tsx | 17 ++++ apps/web/src/components/forms/signup.tsx | 14 ++-- packages/lib/next-auth/auth-options.ts | 12 +++ packages/lib/next-auth/error-codes.ts | 1 + .../lib/server-only/user/get-user-by-email.ts | 3 + .../user/get-user-by-verification-token.ts | 17 ++++ packages/trpc/server/profile-router/router.ts | 34 ++++++++ packages/trpc/server/profile-router/schema.ts | 8 ++ 9 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 apps/web/src/app/(unauthenticated)/unverified-account/page.tsx create mode 100644 packages/lib/server-only/user/get-user-by-verification-token.ts diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx new file mode 100644 index 000000000..7a0a9c78d --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -0,0 +1,80 @@ +'use client'; + +import { useState } from 'react'; + +import { useSearchParams } from 'next/navigation'; + +import { Mails } from 'lucide-react'; + +import { ONE_SECOND } from '@documenso/lib/constants/time'; +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +const RESEND_CONFIRMATION_EMAIL_TIMEOUT = 20 * ONE_SECOND; + +export default function UnverifiedAccount() { + const [isButtonDisabled, setIsButtonDisabled] = useState(false); + const searchParams = useSearchParams(); + const { toast } = useToast(); + + const token = searchParams?.get('t') ?? ''; + + const { data: { email } = {} } = trpc.profile.getUserFromVerificationToken.useQuery({ token }); + + const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); + + const onResendConfirmationEmail = async () => { + if (!email) { + toast({ + title: 'Unable to send confirmation email', + description: 'Something went wrong while sending the confirmation email. Please try again.', + variant: 'destructive', + }); + + return; + } + + try { + setIsButtonDisabled(true); + + await sendConfirmationEmail({ email: email }); + + toast({ + title: 'Success', + description: 'Verification email sent successfully.', + duration: 5000, + }); + + setTimeout(() => setIsButtonDisabled(false), RESEND_CONFIRMATION_EMAIL_TIMEOUT); + } catch (err) { + setIsButtonDisabled(false); + + toast({ + title: 'Error', + description: 'Something went wrong while sending the confirmation email.', + variant: 'destructive', + }); + } + }; + + return ( +
+
+ +
+
+

Confirm email

+ +

+ To gain full access to your account and unlock all its features, please confirm your email + address by clicking on the link sent to your email address. +

+ + +
+
+ ); +} diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index 4e671a569..2924080b0 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -2,6 +2,8 @@ import { useState } from 'react'; +import { useRouter } from 'next/navigation'; + import { zodResolver } from '@hookform/resolvers/zod'; import { signIn } from 'next-auth/react'; import { useForm } from 'react-hook-form'; @@ -9,6 +11,7 @@ import { FcGoogle } from 'react-icons/fc'; import { z } from 'zod'; import { ErrorCode, isErrorCode } from '@documenso/lib/next-auth/error-codes'; +import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@documenso/ui/primitives/dialog'; @@ -31,6 +34,8 @@ const ERROR_MESSAGES: Partial> = { 'This account appears to be using a social login method, please sign in using that method', [ErrorCode.INCORRECT_TWO_FACTOR_CODE]: 'The two-factor authentication code provided is incorrect', [ErrorCode.INCORRECT_TWO_FACTOR_BACKUP_CODE]: 'The backup code provided is incorrect', + [ErrorCode.UNVERIFIED_EMAIL]: + 'This account has not been verified. Please verify your account before signing in.', }; const TwoFactorEnabledErrorCode = ErrorCode.TWO_FACTOR_MISSING_CREDENTIALS; @@ -54,6 +59,7 @@ export const SignInForm = ({ className }: SignInFormProps) => { const { toast } = useToast(); const [isTwoFactorAuthenticationDialogOpen, setIsTwoFactorAuthenticationDialogOpen] = useState(false); + const router = useRouter(); const [twoFactorAuthenticationMethod, setTwoFactorAuthenticationMethod] = useState< 'totp' | 'backup' @@ -69,6 +75,8 @@ export const SignInForm = ({ className }: SignInFormProps) => { resolver: zodResolver(ZSignInFormSchema), }); + const { mutateAsync: getUser } = trpc.profile.getUserByEmail.useMutation(); + const isSubmitting = form.formState.isSubmitting; const onCloseTwoFactorAuthenticationDialog = () => { @@ -122,6 +130,15 @@ export const SignInForm = ({ className }: SignInFormProps) => { const errorMessage = ERROR_MESSAGES[result.error]; + if (result.error === ErrorCode.UNVERIFIED_EMAIL) { + const user = await getUser({ email }); + const token = user?.VerificationToken[user.VerificationToken.length - 1].token; + + router.push(`/unverified-account?t=${token}`); + + return; + } + toast({ variant: 'destructive', title: 'Unable to sign in', diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index b91b4a9fd..526836ca7 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -1,7 +1,8 @@ 'use client'; +import { useRouter } from 'next/navigation'; + import { zodResolver } from '@hookform/resolvers/zod'; -import { signIn } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; @@ -42,6 +43,7 @@ export type SignUpFormProps = { export const SignUpForm = ({ className }: SignUpFormProps) => { const { toast } = useToast(); const analytics = useAnalytics(); + const router = useRouter(); const form = useForm({ values: { @@ -61,10 +63,12 @@ export const SignUpForm = ({ className }: SignUpFormProps) => { try { await signup({ name, email, password, signature }); - await signIn('credentials', { - email, - password, - callbackUrl: '/', + router.push('/signin'); + + toast({ + title: 'Registration Successful', + description: 'You have successfully registered. Please sign in to continue.', + duration: 5000, }); analytics.capture('App: User Sign Up', { diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 3b9492807..4c529d113 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -10,6 +10,7 @@ import GoogleProvider from 'next-auth/providers/google'; import { prisma } from '@documenso/prisma'; +import { ONE_DAY } from '../constants/time'; import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; @@ -69,6 +70,17 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } } + const userCreationDate = user?.createdAt; + const createdWithinLast72Hours = userCreationDate > new Date(Date.now() - ONE_DAY * 3); + + /* + avoid messing with the users who signed up before the email verification requirement + the error is thrown only if the user doesn't have a verified email and the account was created within the last 72 hours + */ + if (!user.emailVerified && createdWithinLast72Hours) { + throw new Error(ErrorCode.UNVERIFIED_EMAIL); + } + return { id: Number(user.id), email: user.email, diff --git a/packages/lib/next-auth/error-codes.ts b/packages/lib/next-auth/error-codes.ts index c3dfafece..6e1b7488b 100644 --- a/packages/lib/next-auth/error-codes.ts +++ b/packages/lib/next-auth/error-codes.ts @@ -19,4 +19,5 @@ export const ErrorCode = { INCORRECT_PASSWORD: 'INCORRECT_PASSWORD', MISSING_ENCRYPTION_KEY: 'MISSING_ENCRYPTION_KEY', MISSING_BACKUP_CODE: 'MISSING_BACKUP_CODE', + UNVERIFIED_EMAIL: 'UNVERIFIED_EMAIL', } as const; diff --git a/packages/lib/server-only/user/get-user-by-email.ts b/packages/lib/server-only/user/get-user-by-email.ts index 0a2ef8d16..8c61202a2 100644 --- a/packages/lib/server-only/user/get-user-by-email.ts +++ b/packages/lib/server-only/user/get-user-by-email.ts @@ -9,5 +9,8 @@ export const getUserByEmail = async ({ email }: GetUserByEmailOptions) => { where: { email: email.toLowerCase(), }, + include: { + VerificationToken: true, + }, }); }; diff --git a/packages/lib/server-only/user/get-user-by-verification-token.ts b/packages/lib/server-only/user/get-user-by-verification-token.ts new file mode 100644 index 000000000..b33506d6e --- /dev/null +++ b/packages/lib/server-only/user/get-user-by-verification-token.ts @@ -0,0 +1,17 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetUserByVerificationTokenOptions { + token: string; +} + +export const getUserByVerificationToken = async ({ token }: GetUserByVerificationTokenOptions) => { + return await prisma.user.findFirstOrThrow({ + where: { + VerificationToken: { + some: { + token, + }, + }, + }, + }); +}; diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 4dcf4ca93..79c67ed0c 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -1,7 +1,9 @@ import { TRPCError } from '@trpc/server'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; +import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; +import { getUserByVerificationToken } from '@documenso/lib/server-only/user/get-user-by-verification-token'; import { resetPassword } from '@documenso/lib/server-only/user/reset-password'; import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; import { updatePassword } from '@documenso/lib/server-only/user/update-password'; @@ -12,7 +14,9 @@ import { ZConfirmEmailMutationSchema, ZForgotPasswordFormSchema, ZResetPasswordFormSchema, + ZRetrieveUserByEmailMutationSchema, ZRetrieveUserByIdQuerySchema, + ZRetrieveUserByVerificationTokenQuerySchema, ZUpdatePasswordMutationSchema, ZUpdateProfileMutationSchema, } from './schema'; @@ -31,6 +35,36 @@ export const profileRouter = router({ } }), + getUserByEmail: procedure + .input(ZRetrieveUserByEmailMutationSchema) + .mutation(async ({ input }) => { + try { + const { email } = input; + + return await getUserByEmail({ email }); + } catch (err) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to retrieve the specified account. Please try again.', + }); + } + }), + + getUserFromVerificationToken: procedure + .input(ZRetrieveUserByVerificationTokenQuerySchema) + .query(async ({ input }) => { + try { + const { token } = input; + + return await getUserByVerificationToken({ token }); + } catch (err) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to retrieve the specified account. Please try again.', + }); + } + }), + updateProfile: authenticatedProcedure .input(ZUpdateProfileMutationSchema) .mutation(async ({ input, ctx }) => { diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index ef9ca2a14..671756e94 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -4,6 +4,14 @@ export const ZRetrieveUserByIdQuerySchema = z.object({ id: z.number().min(1), }); +export const ZRetrieveUserByEmailMutationSchema = z.object({ + email: z.string().email().min(1), +}); + +export const ZRetrieveUserByVerificationTokenQuerySchema = z.object({ + token: z.string().min(1), +}); + export const ZUpdateProfileMutationSchema = z.object({ name: z.string().min(1), signature: z.string(), From e5c2263e9276ce08eabcab3d12e4d5dfd35ba19b Mon Sep 17 00:00:00 2001 From: Sumit Bisht Date: Tue, 23 Jan 2024 18:37:02 +0530 Subject: [PATCH 02/61] fix: imporoved document-dropzone ui for small vertical screens --- apps/web/src/app/(dashboard)/documents/upload-document.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/web/src/app/(dashboard)/documents/upload-document.tsx b/apps/web/src/app/(dashboard)/documents/upload-document.tsx index 65b95f9ec..71926dafc 100644 --- a/apps/web/src/app/(dashboard)/documents/upload-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/upload-document.tsx @@ -96,10 +96,12 @@ export const UploadDocument = ({ className }: UploadDocumentProps) => { } }; + const isSmallVerticalScreen = typeof window !== 'undefined' && window.innerHeight < 800; + return (
Date: Thu, 25 Jan 2024 13:21:55 +0530 Subject: [PATCH 03/61] fixed undo operation on signature pad --- packages/ui/primitives/signature-pad/signature-pad.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index 80bac0e18..e6f844b52 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -26,7 +26,7 @@ export const SignaturePad = ({ ...props }: SignaturePadProps) => { const $el = useRef(null); - + const defaultImageRef = useRef(null); const [isPressed, setIsPressed] = useState(false); const [lines, setLines] = useState([]); const [currentLine, setCurrentLine] = useState([]); @@ -161,6 +161,7 @@ export const SignaturePad = ({ const ctx = $el.current.getContext('2d'); ctx?.clearRect(0, 0, $el.current.width, $el.current.height); + defaultImageRef.current = null; } onChange?.(null); @@ -181,8 +182,11 @@ export const SignaturePad = ({ // Clear the canvas if ($el.current) { const ctx = $el.current.getContext('2d'); + const { width, height } = $el.current; ctx?.clearRect(0, 0, $el.current.width, $el.current.height); - + if (typeof defaultValue === 'string' && defaultImageRef.current) { + ctx?.putImageData(defaultImageRef.current, 0, 0); + } newLines.forEach((line) => { const pathData = new Path2D(getSvgPathFromStroke(getStroke(line, perfectFreehandOptions))); ctx?.fill(pathData); @@ -207,6 +211,8 @@ export const SignaturePad = ({ img.onload = () => { ctx?.drawImage(img, 0, 0, Math.min(width, img.width), Math.min(height, img.height)); + const defaultImageData = ctx?.getImageData(0, 0, width, height) || null; + defaultImageRef.current = defaultImageData; }; img.src = defaultValue; From d451a7accecc19bfdf1be559e4c5af79c3e14002 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Thu, 25 Jan 2024 10:48:20 +0200 Subject: [PATCH 04/61] feat: add next-runtime-env --- .../(dashboard)/documents/[id]/edit-document.tsx | 2 +- .../billing/create-billing-portal.action.ts | 6 +++++- .../settings/billing/create-checkout.action.ts | 8 ++++++-- .../app/(share)/share/[slug]/opengraph/route.tsx | 5 ++++- apps/web/src/app/(share)/share/[slug]/page.tsx | 8 ++++++-- .../src/app/(unauthenticated)/signin/page.tsx | 6 +++++- .../src/app/(unauthenticated)/signup/page.tsx | 6 +++++- apps/web/src/app/layout.tsx | 9 +++++++-- .../(dashboard)/avatar/avatar-with-recipient.tsx | 6 +++++- apps/web/src/helpers/get-asset-buffer.ts | 6 +++++- package-lock.json | 16 ++++++++++++++++ package.json | 4 +++- packages/ee/server-only/limits/client.ts | 5 +++-- .../template-document-self-signed.tsx | 6 +++++- .../template-reset-password.tsx | 6 +++++- packages/lib/constants/app.ts | 14 +++++++++----- packages/lib/constants/feature-flags.ts | 9 +++++++-- packages/lib/next-auth/auth-options.ts | 5 ++++- .../server-only/auth/send-confirmation-email.ts | 12 +++++++++--- .../lib/server-only/auth/send-forgot-password.ts | 8 ++++++-- .../lib/server-only/auth/send-reset-password.ts | 6 +++++- .../lib/server-only/document/delete-document.ts | 6 +++++- .../lib/server-only/document/resend-document.tsx | 8 ++++++-- .../server-only/document/send-completed-email.ts | 8 ++++++-- .../lib/server-only/document/send-document.tsx | 8 ++++++-- .../server-only/document/send-pending-email.ts | 6 +++++- packages/lib/server-only/feature-flags/all.ts | 8 ++++++-- packages/lib/server-only/feature-flags/get.ts | 11 ++++++++--- packages/lib/universal/get-base-url.ts | 8 ++++++-- packages/lib/universal/upload/put-file.ts | 5 ++++- packages/lib/universal/upload/server-actions.ts | 5 ++++- packages/trpc/server/auth-router/router.ts | 5 ++++- .../trpc/server/singleplayer-router/router.ts | 5 ++++- .../document/document-share-button.tsx | 12 +++++++----- 34 files changed, 192 insertions(+), 56 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 2159b87f2..832e255fd 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -61,7 +61,7 @@ export const EditDocumentForm = ({ const { mutateAsync: setPasswordForDocument } = trpc.document.setPasswordForDocument.useMutation(); - const documentFlow: Record = { + const documentFlow: Record = { title: { title: 'Add Title', description: 'Add the title to the document.', diff --git a/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts b/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts index 885414515..7d952d599 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts +++ b/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts @@ -1,16 +1,20 @@ 'use server'; +import { env } from 'next-runtime-env'; + import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; export const createBillingPortal = async () => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const { user } = await getRequiredServerComponentSession(); const { stripeCustomer } = await getStripeCustomerByUser(user); return getPortalSession({ customerId: stripeCustomer.id, - returnUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, }); }; diff --git a/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts b/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts index f8f20030c..ef3fb0f30 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts +++ b/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts @@ -1,5 +1,7 @@ 'use server'; +import { env } from 'next-runtime-env'; + import { getCheckoutSession } from '@documenso/ee/server-only/stripe/get-checkout-session'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session'; @@ -11,6 +13,8 @@ export type CreateCheckoutOptions = { }; export const createCheckout = async ({ priceId }: CreateCheckoutOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const session = await getRequiredServerComponentSession(); const { user, stripeCustomer } = await getStripeCustomerByUser(session.user); @@ -27,13 +31,13 @@ export const createCheckout = async ({ priceId }: CreateCheckoutOptions) => { if (foundSubscription) { return getPortalSession({ customerId: stripeCustomer.id, - returnUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, }); } return getCheckoutSession({ customerId: stripeCustomer.id, priceId, - returnUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, }); }; diff --git a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx index d8f0ecac8..e9977b8f3 100644 --- a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx +++ b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx @@ -1,6 +1,7 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; +import { env } from 'next-runtime-env'; import { P, match } from 'ts-pattern'; import type { ShareHandlerAPIResponse } from '~/pages/api/share'; @@ -22,6 +23,8 @@ type SharePageOpenGraphImageProps = { }; export async function GET(_request: Request, { params: { slug } }: SharePageOpenGraphImageProps) { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const [interSemiBold, interRegular, caveatRegular, shareFrameImage] = await Promise.all([ fetch(new URL('@documenso/assets/fonts/inter-semibold.ttf', import.meta.url)).then( async (res) => res.arrayBuffer(), @@ -37,7 +40,7 @@ export async function GET(_request: Request, { params: { slug } }: SharePageOpen ), ]); - const baseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const baseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const recipientOrSender: ShareHandlerAPIResponse = await fetch( new URL(`/api/share?slug=${slug}`, baseUrl), diff --git a/apps/web/src/app/(share)/share/[slug]/page.tsx b/apps/web/src/app/(share)/share/[slug]/page.tsx index 8e8fd7769..ab530ba0b 100644 --- a/apps/web/src/app/(share)/share/[slug]/page.tsx +++ b/apps/web/src/app/(share)/share/[slug]/page.tsx @@ -1,7 +1,9 @@ -import { Metadata } from 'next'; +import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; +import { env } from 'next-runtime-env'; + import { APP_BASE_URL } from '@documenso/lib/constants/app'; type SharePageProps = { @@ -28,6 +30,8 @@ export function generateMetadata({ params: { slug } }: SharePageProps) { } export default function SharePage() { + const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); + const userAgent = headers().get('User-Agent') ?? ''; // https://stackoverflow.com/questions/47026171/how-to-detect-bots-for-open-graph-with-user-agent @@ -35,5 +39,5 @@ export default function SharePage() { return null; } - redirect(process.env.NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001'); + redirect(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001'); } diff --git a/apps/web/src/app/(unauthenticated)/signin/page.tsx b/apps/web/src/app/(unauthenticated)/signin/page.tsx index 5fda07e70..bbea70ecb 100644 --- a/apps/web/src/app/(unauthenticated)/signin/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signin/page.tsx @@ -1,10 +1,14 @@ import Link from 'next/link'; +import { env } from 'next-runtime-env'; + import { IS_GOOGLE_SSO_ENABLED } from '@documenso/lib/constants/auth'; import { SignInForm } from '~/components/forms/signin'; export default function SignInPage() { + const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); + return (

Sign in to your account

@@ -15,7 +19,7 @@ export default function SignInPage() { - {process.env.NEXT_PUBLIC_DISABLE_SIGNUP !== 'true' && ( + {NEXT_PUBLIC_DISABLE_SIGNUP !== 'true' && (

Don't have an account?{' '} diff --git a/apps/web/src/app/(unauthenticated)/signup/page.tsx b/apps/web/src/app/(unauthenticated)/signup/page.tsx index 353716d9b..996797d55 100644 --- a/apps/web/src/app/(unauthenticated)/signup/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signup/page.tsx @@ -1,10 +1,14 @@ import Link from 'next/link'; import { redirect } from 'next/navigation'; +import { env } from 'next-runtime-env'; + import { SignUpForm } from '~/components/forms/signup'; export default function SignUpPage() { - if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { + const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); + + if (NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { redirect('/signin'); } diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index ac88469b0..f36d59353 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -2,6 +2,8 @@ import { Suspense } from 'react'; import { Caveat, Inter } from 'next/font/google'; +import { PublicEnvScript, env } from 'next-runtime-env'; + import { FeatureFlagProvider } from '@documenso/lib/client-only/providers/feature-flag'; import { LocaleProvider } from '@documenso/lib/client-only/providers/locale'; import { getServerComponentAllFlags } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag'; @@ -19,6 +21,8 @@ import './globals.css'; const fontInter = Inter({ subsets: ['latin'], variable: '--font-sans' }); const fontCaveat = Caveat({ subsets: ['latin'], variable: '--font-signature' }); +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + export const metadata = { title: 'Documenso - The Open Source DocuSign Alternative', description: @@ -32,12 +36,12 @@ export const metadata = { description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', type: 'website', - images: [`${process.env.NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], + images: [`${NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], }, twitter: { site: '@documenso', card: 'summary_large_image', - images: [`${process.env.NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], + images: [`${NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', }, @@ -59,6 +63,7 @@ export default async function RootLayout({ children }: { children: React.ReactNo + diff --git a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx index d04b3a998..727627ddd 100644 --- a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx +++ b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx @@ -2,6 +2,8 @@ import React from 'react'; +import { env } from 'next-runtime-env'; + import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; @@ -16,6 +18,8 @@ export type AvatarWithRecipientProps = { }; export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const [, copy] = useCopyToClipboard(); const { toast } = useToast(); @@ -24,7 +28,7 @@ export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { return; } - void copy(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`).then(() => { + void copy(`${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`).then(() => { toast({ title: 'Copied to clipboard', description: 'The signing link has been copied to your clipboard.', diff --git a/apps/web/src/helpers/get-asset-buffer.ts b/apps/web/src/helpers/get-asset-buffer.ts index 85887071e..12c27d1a5 100644 --- a/apps/web/src/helpers/get-asset-buffer.ts +++ b/apps/web/src/helpers/get-asset-buffer.ts @@ -1,3 +1,5 @@ +import { env } from 'next-runtime-env'; + /** * getAssetBuffer is used to retrieve array buffers for various assets * that are hosted in the `public` folder. @@ -8,7 +10,9 @@ * @param path The path to the asset, relative to the `public` folder. */ export const getAssetBuffer = async (path: string) => { - const baseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + + const baseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; return fetch(new URL(path, baseUrl)).then(async (res) => res.arrayBuffer()); }; diff --git a/package-lock.json b/package-lock.json index 69825e8d8..d92461436 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "apps/*", "packages/*" ], + "dependencies": { + "next-runtime-env": "^3.2.0" + }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", @@ -14503,6 +14506,19 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/next-runtime-env": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-3.2.0.tgz", + "integrity": "sha512-rwe3flUgSRm51hzRN4Vt5MMSYMS4aDMEPJa0r+CMONA3UyUZl8Y5O8zjHSIlaNb3yquTCttZ0ahObPyPprBj9g==", + "dependencies": { + "next": "^14", + "react": "^18" + }, + "peerDependencies": { + "next": "^14", + "react": "^18" + } + }, "node_modules/next-themes": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", diff --git a/package.json b/package.json index 30076100f..853de1c6b 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,9 @@ "apps/*", "packages/*" ], - "dependencies": {}, + "dependencies": { + "next-runtime-env": "^3.2.0" + }, "overrides": { "next-auth": { "next": "14.0.3" diff --git a/packages/ee/server-only/limits/client.ts b/packages/ee/server-only/limits/client.ts index 7f48e6856..9bb2bd0ac 100644 --- a/packages/ee/server-only/limits/client.ts +++ b/packages/ee/server-only/limits/client.ts @@ -1,7 +1,8 @@ import { APP_BASE_URL } from '@documenso/lib/constants/app'; import { FREE_PLAN_LIMITS } from './constants'; -import { TLimitsResponseSchema, ZLimitsResponseSchema } from './schema'; +import type { TLimitsResponseSchema } from './schema'; +import { ZLimitsResponseSchema } from './schema'; export type GetLimitsOptions = { headers?: Record; @@ -10,7 +11,7 @@ export type GetLimitsOptions = { export const getLimits = async ({ headers }: GetLimitsOptions = {}) => { const requestHeaders = headers ?? {}; - const url = new URL(`${APP_BASE_URL}/api/limits`); + const url = new URL('/api/limits', APP_BASE_URL ?? 'http://localhost:3000'); return fetch(url, { headers: { diff --git a/packages/email/template-components/template-document-self-signed.tsx b/packages/email/template-components/template-document-self-signed.tsx index 90a1d3951..db16fb000 100644 --- a/packages/email/template-components/template-document-self-signed.tsx +++ b/packages/email/template-components/template-document-self-signed.tsx @@ -1,3 +1,5 @@ +import { env } from 'next-runtime-env'; + import { Button, Column, Img, Link, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -10,7 +12,9 @@ export const TemplateDocumentSelfSigned = ({ documentName, assetBaseUrl, }: TemplateDocumentSelfSignedProps) => { - const signUpUrl = `${process.env.NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000'}/signup`; + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + + const signUpUrl = `${NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000'}/signup`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); diff --git a/packages/email/template-components/template-reset-password.tsx b/packages/email/template-components/template-reset-password.tsx index 8788d60b8..d05393c83 100644 --- a/packages/email/template-components/template-reset-password.tsx +++ b/packages/email/template-components/template-reset-password.tsx @@ -1,3 +1,5 @@ +import { env } from 'next-runtime-env'; + import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; @@ -8,6 +10,8 @@ export interface TemplateResetPasswordProps { } export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordProps) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + return ( <> @@ -24,7 +28,7 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro

diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 827fcef0a..cee5a7586 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -1,8 +1,12 @@ -export const IS_APP_MARKETING = process.env.NEXT_PUBLIC_PROJECT === 'marketing'; -export const IS_APP_WEB = process.env.NEXT_PUBLIC_PROJECT === 'web'; +import { env } from 'next-runtime-env'; + +const NEXT_PUBLIC_PROJECT = process.env.NEXT_PUBLIC_PROJECT; +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); +const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); + +export const IS_APP_MARKETING = NEXT_PUBLIC_PROJECT === 'marketing'; +export const IS_APP_WEB = NEXT_PUBLIC_PROJECT === 'web'; export const APP_FOLDER = IS_APP_MARKETING ? 'marketing' : 'web'; -export const APP_BASE_URL = IS_APP_WEB - ? process.env.NEXT_PUBLIC_WEBAPP_URL - : process.env.NEXT_PUBLIC_MARKETING_URL; +export const APP_BASE_URL = IS_APP_WEB ? NEXT_PUBLIC_WEBAPP_URL : NEXT_PUBLIC_MARKETING_URL; diff --git a/packages/lib/constants/feature-flags.ts b/packages/lib/constants/feature-flags.ts index e972b47c2..a0e958e3a 100644 --- a/packages/lib/constants/feature-flags.ts +++ b/packages/lib/constants/feature-flags.ts @@ -1,5 +1,10 @@ +import { env } from 'next-runtime-env'; + import { APP_BASE_URL } from './app'; +const NEXT_PUBLIC_FEATURE_BILLING_ENABLED = env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED'); +const NEXT_PUBLIC_POSTHOG_KEY = env('NEXT_PUBLIC_POSTHOG_KEY'); + /** * The flag name for global session recording feature flag. */ @@ -16,7 +21,7 @@ export const FEATURE_FLAG_POLL_INTERVAL = 30000; * Does not take any person or group properties into account. */ export const LOCAL_FEATURE_FLAGS: Record = { - app_billing: process.env.NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true', + app_billing: NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true', marketing_header_single_player_mode: false, } as const; @@ -24,7 +29,7 @@ export const LOCAL_FEATURE_FLAGS: Record = { * Extract the PostHog configuration from the environment. */ export function extractPostHogConfig(): { key: string; host: string } | null { - const postHogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY; + const postHogKey = NEXT_PUBLIC_POSTHOG_KEY; const postHogHost = `${APP_BASE_URL}/ingest`; if (!postHogKey || !postHogHost) { diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 3b9492807..dc5f1b6f4 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -7,6 +7,7 @@ import type { JWT } from 'next-auth/jwt'; import CredentialsProvider from 'next-auth/providers/credentials'; import type { GoogleProfile } from 'next-auth/providers/google'; import GoogleProvider from 'next-auth/providers/google'; +import { env } from 'next-runtime-env'; import { prisma } from '@documenso/prisma'; @@ -15,6 +16,8 @@ import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa import { getUserByEmail } from '../server-only/user/get-user-by-email'; import { ErrorCode } from './error-codes'; +const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); + export const NEXT_AUTH_OPTIONS: AuthOptions = { adapter: PrismaAdapter(prisma), secret: process.env.NEXTAUTH_SECRET ?? 'secret', @@ -166,7 +169,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { async signIn({ user }) { // We do this to stop OAuth providers from creating an account // when signups are disabled - if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { + if (NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { const userData = await getUserByEmail({ email: user.email! }); return !!userData; diff --git a/packages/lib/server-only/auth/send-confirmation-email.ts b/packages/lib/server-only/auth/send-confirmation-email.ts index 7defdb1bd..c808e8f3d 100644 --- a/packages/lib/server-only/auth/send-confirmation-email.ts +++ b/packages/lib/server-only/auth/send-confirmation-email.ts @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ConfirmEmailTemplate } from '@documenso/email/templates/confirm-email'; @@ -10,6 +12,10 @@ export interface SendConfirmationEmailProps { } export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailProps) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const NEXT_PRIVATE_SMTP_FROM_NAME = env('NEXT_PRIVATE_SMTP_FROM_NAME'); + const NEXT_PRIVATE_SMTP_FROM_ADDRESS = env('NEXT_PRIVATE_SMTP_FROM_ADDRESS'); + const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -30,10 +36,10 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro throw new Error('Verification token not found for the user'); } - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const confirmationLink = `${assetBaseUrl}/verify-email/${verificationToken.token}`; - const senderName = process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso'; - const senderAdress = process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com'; + const senderName = NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso'; + const senderAdress = NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com'; const confirmationTemplate = createElement(ConfirmEmailTemplate, { assetBaseUrl, diff --git a/packages/lib/server-only/auth/send-forgot-password.ts b/packages/lib/server-only/auth/send-forgot-password.ts index e62d5e176..125db9338 100644 --- a/packages/lib/server-only/auth/send-forgot-password.ts +++ b/packages/lib/server-only/auth/send-forgot-password.ts @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ForgotPasswordTemplate } from '@documenso/email/templates/forgot-password'; @@ -10,6 +12,8 @@ export interface SendForgotPasswordOptions { } export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -29,8 +33,8 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) } const token = user.PasswordResetToken[0].token; - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const resetPasswordLink = `${process.env.NEXT_PUBLIC_WEBAPP_URL}/reset-password/${token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const resetPasswordLink = `${NEXT_PUBLIC_WEBAPP_URL}/reset-password/${token}`; const template = createElement(ForgotPasswordTemplate, { assetBaseUrl, diff --git a/packages/lib/server-only/auth/send-reset-password.ts b/packages/lib/server-only/auth/send-reset-password.ts index 9479f1a45..3dcec113c 100644 --- a/packages/lib/server-only/auth/send-reset-password.ts +++ b/packages/lib/server-only/auth/send-reset-password.ts @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ResetPasswordTemplate } from '@documenso/email/templates/reset-password'; @@ -10,13 +12,15 @@ export interface SendResetPasswordOptions { } export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const user = await prisma.user.findFirstOrThrow({ where: { id: userId, }, }); - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const template = createElement(ResetPasswordTemplate, { assetBaseUrl, diff --git a/packages/lib/server-only/document/delete-document.ts b/packages/lib/server-only/document/delete-document.ts index 22365a727..58b1f48a9 100644 --- a/packages/lib/server-only/document/delete-document.ts +++ b/packages/lib/server-only/document/delete-document.ts @@ -2,6 +2,8 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import DocumentCancelTemplate from '@documenso/email/templates/document-cancel'; @@ -16,6 +18,8 @@ export type DeleteDocumentOptions = { status: DocumentStatus; }; +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + export const deleteDocument = async ({ id, userId, status }: DeleteDocumentOptions) => { // if the document is a draft, hard-delete if (status === DocumentStatus.DRAFT) { @@ -49,7 +53,7 @@ export const deleteDocument = async ({ id, userId, status }: DeleteDocumentOptio if (document.Recipient.length > 0) { await Promise.all( document.Recipient.map(async (recipient) => { - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const template = createElement(DocumentCancelTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index da4ffcb58..a048cf600 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; @@ -14,6 +16,8 @@ export type ResendDocumentOptions = { recipients: number[]; }; +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + export const resendDocument = async ({ documentId, userId, recipients }: ResendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { @@ -67,8 +71,8 @@ export const resendDocument = async ({ documentId, userId, recipients }: ResendD 'document.name': document.title, }; - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const signDocumentLink = `${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; const template = createElement(DocumentInviteEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 226ff43ec..9b624a23c 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentCompletedEmailTemplate } from '@documenso/email/templates/document-completed'; @@ -12,6 +14,8 @@ export interface SendDocumentOptions { } export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const document = await prisma.document.findUnique({ where: { id: documentId, @@ -36,12 +40,12 @@ export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => document.Recipient.map(async (recipient) => { const { email, name, token } = recipient; - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const template = createElement(DocumentCompletedEmailTemplate, { documentName: document.title, assetBaseUrl, - downloadLink: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${token}/complete`, + downloadLink: `${NEXT_PUBLIC_WEBAPP_URL}/sign/${token}/complete`, }); await mailer.sendMail({ diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 25dc132ba..f72c79792 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; @@ -14,6 +16,8 @@ export type SendDocumentOptions = { }; export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -59,8 +63,8 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) return; } - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const signDocumentLink = `${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; const template = createElement(DocumentInviteEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/send-pending-email.ts b/packages/lib/server-only/document/send-pending-email.ts index 75861be78..abbecd72a 100644 --- a/packages/lib/server-only/document/send-pending-email.ts +++ b/packages/lib/server-only/document/send-pending-email.ts @@ -1,5 +1,7 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; + import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentPendingEmailTemplate } from '@documenso/email/templates/document-pending'; @@ -11,6 +13,8 @@ export interface SendPendingEmailOptions { } export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingEmailOptions) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const document = await prisma.document.findFirst({ where: { id: documentId, @@ -41,7 +45,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE const { email, name } = recipient; - const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; const template = createElement(DocumentPendingEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/feature-flags/all.ts b/packages/lib/server-only/feature-flags/all.ts index 40e759221..fff6cd855 100644 --- a/packages/lib/server-only/feature-flags/all.ts +++ b/packages/lib/server-only/feature-flags/all.ts @@ -1,6 +1,7 @@ import { NextRequest, NextResponse } from 'next/server'; import { getToken } from 'next-auth/jwt'; +import { env } from 'next-runtime-env'; import { LOCAL_FEATURE_FLAGS } from '@documenso/lib/constants/feature-flags'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; @@ -11,6 +12,9 @@ import { extractDistinctUserId, mapJwtToFlagProperties } from './get'; * Get all the evaluated feature flags based on the current user if possible. */ export default async function handlerFeatureFlagAll(req: Request) { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); + const requestHeaders = Object.fromEntries(req.headers.entries()); const nextReq = new NextRequest(req, { @@ -38,11 +42,11 @@ export default async function handlerFeatureFlagAll(req: Request) { const origin = req.headers.get('origin'); if (origin) { - if (origin.startsWith(process.env.NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { + if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { res.headers.set('Access-Control-Allow-Origin', origin); } - if (origin.startsWith(process.env.NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { + if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { res.headers.set('Access-Control-Allow-Origin', origin); } } diff --git a/packages/lib/server-only/feature-flags/get.ts b/packages/lib/server-only/feature-flags/get.ts index 36aafc7b7..6f8a2c011 100644 --- a/packages/lib/server-only/feature-flags/get.ts +++ b/packages/lib/server-only/feature-flags/get.ts @@ -1,7 +1,9 @@ import { NextRequest, NextResponse } from 'next/server'; import { nanoid } from 'nanoid'; -import { JWT, getToken } from 'next-auth/jwt'; +import type { JWT } from 'next-auth/jwt'; +import { getToken } from 'next-auth/jwt'; +import { env } from 'next-runtime-env'; import { LOCAL_FEATURE_FLAGS, extractPostHogConfig } from '@documenso/lib/constants/feature-flags'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; @@ -13,6 +15,9 @@ import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-po * @returns A Response with the feature flag value. */ export default async function handleFeatureFlagGet(req: Request) { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); + const { searchParams } = new URL(req.url ?? ''); const flag = searchParams.get('flag'); @@ -57,11 +62,11 @@ export default async function handleFeatureFlagGet(req: Request) { const origin = req.headers.get('Origin'); if (origin) { - if (origin.startsWith(process.env.NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { + if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { res.headers.set('Access-Control-Allow-Origin', origin); } - if (origin.startsWith(process.env.NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { + if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { res.headers.set('Access-Control-Allow-Origin', origin); } } diff --git a/packages/lib/universal/get-base-url.ts b/packages/lib/universal/get-base-url.ts index 2120c9f54..b7c9d4ea4 100644 --- a/packages/lib/universal/get-base-url.ts +++ b/packages/lib/universal/get-base-url.ts @@ -1,4 +1,8 @@ /* eslint-disable turbo/no-undeclared-env-vars */ +import { env } from 'next-runtime-env'; + +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + export const getBaseUrl = () => { if (typeof window !== 'undefined') { return ''; @@ -8,8 +12,8 @@ export const getBaseUrl = () => { return `https://${process.env.VERCEL_URL}`; } - if (process.env.NEXT_PUBLIC_WEBAPP_URL) { - return process.env.NEXT_PUBLIC_WEBAPP_URL; + if (NEXT_PUBLIC_WEBAPP_URL) { + return NEXT_PUBLIC_WEBAPP_URL; } return `http://localhost:${process.env.PORT ?? 3000}`; diff --git a/packages/lib/universal/upload/put-file.ts b/packages/lib/universal/upload/put-file.ts index c54ccef77..498bed3bd 100644 --- a/packages/lib/universal/upload/put-file.ts +++ b/packages/lib/universal/upload/put-file.ts @@ -1,4 +1,5 @@ import { base64 } from '@scure/base'; +import { env } from 'next-runtime-env'; import { match } from 'ts-pattern'; import { DocumentDataType } from '@documenso/prisma/client'; @@ -11,8 +12,10 @@ type File = { arrayBuffer: () => Promise; }; +const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); + export const putFile = async (file: File) => { - const { type, data } = await match(process.env.NEXT_PUBLIC_UPLOAD_TRANSPORT) + const { type, data } = await match(NEXT_PUBLIC_UPLOAD_TRANSPORT) .with('s3', async () => putFileInS3(file)) .otherwise(async () => putFileInDatabase(file)); diff --git a/packages/lib/universal/upload/server-actions.ts b/packages/lib/universal/upload/server-actions.ts index 69274c30c..61429cd86 100644 --- a/packages/lib/universal/upload/server-actions.ts +++ b/packages/lib/universal/upload/server-actions.ts @@ -11,12 +11,15 @@ import { } from '@aws-sdk/client-s3'; import slugify from '@sindresorhus/slugify'; import { type JWT, getToken } from 'next-auth/jwt'; +import { env } from 'next-runtime-env'; import path from 'node:path'; import { APP_BASE_URL } from '../../constants/app'; import { ONE_HOUR, ONE_SECOND } from '../../constants/time'; import { alphaid } from '../id'; +const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); + export const getPresignPostUrl = async (fileName: string, contentType: string) => { const client = getS3Client(); @@ -117,7 +120,7 @@ export const deleteS3File = async (key: string) => { }; const getS3Client = () => { - if (process.env.NEXT_PUBLIC_UPLOAD_TRANSPORT !== 's3') { + if (NEXT_PUBLIC_UPLOAD_TRANSPORT !== 's3') { throw new Error('Invalid upload transport'); } diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts index 24dd272ee..0debd7f8d 100644 --- a/packages/trpc/server/auth-router/router.ts +++ b/packages/trpc/server/auth-router/router.ts @@ -1,4 +1,5 @@ import { TRPCError } from '@trpc/server'; +import { env } from 'next-runtime-env'; import { ErrorCode } from '@documenso/lib/next-auth/error-codes'; import { compareSync } from '@documenso/lib/server-only/auth/hash'; @@ -8,10 +9,12 @@ import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-conf import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZSignUpMutationSchema, ZVerifyPasswordMutationSchema } from './schema'; +const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); + export const authRouter = router({ signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => { try { - if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { + if (NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { throw new TRPCError({ code: 'BAD_REQUEST', message: 'Signups are disabled.', diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index 8e2266fcc..cb92aa7a4 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -1,5 +1,6 @@ import { createElement } from 'react'; +import { env } from 'next-runtime-env'; import { PDFDocument } from 'pdf-lib'; import { mailer } from '@documenso/email/mailer'; @@ -24,6 +25,8 @@ import { procedure, router } from '../trpc'; import { mapField } from './helper'; import { ZCreateSinglePlayerDocumentMutationSchema } from './schema'; +const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); + export const singleplayerRouter = router({ createSinglePlayerDocument: procedure .input(ZCreateSinglePlayerDocumentMutationSchema) @@ -148,7 +151,7 @@ export const singleplayerRouter = router({ const template = createElement(DocumentSelfSignedEmailTemplate, { documentName: documentName, - assetBaseUrl: process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', + assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', }); const [html, text] = await Promise.all([ diff --git a/packages/ui/components/document/document-share-button.tsx b/packages/ui/components/document/document-share-button.tsx index b366123fb..f304d92c0 100644 --- a/packages/ui/components/document/document-share-button.tsx +++ b/packages/ui/components/document/document-share-button.tsx @@ -4,6 +4,7 @@ import type { HTMLAttributes } from 'react'; import React, { useState } from 'react'; import { Copy, Sparkles } from 'lucide-react'; +import { env } from 'next-runtime-env'; import { FaXTwitter } from 'react-icons/fa6'; import { useCopyShareLink } from '@documenso/lib/client-only/hooks/use-copy-share-link'; @@ -38,6 +39,7 @@ export const DocumentShareButton = ({ className, trigger, }: DocumentShareButtonProps) => { + const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); const { toast } = useToast(); const { copyShareLink, createAndCopyShareLink, isCopyingShareLink } = useCopyShareLink({ @@ -68,7 +70,7 @@ export const DocumentShareButton = ({ const onCopyClick = async () => { if (shareLink) { - await copyShareLink(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${shareLink.slug}`); + await copyShareLink(`${NEXT_PUBLIC_WEBAPP_URL}/share/${shareLink.slug}`); } else { await createAndCopyShareLink({ token, @@ -92,7 +94,7 @@ export const DocumentShareButton = ({ } // Ensuring we've prewarmed the opengraph image for the Twitter - await fetch(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}/opengraph`, { + await fetch(`${NEXT_PUBLIC_WEBAPP_URL}/share/${slug}/opengraph`, { // We don't care about the response, so we can use no-cors mode: 'no-cors', }); @@ -100,7 +102,7 @@ export const DocumentShareButton = ({ window.open( generateTwitterIntent( `I just ${token ? 'signed' : 'sent'} a document in style with @documenso. Check it out!`, - `${process.env.NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`, + `${NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`, ), '_blank', ); @@ -148,7 +150,7 @@ export const DocumentShareButton = ({ 'animate-pulse': !shareLink?.slug, })} > - {process.env.NEXT_PUBLIC_WEBAPP_URL}/share/{shareLink?.slug || '...'} + {NEXT_PUBLIC_WEBAPP_URL}/share/{shareLink?.slug || '...'}
{shareLink?.slug && ( sharing link From 49ecfc1a2cf01e3bcdf195819657b463faf7e890 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:42:40 +0200 Subject: [PATCH 05/61] chore: refactor --- .../unverified-account/page.tsx | 16 +++------------- apps/web/src/components/forms/signin.tsx | 9 ++++----- apps/web/src/components/forms/signup.tsx | 5 ++++- packages/lib/next-auth/auth-options.ts | 10 +--------- .../lib/server-only/user/get-user-by-email.ts | 3 --- .../user/get-user-by-verification-token.ts | 17 ----------------- packages/trpc/server/profile-router/router.ts | 19 +------------------ 7 files changed, 13 insertions(+), 66 deletions(-) delete mode 100644 packages/lib/server-only/user/get-user-by-verification-token.ts diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx index 7a0a9c78d..456971a9f 100644 --- a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -20,25 +20,15 @@ export default function UnverifiedAccount() { const token = searchParams?.get('t') ?? ''; - const { data: { email } = {} } = trpc.profile.getUserFromVerificationToken.useQuery({ token }); - const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); const onResendConfirmationEmail = async () => { - if (!email) { - toast({ - title: 'Unable to send confirmation email', - description: 'Something went wrong while sending the confirmation email. Please try again.', - variant: 'destructive', - }); - - return; - } - try { setIsButtonDisabled(true); - await sendConfirmationEmail({ email: email }); + // TODO: decrypt email and send it + + await sendConfirmationEmail({ email: token ?? '' }); toast({ title: 'Success', diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index c79021396..4e3701c84 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -62,6 +62,8 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = useState(false); const router = useRouter(); + const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation(); + const [twoFactorAuthenticationMethod, setTwoFactorAuthenticationMethod] = useState< 'totp' | 'backup' >('totp'); @@ -76,8 +78,6 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = resolver: zodResolver(ZSignInFormSchema), }); - const { mutateAsync: getUser } = trpc.profile.getUserByEmail.useMutation(); - const isSubmitting = form.formState.isSubmitting; const onCloseTwoFactorAuthenticationDialog = () => { @@ -132,10 +132,9 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = const errorMessage = ERROR_MESSAGES[result.error]; if (result.error === ErrorCode.UNVERIFIED_EMAIL) { - const user = await getUser({ email }); - const token = user?.VerificationToken[user.VerificationToken.length - 1].token; + const encryptedEmail = await encryptSecondaryData({ data: email }); - router.push(`/unverified-account?t=${token}`); + router.push(`/unverified-account?t=${encryptedEmail}`); return; } diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index 6258dcdee..190084226 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -62,12 +62,15 @@ export const SignUpForm = ({ className, isGoogleSSOEnabled }: SignUpFormProps) = const isSubmitting = form.formState.isSubmitting; const { mutateAsync: signup } = trpc.auth.signup.useMutation(); + const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation(); const onFormSubmit = async ({ name, email, password, signature }: TSignUpFormSchema) => { try { await signup({ name, email, password, signature }); - router.push('/signin'); + const encryptedEmail = await encryptSecondaryData({ data: email }); + + router.push(`/unverified-account?t=${encryptedEmail}`); toast({ title: 'Registration Successful', diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index ed4aeaf44..37f1ed864 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -11,7 +11,6 @@ import GoogleProvider from 'next-auth/providers/google'; import { prisma } from '@documenso/prisma'; import { IdentityProvider } from '@documenso/prisma/client'; -import { ONE_DAY } from '../constants/time'; import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; @@ -71,14 +70,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } } - const userCreationDate = user?.createdAt; - const createdWithinLast72Hours = userCreationDate > new Date(Date.now() - ONE_DAY * 3); - - /* - avoid messing with the users who signed up before the email verification requirement - the error is thrown only if the user doesn't have a verified email and the account was created within the last 72 hours - */ - if (!user.emailVerified && createdWithinLast72Hours) { + if (!user.emailVerified) { throw new Error(ErrorCode.UNVERIFIED_EMAIL); } diff --git a/packages/lib/server-only/user/get-user-by-email.ts b/packages/lib/server-only/user/get-user-by-email.ts index 8c61202a2..0a2ef8d16 100644 --- a/packages/lib/server-only/user/get-user-by-email.ts +++ b/packages/lib/server-only/user/get-user-by-email.ts @@ -9,8 +9,5 @@ export const getUserByEmail = async ({ email }: GetUserByEmailOptions) => { where: { email: email.toLowerCase(), }, - include: { - VerificationToken: true, - }, }); }; diff --git a/packages/lib/server-only/user/get-user-by-verification-token.ts b/packages/lib/server-only/user/get-user-by-verification-token.ts deleted file mode 100644 index b33506d6e..000000000 --- a/packages/lib/server-only/user/get-user-by-verification-token.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { prisma } from '@documenso/prisma'; - -export interface GetUserByVerificationTokenOptions { - token: string; -} - -export const getUserByVerificationToken = async ({ token }: GetUserByVerificationTokenOptions) => { - return await prisma.user.findFirstOrThrow({ - where: { - VerificationToken: { - some: { - token, - }, - }, - }, - }); -}; diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 79c67ed0c..09ee0351f 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -3,7 +3,6 @@ import { TRPCError } from '@trpc/server'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; -import { getUserByVerificationToken } from '@documenso/lib/server-only/user/get-user-by-verification-token'; import { resetPassword } from '@documenso/lib/server-only/user/reset-password'; import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; import { updatePassword } from '@documenso/lib/server-only/user/update-password'; @@ -16,7 +15,6 @@ import { ZResetPasswordFormSchema, ZRetrieveUserByEmailMutationSchema, ZRetrieveUserByIdQuerySchema, - ZRetrieveUserByVerificationTokenQuerySchema, ZUpdatePasswordMutationSchema, ZUpdateProfileMutationSchema, } from './schema'; @@ -50,21 +48,6 @@ export const profileRouter = router({ } }), - getUserFromVerificationToken: procedure - .input(ZRetrieveUserByVerificationTokenQuerySchema) - .query(async ({ input }) => { - try { - const { token } = input; - - return await getUserByVerificationToken({ token }); - } catch (err) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'We were unable to retrieve the specified account. Please try again.', - }); - } - }), - updateProfile: authenticatedProcedure .input(ZUpdateProfileMutationSchema) .mutation(async ({ input, ctx }) => { @@ -153,7 +136,7 @@ export const profileRouter = router({ try { const { email } = input; - return sendConfirmationToken({ email }); + return await sendConfirmationToken({ email }); } catch (err) { let message = 'We were unable to send a confirmation email. Please try again.'; From 311c8da8fc8ad5ded8f8ed11146a517e740f07b5 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:24:37 +0200 Subject: [PATCH 06/61] chore: encrypt and decrypt email addr --- .../src/app/(unauthenticated)/unverified-account/page.tsx | 6 ++---- packages/trpc/server/profile-router/router.ts | 5 ++++- packages/trpc/server/profile-router/schema.ts | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx index 456971a9f..5199249e0 100644 --- a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -18,7 +18,7 @@ export default function UnverifiedAccount() { const searchParams = useSearchParams(); const { toast } = useToast(); - const token = searchParams?.get('t') ?? ''; + const encryptedEmail = searchParams?.get('t') ?? ''; // TODO: choose a better name instead of t const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); @@ -26,9 +26,7 @@ export default function UnverifiedAccount() { try { setIsButtonDisabled(true); - // TODO: decrypt email and send it - - await sendConfirmationEmail({ email: token ?? '' }); + await sendConfirmationEmail({ email: encryptedEmail }); toast({ title: 'Success', diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 09ee0351f..510e2a6fd 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -1,5 +1,6 @@ import { TRPCError } from '@trpc/server'; +import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; @@ -136,7 +137,9 @@ export const profileRouter = router({ try { const { email } = input; - return await sendConfirmationToken({ email }); + const decryptedEmail = decryptSecondaryData(email); + + return await sendConfirmationToken({ email: decryptedEmail ?? '' }); // TODO: fix this tomorrow } catch (err) { let message = 'We were unable to send a confirmation email. Please try again.'; diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index 671756e94..5aa9844ca 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -30,9 +30,9 @@ export const ZResetPasswordFormSchema = z.object({ password: z.string().min(6), token: z.string().min(1), }); - +// TODO: revisit this export const ZConfirmEmailMutationSchema = z.object({ - email: z.string().email().min(1), + email: z.string().min(1), }); export type TRetrieveUserByIdQuerySchema = z.infer; From e2fa01509dc602aedc9d9764a0f0f24e0e8208c5 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:33:35 +0200 Subject: [PATCH 07/61] chore: avoid returning unnecessary info --- packages/lib/server-only/user/send-confirmation-token.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts index 5206d202e..6c070125b 100644 --- a/packages/lib/server-only/user/send-confirmation-token.ts +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -37,5 +37,12 @@ export const sendConfirmationToken = async ({ email }: { email: string }) => { throw new Error(`Failed to create the verification token`); } - return sendConfirmationEmail({ userId: user.id }); + // TODO: Revisit tomorrow + try { + await sendConfirmationEmail({ userId: user.id }); + + return { success: true }; + } catch (err) { + throw new Error(`Failed to send the confirmation email`); + } }; From b2cca9afb677da0505189aa5e0f68e57dc1250e5 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:27:36 +0200 Subject: [PATCH 08/61] chore: refactor --- .../app/(unauthenticated)/unverified-account/page.tsx | 4 ++-- apps/web/src/components/forms/signin.tsx | 2 +- apps/web/src/components/forms/signup.tsx | 2 +- .../lib/server-only/user/send-confirmation-token.ts | 1 - packages/trpc/server/profile-router/router.ts | 10 +++++++--- packages/trpc/server/profile-router/schema.ts | 4 ++-- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx index 5199249e0..dc98044ae 100644 --- a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -18,7 +18,7 @@ export default function UnverifiedAccount() { const searchParams = useSearchParams(); const { toast } = useToast(); - const encryptedEmail = searchParams?.get('t') ?? ''; // TODO: choose a better name instead of t + const encryptedEmail = searchParams?.get('token') ?? ''; const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); @@ -26,7 +26,7 @@ export default function UnverifiedAccount() { try { setIsButtonDisabled(true); - await sendConfirmationEmail({ email: encryptedEmail }); + await sendConfirmationEmail({ encryptedEmail }); toast({ title: 'Success', diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index 4e3701c84..0353333cf 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -134,7 +134,7 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = if (result.error === ErrorCode.UNVERIFIED_EMAIL) { const encryptedEmail = await encryptSecondaryData({ data: email }); - router.push(`/unverified-account?t=${encryptedEmail}`); + router.push(`/unverified-account?token=${encryptedEmail}`); return; } diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index 190084226..bc7ee0ce5 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -70,7 +70,7 @@ export const SignUpForm = ({ className, isGoogleSSOEnabled }: SignUpFormProps) = const encryptedEmail = await encryptSecondaryData({ data: email }); - router.push(`/unverified-account?t=${encryptedEmail}`); + router.push(`/unverified-account?token=${encryptedEmail}`); toast({ title: 'Registration Successful', diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts index 6c070125b..af4a97a48 100644 --- a/packages/lib/server-only/user/send-confirmation-token.ts +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -37,7 +37,6 @@ export const sendConfirmationToken = async ({ email }: { email: string }) => { throw new Error(`Failed to create the verification token`); } - // TODO: Revisit tomorrow try { await sendConfirmationEmail({ userId: user.id }); diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 510e2a6fd..44d0f59bd 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -135,11 +135,15 @@ export const profileRouter = router({ .input(ZConfirmEmailMutationSchema) .mutation(async ({ input }) => { try { - const { email } = input; + const { encryptedEmail } = input; - const decryptedEmail = decryptSecondaryData(email); + const decryptedEmail = decryptSecondaryData(encryptedEmail); - return await sendConfirmationToken({ email: decryptedEmail ?? '' }); // TODO: fix this tomorrow + if (!decryptedEmail) { + throw new Error('Email is required'); + } + + return await sendConfirmationToken({ email: decryptedEmail }); } catch (err) { let message = 'We were unable to send a confirmation email. Please try again.'; diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index 5aa9844ca..897a4912d 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -30,9 +30,9 @@ export const ZResetPasswordFormSchema = z.object({ password: z.string().min(6), token: z.string().min(1), }); -// TODO: revisit this + export const ZConfirmEmailMutationSchema = z.object({ - email: z.string().min(1), + encryptedEmail: z.string().min(1), }); export type TRetrieveUserByIdQuerySchema = z.infer; From 927a656c576228ab4ef54dbc5a22237a4a9c116b Mon Sep 17 00:00:00 2001 From: Tangerine Kugelmann <9637909+daallgeier@users.noreply.github.com> Date: Sun, 28 Jan 2024 01:00:07 +0100 Subject: [PATCH 09/61] Create security.txt See also https://securitytxt.org --- .well-known/security.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .well-known/security.txt diff --git a/.well-known/security.txt b/.well-known/security.txt new file mode 100644 index 000000000..5cd29187c --- /dev/null +++ b/.well-known/security.txt @@ -0,0 +1,3 @@ +Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml +Preferred-Languages: en +Canonical: https://documenso.com/.well-known/security.txt From f514d55d27bc23866dd70b6b7c7005bce5891851 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:41:02 +0200 Subject: [PATCH 10/61] chore: removed unused schema --- packages/trpc/server/profile-router/schema.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index 897a4912d..dfde69796 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -8,10 +8,6 @@ export const ZRetrieveUserByEmailMutationSchema = z.object({ email: z.string().email().min(1), }); -export const ZRetrieveUserByVerificationTokenQuerySchema = z.object({ - token: z.string().min(1), -}); - export const ZUpdateProfileMutationSchema = z.object({ name: z.string().min(1), signature: z.string(), From 1676f5bf6cbcdc63b6cae10ee0be61e1a4be5d52 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:43:38 +0200 Subject: [PATCH 11/61] chore: removed unused code --- packages/trpc/server/profile-router/router.ts | 17 ----------------- packages/trpc/server/profile-router/schema.ts | 4 ---- 2 files changed, 21 deletions(-) diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 44d0f59bd..1faa3c8e6 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -2,7 +2,6 @@ import { TRPCError } from '@trpc/server'; import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; -import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; import { resetPassword } from '@documenso/lib/server-only/user/reset-password'; import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; @@ -14,7 +13,6 @@ import { ZConfirmEmailMutationSchema, ZForgotPasswordFormSchema, ZResetPasswordFormSchema, - ZRetrieveUserByEmailMutationSchema, ZRetrieveUserByIdQuerySchema, ZUpdatePasswordMutationSchema, ZUpdateProfileMutationSchema, @@ -34,21 +32,6 @@ export const profileRouter = router({ } }), - getUserByEmail: procedure - .input(ZRetrieveUserByEmailMutationSchema) - .mutation(async ({ input }) => { - try { - const { email } = input; - - return await getUserByEmail({ email }); - } catch (err) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'We were unable to retrieve the specified account. Please try again.', - }); - } - }), - updateProfile: authenticatedProcedure .input(ZUpdateProfileMutationSchema) .mutation(async ({ input, ctx }) => { diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index dfde69796..135d0d1e8 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -4,10 +4,6 @@ export const ZRetrieveUserByIdQuerySchema = z.object({ id: z.number().min(1), }); -export const ZRetrieveUserByEmailMutationSchema = z.object({ - email: z.string().email().min(1), -}); - export const ZUpdateProfileMutationSchema = z.object({ name: z.string().min(1), signature: z.string(), From cc090adce0918def56279c44d76cecaa21bf5fe5 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 30 Jan 2024 12:54:48 +0200 Subject: [PATCH 12/61] chore: refactor --- .../unverified-account/page.tsx | 53 ++----------------- apps/web/src/components/forms/signin.tsx | 10 ++-- apps/web/src/components/forms/signup.tsx | 8 ++- packages/lib/next-auth/auth-options.ts | 10 ++++ .../lib/server-only/user/get-user-by-email.ts | 3 ++ .../user/send-confirmation-token.ts | 4 ++ packages/trpc/server/profile-router/router.ts | 11 +--- packages/trpc/server/profile-router/schema.ts | 2 +- 8 files changed, 32 insertions(+), 69 deletions(-) diff --git a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx index dc98044ae..9b636f7cf 100644 --- a/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx +++ b/apps/web/src/app/(unauthenticated)/unverified-account/page.tsx @@ -1,51 +1,8 @@ -'use client'; - -import { useState } from 'react'; - -import { useSearchParams } from 'next/navigation'; - import { Mails } from 'lucide-react'; -import { ONE_SECOND } from '@documenso/lib/constants/time'; -import { trpc } from '@documenso/trpc/react'; -import { Button } from '@documenso/ui/primitives/button'; -import { useToast } from '@documenso/ui/primitives/use-toast'; - -const RESEND_CONFIRMATION_EMAIL_TIMEOUT = 20 * ONE_SECOND; +import { SendConfirmationEmailForm } from '~/components/forms/send-confirmation-email'; export default function UnverifiedAccount() { - const [isButtonDisabled, setIsButtonDisabled] = useState(false); - const searchParams = useSearchParams(); - const { toast } = useToast(); - - const encryptedEmail = searchParams?.get('token') ?? ''; - - const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); - - const onResendConfirmationEmail = async () => { - try { - setIsButtonDisabled(true); - - await sendConfirmationEmail({ encryptedEmail }); - - toast({ - title: 'Success', - description: 'Verification email sent successfully.', - duration: 5000, - }); - - setTimeout(() => setIsButtonDisabled(false), RESEND_CONFIRMATION_EMAIL_TIMEOUT); - } catch (err) { - setIsButtonDisabled(false); - - toast({ - title: 'Error', - description: 'Something went wrong while sending the confirmation email.', - variant: 'destructive', - }); - } - }; - return (
@@ -55,13 +12,11 @@ export default function UnverifiedAccount() {

Confirm email

- To gain full access to your account and unlock all its features, please confirm your email - address by clicking on the link sent to your email address. + To gain access to your account, please confirm your email address by clicking on the + confirmation link from your inbox.

- +
); diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index 0353333cf..d0b5e1b60 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -11,7 +11,6 @@ import { FcGoogle } from 'react-icons/fc'; import { z } from 'zod'; import { ErrorCode, isErrorCode } from '@documenso/lib/next-auth/error-codes'; -import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@documenso/ui/primitives/dialog'; @@ -62,8 +61,6 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = useState(false); const router = useRouter(); - const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation(); - const [twoFactorAuthenticationMethod, setTwoFactorAuthenticationMethod] = useState< 'totp' | 'backup' >('totp'); @@ -132,9 +129,12 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = const errorMessage = ERROR_MESSAGES[result.error]; if (result.error === ErrorCode.UNVERIFIED_EMAIL) { - const encryptedEmail = await encryptSecondaryData({ data: email }); + router.push(`/unverified-account`); - router.push(`/unverified-account?token=${encryptedEmail}`); + toast({ + title: 'Unable to sign in', + description: errorMessage ?? 'An unknown error occurred', + }); return; } diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index bc7ee0ce5..4520e00ca 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -62,19 +62,17 @@ export const SignUpForm = ({ className, isGoogleSSOEnabled }: SignUpFormProps) = const isSubmitting = form.formState.isSubmitting; const { mutateAsync: signup } = trpc.auth.signup.useMutation(); - const { mutateAsync: encryptSecondaryData } = trpc.crypto.encryptSecondaryData.useMutation(); const onFormSubmit = async ({ name, email, password, signature }: TSignUpFormSchema) => { try { await signup({ name, email, password, signature }); - const encryptedEmail = await encryptSecondaryData({ data: email }); - - router.push(`/unverified-account?token=${encryptedEmail}`); + router.push(`/unverified-account}`); toast({ title: 'Registration Successful', - description: 'You have successfully registered. Please sign in to continue.', + description: + 'You have successfully registered. Please verify your account by clicking on the link you received in the email.', duration: 5000, }); diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 37f1ed864..1dedfe12b 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -14,6 +14,7 @@ import { IdentityProvider } from '@documenso/prisma/client'; import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; +import { sendConfirmationToken } from '../server-only/user/send-confirmation-token'; import { ErrorCode } from './error-codes'; export const NEXT_AUTH_OPTIONS: AuthOptions = { @@ -71,6 +72,15 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } if (!user.emailVerified) { + const totalUserVerificationTokens = user.VerificationToken.length; + const lastUserVerificationToken = user.VerificationToken[totalUserVerificationTokens - 1]; + const expiredToken = + DateTime.fromJSDate(lastUserVerificationToken.expires) <= DateTime.now(); + + if (totalUserVerificationTokens < 1 || expiredToken) { + await sendConfirmationToken({ email }); + } + throw new Error(ErrorCode.UNVERIFIED_EMAIL); } diff --git a/packages/lib/server-only/user/get-user-by-email.ts b/packages/lib/server-only/user/get-user-by-email.ts index 0a2ef8d16..8c61202a2 100644 --- a/packages/lib/server-only/user/get-user-by-email.ts +++ b/packages/lib/server-only/user/get-user-by-email.ts @@ -9,5 +9,8 @@ export const getUserByEmail = async ({ email }: GetUserByEmailOptions) => { where: { email: email.toLowerCase(), }, + include: { + VerificationToken: true, + }, }); }; diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts index af4a97a48..a399dd9fc 100644 --- a/packages/lib/server-only/user/send-confirmation-token.ts +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -20,6 +20,10 @@ export const sendConfirmationToken = async ({ email }: { email: string }) => { throw new Error('User not found'); } + if (user.emailVerified) { + throw new Error('Email verified'); + } + const createdToken = await prisma.verificationToken.create({ data: { identifier: IDENTIFIER, diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 1faa3c8e6..3d765372b 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -1,6 +1,5 @@ import { TRPCError } from '@trpc/server'; -import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; import { resetPassword } from '@documenso/lib/server-only/user/reset-password'; @@ -118,15 +117,9 @@ export const profileRouter = router({ .input(ZConfirmEmailMutationSchema) .mutation(async ({ input }) => { try { - const { encryptedEmail } = input; + const { email } = input; - const decryptedEmail = decryptSecondaryData(encryptedEmail); - - if (!decryptedEmail) { - throw new Error('Email is required'); - } - - return await sendConfirmationToken({ email: decryptedEmail }); + return await sendConfirmationToken({ email }); } catch (err) { let message = 'We were unable to send a confirmation email. Please try again.'; diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index 135d0d1e8..ef9ca2a14 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -24,7 +24,7 @@ export const ZResetPasswordFormSchema = z.object({ }); export const ZConfirmEmailMutationSchema = z.object({ - encryptedEmail: z.string().min(1), + email: z.string().email().min(1), }); export type TRetrieveUserByIdQuerySchema = z.infer; From 6053a4a40a55db36c815dbc2bdbf3c140f62860d Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 30 Jan 2024 12:56:32 +0200 Subject: [PATCH 13/61] chore: refactor --- .../forms/send-confirmation-email.tsx | 93 +++++++++++++++++++ apps/web/src/components/forms/signup.tsx | 2 +- 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 apps/web/src/components/forms/send-confirmation-email.tsx diff --git a/apps/web/src/components/forms/send-confirmation-email.tsx b/apps/web/src/components/forms/send-confirmation-email.tsx new file mode 100644 index 000000000..9e669539e --- /dev/null +++ b/apps/web/src/components/forms/send-confirmation-email.tsx @@ -0,0 +1,93 @@ +'use client'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { trpc } from '@documenso/trpc/react'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export const ZSendConfirmationEmailFormSchema = z.object({ + email: z.string().email().min(1), +}); + +export type TSendConfirmationEmailFormSchema = z.infer; + +export type SendConfirmationEmailFormProps = { + className?: string; +}; + +export const SendConfirmationEmailForm = ({ className }: SendConfirmationEmailFormProps) => { + const { toast } = useToast(); + + const form = useForm({ + values: { + email: '', + }, + resolver: zodResolver(ZSendConfirmationEmailFormSchema), + }); + + const isSubmitting = form.formState.isSubmitting; + + const { mutateAsync: sendConfirmationEmail } = trpc.profile.sendConfirmationEmail.useMutation(); + + const onFormSubmit = async ({ email }: TSendConfirmationEmailFormSchema) => { + try { + await sendConfirmationEmail({ email }); + + toast({ + title: 'Confirmation email sent', + description: + 'A confirmation email has been sent, and it should arrive in your inbox shortly.', + duration: 5000, + }); + + form.reset(); + } catch (err) { + toast({ + title: 'An error occurred while sending your confirmation email', + description: 'Please try again and make sure you enter the correct email address.', + variant: 'destructive', + }); + } + }; + + return ( +
+
+ +
+ ( + + Email address + + + + + )} + /> +
+ +
+ +
+ ); +}; diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index 4520e00ca..7bfe07968 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -67,7 +67,7 @@ export const SignUpForm = ({ className, isGoogleSSOEnabled }: SignUpFormProps) = try { await signup({ name, email, password, signature }); - router.push(`/unverified-account}`); + router.push(`/unverified-account`); toast({ title: 'Registration Successful', From 747a7b0aea078d4cf52db95abda58b51e269b7f8 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Tue, 30 Jan 2024 16:15:32 +0100 Subject: [PATCH 14/61] chore: security contacts and descr --- .well-known/security.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.well-known/security.txt b/.well-known/security.txt index 5cd29187c..0b00c7123 100644 --- a/.well-known/security.txt +++ b/.well-known/security.txt @@ -1,3 +1,6 @@ +# General Issues Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml +# Report critical issues privately, to let us take appropriate action before publishing +Contact: mailto:security@documenso.com Preferred-Languages: en Canonical: https://documenso.com/.well-known/security.txt From 08f82b23dcc78f309f648785574cfe30eb0e2387 Mon Sep 17 00:00:00 2001 From: Mythie Date: Wed, 31 Jan 2024 22:32:42 +1100 Subject: [PATCH 15/61] fix: update env entries to evaluate at runtime --- .../src/app/(marketing)/claimed/page.tsx | 7 ++----- .../src/app/(marketing)/singleplayer/client.tsx | 3 ++- .../src/components/(marketing)/pricing-table.tsx | 9 +++------ .../single-player-mode-success.tsx | 3 ++- .../src/components/(marketing)/widget.tsx | 7 ++++++- apps/marketing/src/pages/api/claim-plan/index.ts | 14 ++++++++------ .../(dashboard)/documents/[id]/edit-document.tsx | 2 +- .../billing/create-billing-portal.action.ts | 7 ++----- .../settings/billing/create-checkout.action.ts | 9 +++------ .../app/(share)/share/[slug]/opengraph/route.tsx | 7 +++---- apps/web/src/app/(share)/share/[slug]/page.tsx | 12 ++++-------- apps/web/src/app/layout.tsx | 9 ++++----- .../(dashboard)/avatar/avatar-with-recipient.tsx | 7 ++----- apps/web/src/helpers/get-asset-buffer.ts | 6 ++---- packages/ee/server-only/limits/client.ts | 2 +- packages/lib/constants/app.ts | 15 ++++++++------- packages/lib/constants/crypto.ts | 16 ++++++++-------- packages/lib/constants/feature-flags.ts | 10 +++++----- packages/lib/constants/pdf.ts | 2 +- packages/lib/next-auth/auth-options.ts | 4 +--- .../server-only/auth/send-confirmation-email.ts | 11 +++++------ .../lib/server-only/auth/send-forgot-password.ts | 10 ++++------ .../lib/server-only/auth/send-reset-password.ts | 8 +++----- .../lib/server-only/document/delete-document.ts | 7 ++----- .../lib/server-only/document/resend-document.tsx | 10 ++++------ .../server-only/document/send-completed-email.ts | 9 +++------ .../lib/server-only/document/send-document.tsx | 10 ++++------ .../server-only/document/send-pending-email.ts | 8 +++----- packages/lib/server-only/feature-flags/all.ts | 9 +++------ packages/lib/server-only/feature-flags/get.ts | 10 ++++------ .../lib/server-only/pdf/insert-text-in-pdf.ts | 2 +- packages/lib/universal/get-base-url.ts | 10 +++++----- packages/lib/universal/get-feature-flag.ts | 6 +++--- packages/lib/universal/upload/put-file.ts | 4 ++-- packages/lib/universal/upload/server-actions.ts | 8 +++++--- packages/trpc/server/auth-router/router.ts | 4 ++-- .../trpc/server/singleplayer-router/router.ts | 6 ++---- .../document/document-share-button.tsx | 13 ++++++------- 38 files changed, 129 insertions(+), 167 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/claimed/page.tsx b/apps/marketing/src/app/(marketing)/claimed/page.tsx index 931045bd2..7f85b5d2e 100644 --- a/apps/marketing/src/app/(marketing)/claimed/page.tsx +++ b/apps/marketing/src/app/(marketing)/claimed/page.tsx @@ -4,6 +4,7 @@ import { redirect } from 'next/navigation'; import { ArrowRight } from 'lucide-react'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { redis } from '@documenso/lib/server-only/redis'; import { stripe } from '@documenso/lib/server-only/stripe'; import { prisma } from '@documenso/prisma'; @@ -175,11 +176,7 @@ export default async function ClaimedPlanPage({ searchParams = {} }: ClaimedPlan This is a temporary password. Please change it as soon as possible.

- + @@ -117,7 +114,7 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => {

diff --git a/apps/marketing/src/components/(marketing)/single-player-mode/single-player-mode-success.tsx b/apps/marketing/src/components/(marketing)/single-player-mode/single-player-mode-success.tsx index 1af71c775..d8a8e2c53 100644 --- a/apps/marketing/src/components/(marketing)/single-player-mode/single-player-mode-success.tsx +++ b/apps/marketing/src/components/(marketing)/single-player-mode/single-player-mode-success.tsx @@ -6,6 +6,7 @@ import Link from 'next/link'; import signingCelebration from '@documenso/assets/images/signing-celebration.png'; import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import type { Signature } from '@documenso/prisma/client'; import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentWithRecipient } from '@documenso/prisma/types/document-with-recipient'; @@ -85,7 +86,7 @@ export const SinglePlayerModeSuccess = ({

Create a{' '} diff --git a/apps/marketing/src/components/(marketing)/widget.tsx b/apps/marketing/src/components/(marketing)/widget.tsx index 80c13b275..b0baeb5fc 100644 --- a/apps/marketing/src/components/(marketing)/widget.tsx +++ b/apps/marketing/src/components/(marketing)/widget.tsx @@ -7,6 +7,7 @@ import { zodResolver } from '@hookform/resolvers/zod'; import { AnimatePresence, motion } from 'framer-motion'; import { Loader } from 'lucide-react'; import { usePlausible } from 'next-plausible'; +import { env } from 'next-runtime-env'; import { Controller, useForm } from 'react-hook-form'; import { z } from 'zod'; @@ -144,7 +145,11 @@ export const Widget = ({ className, children, ...props }: WidgetProps) => { setTimeout(resolve, 1000); }); - const planId = process.env.NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID; + const planId = env('NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID'); + + if (!planId) { + throw new Error('No plan ID found.'); + } const claimPlanInput = signatureDataUrl ? { diff --git a/apps/marketing/src/pages/api/claim-plan/index.ts b/apps/marketing/src/pages/api/claim-plan/index.ts index 57597001e..c63a727c5 100644 --- a/apps/marketing/src/pages/api/claim-plan/index.ts +++ b/apps/marketing/src/pages/api/claim-plan/index.ts @@ -1,13 +1,15 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import type { NextApiRequest, NextApiResponse } from 'next'; import { randomUUID } from 'crypto'; -import { TEarlyAdopterCheckoutMetadataSchema } from '@documenso/ee/server-only/stripe/webhook/early-adopter-checkout-metadata'; +import type { TEarlyAdopterCheckoutMetadataSchema } from '@documenso/ee/server-only/stripe/webhook/early-adopter-checkout-metadata'; +import { NEXT_PUBLIC_MARKETING_URL, NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { redis } from '@documenso/lib/server-only/redis'; import { stripe } from '@documenso/lib/server-only/stripe'; import { prisma } from '@documenso/prisma'; -import { TClaimPlanResponseSchema, ZClaimPlanRequestSchema } from '~/api/claim-plan/types'; +import type { TClaimPlanResponseSchema } from '~/api/claim-plan/types'; +import { ZClaimPlanRequestSchema } from '~/api/claim-plan/types'; export default async function handler( req: NextApiRequest, @@ -40,7 +42,7 @@ export default async function handler( if (user) { return res.status(200).json({ - redirectUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/signin`, + redirectUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/signin`, }); } @@ -77,8 +79,8 @@ export default async function handler( mode: 'subscription', metadata, allow_promotion_codes: true, - success_url: `${process.env.NEXT_PUBLIC_MARKETING_URL}/claimed?sessionId={CHECKOUT_SESSION_ID}`, - cancel_url: `${process.env.NEXT_PUBLIC_MARKETING_URL}`, + success_url: `${NEXT_PUBLIC_MARKETING_URL()}/claimed?sessionId={CHECKOUT_SESSION_ID}`, + cancel_url: `${NEXT_PUBLIC_MARKETING_URL()}`, }); if (!checkout.url) { diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 832e255fd..2159b87f2 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -61,7 +61,7 @@ export const EditDocumentForm = ({ const { mutateAsync: setPasswordForDocument } = trpc.document.setPasswordForDocument.useMutation(); - const documentFlow: Record = { + const documentFlow: Record = { title: { title: 'Add Title', description: 'Add the title to the document.', diff --git a/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts b/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts index 7d952d599..5435aefb1 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts +++ b/apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts @@ -1,20 +1,17 @@ 'use server'; -import { env } from 'next-runtime-env'; - import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; export const createBillingPortal = async () => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const { user } = await getRequiredServerComponentSession(); const { stripeCustomer } = await getStripeCustomerByUser(user); return getPortalSession({ customerId: stripeCustomer.id, - returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/settings/billing`, }); }; diff --git a/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts b/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts index ef3fb0f30..90dd77e79 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts +++ b/apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts @@ -1,10 +1,9 @@ 'use server'; -import { env } from 'next-runtime-env'; - import { getCheckoutSession } from '@documenso/ee/server-only/stripe/get-checkout-session'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getSubscriptionsByUserId } from '@documenso/lib/server-only/subscription/get-subscriptions-by-user-id'; @@ -13,8 +12,6 @@ export type CreateCheckoutOptions = { }; export const createCheckout = async ({ priceId }: CreateCheckoutOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const session = await getRequiredServerComponentSession(); const { user, stripeCustomer } = await getStripeCustomerByUser(session.user); @@ -31,13 +28,13 @@ export const createCheckout = async ({ priceId }: CreateCheckoutOptions) => { if (foundSubscription) { return getPortalSession({ customerId: stripeCustomer.id, - returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/settings/billing`, }); } return getCheckoutSession({ customerId: stripeCustomer.id, priceId, - returnUrl: `${NEXT_PUBLIC_WEBAPP_URL}/settings/billing`, + returnUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/settings/billing`, }); }; diff --git a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx index e9977b8f3..27f39a6b1 100644 --- a/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx +++ b/apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx @@ -1,9 +1,10 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; -import { env } from 'next-runtime-env'; import { P, match } from 'ts-pattern'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; + import type { ShareHandlerAPIResponse } from '~/pages/api/share'; export const runtime = 'edge'; @@ -23,8 +24,6 @@ type SharePageOpenGraphImageProps = { }; export async function GET(_request: Request, { params: { slug } }: SharePageOpenGraphImageProps) { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const [interSemiBold, interRegular, caveatRegular, shareFrameImage] = await Promise.all([ fetch(new URL('@documenso/assets/fonts/inter-semibold.ttf', import.meta.url)).then( async (res) => res.arrayBuffer(), @@ -40,7 +39,7 @@ export async function GET(_request: Request, { params: { slug } }: SharePageOpen ), ]); - const baseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const baseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const recipientOrSender: ShareHandlerAPIResponse = await fetch( new URL(`/api/share?slug=${slug}`, baseUrl), diff --git a/apps/web/src/app/(share)/share/[slug]/page.tsx b/apps/web/src/app/(share)/share/[slug]/page.tsx index ab530ba0b..80d991934 100644 --- a/apps/web/src/app/(share)/share/[slug]/page.tsx +++ b/apps/web/src/app/(share)/share/[slug]/page.tsx @@ -2,9 +2,7 @@ import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; -import { env } from 'next-runtime-env'; - -import { APP_BASE_URL } from '@documenso/lib/constants/app'; +import { APP_BASE_URL, NEXT_PUBLIC_MARKETING_URL } from '@documenso/lib/constants/app'; type SharePageProps = { params: { slug: string }; @@ -18,20 +16,18 @@ export function generateMetadata({ params: { slug } }: SharePageProps) { title: 'Documenso - Join the open source signing revolution', description: 'I just signed with Documenso!', type: 'website', - images: [`${APP_BASE_URL}/share/${slug}/opengraph`], + images: [`${APP_BASE_URL()}/share/${slug}/opengraph`], }, twitter: { site: '@documenso', card: 'summary_large_image', - images: [`${APP_BASE_URL}/share/${slug}/opengraph`], + images: [`${APP_BASE_URL()}/share/${slug}/opengraph`], description: 'I just signed with Documenso!', }, } satisfies Metadata; } export default function SharePage() { - const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); - const userAgent = headers().get('User-Agent') ?? ''; // https://stackoverflow.com/questions/47026171/how-to-detect-bots-for-open-graph-with-user-agent @@ -39,5 +35,5 @@ export default function SharePage() { return null; } - redirect(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001'); + redirect(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001'); } diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 1e6619a46..606aa0f10 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -2,10 +2,11 @@ import { Suspense } from 'react'; import { Caveat, Inter } from 'next/font/google'; -import { PublicEnvScript, env } from 'next-runtime-env'; +import { PublicEnvScript } from 'next-runtime-env'; import { FeatureFlagProvider } from '@documenso/lib/client-only/providers/feature-flag'; import { LocaleProvider } from '@documenso/lib/client-only/providers/locale'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { getServerComponentAllFlags } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag'; import { getLocale } from '@documenso/lib/server-only/headers/get-locale'; import { TrpcProvider } from '@documenso/trpc/react'; @@ -21,8 +22,6 @@ import './globals.css'; const fontInter = Inter({ subsets: ['latin'], variable: '--font-sans' }); const fontCaveat = Caveat({ subsets: ['latin'], variable: '--font-signature' }); -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - export const metadata = { title: { template: '%s - Documenso', @@ -39,12 +38,12 @@ export const metadata = { description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', type: 'website', - images: [`${NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], + images: [`${NEXT_PUBLIC_WEBAPP_URL()}/opengraph-image.jpg`], }, twitter: { site: '@documenso', card: 'summary_large_image', - images: [`${NEXT_PUBLIC_WEBAPP_URL}/opengraph-image.jpg`], + images: [`${NEXT_PUBLIC_WEBAPP_URL()}/opengraph-image.jpg`], description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', }, diff --git a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx index 727627ddd..a809ed23e 100644 --- a/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx +++ b/apps/web/src/components/(dashboard)/avatar/avatar-with-recipient.tsx @@ -2,10 +2,9 @@ import React from 'react'; -import { env } from 'next-runtime-env'; - import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; import type { Recipient } from '@documenso/prisma/client'; import { cn } from '@documenso/ui/lib/utils'; @@ -18,8 +17,6 @@ export type AvatarWithRecipientProps = { }; export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const [, copy] = useCopyToClipboard(); const { toast } = useToast(); @@ -28,7 +25,7 @@ export function AvatarWithRecipient({ recipient }: AvatarWithRecipientProps) { return; } - void copy(`${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`).then(() => { + void copy(`${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`).then(() => { toast({ title: 'Copied to clipboard', description: 'The signing link has been copied to your clipboard.', diff --git a/apps/web/src/helpers/get-asset-buffer.ts b/apps/web/src/helpers/get-asset-buffer.ts index 12c27d1a5..871e669b1 100644 --- a/apps/web/src/helpers/get-asset-buffer.ts +++ b/apps/web/src/helpers/get-asset-buffer.ts @@ -1,4 +1,4 @@ -import { env } from 'next-runtime-env'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; /** * getAssetBuffer is used to retrieve array buffers for various assets @@ -10,9 +10,7 @@ import { env } from 'next-runtime-env'; * @param path The path to the asset, relative to the `public` folder. */ export const getAssetBuffer = async (path: string) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - - const baseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const baseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; return fetch(new URL(path, baseUrl)).then(async (res) => res.arrayBuffer()); }; diff --git a/packages/ee/server-only/limits/client.ts b/packages/ee/server-only/limits/client.ts index 9bb2bd0ac..fa31e6e40 100644 --- a/packages/ee/server-only/limits/client.ts +++ b/packages/ee/server-only/limits/client.ts @@ -11,7 +11,7 @@ export type GetLimitsOptions = { export const getLimits = async ({ headers }: GetLimitsOptions = {}) => { const requestHeaders = headers ?? {}; - const url = new URL('/api/limits', APP_BASE_URL ?? 'http://localhost:3000'); + const url = new URL('/api/limits', APP_BASE_URL() ?? 'http://localhost:3000'); return fetch(url, { headers: { diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index cee5a7586..0675bb84b 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -1,12 +1,13 @@ import { env } from 'next-runtime-env'; -const NEXT_PUBLIC_PROJECT = process.env.NEXT_PUBLIC_PROJECT; -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); -const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); +export const NEXT_PUBLIC_PROJECT = () => env('NEXT_PUBLIC_PROJECT'); +export const NEXT_PUBLIC_WEBAPP_URL = () => env('NEXT_PUBLIC_WEBAPP_URL'); +export const NEXT_PUBLIC_MARKETING_URL = () => env('NEXT_PUBLIC_MARKETING_URL'); -export const IS_APP_MARKETING = NEXT_PUBLIC_PROJECT === 'marketing'; -export const IS_APP_WEB = NEXT_PUBLIC_PROJECT === 'web'; +export const IS_APP_MARKETING = () => NEXT_PUBLIC_PROJECT() === 'marketing'; +export const IS_APP_WEB = () => NEXT_PUBLIC_PROJECT() === 'web'; -export const APP_FOLDER = IS_APP_MARKETING ? 'marketing' : 'web'; +export const APP_FOLDER = () => (IS_APP_MARKETING() ? 'marketing' : 'web'); -export const APP_BASE_URL = IS_APP_WEB ? NEXT_PUBLIC_WEBAPP_URL : NEXT_PUBLIC_MARKETING_URL; +export const APP_BASE_URL = () => + IS_APP_WEB() ? NEXT_PUBLIC_WEBAPP_URL() : NEXT_PUBLIC_MARKETING_URL(); diff --git a/packages/lib/constants/crypto.ts b/packages/lib/constants/crypto.ts index 40d3ef113..74f306a53 100644 --- a/packages/lib/constants/crypto.ts +++ b/packages/lib/constants/crypto.ts @@ -2,15 +2,15 @@ export const DOCUMENSO_ENCRYPTION_KEY = process.env.NEXT_PRIVATE_ENCRYPTION_KEY; export const DOCUMENSO_ENCRYPTION_SECONDARY_KEY = process.env.NEXT_PRIVATE_ENCRYPTION_SECONDARY_KEY; -if (!DOCUMENSO_ENCRYPTION_KEY || !DOCUMENSO_ENCRYPTION_SECONDARY_KEY) { - throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY or DOCUMENSO_ENCRYPTION_SECONDARY_KEY keys'); -} +// if (!DOCUMENSO_ENCRYPTION_KEY || !DOCUMENSO_ENCRYPTION_SECONDARY_KEY) { +// throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY or DOCUMENSO_ENCRYPTION_SECONDARY_KEY keys'); +// } -if (DOCUMENSO_ENCRYPTION_KEY === DOCUMENSO_ENCRYPTION_SECONDARY_KEY) { - throw new Error( - 'DOCUMENSO_ENCRYPTION_KEY and DOCUMENSO_ENCRYPTION_SECONDARY_KEY cannot be equal', - ); -} +// if (DOCUMENSO_ENCRYPTION_KEY === DOCUMENSO_ENCRYPTION_SECONDARY_KEY) { +// throw new Error( +// 'DOCUMENSO_ENCRYPTION_KEY and DOCUMENSO_ENCRYPTION_SECONDARY_KEY cannot be equal', +// ); +// } if (DOCUMENSO_ENCRYPTION_KEY === 'CAFEBABE') { console.warn('*********************************************************************'); diff --git a/packages/lib/constants/feature-flags.ts b/packages/lib/constants/feature-flags.ts index a0e958e3a..d33db549e 100644 --- a/packages/lib/constants/feature-flags.ts +++ b/packages/lib/constants/feature-flags.ts @@ -2,8 +2,8 @@ import { env } from 'next-runtime-env'; import { APP_BASE_URL } from './app'; -const NEXT_PUBLIC_FEATURE_BILLING_ENABLED = env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED'); -const NEXT_PUBLIC_POSTHOG_KEY = env('NEXT_PUBLIC_POSTHOG_KEY'); +const NEXT_PUBLIC_FEATURE_BILLING_ENABLED = () => env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED'); +const NEXT_PUBLIC_POSTHOG_KEY = () => env('NEXT_PUBLIC_POSTHOG_KEY'); /** * The flag name for global session recording feature flag. @@ -21,7 +21,7 @@ export const FEATURE_FLAG_POLL_INTERVAL = 30000; * Does not take any person or group properties into account. */ export const LOCAL_FEATURE_FLAGS: Record = { - app_billing: NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true', + app_billing: NEXT_PUBLIC_FEATURE_BILLING_ENABLED() === 'true', marketing_header_single_player_mode: false, } as const; @@ -29,8 +29,8 @@ export const LOCAL_FEATURE_FLAGS: Record = { * Extract the PostHog configuration from the environment. */ export function extractPostHogConfig(): { key: string; host: string } | null { - const postHogKey = NEXT_PUBLIC_POSTHOG_KEY; - const postHogHost = `${APP_BASE_URL}/ingest`; + const postHogKey = NEXT_PUBLIC_POSTHOG_KEY(); + const postHogHost = `${APP_BASE_URL()}/ingest`; if (!postHogKey || !postHogHost) { return null; diff --git a/packages/lib/constants/pdf.ts b/packages/lib/constants/pdf.ts index eba72ab56..19663ef58 100644 --- a/packages/lib/constants/pdf.ts +++ b/packages/lib/constants/pdf.ts @@ -6,4 +6,4 @@ export const DEFAULT_HANDWRITING_FONT_SIZE = 50; export const MIN_STANDARD_FONT_SIZE = 8; export const MIN_HANDWRITING_FONT_SIZE = 20; -export const CAVEAT_FONT_PATH = `${APP_BASE_URL}/fonts/caveat.ttf`; +export const CAVEAT_FONT_PATH = () => `${APP_BASE_URL()}/fonts/caveat.ttf`; diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 4823833cc..8f324d248 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -17,8 +17,6 @@ import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa import { getUserByEmail } from '../server-only/user/get-user-by-email'; import { ErrorCode } from './error-codes'; -const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); - export const NEXT_AUTH_OPTIONS: AuthOptions = { adapter: PrismaAdapter(prisma), secret: process.env.NEXTAUTH_SECRET ?? 'secret', @@ -186,7 +184,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { async signIn({ user }) { // We do this to stop OAuth providers from creating an account // when signups are disabled - if (NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { + if (env('NEXT_PUBLIC_DISABLE_SIGNUP') === 'true') { const userData = await getUserByEmail({ email: user.email! }); return !!userData; diff --git a/packages/lib/server-only/auth/send-confirmation-email.ts b/packages/lib/server-only/auth/send-confirmation-email.ts index c808e8f3d..3e1ac920d 100644 --- a/packages/lib/server-only/auth/send-confirmation-email.ts +++ b/packages/lib/server-only/auth/send-confirmation-email.ts @@ -1,20 +1,19 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ConfirmEmailTemplate } from '@documenso/email/templates/confirm-email'; import { prisma } from '@documenso/prisma'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export interface SendConfirmationEmailProps { userId: number; } export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailProps) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const NEXT_PRIVATE_SMTP_FROM_NAME = env('NEXT_PRIVATE_SMTP_FROM_NAME'); - const NEXT_PRIVATE_SMTP_FROM_ADDRESS = env('NEXT_PRIVATE_SMTP_FROM_ADDRESS'); + const NEXT_PRIVATE_SMTP_FROM_NAME = process.env.NEXT_PRIVATE_SMTP_FROM_NAME; + const NEXT_PRIVATE_SMTP_FROM_ADDRESS = process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS; const user = await prisma.user.findFirstOrThrow({ where: { @@ -36,7 +35,7 @@ export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailPro throw new Error('Verification token not found for the user'); } - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const confirmationLink = `${assetBaseUrl}/verify-email/${verificationToken.token}`; const senderName = NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso'; const senderAdress = NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com'; diff --git a/packages/lib/server-only/auth/send-forgot-password.ts b/packages/lib/server-only/auth/send-forgot-password.ts index 125db9338..6e3a582a8 100644 --- a/packages/lib/server-only/auth/send-forgot-password.ts +++ b/packages/lib/server-only/auth/send-forgot-password.ts @@ -1,19 +1,17 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ForgotPasswordTemplate } from '@documenso/email/templates/forgot-password'; import { prisma } from '@documenso/prisma'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export interface SendForgotPasswordOptions { userId: number; } export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -33,8 +31,8 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) } const token = user.PasswordResetToken[0].token; - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const resetPasswordLink = `${NEXT_PUBLIC_WEBAPP_URL}/reset-password/${token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; + const resetPasswordLink = `${NEXT_PUBLIC_WEBAPP_URL()}/reset-password/${token}`; const template = createElement(ForgotPasswordTemplate, { assetBaseUrl, diff --git a/packages/lib/server-only/auth/send-reset-password.ts b/packages/lib/server-only/auth/send-reset-password.ts index 3dcec113c..6bcd5820d 100644 --- a/packages/lib/server-only/auth/send-reset-password.ts +++ b/packages/lib/server-only/auth/send-reset-password.ts @@ -1,26 +1,24 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { ResetPasswordTemplate } from '@documenso/email/templates/reset-password'; import { prisma } from '@documenso/prisma'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export interface SendResetPasswordOptions { userId: number; } export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const user = await prisma.user.findFirstOrThrow({ where: { id: userId, }, }); - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const template = createElement(ResetPasswordTemplate, { assetBaseUrl, diff --git a/packages/lib/server-only/document/delete-document.ts b/packages/lib/server-only/document/delete-document.ts index 58b1f48a9..a5cf96cdd 100644 --- a/packages/lib/server-only/document/delete-document.ts +++ b/packages/lib/server-only/document/delete-document.ts @@ -2,14 +2,13 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import DocumentCancelTemplate from '@documenso/email/templates/document-cancel'; import { prisma } from '@documenso/prisma'; import { DocumentStatus } from '@documenso/prisma/client'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { FROM_ADDRESS, FROM_NAME } from '../../constants/email'; export type DeleteDocumentOptions = { @@ -18,8 +17,6 @@ export type DeleteDocumentOptions = { status: DocumentStatus; }; -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - export const deleteDocument = async ({ id, userId, status }: DeleteDocumentOptions) => { // if the document is a draft, hard-delete if (status === DocumentStatus.DRAFT) { @@ -53,7 +50,7 @@ export const deleteDocument = async ({ id, userId, status }: DeleteDocumentOptio if (document.Recipient.length > 0) { await Promise.all( document.Recipient.map(async (recipient) => { - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const template = createElement(DocumentCancelTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index a048cf600..85e148a57 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -1,7 +1,5 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; @@ -10,14 +8,14 @@ import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-em import { prisma } from '@documenso/prisma'; import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export type ResendDocumentOptions = { documentId: number; userId: number; recipients: number[]; }; -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - export const resendDocument = async ({ documentId, userId, recipients }: ResendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { @@ -71,8 +69,8 @@ export const resendDocument = async ({ documentId, userId, recipients }: ResendD 'document.name': document.title, }; - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; + const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`; const template = createElement(DocumentInviteEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 9b624a23c..c7134d164 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -1,12 +1,11 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentCompletedEmailTemplate } from '@documenso/email/templates/document-completed'; import { prisma } from '@documenso/prisma'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { getFile } from '../../universal/upload/get-file'; export interface SendDocumentOptions { @@ -14,8 +13,6 @@ export interface SendDocumentOptions { } export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const document = await prisma.document.findUnique({ where: { id: documentId, @@ -40,12 +37,12 @@ export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => document.Recipient.map(async (recipient) => { const { email, name, token } = recipient; - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const template = createElement(DocumentCompletedEmailTemplate, { documentName: document.title, assetBaseUrl, - downloadLink: `${NEXT_PUBLIC_WEBAPP_URL}/sign/${token}/complete`, + downloadLink: `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${token}/complete`, }); await mailer.sendMail({ diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index f72c79792..86f610cc9 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -1,7 +1,5 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; @@ -10,14 +8,14 @@ import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-em import { prisma } from '@documenso/prisma'; import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export type SendDocumentOptions = { documentId: number; userId: number; }; export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const user = await prisma.user.findFirstOrThrow({ where: { id: userId, @@ -63,8 +61,8 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) return; } - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; - const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; + const signDocumentLink = `${NEXT_PUBLIC_WEBAPP_URL()}/sign/${recipient.token}`; const template = createElement(DocumentInviteEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/document/send-pending-email.ts b/packages/lib/server-only/document/send-pending-email.ts index abbecd72a..73e938a7d 100644 --- a/packages/lib/server-only/document/send-pending-email.ts +++ b/packages/lib/server-only/document/send-pending-email.ts @@ -1,20 +1,18 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; - import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentPendingEmailTemplate } from '@documenso/email/templates/document-pending'; import { prisma } from '@documenso/prisma'; +import { NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + export interface SendPendingEmailOptions { documentId: number; recipientId: number; } export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingEmailOptions) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const document = await prisma.document.findFirst({ where: { id: documentId, @@ -45,7 +43,7 @@ export const sendPendingEmail = async ({ documentId, recipientId }: SendPendingE const { email, name } = recipient; - const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; const template = createElement(DocumentPendingEmailTemplate, { documentName: document.title, diff --git a/packages/lib/server-only/feature-flags/all.ts b/packages/lib/server-only/feature-flags/all.ts index fff6cd855..71efd5425 100644 --- a/packages/lib/server-only/feature-flags/all.ts +++ b/packages/lib/server-only/feature-flags/all.ts @@ -1,20 +1,17 @@ import { NextRequest, NextResponse } from 'next/server'; import { getToken } from 'next-auth/jwt'; -import { env } from 'next-runtime-env'; import { LOCAL_FEATURE_FLAGS } from '@documenso/lib/constants/feature-flags'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; +import { NEXT_PUBLIC_MARKETING_URL, NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; import { extractDistinctUserId, mapJwtToFlagProperties } from './get'; /** * Get all the evaluated feature flags based on the current user if possible. */ export default async function handlerFeatureFlagAll(req: Request) { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); - const requestHeaders = Object.fromEntries(req.headers.entries()); const nextReq = new NextRequest(req, { @@ -42,11 +39,11 @@ export default async function handlerFeatureFlagAll(req: Request) { const origin = req.headers.get('origin'); if (origin) { - if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { + if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL() ?? 'http://localhost:3000')) { res.headers.set('Access-Control-Allow-Origin', origin); } - if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { + if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001')) { res.headers.set('Access-Control-Allow-Origin', origin); } } diff --git a/packages/lib/server-only/feature-flags/get.ts b/packages/lib/server-only/feature-flags/get.ts index 6f8a2c011..5b2b3b7fd 100644 --- a/packages/lib/server-only/feature-flags/get.ts +++ b/packages/lib/server-only/feature-flags/get.ts @@ -3,11 +3,12 @@ import { NextRequest, NextResponse } from 'next/server'; import { nanoid } from 'nanoid'; import type { JWT } from 'next-auth/jwt'; import { getToken } from 'next-auth/jwt'; -import { env } from 'next-runtime-env'; import { LOCAL_FEATURE_FLAGS, extractPostHogConfig } from '@documenso/lib/constants/feature-flags'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; +import { NEXT_PUBLIC_MARKETING_URL, NEXT_PUBLIC_WEBAPP_URL } from '../../constants/app'; + /** * Evaluate a single feature flag based on the current user if possible. * @@ -15,9 +16,6 @@ import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-po * @returns A Response with the feature flag value. */ export default async function handleFeatureFlagGet(req: Request) { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - const NEXT_PUBLIC_MARKETING_URL = env('NEXT_PUBLIC_MARKETING_URL'); - const { searchParams } = new URL(req.url ?? ''); const flag = searchParams.get('flag'); @@ -62,11 +60,11 @@ export default async function handleFeatureFlagGet(req: Request) { const origin = req.headers.get('Origin'); if (origin) { - if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000')) { + if (origin.startsWith(NEXT_PUBLIC_WEBAPP_URL() ?? 'http://localhost:3000')) { res.headers.set('Access-Control-Allow-Origin', origin); } - if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001')) { + if (origin.startsWith(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001')) { res.headers.set('Access-Control-Allow-Origin', origin); } } diff --git a/packages/lib/server-only/pdf/insert-text-in-pdf.ts b/packages/lib/server-only/pdf/insert-text-in-pdf.ts index 248702b6e..d5120341c 100644 --- a/packages/lib/server-only/pdf/insert-text-in-pdf.ts +++ b/packages/lib/server-only/pdf/insert-text-in-pdf.ts @@ -12,7 +12,7 @@ export async function insertTextInPDF( useHandwritingFont = true, ): Promise { // Fetch the font file from the public URL. - const fontResponse = await fetch(CAVEAT_FONT_PATH); + const fontResponse = await fetch(CAVEAT_FONT_PATH()); const fontCaveat = await fontResponse.arrayBuffer(); const pdfDoc = await PDFDocument.load(pdfAsBase64); diff --git a/packages/lib/universal/get-base-url.ts b/packages/lib/universal/get-base-url.ts index b7c9d4ea4..7f9380047 100644 --- a/packages/lib/universal/get-base-url.ts +++ b/packages/lib/universal/get-base-url.ts @@ -1,7 +1,5 @@ /* eslint-disable turbo/no-undeclared-env-vars */ -import { env } from 'next-runtime-env'; - -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); +import { NEXT_PUBLIC_WEBAPP_URL } from '../constants/app'; export const getBaseUrl = () => { if (typeof window !== 'undefined') { @@ -12,8 +10,10 @@ export const getBaseUrl = () => { return `https://${process.env.VERCEL_URL}`; } - if (NEXT_PUBLIC_WEBAPP_URL) { - return NEXT_PUBLIC_WEBAPP_URL; + const webAppUrl = NEXT_PUBLIC_WEBAPP_URL(); + + if (webAppUrl) { + return webAppUrl; } return `http://localhost:${process.env.PORT ?? 3000}`; diff --git a/packages/lib/universal/get-feature-flag.ts b/packages/lib/universal/get-feature-flag.ts index 0fc0aa131..f4650f691 100644 --- a/packages/lib/universal/get-feature-flag.ts +++ b/packages/lib/universal/get-feature-flag.ts @@ -22,7 +22,7 @@ export const getFlag = async ( return LOCAL_FEATURE_FLAGS[flag] ?? true; } - const url = new URL(`${APP_BASE_URL}/api/feature-flag/get`); + const url = new URL(`${APP_BASE_URL()}/api/feature-flag/get`); url.searchParams.set('flag', flag); const response = await fetch(url, { @@ -55,7 +55,7 @@ export const getAllFlags = async ( return LOCAL_FEATURE_FLAGS; } - const url = new URL(`${APP_BASE_URL}/api/feature-flag/all`); + const url = new URL(`${APP_BASE_URL()}/api/feature-flag/all`); return fetch(url, { headers: { @@ -80,7 +80,7 @@ export const getAllAnonymousFlags = async (): Promise Promise; }; -const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); - export const putFile = async (file: File) => { + const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); + const { type, data } = await match(NEXT_PUBLIC_UPLOAD_TRANSPORT) .with('s3', async () => putFileInS3(file)) .otherwise(async () => putFileInDatabase(file)); diff --git a/packages/lib/universal/upload/server-actions.ts b/packages/lib/universal/upload/server-actions.ts index 61429cd86..fd4bfc57a 100644 --- a/packages/lib/universal/upload/server-actions.ts +++ b/packages/lib/universal/upload/server-actions.ts @@ -18,8 +18,6 @@ import { APP_BASE_URL } from '../../constants/app'; import { ONE_HOUR, ONE_SECOND } from '../../constants/time'; import { alphaid } from '../id'; -const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); - export const getPresignPostUrl = async (fileName: string, contentType: string) => { const client = getS3Client(); @@ -28,8 +26,10 @@ export const getPresignPostUrl = async (fileName: string, contentType: string) = let token: JWT | null = null; try { + const baseUrl = APP_BASE_URL() ?? 'http://localhost:3000'; + token = await getToken({ - req: new NextRequest(APP_BASE_URL ?? 'http://localhost:3000', { + req: new NextRequest(baseUrl, { headers: headers(), }), }); @@ -120,6 +120,8 @@ export const deleteS3File = async (key: string) => { }; const getS3Client = () => { + const NEXT_PUBLIC_UPLOAD_TRANSPORT = env('NEXT_PUBLIC_UPLOAD_TRANSPORT'); + if (NEXT_PUBLIC_UPLOAD_TRANSPORT !== 's3') { throw new Error('Invalid upload transport'); } diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts index 0debd7f8d..65fe8d296 100644 --- a/packages/trpc/server/auth-router/router.ts +++ b/packages/trpc/server/auth-router/router.ts @@ -9,12 +9,12 @@ import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-conf import { authenticatedProcedure, procedure, router } from '../trpc'; import { ZSignUpMutationSchema, ZVerifyPasswordMutationSchema } from './schema'; -const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); +const NEXT_PUBLIC_DISABLE_SIGNUP = () => env('NEXT_PUBLIC_DISABLE_SIGNUP'); export const authRouter = router({ signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => { try { - if (NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { + if (NEXT_PUBLIC_DISABLE_SIGNUP() === 'true') { throw new TRPCError({ code: 'BAD_REQUEST', message: 'Signups are disabled.', diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index cb92aa7a4..4b4c12c0a 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -1,11 +1,11 @@ import { createElement } from 'react'; -import { env } from 'next-runtime-env'; import { PDFDocument } from 'pdf-lib'; import { mailer } from '@documenso/email/mailer'; import { renderAsync } from '@documenso/email/render'; import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email'; import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in-pdf'; import { alphaid } from '@documenso/lib/universal/id'; @@ -25,8 +25,6 @@ import { procedure, router } from '../trpc'; import { mapField } from './helper'; import { ZCreateSinglePlayerDocumentMutationSchema } from './schema'; -const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); - export const singleplayerRouter = router({ createSinglePlayerDocument: procedure .input(ZCreateSinglePlayerDocumentMutationSchema) @@ -151,7 +149,7 @@ export const singleplayerRouter = router({ const template = createElement(DocumentSelfSignedEmailTemplate, { documentName: documentName, - assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', + assetBaseUrl: NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000', }); const [html, text] = await Promise.all([ diff --git a/packages/ui/components/document/document-share-button.tsx b/packages/ui/components/document/document-share-button.tsx index f304d92c0..e20e677c7 100644 --- a/packages/ui/components/document/document-share-button.tsx +++ b/packages/ui/components/document/document-share-button.tsx @@ -4,10 +4,10 @@ import type { HTMLAttributes } from 'react'; import React, { useState } from 'react'; import { Copy, Sparkles } from 'lucide-react'; -import { env } from 'next-runtime-env'; import { FaXTwitter } from 'react-icons/fa6'; import { useCopyShareLink } from '@documenso/lib/client-only/hooks/use-copy-share-link'; +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; import { TOAST_DOCUMENT_SHARE_ERROR, TOAST_DOCUMENT_SHARE_SUCCESS, @@ -39,7 +39,6 @@ export const DocumentShareButton = ({ className, trigger, }: DocumentShareButtonProps) => { - const NEXT_PUBLIC_WEBAPP_URL = env('NEXT_PUBLIC_WEBAPP_URL'); const { toast } = useToast(); const { copyShareLink, createAndCopyShareLink, isCopyingShareLink } = useCopyShareLink({ @@ -70,7 +69,7 @@ export const DocumentShareButton = ({ const onCopyClick = async () => { if (shareLink) { - await copyShareLink(`${NEXT_PUBLIC_WEBAPP_URL}/share/${shareLink.slug}`); + await copyShareLink(`${NEXT_PUBLIC_WEBAPP_URL()}/share/${shareLink.slug}`); } else { await createAndCopyShareLink({ token, @@ -94,7 +93,7 @@ export const DocumentShareButton = ({ } // Ensuring we've prewarmed the opengraph image for the Twitter - await fetch(`${NEXT_PUBLIC_WEBAPP_URL}/share/${slug}/opengraph`, { + await fetch(`${NEXT_PUBLIC_WEBAPP_URL()}/share/${slug}/opengraph`, { // We don't care about the response, so we can use no-cors mode: 'no-cors', }); @@ -102,7 +101,7 @@ export const DocumentShareButton = ({ window.open( generateTwitterIntent( `I just ${token ? 'signed' : 'sent'} a document in style with @documenso. Check it out!`, - `${NEXT_PUBLIC_WEBAPP_URL}/share/${slug}`, + `${NEXT_PUBLIC_WEBAPP_URL()}/share/${slug}`, ), '_blank', ); @@ -150,7 +149,7 @@ export const DocumentShareButton = ({ 'animate-pulse': !shareLink?.slug, })} > - {NEXT_PUBLIC_WEBAPP_URL}/share/{shareLink?.slug || '...'} + {NEXT_PUBLIC_WEBAPP_URL()}/share/{shareLink?.slug || '...'}

{shareLink?.slug && ( sharing link From 3541a805e5477570396fa8cfab59429946c9ff75 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 31 Jan 2024 18:16:07 +0530 Subject: [PATCH 16/61] chore: add migration file Signed-off-by: Adithya Krishna --- .../20240131120410_add_document_meta_redirect_url/migration.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql diff --git a/packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql b/packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql new file mode 100644 index 000000000..0eb8a1175 --- /dev/null +++ b/packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "DocumentMeta" ADD COLUMN "redirectUrl" TEXT; From f4c24fd9441fb8ff2224b0ef73dc6a019baf802f Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 31 Jan 2024 18:17:43 +0530 Subject: [PATCH 17/61] feat: add a feature for redirecting users on signing Signed-off-by: Adithya Krishna --- .../documents/[id]/edit-document.tsx | 5 ++-- .../document-meta/upsert-document-meta.ts | 8 +++++-- packages/prisma/schema.prisma | 1 + .../trpc/server/document-router/router.ts | 3 ++- .../trpc/server/document-router/schema.ts | 1 + .../primitives/document-flow/add-subject.tsx | 24 ++++++++++++++++++- .../document-flow/add-subject.types.ts | 1 + 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 2159b87f2..546452352 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -149,7 +149,7 @@ export const EditDocumentForm = ({ }; const onAddSubjectFormSubmit = async (data: TAddSubjectFormSchema) => { - const { subject, message, timezone, dateFormat } = data.meta; + const { subject, message, timezone, dateFormat, redirectUrl } = data.meta; try { await sendDocument({ @@ -157,8 +157,9 @@ export const EditDocumentForm = ({ meta: { subject, message, - timezone, dateFormat, + timezone, + redirectUrl, }, }); diff --git a/packages/lib/server-only/document-meta/upsert-document-meta.ts b/packages/lib/server-only/document-meta/upsert-document-meta.ts index b67c6848b..b5e1dc553 100644 --- a/packages/lib/server-only/document-meta/upsert-document-meta.ts +++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts @@ -9,6 +9,7 @@ export type CreateDocumentMetaOptions = { timezone?: string; password?: string; dateFormat?: string; + redirectUrl?: string; userId: number; }; @@ -20,6 +21,7 @@ export const upsertDocumentMeta = async ({ documentId, userId, password, + redirectUrl, }: CreateDocumentMetaOptions) => { await prisma.document.findFirstOrThrow({ where: { @@ -35,17 +37,19 @@ export const upsertDocumentMeta = async ({ create: { subject, message, + password, dateFormat, timezone, - password, documentId, + redirectUrl, }, update: { subject, message, - dateFormat, password, + dateFormat, timezone, + redirectUrl, }, }); }; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index e1549e072..35da3dbd6 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -166,6 +166,7 @@ model DocumentMeta { dateFormat String? @db.Text @default("yyyy-MM-dd hh:mm a") documentId Int @unique document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) + redirectUrl String? @db.Text } enum ReadStatus { diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index 9dba63797..304788525 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -216,13 +216,14 @@ export const documentRouter = router({ try { const { documentId, meta } = input; - if (meta.message || meta.subject || meta.timezone || meta.dateFormat) { + if (meta.message || meta.subject || meta.timezone || meta.dateFormat || meta.redirectUrl) { await upsertDocumentMeta({ documentId, subject: meta.subject, message: meta.message, dateFormat: meta.dateFormat, timezone: meta.timezone, + redirectUrl: meta.redirectUrl, userId: ctx.user.id, }); } diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index c4389bdfb..ddf945bfe 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -70,6 +70,7 @@ export const ZSendDocumentMutationSchema = z.object({ message: z.string(), timezone: z.string(), dateFormat: z.string(), + redirectUrl: z.string().optional(), }), }); diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index 8fef8af7b..2b361e7fa 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -60,7 +60,6 @@ export const AddSubjectFormPartial = ({ register, handleSubmit, formState: { errors, isSubmitting, touchedFields }, - getValues, setValue, } = useForm({ defaultValues: { @@ -69,6 +68,7 @@ export const AddSubjectFormPartial = ({ message: document.documentMeta?.message ?? '', timezone: document.documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, dateFormat: document.documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, + redirectUrl: document.documentMeta?.redirectUrl ?? '', }, }, }); @@ -214,6 +214,28 @@ export const AddSubjectFormPartial = ({ )} />
+ +
+
+
+ + + + + +
+
+
diff --git a/packages/ui/primitives/document-flow/add-subject.types.ts b/packages/ui/primitives/document-flow/add-subject.types.ts index ea14f4c0f..285b8f813 100644 --- a/packages/ui/primitives/document-flow/add-subject.types.ts +++ b/packages/ui/primitives/document-flow/add-subject.types.ts @@ -9,6 +9,7 @@ export const ZAddSubjectFormSchema = z.object({ message: z.string(), timezone: z.string().optional().default(DEFAULT_DOCUMENT_TIME_ZONE), dateFormat: z.string().optional().default(DEFAULT_DOCUMENT_DATE_FORMAT), + redirectUrl: z.string().optional(), }), }); From 9c4ec34a3c8a9fb6a190752538420809a1f60d37 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 2 Feb 2024 04:00:28 +0000 Subject: [PATCH 18/61] fix: add precommit step for .well-known --- .husky/pre-commit | 12 + .../marketing/public/.well-known/security.txt | 6 + apps/marketing/public/pdf.worker.min.js | 56591 +--------------- apps/web/public/.well-known/security.txt | 6 + lint-staged.config.cjs | 6 +- scripts/copy-pdfjs.cjs | 1 + scripts/copy-wellknown.cjs | 16 + 7 files changed, 45 insertions(+), 56593 deletions(-) create mode 100644 apps/marketing/public/.well-known/security.txt create mode 100644 apps/web/public/.well-known/security.txt create mode 100644 scripts/copy-wellknown.cjs diff --git a/.husky/pre-commit b/.husky/pre-commit index d24fdfc60..3d805e3cf 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,16 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" +SCRIPT_DIR="$(readlink -f "$(dirname "$0")")" +MONOREPO_ROOT="$(readlink -f "$SCRIPT_DIR/../")" + +echo "Copying pdf.js" +npm run copy:pdfjs --workspace apps/** + +echo "Copying .well-known/ contents" +node "$MONOREPO_ROOT/scripts/copy-wellknown.cjs" + +git add "$MONOREPO_ROOT/apps/web/public/" +git add "$MONOREPO_ROOT/apps/marketing/public/" + npx lint-staged diff --git a/apps/marketing/public/.well-known/security.txt b/apps/marketing/public/.well-known/security.txt new file mode 100644 index 000000000..0b00c7123 --- /dev/null +++ b/apps/marketing/public/.well-known/security.txt @@ -0,0 +1,6 @@ +# General Issues +Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml +# Report critical issues privately, to let us take appropriate action before publishing +Contact: mailto:security@documenso.com +Preferred-Languages: en +Canonical: https://documenso.com/.well-known/security.txt diff --git a/apps/marketing/public/pdf.worker.min.js b/apps/marketing/public/pdf.worker.min.js index 3b79c94ef..3099f8071 100644 --- a/apps/marketing/public/pdf.worker.min.js +++ b/apps/marketing/public/pdf.worker.min.js @@ -19,56593 +19,4 @@ * @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), - i = a(3), - n = a(4), - s = a(6), - o = a(71), - c = a(65), - l = a(102), - h = a(103), - u = a(104); - class WorkerTask { - constructor(e) { - this.name = e; - this.terminated = !1; - this._capability = new r.PromiseCapability(); - } - 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 (t) { - if (!a) { - a = !0; - e.send('test', t instanceof Uint8Array); - } - }); - e.on('configure', function (e) { - (0, r.setVerbosityLevel)(e.verbosity); - }); - e.on('GetDocRequest', function (e) { - return WorkerMessageHandler.createDocumentHandler(e, t); - }); - } - static createDocumentHandler(e, t) { - let a, - d = !1, - f = null; - const g = new Set(), - p = (0, r.getVerbosityLevel)(), - { docId: m, apiVersion: b } = e, - y = '3.6.172'; - if (b !== y) - throw new Error(`The API version "${b}" does not match the Worker version "${y}".`); - const w = []; - for (const e in []) w.push(e); - if (w.length) - throw new Error( - 'The `Array.prototype` contains unexpected enumerable properties: ' + - w.join(', ') + - '; thus breaking e.g. `for...in` iteration of `Array`s.', - ); - if ( - (l.isNodeJS && 'undefined' == typeof Path2D) || - 'undefined' == typeof ReadableStream - ) { - const e = - 'The browser/environment lacks native support for critical functionality used by the PDF.js library (e.g. `Path2D` and/or `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 S = m + '_worker'; - let x = new h.MessageHandler(S, m, t); - function ensureNotTerminated() { - if (d) throw new Error('Worker was terminated'); - } - function startWorkerTask(e) { - g.add(e); - } - function finishWorkerTask(e) { - e.finish(); - g.delete(e); - } - 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(x, e) - .catch((e) => {}) - .then(() => finishWorkerTask(e)), - a.loadXfaImages(), - ]); - } - const [r, i] = await Promise.all([ - a.ensureDoc('numPages'), - a.ensureDoc('fingerprints'), - ]); - return { - numPages: r, - fingerprints: i, - htmlForXfa: t ? await a.ensureDoc('htmlForXfa') : null, - }; - } - function getPdfManager({ - data: e, - password: t, - disableAutoFetch: a, - rangeChunkSize: n, - length: o, - docBaseUrl: c, - enableXfa: l, - evaluatorOptions: h, - }) { - const d = { - source: null, - disableAutoFetch: a, - docBaseUrl: c, - docId: m, - enableXfa: l, - evaluatorOptions: h, - handler: x, - length: o, - password: t, - rangeChunkSize: n, - }, - g = new r.PromiseCapability(); - let p; - if (e) { - try { - d.source = e; - p = new s.LocalPdfManager(d); - g.resolve(p); - } catch (e) { - g.reject(e); - } - return g.promise; - } - let b, - y = []; - try { - b = new u.PDFWorkerStream(x); - } catch (e) { - g.reject(e); - return g.promise; - } - const w = b.getFullReader(); - w.headersReady - .then(function () { - if (w.isRangeSupported) { - d.source = b; - d.length = w.contentLength; - d.disableAutoFetch ||= w.isStreamingSupported; - p = new s.NetworkPdfManager(d); - for (const e of y) p.sendProgressiveData(e); - y = []; - g.resolve(p); - f = null; - } - }) - .catch(function (e) { - g.reject(e); - f = null; - }); - let S = 0; - new Promise(function (e, t) { - const readChunk = function ({ value: e, done: a }) { - try { - ensureNotTerminated(); - if (a) { - p || - (function () { - const e = (0, i.arrayBuffersToBytes)(y); - o && - e.length !== o && - (0, r.warn)('reported HTTP length is different from actual'); - try { - d.source = e; - p = new s.LocalPdfManager(d); - g.resolve(p); - } catch (e) { - g.reject(e); - } - y = []; - })(); - f = null; - return; - } - S += e.byteLength; - w.isStreamingSupported || - x.send('DocProgress', { - loaded: S, - total: Math.max(S, w.contentLength || 0), - }); - p ? p.sendProgressiveData(e) : y.push(e); - w.read().then(readChunk, t); - } catch (e) { - t(e); - } - }; - w.read().then(readChunk, t); - }).catch(function (e) { - g.reject(e); - f = null; - }); - f = function (e) { - b.cancelAllRequests(e); - }; - return g.promise; - } - x.on('GetPage', function (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 }; - }); - }); - }); - x.on('GetPageIndex', function (e) { - const t = n.Ref.get(e.num, e.gen); - return a.ensureCatalog('getPageIndex', [t]); - }); - x.on('GetDestinations', function (e) { - return a.ensureCatalog('destinations'); - }); - x.on('GetDestination', function (e) { - return a.ensureCatalog('getDestination', [e.id]); - }); - x.on('GetPageLabels', function (e) { - return a.ensureCatalog('pageLabels'); - }); - x.on('GetPageLayout', function (e) { - return a.ensureCatalog('pageLayout'); - }); - x.on('GetPageMode', function (e) { - return a.ensureCatalog('pageMode'); - }); - x.on('GetViewerPreferences', function (e) { - return a.ensureCatalog('viewerPreferences'); - }); - x.on('GetOpenAction', function (e) { - return a.ensureCatalog('openAction'); - }); - x.on('GetAttachments', function (e) { - return a.ensureCatalog('attachments'); - }); - x.on('GetJavaScript', function (e) { - return a.ensureCatalog('javaScript'); - }); - x.on('GetDocJSActions', function (e) { - return a.ensureCatalog('jsActions'); - }); - x.on('GetPageJSActions', function ({ pageIndex: e }) { - return a.getPage(e).then(function (e) { - return a.ensure(e, 'jsActions'); - }); - }); - x.on('GetOutline', function (e) { - return a.ensureCatalog('documentOutline'); - }); - x.on('GetOptionalContentConfig', function (e) { - return a.ensureCatalog('optionalContentConfig'); - }); - x.on('GetPermissions', function (e) { - return a.ensureCatalog('permissions'); - }); - x.on('GetMetadata', function (e) { - return Promise.all([a.ensureDoc('documentInfo'), a.ensureCatalog('metadata')]); - }); - x.on('GetMarkInfo', function (e) { - return a.ensureCatalog('markInfo'); - }); - x.on('GetData', function (e) { - return a.requestLoadedStream().then(function (e) { - return e.bytes; - }); - }); - x.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(x, r, t).then( - (e) => { - finishWorkerTask(r); - return e; - }, - (e) => { - finishWorkerTask(r); - throw e; - }, - ); - }); - }); - x.on('GetFieldObjects', function (e) { - return a.ensureDoc('fieldObjects'); - }); - x.on('HasJSActions', function (e) { - return a.ensureDoc('hasJSActions'); - }); - x.on('GetCalculationOrderIds', function (e) { - return a.ensureDoc('calculationOrderIds'); - }); - x.on( - 'SaveDocument', - function ({ isPureXfa: e, numPages: t, annotationStorage: s, filename: o }) { - const l = [ - a.requestLoadedStream(), - a.ensureCatalog('acroForm'), - a.ensureCatalog('acroFormRef'), - a.ensureDoc('xref'), - a.ensureDoc('startXRef'), - ], - h = e ? null : (0, i.getNewAnnotationsMap)(s); - if (h) - for (const [e, t] of h) - l.push( - a.getPage(e).then((a) => { - const r = new WorkerTask(`Save (editor): page ${e}`); - return a.saveNewAnnotations(x, r, t).finally(function () { - finishWorkerTask(r); - }); - }), - ); - if (e) l.push(a.serializeXfaData(s)); - else - for (let e = 0; e < t; e++) - l.push( - a.getPage(e).then(function (t) { - const a = new WorkerTask(`Save: page ${e}`); - return t.save(x, a, s).finally(function () { - finishWorkerTask(a); - }); - }), - ); - return Promise.all(l).then(function ([t, a, i, s, l, ...h]) { - let u = [], - d = null; - if (e) { - d = h[0]; - if (!d) return t.bytes; - } else { - u = h.flat(2); - if (0 === u.length) return t.bytes; - } - const f = i && a instanceof n.Dict && u.some((e) => e.needAppearances), - g = (a instanceof n.Dict && a.get('XFA')) || null; - let p = null, - m = !1; - if (Array.isArray(g)) { - for (let e = 0, t = g.length; e < t; e += 2) - if ('datasets' === g[e]) { - p = g[e + 1]; - m = !0; - } - null === p && (p = s.getNewTemporaryRef()); - } else g && (0, r.warn)('Unsupported XFA type.'); - let b = Object.create(null); - if (s.trailer) { - const e = Object.create(null), - t = s.trailer.get('Info') || null; - t instanceof n.Dict && - t.forEach((t, a) => { - 'string' == typeof a && (e[t] = (0, r.stringToPDFString)(a)); - }); - b = { - rootRef: s.trailer.getRaw('Root') || null, - encryptRef: s.trailer.getRaw('Encrypt') || null, - newRef: s.getNewTemporaryRef(), - infoRef: s.trailer.getRaw('Info') || null, - info: e, - fileIds: s.trailer.get('ID') || null, - startXRef: s.lastXRefStreamPos ?? l, - filename: o, - }; - } - try { - return (0, - c.incrementalUpdate)({ originalData: t.bytes, xrefInfo: b, newRefs: u, xref: s, hasXfa: !!g, xfaDatasetsRef: p, hasXfaDatasetsEntry: m, needAppearances: f, acroFormRef: i, acroForm: a, xfaData: d }); - } finally { - s.resetNewTemporaryRef(); - } - }); - }, - ); - x.on('GetOperatorList', function (e, t) { - const i = e.pageIndex; - a.getPage(i).then(function (a) { - const n = new WorkerTask(`GetOperatorList: page ${i}`); - startWorkerTask(n); - const s = p >= r.VerbosityLevel.INFOS ? Date.now() : 0; - a.getOperatorList({ - handler: x, - sink: t, - task: n, - intent: e.intent, - cacheKey: e.cacheKey, - annotationStorage: e.annotationStorage, - }).then( - function (e) { - finishWorkerTask(n); - s && - (0, r.info)( - `page=${i + 1} - getOperatorList: time=${Date.now() - s}ms, len=${ - e.length - }`, - ); - t.close(); - }, - function (e) { - finishWorkerTask(n); - n.terminated || t.error(e); - }, - ); - }); - }); - x.on('GetTextContent', function (e, t) { - const { pageIndex: i, includeMarkedContent: n, disableNormalization: s } = e; - a.getPage(i).then(function (e) { - const a = new WorkerTask('GetTextContent: page ' + i); - startWorkerTask(a); - const o = p >= r.VerbosityLevel.INFOS ? Date.now() : 0; - e.extractTextContent({ - handler: x, - task: a, - sink: t, - includeMarkedContent: n, - disableNormalization: s, - }).then( - function () { - finishWorkerTask(a); - o && - (0, r.info)( - `page=${i + 1} - getTextContent: time=` + (Date.now() - o) + 'ms', - ); - t.close(); - }, - function (e) { - finishWorkerTask(a); - a.terminated || t.error(e); - }, - ); - }); - }); - x.on('GetStructTree', function (e) { - return a.getPage(e.pageIndex).then(function (e) { - return a.ensure(e, 'getStructTree'); - }); - }); - x.on('FontFallback', function (e) { - return a.fontFallback(e.id, x); - }); - x.on('Cleanup', function (e) { - return a.cleanup(!0); - }); - x.on('Terminate', function (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 () { - x.destroy(); - x = null; - }); - }); - x.on('Ready', function (t) { - !(function setupDoc(e) { - function onSuccess(e) { - ensureNotTerminated(); - x.send('GetDoc', { pdfInfo: e }); - } - function onFailure(e) { - ensureNotTerminated(); - if (e instanceof r.PasswordException) { - const t = new WorkerTask(`PasswordException: response ${e.code}`); - startWorkerTask(t); - x.sendWithPromise('PasswordRequest', e) - .then(function ({ password: e }) { - finishWorkerTask(t); - a.updatePassword(e); - pdfManagerReady(); - }) - .catch(function () { - finishWorkerTask(t); - x.send('DocException', e); - }); - } else - e instanceof r.InvalidPDFException || - e instanceof r.MissingPDFException || - e instanceof r.UnexpectedResponseException || - e instanceof r.UnknownErrorException - ? x.send('DocException', e) - : x.send( - 'DocException', - new r.UnknownErrorException(e.message, e.toString()), - ); - } - function pdfManagerReady() { - ensureNotTerminated(); - loadDocument(!1).then(onSuccess, function (e) { - ensureNotTerminated(); - e instanceof i.XRefParseException - ? a.requestLoadedStream().then(function () { - ensureNotTerminated(); - loadDocument(!0).then(onSuccess, onFailure); - }) - : onFailure(e); - }); - } - ensureNotTerminated(); - getPdfManager(e) - .then(function (e) { - if (d) { - e.terminate(new r.AbortException('Worker was terminated.')); - throw new Error('Worker was terminated'); - } - a = e; - a.requestLoadedStream(!0).then((e) => { - x.send('DataLoaded', { length: e.bytes.byteLength }); - }); - }) - .then(pdfManagerReady, onFailure); - })(e); - e = null; - }); - return S; - } - 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) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.VerbosityLevel = - t.Util = - t.UnknownErrorException = - t.UnexpectedResponseException = - t.TextRenderingMode = - t.RenderingIntentFlag = - t.PromiseCapability = - t.PermissionFlag = - t.PasswordResponses = - t.PasswordException = - t.PageActionEventType = - t.OPS = - t.MissingPDFException = - t.MAX_IMAGE_SIZE_TO_CACHE = - t.LINE_FACTOR = - t.LINE_DESCENT_FACTOR = - t.InvalidPDFException = - t.ImageKind = - t.IDENTITY_MATRIX = - t.FormatError = - t.FeatureTest = - t.FONT_IDENTITY_MATRIX = - t.DocumentActionEventType = - t.CMapCompressionType = - t.BaseException = - t.BASELINE_FACTOR = - 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.assert = function assert(e, t) { - e || unreachable(t); - }; - t.bytesToString = function bytesToString(e) { - ('object' == typeof e && void 0 !== e?.length) || - unreachable('Invalid argument for bytesToString'); - const t = e.length, - a = 8192; - if (t < a) return String.fromCharCode.apply(null, e); - const r = []; - for (let i = 0; i < t; i += a) { - const n = Math.min(i + a, t), - s = e.subarray(i, n); - r.push(String.fromCharCode.apply(null, s)); - } - return r.join(''); - }; - 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?.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) { - 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.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 r; - }; - t.info = function info(e) { - r >= a.INFOS && console.log(`Info: ${e}`); - }; - t.isArrayBuffer = function isArrayBuffer(e) { - return 'object' == typeof 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 < r; a++) if (e[a] !== t[a]) return !1; - return !0; - }; - t.normalizeUnicode = function normalizeUnicode(e) { - if (!o) { - o = - /([\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; - c = new Map([['ſt', 'ſt']]); - } - return e.replaceAll(o, (e, t, a) => (t ? t.normalize('NFKC') : c.get(a))); - }; - t.objectFromMap = function objectFromMap(e) { - const t = Object.create(null); - for (const [a, r] of e) t[a] = r; - return t; - }; - t.objectSize = function objectSize(e) { - return Object.keys(e).length; - }; - t.setVerbosityLevel = function setVerbosityLevel(e) { - Number.isInteger(e) && (r = e); - }; - t.shadow = shadow; - t.string32 = function string32(e) { - return String.fromCharCode((e >> 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 < r; a++) { - const r = s[e.charCodeAt(a)]; - t.push(r ? String.fromCharCode(r) : e.charAt(a)); - } - return t.join(''); - }; - t.stringToUTF8String = stringToUTF8String; - t.unreachable = unreachable; - t.utf8StringToString = function utf8StringToString(e) { - return unescape(encodeURIComponent(e)); - }; - t.warn = warn; - t.IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - t.FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; - t.MAX_IMAGE_SIZE_TO_CACHE = 1e7; - t.LINE_FACTOR = 1.35; - t.LINE_DESCENT_FACTOR = 0.35; - t.BASELINE_FACTOR = 0.25925925925925924; - t.RenderingIntentFlag = { - ANY: 1, - DISPLAY: 2, - PRINT: 4, - SAVE: 8, - 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' }; - const a = { ERRORS: 0, WARNINGS: 1, INFOS: 5 }; - t.VerbosityLevel = a; - t.CMapCompressionType = { NONE: 0, BINARY: 1 }; - 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, - beginAnnotation: 80, - endAnnotation: 81, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91, - }; - t.PasswordResponses = { NEED_PASSWORD: 1, INCORRECT_PASSWORD: 2 }; - let r = a.WARNINGS; - function warn(e) { - r >= a.WARNINGS && console.log(`Warning: ${e}`); - } - function unreachable(e) { - throw new Error(e); - } - function shadow(e, t, a, r = !1) { - Object.defineProperty(e, t, { - value: a, - enumerable: !r, - 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; r < t; ++r) a[r] = 255 & e.charCodeAt(r); - return a; - } - t.FeatureTest = class FeatureTest { - static get isLittleEndian() { - return shadow( - this, - 'isLittleEndian', - (function isLittleEndian() { - const e = new Uint8Array(4); - e[0] = 1; - return 1 === new Uint32Array(e.buffer, 0, 1)[0]; - })(), - ); - } - static get isEvalSupported() { - return shadow( - this, - 'isEvalSupported', - (function isEvalSupported() { - try { - new Function(''); - return !0; - } catch (e) { - return !1; - } - })(), - ); - } - static get isOffscreenCanvasSupported() { - return shadow( - this, - 'isOffscreenCanvasSupported', - 'undefined' != typeof OffscreenCanvas, - ); - } - static get platform() { - return 'undefined' == typeof navigator - ? shadow(this, 'platform', { isWin: !1, isMac: !1 }) - : shadow(this, 'platform', { - isWin: navigator.platform.includes('Win'), - isMac: navigator.platform.includes('Mac'), - }); - } - }; - const n = [...Array(256).keys()].map((e) => e.toString(16).padStart(2, '0')); - class Util { - static makeHexColor(e, t, a) { - return `#${n[e]}${n[t]}${n[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), - i = Util.applyTransform([e[0], e[3]], t), - n = Util.applyTransform([e[2], e[1]], t); - return [ - Math.min(a[0], r[0], i[0], n[0]), - Math.min(a[1], r[1], i[1], n[1]), - Math.max(a[0], r[0], i[0], n[0]), - Math.max(a[1], r[1], i[1], n[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 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], - i = e[2] * t[0] + e[3] * t[2], - n = e[2] * t[1] + e[3] * t[3], - s = (a + n) / 2, - o = Math.sqrt((a + n) ** 2 - 4 * (a * n - i * 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 i = Math.max(Math.min(e[1], e[3]), Math.min(t[1], t[3])), - n = Math.min(Math.max(e[1], e[3]), Math.max(t[1], t[3])); - return i > n ? null : [a, i, r, n]; - } - static bezierBoundingBox(e, t, a, r, i, n, 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 * i; - h = -3 * e + 9 * a - 9 * i + 3 * s; - d = 3 * a - 3 * e; - } else { - u = 6 * t - 12 * r + 6 * n; - h = -3 * t + 9 * r - 9 * n + 3 * o; - d = 3 * r - 3 * t; - } - if (Math.abs(h) < 1e-12) { - if (Math.abs(u) < 1e-12) continue; - f = -d / u; - 0 < f && f < 1 && c.push(f); - } else { - m = u * u - 4 * d * h; - b = Math.sqrt(m); - if (!(m < 0)) { - g = (-u + b) / (2 * h); - 0 < g && g < 1 && c.push(g); - p = (-u - b) / (2 * h); - 0 < p && p < 1 && c.push(p); - } - } - } - let y, - w = c.length; - const S = w; - for (; w--; ) { - f = c[w]; - y = 1 - f; - l[0][w] = y * y * y * e + 3 * y * y * f * a + 3 * y * f * f * i + f * f * f * s; - l[1][w] = y * y * y * t + 3 * y * y * f * r + 3 * y * f * f * n + f * f * f * o; - } - l[0][S] = e; - l[1][S] = t; - l[0][S + 1] = s; - l[1][S + 1] = o; - l[0].length = l[1].length = S + 2; - return [Math.min(...l[0]), Math.min(...l[1]), Math.max(...l[0]), Math.max(...l[1])]; - } - } - t.Util = Util; - const s = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, 711, 710, - 729, 733, 731, 730, 732, 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, 8226, 8224, 8225, 8230, 8212, 8211, - 402, 8260, 8249, 8250, 8722, 8240, 8222, 8220, 8221, 8216, 8217, 8218, 8482, 64257, - 64258, 321, 338, 352, 376, 381, 305, 322, 339, 353, 382, 0, 8364, - ]; - function stringToUTF8String(e) { - return decodeURIComponent(escape(e)); - } - t.PromiseCapability = class PromiseCapability { - #e = !1; - constructor() { - this.promise = new Promise((e, t) => { - this.resolve = (t) => { - this.#e = !0; - e(t); - }; - this.reject = (e) => { - this.#e = !0; - t(e); - }; - }); - } - get settled() { - return this.#e; - } - }; - let o = null, - c = null; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.XRefParseException = - t.XRefEntryException = - t.ParserEOFException = - t.PDF_VERSION_REGEXP = - t.MissingDataException = - void 0; - t.arrayBuffersToBytes = function arrayBuffersToBytes(e) { - const t = e.length; - if (0 === t) return new Uint8Array(0); - if (1 === t) return new Uint8Array(e[0]); - let a = 0; - for (let r = 0; r < t; r++) a += e[r].byteLength; - const r = new Uint8Array(a); - let i = 0; - for (let a = 0; a < t; a++) { - const t = new Uint8Array(e[a]); - r.set(t, i); - i += t.byteLength; - } - return r; - }; - t.collectActions = function collectActions(e, t, a) { - const n = 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 i.Dict) - for (const t of r.getKeys()) { - const s = a[t]; - if (!s) continue; - const o = []; - _collectJS(r.getRaw(t), e, o, new i.RefSet()); - o.length > 0 && (n[s] = o); - } - } - if (t.has('A')) { - const a = []; - _collectJS(t.get('A'), e, a, new i.RefSet()); - a.length > 0 && (n.Action = a); - } - return (0, r.objectSize)(n) > 0 ? n : null; - }; - t.encodeToXmlString = function encodeToXmlString(e) { - const t = []; - let a = 0; - for (let r = 0, i = e.length; r < i; r++) { - const i = e.codePointAt(r); - if (32 <= i && i <= 126) { - const n = o[i]; - if (n) { - a < r && t.push(e.substring(a, r)); - t.push(n); - a = r + 1; - } - } else { - a < r && t.push(e.substring(a, r)); - t.push(`&#x${i.toString(16).toUpperCase()};`); - i > 55295 && (i < 57344 || i > 65533) && r++; - a = r + 1; - } - } - if (0 === t.length) return e; - a < e.length && t.push(e.substring(a, e.length)); - return t.join(''); - }; - t.escapePDFName = function escapePDFName(e) { - const t = []; - let a = 0; - for (let r = 0, i = e.length; r < i; r++) { - const i = e.charCodeAt(r); - if ( - i < 33 || - i > 126 || - 35 === i || - 40 === i || - 41 === i || - 60 === i || - 62 === i || - 91 === i || - 93 === i || - 123 === i || - 125 === i || - 47 === i || - 37 === i - ) { - a < r && t.push(e.substring(a, r)); - t.push(`#${i.toString(16)}`); - a = r + 1; - } - } - if (0 === t.length) return e; - a < e.length && t.push(e.substring(a, e.length)); - return t.join(''); - }; - t.escapeString = function escapeString(e) { - return e.replaceAll(/([()\\\n\r])/g, (e) => - '\n' === e ? '\\n' : '\r' === e ? '\\r' : `\\${e}`, - ); - }; - t.getInheritableProperty = getInheritableProperty; - t.getLookupTableFactory = function getLookupTableFactory(e) { - let t; - return function () { - if (e) { - t = Object.create(null); - e(t); - e = null; - } - return t; - }; - }; - t.getNewAnnotationsMap = function getNewAnnotationsMap(e) { - if (!e) return null; - const t = new Map(); - for (const [a, i] of e) { - if (!a.startsWith(r.AnnotationEditorPrefix)) continue; - let e = t.get(i.pageIndex); - if (!e) { - e = []; - t.set(i.pageIndex, e); - } - e.push(i); - } - return t.size > 0 ? t : null; - }; - t.getRotationMatrix = function 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'); - } - }; - t.isAscii = function isAscii(e) { - return /^[\x00-\x7F]*$/.test(e); - }; - 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('|') - .replaceAll('.', '\\.') + - ')\\((?:\'|")([^\'"]*)(?:\'|")(?:,\\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.stringToUTF16HexString = function stringToUTF16HexString(e) { - const t = []; - for (let a = 0, r = e.length; a < r; a++) { - const r = e.charCodeAt(a); - t.push( - ((r >> 8) & 255).toString(16).padStart(2, '0'), - (255 & r).toString(16).padStart(2, '0'), - ); - } - return t.join(''); - }; - t.stringToUTF16String = function stringToUTF16String(e, t = !1) { - const a = []; - t && a.push('þÿ'); - for (let t = 0, r = e.length; t < r; t++) { - const r = e.charCodeAt(t); - a.push(String.fromCharCode((r >> 8) & 255), String.fromCharCode(255 & r)); - } - return a.join(''); - }; - 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 i; - for (; e >= 1e3; ) { - e -= 1e3; - a.push('M'); - } - i = (e / 100) | 0; - e %= 100; - a.push(s[i]); - i = (e / 10) | 0; - e %= 10; - a.push(s[10 + i]); - a.push(s[20 + e]); - const n = a.join(''); - return t ? n.toLowerCase() : n; - }; - 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: i, italicAngle: n } = e, - s = /^("|').*("|')$/.exec(a); - if (s && s[1] === s[2]) { - if (new RegExp(`[^\\\\]${s[1]}`).test(a.slice(1, -1))) { - (0, r.warn)(`XFA - FontFamily contains unescaped ${s[1]}: ${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 invalid : ${a}.`); - return !1; - } - const o = i ? i.toString() : ''; - e.fontWeight = t.has(o) ? o : '400'; - const c = parseFloat(n); - e.italicAngle = isNaN(c) || c < -90 || c > 90 ? '14' : n.toString(); - return !0; - }; - var r = a(2), - i = a(4), - n = a(5); - t.PDF_VERSION_REGEXP = /^[1-9]\.\d$/; - 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; - function getInheritableProperty({ - dict: e, - key: t, - getArray: a = !1, - stopWhenFound: r = !0, - }) { - let n; - const s = new i.RefSet(); - for (; e instanceof i.Dict && (!e.objId || !s.has(e.objId)); ) { - e.objId && s.put(e.objId); - const i = a ? e.getArray(t) : e.get(t); - if (void 0 !== i) { - if (r) return i; - (n ||= []).push(i); - } - e = e.get('Parent'); - } - return n; - } - 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 i.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 i.Dict) { - if ((0, i.isName)(e.get('S'), 'JavaScript')) { - const t = e.get('JS'); - let i; - t instanceof n.BaseStream ? (i = t.getString()) : 'string' == typeof t && (i = t); - i &&= (0, r.stringToPDFString)(i).replaceAll('\0', ''); - i && a.push(i); - } - _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.RefSetCache = - t.RefSet = - t.Ref = - t.Name = - t.EOF = - t.Dict = - t.Cmd = - t.CIRCULAR_REF = - void 0; - t.clearPrimitiveCaches = function clearPrimitiveCaches() { - s = Object.create(null); - o = Object.create(null); - c = Object.create(null); - }; - t.isCmd = function isCmd(e, t) { - return e instanceof Cmd && (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 i = Symbol('CIRCULAR_REF'); - t.CIRCULAR_REF = i; - const n = Symbol('EOF'); - t.EOF = n; - let s = Object.create(null), - o = Object.create(null), - c = Object.create(null); - class Name { - constructor(e) { - this.name = e; - } - static get(e) { - return (o[e] ||= new Name(e)); - } - } - t.Name = Name; - class Cmd { - constructor(e) { - this.cmd = e; - } - static get(e) { - return (s[e] ||= new Cmd(e)); - } - } - t.Cmd = Cmd; - const l = function nonSerializableClosure() { - return l; - }; - class Dict { - constructor(e = null) { - this._map = Object.create(null); - this.xref = e; - this.objId = null; - this.suppressEncryption = !1; - this.__nonSerializable__ = l; - } - 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 Ref && 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 Ref && 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 Ref && this.xref && (r = this.xref.fetch(r, this.suppressEncryption)); - if (Array.isArray(r)) { - r = r.slice(); - for (let e = 0, t = r.length; e < t; e++) - r[e] instanceof Ref && - this.xref && - (r[e] = this.xref.fetch(r[e], this.suppressEncryption)); - } - return r; - } - getRaw(e) { - return this._map[e]; - } - getKeys() { - return Object.keys(this._map); - } - getRawValues() { - return Object.values(this._map); - } - set(e, t) { - this._map[e] = t; - } - has(e) { - return void 0 !== this._map[e]; - } - forEach(e) { - for (const t in this._map) e(t, this.get(t)); - } - static get empty() { - const e = new Dict(null); - e.set = (e, t) => { - (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), - i = new Map(); - for (const e of t) - if (e instanceof Dict) - for (const [t, r] of Object.entries(e._map)) { - let e = i.get(t); - if (void 0 === e) { - e = []; - i.set(t, e); - } else if (!(a && r instanceof Dict)) continue; - e.push(r); - } - for (const [t, a] of i) { - if (1 === a.length || !(a[0] instanceof Dict)) { - r._map[t] = a[0]; - continue; - } - const i = new Dict(e); - for (const e of a) - for (const [t, a] of Object.entries(e._map)) - void 0 === i._map[t] && (i._map[t] = a); - i.size > 0 && (r._map[t] = i); - } - i.clear(); - return r.size > 0 ? r : Dict.empty; - } - } - t.Dict = Dict; - 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(e, t) { - const a = 0 === t ? `${e}R` : `${e}R${t}`; - return (c[a] ||= new Ref(e, t)); - } - } - t.Ref = Ref; - 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 Name && (void 0 === t || e.name === t); - } - }, - (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), - i = a(7), - n = a(3), - s = a(9), - o = a(8); - class BasePdfManager { - constructor(e) { - this.constructor === BasePdfManager && - (0, r.unreachable)('Cannot initialize BasePdfManager.'); - this._docBaseUrl = (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; - })(e.docBaseUrl); - this._docId = e.docId; - this._password = e.password; - this.enableXfa = e.enableXfa; - e.evaluatorOptions.isOffscreenCanvasSupported &&= - r.FeatureTest.isOffscreenCanvasSupported; - this.evaluatorOptions = e.evaluatorOptions; - } - 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); - } - 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(e = !1) { - (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) { - super(e); - const t = new o.Stream(e.source); - this.pdfDocument = new s.PDFDocument(this, t); - this._loadedStreamPromise = Promise.resolve(t); - } - 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(e = !1) { - return this._loadedStreamPromise; - } - terminate(e) {} - }; - t.NetworkPdfManager = class NetworkPdfManager extends BasePdfManager { - constructor(e) { - super(e); - this.streamManager = new i.ChunkedStreamManager(e.source, { - msgHandler: e.handler, - length: e.length, - disableAutoFetch: e.disableAutoFetch, - rangeChunkSize: e.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 n.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(e = !1) { - return this.streamManager.requestAllChunks(e); - } - sendProgressiveData(e) { - this.streamManager.onReceiveData({ chunk: e }); - } - terminate(e) { - this.streamManager.abort(e); - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.ChunkedStreamManager = t.ChunkedStream = void 0; - var r = a(3), - i = a(2), - n = a(8); - class ChunkedStream extends n.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 < a; ++t) - this._loadedChunks.has(t) || e.push(t); - return e; - } - get numChunksLoaded() { - return this._loadedChunks.size; - } - get isDataLoaded() { - return this.numChunksLoaded === this.numChunks; - } - onReceiveData(e, t) { - const a = this.chunkSize; - if (e % a != 0) throw new Error(`Bad begin offset: ${e}`); - const r = e + t.byteLength; - if (r % a != 0 && r !== this.bytes.length) throw new Error(`Bad end offset: ${r}`); - this.bytes.set(new Uint8Array(t), e); - const i = Math.floor(e / a), - n = Math.floor((r - 1) / a) + 1; - for (let e = i; e < n; ++e) this._loadedChunks.add(e); - } - onReceiveProgressiveData(e) { - let t = this.progressiveDataLength; - const a = Math.floor(t / this.chunkSize); - this.bytes.set(new Uint8Array(e), t); - t += e.byteLength; - this.progressiveDataLength = t; - const r = t >= this.end ? this.numChunks : Math.floor(t / this.chunkSize); - for (let e = a; e < r; ++e) this._loadedChunks.add(e); - } - ensureByte(e) { - if (e < this.progressiveDataLength) return; - const t = Math.floor(e / this.chunkSize); - if (!(t > this.numChunks) && t !== this.lastSuccessfulEnsureByteChunk) { - if (!this._loadedChunks.has(t)) throw new r.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 i = Math.min(Math.floor((t - 1) / this.chunkSize) + 1, this.numChunks); - for (let n = a; n < i; ++n) - if (!this._loadedChunks.has(n)) throw new r.MissingDataException(e, t); - } - nextEmptyChunk(e) { - const t = this.numChunks; - for (let a = 0; a < t; ++a) { - const r = (e + a) % t; - if (!this._loadedChunks.has(r)) return r; - } - return null; - } - hasChunk(e) { - return this._loadedChunks.has(e); - } - getByte() { - const e = this.pos; - if (e >= 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 i = a + e; - i > r && (i = r); - i > this.progressiveDataLength && this.ensureRange(a, i); - this.pos = i; - return t.subarray(a, i); - } - 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 < a; ++e) this._loadedChunks.has(e) || r.push(e); - return r; - }; - Object.defineProperty(ChunkedStreamSubstream.prototype, 'isDataLoaded', { - get() { - return ( - this.numChunksLoaded === this.numChunks || 0 === this.getMissingChunks().length - ); - }, - configurable: !0, - }); - const r = new ChunkedStreamSubstream(); - r.pos = r.start = e; - r.end = e + t || this.end; - r.dict = a; - return r; - } - getBaseStreams() { - return [this]; - } - } - t.ChunkedStream = ChunkedStream; - t.ChunkedStreamManager = class ChunkedStreamManager { - constructor(e, t) { - this.length = t.length; - this.chunkSize = t.rangeChunkSize; - this.stream = new ChunkedStream(this.length, this.chunkSize, this); - this.pdfNetworkStream = e; - this.disableAutoFetch = t.disableAutoFetch; - this.msgHandler = t.msgHandler; - this.currRequestId = 0; - this._chunksNeededByRequest = new Map(); - this._requestsByChunk = new Map(); - this._promisesByRequest = new Map(); - this.progressiveDataLength = 0; - this.aborted = !1; - this._loadedStreamCapability = new i.PromiseCapability(); - } - sendRequest(e, t) { - const a = this.pdfNetworkStream.getRangeReader(e, t); - a.isStreamingSupported || (a.onProgress = this.onProgress.bind(this)); - let i = [], - n = 0; - return new Promise((e, t) => { - const readChunk = ({ value: s, done: o }) => { - try { - if (o) { - const t = (0, r.arrayBuffersToBytes)(i); - i = null; - e(t); - return; - } - n += s.byteLength; - a.isStreamingSupported && this.onProgress({ loaded: n }); - i.push(s); - a.read().then(readChunk, t); - } catch (e) { - t(e); - } - }; - a.read().then(readChunk, t); - }).then((t) => { - this.aborted || this.onReceiveData({ chunk: t, begin: e }); - }); - } - requestAllChunks(e = !1) { - if (!e) { - 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 r = new i.PromiseCapability(); - this._promisesByRequest.set(t, r); - const n = []; - for (const e of a) { - let a = this._requestsByChunk.get(e); - if (!a) { - a = []; - this._requestsByChunk.set(e, a); - n.push(e); - } - a.push(t); - } - if (n.length > 0) { - const e = this.groupChunks(n); - 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(r.reject); - } - } - return r.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), - i = []; - for (let e = a; e < r; ++e) i.push(e); - return this._requestChunks(i); - } - requestRanges(e = []) { - const t = []; - for (const a of e) { - const e = this.getBeginChunk(a.begin), - r = this.getEndChunk(a.end); - for (let a = e; a < r; ++a) t.includes(a) || t.push(a); - } - t.sort(function (e, t) { - return e - t; - }); - return this._requestChunks(t); - } - groupChunks(e) { - const t = []; - let a = -1, - r = -1; - for (let i = 0, n = e.length; i < n; ++i) { - const n = e[i]; - a < 0 && (a = n); - if (r >= 0 && r + 1 !== n) { - t.push({ beginChunk: a, endChunk: r + 1 }); - a = n; - } - i + 1 === e.length && t.push({ beginChunk: a, endChunk: n + 1 }); - r = n; - } - 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, - i = r + t.byteLength, - n = Math.floor(r / this.chunkSize), - s = - i < this.length ? Math.floor(i / this.chunkSize) : Math.ceil(i / this.chunkSize); - if (a) { - this.stream.onReceiveProgressiveData(t); - this.progressiveDataLength = i; - } else this.stream.onReceiveData(r, t); - this.stream.isDataLoaded && this._loadedStreamCapability.resolve(this.stream); - const o = []; - for (let e = n; e < s; ++e) { - const t = this._requestsByChunk.get(e); - if (t) { - this._requestsByChunk.delete(e); - for (const a of t) { - const t = this._chunksNeededByRequest.get(a); - t.has(e) && t.delete(e); - t.size > 0 || 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(5), - i = 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 i = a + e; - i > r && (i = r); - this.pos = i; - return t.subarray(a, i); - } - 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, i.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(10), - i = a(2), - n = a(3), - s = a(4), - o = a(51), - c = a(5), - l = a(67), - h = a(69), - u = a(71), - d = a(100), - f = a(16), - g = a(8), - p = a(75), - m = a(63), - b = a(13), - y = a(18), - w = a(74), - S = a(65), - x = a(76), - C = a(101); - const k = [0, 0, 612, 792]; - class Page { - constructor({ - pdfManager: e, - xref: t, - pageIndex: a, - pageDict: r, - ref: i, - globalIdFactory: n, - 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 = i; - 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 n { - static createObjId() { - return `p${a}_${++d.obj}`; - } - static getPageObjId() { - return `page${i.toString()}`; - } - }; - } - _getInheritableProperty(e, t = !1) { - const a = (0, n.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, i.shadow)(this, 'resources', e instanceof s.Dict ? e : s.Dict.empty); - } - _getBoundingBox(e) { - if (this.xfaData) return this.xfaData.bbox; - let t = this._getInheritableProperty(e, !0); - if (Array.isArray(t) && 4 === t.length) { - t = i.Util.normalizeRect(t); - if (t[2] - t[0] > 0 && t[3] - t[1] > 0) return t; - (0, i.warn)(`Empty, or invalid, /${e} entry.`); - } - return null; - } - get mediaBox() { - return (0, i.shadow)(this, 'mediaBox', this._getBoundingBox('MediaBox') || k); - } - get cropBox() { - return (0, i.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, i.shadow)(this, 'userUnit', e); - } - get view() { - const { cropBox: e, mediaBox: t } = this; - if (e !== t && !(0, i.isArrayEqual)(e, t)) { - const a = i.Util.intersect(e, t); - if (a && a[2] - a[0] > 0 && a[3] - a[1] > 0) return (0, i.shadow)(this, 'view', a); - (0, i.warn)('Empty /CropBox and /MediaBox intersection.'); - } - return (0, i.shadow)(this, 'view', 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, i.shadow)(this, 'rotate', e); - } - _onSubStreamError(e, t) { - if (!this.evaluatorOptions.ignoreErrors) throw e; - (0, i.warn)(`getContentStream - ignoring sub-stream (${t}): "${e}".`); - } - getContentStream() { - return this.pdfManager - .ensure(this, 'content') - .then((e) => - e instanceof c.BaseStream - ? e - : Array.isArray(e) - ? new y.StreamsSequenceStream(e, this._onSubStreamError.bind(this)) - : new g.NullStream(), - ); - } - get xfaData() { - return (0, i.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 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, - }), - n = this.pageDict, - s = this.annotations.slice(), - o = await r.AnnotationFactory.saveNewAnnotations(i, t, a); - for (const { ref: e } of o.annotations) s.push(e); - const c = n.get('Annots'); - n.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, n, l, h); - c && n.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 n = []; - for (const s of e) - s.mustBePrinted(a) && - n.push( - s.save(r, t, a).catch(function (e) { - (0, - i.warn)(`save - ignoring annotation data during "${t.name}" task: "${e}".`); - return null; - }), - ); - return Promise.all(n).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(), - 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, n.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 i = 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: i, - }) - .then(function () { - return i; - }); - }); - return Promise.all([g, this._parsedAnnotations, f]).then(function ([e, t, r]) { - r && (t = t.concat(r)); - if (0 === t.length || s & i.RenderingIntentFlag.ANNOTATIONS_DISABLE) { - e.flush(!0); - return { length: e.totalLength }; - } - const n = !!(s & i.RenderingIntentFlag.ANNOTATIONS_FORMS), - o = !!(s & i.RenderingIntentFlag.ANY), - l = !!(s & i.RenderingIntentFlag.DISPLAY), - h = !!(s & i.RenderingIntentFlag.PRINT), - d = []; - for (const e of t) - (o || (l && e.mustBeViewed(c)) || (h && e.mustBePrinted(c))) && - d.push( - e.getOperatorList(u, a, s, n, c).catch(function (e) { - (0, - i.warn)(`getOperatorList - ignoring annotation data during "${a.name}" task: "${e}".`); - return { opList: null, separateForm: !1, separateCanvas: !1 }; - }), - ); - return Promise.all(d).then(function (t) { - let a = !1, - r = !1; - for (const { opList: i, separateForm: n, separateCanvas: s } of t) { - e.addOpList(i); - a ||= n; - r ||= s; - } - e.flush(!0, { form: a, canvas: r }); - return { length: e.totalLength }; - }); - }); - } - extractTextContent({ - handler: e, - task: t, - includeMarkedContent: a, - disableNormalization: r, - sink: i, - }) { - const n = this.getContentStream(), - s = this.loadResources(['ExtGState', 'Font', 'Properties', 'XObject']); - return Promise.all([n, s]).then(([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, - }).getTextContent({ - stream: n, - task: t, - resources: this.resources, - includeMarkedContent: a, - disableNormalization: r, - sink: i, - 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 n = [], - s = []; - let o; - const c = !!(a & i.RenderingIntentFlag.ANY), - l = !!(a & i.RenderingIntentFlag.DISPLAY), - h = !!(a & i.RenderingIntentFlag.PRINT); - for (const a of r) { - const r = c || (l && a.viewable); - (r || (h && a.printable)) && n.push(a.data); - if (a.hasTextContent && r) { - 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, - }); - s.push( - a.extractTextContent(o, t, this.view).catch(function (e) { - (0, - i.warn)(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`); - }), - ); - } - } - await Promise.all(s); - return n; - } - get annotations() { - const e = this._getInheritableProperty('Annots'); - return (0, i.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, i.warn)(`_parsedAnnotations: "${e}".`); - return null; - }), - ); - return Promise.all(e).then(function (e) { - if (0 === e.length) return e; - const t = []; - let a; - for (const i of e) - i && (i instanceof r.PopupAnnotation ? (a ||= []).push(i) : t.push(i)); - a && t.push(...a); - return t; - }); - }); - return (0, i.shadow)(this, '_parsedAnnotations', e); - } - get jsActions() { - const e = (0, n.collectActions)(this.xref, this.pageDict, i.PageActionEventType); - return (0, i.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]); - function find(e, t, a = 1024, r = !1) { - const i = t.length, - n = e.peekBytes(a), - s = n.length - i; - if (s <= 0) return !1; - if (r) { - const a = i - 1; - let r = n.length - 1; - for (; r >= a; ) { - let s = 0; - for (; s < i && n[r - s] === t[a - s]; ) s++; - if (s >= i) { - e.pos += r - a; - return !0; - } - r--; - } - } else { - let a = 0; - for (; a <= s; ) { - let r = 0; - for (; r < i && n[a + r] === t[r]; ) r++; - if (r >= i) { - e.pos += a; - return !0; - } - a++; - } - } - return !1; - } - t.PDFDocument = class PDFDocument { - constructor(e, t) { - if (t.length <= 0) - throw new i.InvalidPDFException( - 'The PDF file is empty, i.e. its size is zero bytes.', - ); - this.pdfManager = e; - this.stream = t; - this.xref = new C.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, i.unreachable)('Abstract method `createObjId` called.'); - } - static getPageObjId() { - (0, i.unreachable)('Abstract method `getPageObjId` called.'); - } - }; - } - parse(e) { - this.xref.parse(e); - this.catalog = new h.Catalog(this.pdfManager, this.xref); - } - get linearization() { - let e = null; - try { - e = f.Linearization.create(this.stream); - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - (0, i.info)(e); - } - return (0, i.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 i = !1, - s = e.end; - for (; !i && s > 0; ) { - s -= a - r; - s < 0 && (s = 0); - e.pos = s; - i = find(e, F, a, !0); - } - if (i) { - e.skip(9); - let a; - do { - a = e.getByte(); - } while ((0, n.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, i.shadow)(this, 'startXRef', t); - } - checkHeader() { - const e = this.stream; - e.reset(); - if (!find(e, v)) return; - e.moveStart(); - e.skip(v.length); - let t, - a = ''; - for (; (t = e.getByte()) > 32 && a.length < 7; ) a += String.fromCharCode(t); - n.PDF_VERSION_REGEXP.test(a) - ? (this._version = a) - : (0, i.warn)(`Invalid PDF header version: ${a}`); - } - 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, i.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, i.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'), - n = Array.isArray(r) && r.every((e) => 0 === e); - return a && n; - }) - ); - } - 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 < r; e += 2) { - let i; - i = 0 === e ? 'xdp:xdp' : e === r - 2 ? '/xdp:xdp' : t[e]; - if (!a.hasOwnProperty(i)) continue; - const n = this.xref.fetchIfRef(t[e + 1]); - n instanceof c.BaseStream && !n.isEmpty && (a[i] = n); - } - return a; - } - get xfaDatasets() { - const e = this._xfaStreams; - if (!e) return (0, i.shadow)(this, 'xfaDatasets', null); - for (const t of ['datasets', 'xdp:xdp']) { - const a = e[t]; - if (a) - try { - const e = { [t]: (0, i.stringToUTF8String)(a.getString()) }; - return (0, i.shadow)(this, 'xfaDatasets', new d.DatasetReader(e)); - } catch (e) { - (0, i.warn)('XFA - Invalid utf-8 string.'); - break; - } - } - return (0, i.shadow)(this, 'xfaDatasets', null); - } - get xfaData() { - const e = this._xfaStreams; - if (!e) return null; - const t = Object.create(null); - for (const [a, r] of Object.entries(e)) - if (r) - try { - t[a] = (0, i.stringToUTF8String)(r.getString()); - } catch (e) { - (0, i.warn)('XFA - Invalid utf-8 string.'); - return null; - } - return t; - } - get xfaFactory() { - let e; - this.pdfManager.enableXfa && - this.catalog.needsRendering && - this.formInfo.hasXfa && - !this.formInfo.hasAcroForm && - (e = this.xfaData); - return (0, i.shadow)(this, 'xfaFactory', e ? new x.XFAFactory(e) : null); - } - get isPureXfa() { - return !!this.xfaFactory && this.xfaFactory.isValid(); - } - get htmlForXfa() { - return this.xfaFactory ? this.xfaFactory.getPages() : null; - } - async loadXfaImages() { - const e = await this.pdfManager.ensureCatalog('xfaImages'); - if (!e) return; - const t = e.getKeys(), - a = new p.ObjectLoader(e, t, this.xref); - await a.load(); - const r = new Map(); - for (const a of t) { - const t = e.get(a); - t instanceof c.BaseStream && r.set(a, t.getBytes()); - } - this.xfaFactory.setImages(r); - } - async loadXfaFonts(e, t) { - const a = await this.pdfManager.ensureCatalog('acroForm'); - if (!a) return; - const r = await a.getAsync('DR'); - if (!(r instanceof s.Dict)) return; - const c = new p.ObjectLoader(r, ['Font'], this.xref); - await c.load(); - const l = r.get('Font'); - if (!(l instanceof s.Dict)) return; - const h = Object.assign(Object.create(null), this.pdfManager.evaluatorOptions); - h.useSystemFonts = !1; - const u = new b.PartialEvaluator({ - xref: this.xref, - handler: e, - pageIndex: -1, - idFactory: this._globalIdFactory, - fontCache: this.catalog.fontCache, - builtInCMapCache: this.catalog.builtInCMapCache, - standardFontDataCache: this.catalog.standardFontDataCache, - options: h, - }), - d = new m.OperatorList(), - f = [], - g = { - get font() { - return f.at(-1); - }, - set font(e) { - f.push(e); - }, - clone() { - return this; - }, - }, - y = new Map(); - l.forEach((e, t) => { - 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.replaceAll(/[ ]+(\d)/g, '$1'); - const l = { - fontFamily: c, - fontWeight: o.get('FontWeight'), - italicAngle: -o.get('ItalicAngle'), - }; - (0, n.validateCSSFont)(l) && - w.push( - u - .handleSetFont(r, [s.Name.get(e), 1], null, d, t, g, null, l) - .catch(function (e) { - (0, i.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 n = `${e}-${a.name}`, - c = (0, o.getXfaFontDict)(n); - w.push( - u - .handleSetFont(r, [s.Name.get(n), 1], null, d, t, g, c, { - fontFamily: e, - fontWeight: a.fontWeight, - italicAngle: a.italicAngle, - }) - .catch(function (e) { - (0, i.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 version() { - return this.catalog.version || this._version; - } - get formInfo() { - const e = { hasFields: !1, hasAcroForm: !1, hasXfa: !1, hasSignatures: !1 }, - t = this.catalog.acroForm; - if (!t) return (0, i.shadow)(this, 'formInfo', e); - try { - const a = t.get('Fields'), - r = Array.isArray(a) && a.length > 0; - e.hasFields = r; - const i = t.get('XFA'); - e.hasXfa = - (Array.isArray(i) && i.length > 0) || (i instanceof c.BaseStream && !i.isEmpty); - const n = !!(1 & t.get('SigFlags')), - s = n && this._hasOnlyDocumentSignatures(a); - e.hasAcroForm = r && !s; - e.hasSignatures = n; - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - (0, i.warn)(`Cannot fetch form information: "${e}".`); - } - return (0, i.shadow)(this, 'formInfo', e); - } - get documentInfo() { - const e = { - PDFFormatVersion: this.version, - 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 t; - try { - t = this.xref.trailer.get('Info'); - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - (0, i.info)('The document information dictionary is invalid.'); - } - if (!(t instanceof s.Dict)) return (0, i.shadow)(this, 'documentInfo', e); - for (const a of t.getKeys()) { - const r = t.get(a); - switch (a) { - case 'Title': - case 'Author': - case 'Subject': - case 'Keywords': - case 'Creator': - case 'Producer': - case 'CreationDate': - case 'ModDate': - if ('string' == typeof r) { - e[a] = (0, i.stringToPDFString)(r); - continue; - } - break; - case 'Trapped': - if (r instanceof s.Name) { - e[a] = r; - continue; - } - break; - default: - let t; - switch (typeof r) { - case 'string': - t = (0, i.stringToPDFString)(r); - break; - case 'number': - case 'boolean': - t = r; - break; - default: - r instanceof s.Name && (t = r); - } - if (void 0 === t) { - (0, i.warn)(`Bad value, for custom key "${a}", in Info: ${r}.`); - continue; - } - e.Custom || (e.Custom = Object.create(null)); - e.Custom[a] = t; - continue; - } - (0, i.warn)(`Bad value, for key "${a}", in Info: ${r}.`); - } - return (0, i.shadow)(this, 'documentInfo', e); - } - 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 (const a of e) { - const e = a.toString(16); - t.push(e.padStart(2, '0')); - } - return t.join(''); - } - const e = this.xref.trailer.get('ID'); - let t, a; - if (Array.isArray(e) && validate(e[0])) { - t = (0, i.stringToBytes)(e[0]); - e[1] !== e[0] && validate(e[1]) && (a = (0, i.stringToBytes)(e[1])); - } else t = (0, l.calculateMD5)(this.stream.getByteRange(0, 1024), 0, 1024); - return (0, i.shadow)(this, 'fingerprints', [hexString(t), a ? hexString(a) : null]); - } - async _getLinearizationPage(e) { - const { catalog: t, linearization: a, xref: r } = this, - n = s.Ref.get(a.objectNumberFirst, 0); - try { - const e = await r.fetchAsync(n); - if (e instanceof s.Dict) { - let a = e.getRaw('Type'); - a instanceof s.Ref && (a = await r.fetchAsync(a)); - if ((0, s.isName)(a, 'Page') || (!e.has('Type') && !e.has('Kids'))) { - t.pageKidsCountCache.has(n) || t.pageKidsCountCache.put(n, 1); - t.pageIndexCache.has(n) || t.pageIndexCache.put(n, 0); - return [e, n]; - } - } - throw new i.FormatError( - "The Linearization dictionary doesn't point to a valid Page dictionary.", - ); - } catch (a) { - (0, i.warn)(`_getLinearizationPage: "${a.message}".`); - return t.getPageDict(e); - } - } - getPage(e) { - const t = this._pagePromises.get(e); - if (t) return t; - const { catalog: a, linearization: r, xfaFactory: i } = this; - let n; - n = i - ? Promise.resolve([s.Dict.empty, null]) - : r && r.pageFirst === e - ? this._getLinearizationPage(e) - : a.getPageDict(e); - n = n.then( - ([t, r]) => - new 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: i, - }), - ); - this._pagePromises.set(e, n); - return n; - } - async checkFirstPage(e = !1) { - if (!e) - try { - await this.getPage(0); - } catch (e) { - if (e instanceof n.XRefEntryException) { - this._pagePromises.delete(0); - await this.cleanup(); - throw new n.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 i.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 n.XRefEntryException && !e) throw new n.XRefParseException(); - (0, i.warn)(`checkLastPage - invalid /Pages tree /Count: ${r}.`); - let o; - try { - o = await t.getAllPageDicts(e); - } catch (a) { - if (a instanceof n.XRefEntryException && !e) throw new n.XRefParseException(); - t.setActualNumPages(1); - return; - } - for (const [e, [r, i]] of o) { - let n; - if (r instanceof Error) { - n = Promise.reject(r); - n.catch(() => {}); - } else - n = Promise.resolve( - new Page({ - pdfManager: a, - xref: this.xref, - pageIndex: e, - pageDict: r, - ref: i, - globalIdFactory: this._globalIdFactory, - fontCache: t.fontCache, - builtInCMapCache: t.builtInCMapCache, - standardFontDataCache: t.standardFontDataCache, - globalImageCache: t.globalImageCache, - nonBlendModesSet: t.nonBlendModesSet, - xfaFactory: null, - }), - ); - this._pagePromises.set(e, n); - } - 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 n = this.xref.fetchIfRef(t); - if (n.has('T')) { - const t = (0, i.stringToPDFString)(n.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, i.warn)(`_collectFieldObjects: "${e}".`); - return null; - }), - ); - if (n.has('Kids')) { - const t = n.get('Kids'); - for (const r of t) this._collectFieldObjects(e, r, a); - } - } - get fieldObjects() { - if (!this.formInfo.hasFields) - return (0, i.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, i] of t) - a.push( - Promise.all(i).then((t) => { - (t = t.filter((e) => !!e)).length > 0 && (e[r] = t); - }), - ); - return (0, i.shadow)( - this, - 'fieldObjects', - Promise.all(a).then(() => e), - ); - } - get hasJSActions() { - const e = this.pdfManager.ensureDoc('_parseHasJSActions'); - return (0, i.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, i.shadow)(this, 'calculationOrderIds', null); - const t = e.get('CO'); - if (!Array.isArray(t) || 0 === t.length) - return (0, i.shadow)(this, 'calculationOrderIds', null); - const a = []; - for (const e of t) e instanceof s.Ref && a.push(e.toString()); - return 0 === a.length - ? (0, i.shadow)(this, 'calculationOrderIds', null) - : (0, i.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), - i = a(3), - n = a(11), - s = a(4), - o = a(65), - c = a(5), - l = a(60), - h = a(69), - u = a(12), - d = a(72), - f = a(75), - g = a(63), - p = a(8), - m = a(76); - t.AnnotationFactory = class AnnotationFactory { - static create(e, t, a, r, i) { - return Promise.all([ - a.ensureCatalog('acroForm'), - a.ensureCatalog('baseUrl'), - a.ensureCatalog('attachments'), - a.ensureDoc('xfaDatasets'), - i ? this._getPageIndex(e, t, a) : -1, - ]).then(([n, s, o, c, l]) => a.ensure(this, '_create', [e, t, a, r, n, o, c, i, l])); - } - static _create(e, t, a, n, o, c = null, l, h, u = -1) { - const d = e.fetchIfRef(t); - if (!(d instanceof s.Dict)) return; - const f = t instanceof s.Ref ? t.toString() : `annot_${n.createObjId()}`; - let g = d.get('Subtype'); - g = g instanceof s.Name ? g.name : null; - const p = o instanceof s.Dict ? o : s.Dict.empty, - m = { - xref: e, - ref: t, - dict: d, - subtype: g, - id: f, - pdfManager: a, - acroForm: p, - attachments: c, - xfaDatasets: l, - collectFields: h, - needAppearances: !h && !0 === p.get('NeedAppearances'), - pageIndex: u, - isOffscreenCanvasSupported: a.evaluatorOptions.isOffscreenCanvasSupported, - }; - switch (g) { - case 'Link': - return new LinkAnnotation(m); - case 'Text': - return new TextAnnotation(m); - case 'Widget': - let e = (0, i.getInheritableProperty)({ dict: d, key: 'FT' }); - e = e instanceof s.Name ? e.name : null; - switch (e) { - case 'Tx': - return new TextWidgetAnnotation(m); - case 'Btn': - return new ButtonWidgetAnnotation(m); - case 'Ch': - return new ChoiceWidgetAnnotation(m); - case 'Sig': - return new SignatureWidgetAnnotation(m); - } - (0, r.warn)( - `Unimplemented widget field type "${e}", falling back to base field type.`, - ); - return new WidgetAnnotation(m); - case 'Popup': - return new PopupAnnotation(m); - case 'FreeText': - return new FreeTextAnnotation(m); - case 'Line': - return new LineAnnotation(m); - case 'Square': - return new SquareAnnotation(m); - case 'Circle': - return new CircleAnnotation(m); - case 'PolyLine': - return new PolylineAnnotation(m); - case 'Polygon': - return new PolygonAnnotation(m); - case 'Caret': - return new CaretAnnotation(m); - case 'Ink': - return new InkAnnotation(m); - case 'Highlight': - return new HighlightAnnotation(m); - case 'Underline': - return new UnderlineAnnotation(m); - case 'Squiggly': - return new SquigglyAnnotation(m); - case 'StrikeOut': - return new StrikeOutAnnotation(m); - case 'Stamp': - return new StampAnnotation(m); - case 'FileAttachment': - return new FileAttachmentAnnotation(m); - default: - h || - (g - ? (0, r.warn)( - `Unimplemented annotation type "${g}", falling back to base annotation.`, - ) - : (0, r.warn)('Annotation is missing the required /Subtype.')); - return new Annotation(m); - } - } - static async _getPageIndex(e, t, a) { - try { - const r = await e.fetchIfRefAsync(t); - if (!(r instanceof s.Dict)) return -1; - const i = r.getRaw('P'); - if (!(i instanceof s.Ref)) return -1; - return await a.ensureCatalog('getPageIndex', [i]); - } catch (e) { - (0, r.warn)(`_getPageIndex: "${e}".`); - return -1; - } - } - static async saveNewAnnotations(e, t, a) { - const i = e.xref; - let n; - const c = [], - l = []; - for (const h of a) - switch (h.annotationType) { - case r.AnnotationEditorType.FREETEXT: - if (!n) { - const e = new s.Dict(i); - 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 = []; - n = i.getNewTemporaryRef(); - (0, o.writeObject)(n, e, t, null); - c.push({ ref: n, data: t.join('') }); - } - l.push( - FreeTextAnnotation.createNewAnnotation(i, h, c, { - evaluator: e, - task: t, - baseFontRef: n, - }), - ); - break; - case r.AnnotationEditorType.INK: - l.push(InkAnnotation.createNewAnnotation(i, h, c)); - } - return { annotations: await Promise.all(l), dependencies: c }; - } - static async printNewAnnotations(e, t, a) { - if (!a) return null; - const i = e.xref, - { isOffscreenCanvasSupported: n } = e.options, - s = []; - for (const o of a) - switch (o.annotationType) { - case r.AnnotationEditorType.FREETEXT: - s.push( - FreeTextAnnotation.createNewPrintAnnotation(i, o, { - evaluator: e, - task: t, - isOffscreenCanvasSupported: n, - }), - ); - break; - case r.AnnotationEditorType.INK: - s.push( - InkAnnotation.createNewPrintAnnotation(i, o, { - isOffscreenCanvasSupported: n, - }), - ); - } - return Promise.all(s); - } - }; - 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 getPdfColorArray(e) { - return Array.from(e, (e) => e / 255); - } - function getQuadPoints(e, t) { - const a = e.getArray('QuadPoints'); - if (!Array.isArray(a) || 0 === a.length || a.length % 8 > 0) return null; - const r = []; - for (let e = 0, i = a.length / 8; e < i; e++) { - let i = 1 / 0, - n = -1 / 0, - s = 1 / 0, - o = -1 / 0; - for (let t = 8 * e, r = 8 * e + 8; t < r; t += 2) { - const e = a[t], - r = a[t + 1]; - i = Math.min(e, i); - n = Math.max(e, n); - s = Math.min(r, s); - o = Math.max(r, o); - } - if (null !== t && (i < t[0] || n > t[2] || s < t[1] || o > t[3])) return null; - r.push([ - { x: i, y: o }, - { x: n, y: o }, - { x: i, y: s }, - { x: n, y: s }, - ]); - } - return r; - } - function getTransformMatrix(e, t, a) { - const [i, n, s, o] = r.Util.getAxialAlignedBoundingBox(t, a); - if (i === s || n === o) return [1, 0, 0, 1, e[0], e[1]]; - const c = (e[2] - e[0]) / (s - i), - l = (e[3] - e[1]) / (o - n); - return [c, 0, 0, l, e[0] - i * c, e[1] - n * l]; - } - class Annotation { - constructor(e) { - const { dict: t, xref: a } = e; - 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 n = t.get('MK'); - this.setBorderAndBackgroundColors(n); - this.setRotation(n); - this._streams = []; - this.appearance && this._streams.push(this.appearance); - const o = !!(this.flags & r.AnnotationFlag.LOCKED), - c = !!(this.flags & r.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: e.id, - modificationDate: this.modificationDate, - rect: this.rectangle, - subtype: e.subtype, - hasOwnCanvas: !1, - noRotate: !!(this.flags & r.AnnotationFlag.NOROTATE), - noHTML: o && c, - }; - if (e.collectFields) { - const n = t.get('Kids'); - if (Array.isArray(n)) { - const e = []; - for (const t of n) t instanceof s.Ref && e.push(t.toString()); - 0 !== e.length && (this.data.kidIds = e); - } - this.data.actions = (0, i.collectActions)(a, t, r.AnnotationActionEventType); - this.data.fieldName = this._constructFieldName(t); - this.data.pageIndex = e.pageIndex; - } - this._isOffscreenCanvasSupported = e.isOffscreenCanvasSupported; - this._fallbackFontDict = null; - this._needAppearances = !1; - } - _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' }; - } - setDefaultAppearance(e) { - const t = - (0, i.getInheritableProperty)({ dict: e.dict, key: 'DA' }) || e.acroForm.get('DA'); - this._defaultAppearance = 'string' == typeof t ? t : ''; - this.data.defaultAppearanceData = (0, n.parseDefaultAppearance)( - this._defaultAppearance, - ); - } - 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'); - if (!(r instanceof s.Name && a.has(r.name))) return; - const i = a.get(r.name); - i instanceof c.BaseStream && (this.appearance = i); - } - 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, i, n) { - 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, - ), - i = [], - n = [], - s = { - desiredSize: Math.Infinity, - ready: !0, - enqueue(e, t) { - for (const t of e.items) { - n.push(t.str); - if (t.hasEOL) { - i.push(n.join('')); - n.length = 0; - } - } - }, - }; - await e.getTextContent({ - stream: this.appearance, - task: t, - resources: r, - includeMarkedContent: !0, - sink: s, - viewBox: a, - }); - this.reset(); - n.length && i.push(n.join('')); - i.length > 0 && (this.data.textContent = i); - } - 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 i = new s.RefSet(); - e.objId && i.put(e.objId); - for (; a.has('Parent'); ) { - a = a.get('Parent'); - if (!(a instanceof s.Dict) || (a.objId && i.has(a.objId))) break; - a.objId && i.put(a.objId); - if (a.has('T')) { - const e = (0, r.stringToPDFString)(a.get('T')); - e.startsWith('#') || t.unshift(e); - } - } - 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, - i = (t[3] - t[1]) / 2; - if (a > 0 && i > 0 && (e > a || e > i)) { - (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 { dict: t } = e; - 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: i, - strokeAlpha: n, - 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, i] = c(f, e); - l = Math.min(l, t); - u = Math.max(u, a); - h = Math.min(h, r); - d = Math.max(d, i); - } - 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); - i && w.set('BM', s.Name.get(i)); - 'number' == typeof n && w.set('CA', n); - '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 C = new s.Dict(e); - C.set('Resources', x); - const k = (this.data.rect = [l, h, u, d]); - C.set('BBox', k); - this.appearance = new p.StringStream('/GS0 gs /Fm0 Do'); - this.appearance.dict = C; - this._streams.push(this.appearance, y); - } - static async createNewAnnotation(e, t, a, r) { - const i = e.getNewTemporaryRef(), - n = await this.createNewAppearanceStream(t, e, r), - s = []; - let c; - if (n) { - const r = e.getNewTemporaryRef(); - c = this.createNewDict(t, e, { apRef: r }); - const i = e.encrypt ? e.encrypt.createCipherTransform(r.num, r.gen) : null; - (0, o.writeObject)(r, n, s, i); - a.push({ ref: r, data: s.join('') }); - } else c = this.createNewDict(t, e, {}); - s.length = 0; - const l = e.encrypt ? e.encrypt.createCipherTransform(i.num, i.gen) : null; - (0, o.writeObject)(i, c, s, l); - return { ref: i, data: s.join('') }; - } - static async createNewPrintAnnotation(e, t, a) { - const r = await this.createNewAppearanceStream(t, e, a), - i = this.createNewDict(t, e, { ap: r }); - return new this.prototype.constructor({ - dict: i, - xref: e, - isOffscreenCanvasSupported: a.isOffscreenCanvasSupported, - }); - } - } - t.MarkupAnnotation = MarkupAnnotation; - class WidgetAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t, xref: a } = e, - n = this.data; - this.ref = e.ref; - this._needAppearances = e.needAppearances; - n.annotationType = r.AnnotationType.WIDGET; - void 0 === n.fieldName && (n.fieldName = this._constructFieldName(t)); - void 0 === n.actions && - (n.actions = (0, i.collectActions)(a, t, r.AnnotationActionEventType)); - let o = (0, i.getInheritableProperty)({ dict: t, key: 'V', getArray: !0 }); - n.fieldValue = this._decodeFormValue(o); - const c = (0, i.getInheritableProperty)({ dict: t, key: 'DV', getArray: !0 }); - n.defaultFieldValue = this._decodeFormValue(c); - if (void 0 === o && e.xfaDatasets) { - const t = this._title.str; - if (t) { - this._hasValueFromXFA = !0; - n.fieldValue = o = e.xfaDatasets.getValue(t); - } - } - void 0 === o && null !== n.defaultFieldValue && (n.fieldValue = n.defaultFieldValue); - n.alternativeText = (0, r.stringToPDFString)(t.get('TU') || ''); - this.setDefaultAppearance(e); - n.hasAppearance ||= - this._needAppearances && void 0 !== n.fieldValue && null !== n.fieldValue; - const l = (0, i.getInheritableProperty)({ dict: t, key: 'FT' }); - n.fieldType = l instanceof s.Name ? l.name : null; - const h = (0, i.getInheritableProperty)({ dict: t, key: 'DR' }), - u = e.acroForm.get('DR'), - d = this.appearance && this.appearance.dict.get('Resources'); - this._fieldResources = { - localResources: h, - acroFormResources: u, - appearanceResources: d, - mergedResources: s.Dict.merge({ xref: a, dictArray: [h, d, u], mergeSubDicts: !0 }), - }; - n.fieldFlags = (0, i.getInheritableProperty)({ dict: t, key: 'Ff' }); - (!Number.isInteger(n.fieldFlags) || n.fieldFlags < 0) && (n.fieldFlags = 0); - n.readOnly = this.hasFieldFlag(r.AnnotationFieldFlag.READONLY); - n.required = this.hasFieldFlag(r.AnnotationFieldFlag.REQUIRED); - n.hidden = this._hasFlag(n.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); - } - 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], - s = this.data.rect[3] - this.data.rect[1]; - return (0, i.getRotationMatrix)(a, n, s); - } - 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], - i = this.data.rect[3] - this.data.rect[1], - s = 0 === a || 180 === a ? `0 0 ${r} ${i} re` : `0 0 ${i} ${r} re`; - let o = ''; - this.backgroundColor && - (o = `${(0, n.getPdfColor)(this.backgroundColor, !0)} ${s} f `); - if (this.borderColor) { - o += `${this.borderStyle.width || 1} w ${(0, n.getPdfColor)( - this.borderColor, - !1, - )} ${s} S `; - } - return o; - } - async getOperatorList(e, t, a, i, n) { - if ( - i && - !(this instanceof SignatureWidgetAnnotation) && - !this.data.noHTML && - !this.data.hasOwnCanvas - ) - return { opList: new g.OperatorList(), separateForm: !0, separateCanvas: !1 }; - if (!this._hasText) return super.getOperatorList(e, t, a, i, n); - const s = await this._getAppearance(e, t, a, n); - if (this.appearance && null === s) return super.getOperatorList(e, t, a, i, n); - 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(n), - !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', getPdfColorArray(this.borderColor)); - this.backgroundColor && t.set('BG', getPdfColorArray(this.backgroundColor)); - return t.size > 0 ? t : null; - } - amendSavedDict(e, t) {} - async save(e, t, a) { - const n = a ? a.get(this.data.id) : void 0; - let c = n && n.value, - l = n && n.rotation; - if (c === this.data.fieldValue || void 0 === c) { - if (!this._hasValueFromXFA && void 0 === l) return null; - c ||= this.data.fieldValue; - } - if ( - void 0 === l && - !this._hasValueFromXFA && - Array.isArray(c) && - Array.isArray(this.data.fieldValue) && - c.length === this.data.fieldValue.length && - c.every((e, t) => e === this.data.fieldValue[t]) - ) - return null; - void 0 === l && (l = this.rotation); - let h = null; - if (!this._needAppearances) { - h = await this._getAppearance(e, t, r.RenderingIntentFlag.SAVE, a); - if (null === h) return null; - } - let u = !1; - if (h && h.needAppearances) { - u = !0; - h = null; - } - const { xref: d } = e, - f = d.fetchIfRef(this.ref); - if (!(f instanceof s.Dict)) return null; - const g = new s.Dict(d); - for (const e of f.getKeys()) 'AP' !== e && g.set(e, f.getRaw(e)); - const m = { path: this.data.fieldName, value: c }, - encoder = (e) => ((0, i.isAscii)(e) ? e : (0, i.stringToUTF16String)(e, !0)); - g.set('V', Array.isArray(c) ? c.map(encoder) : encoder(c)); - this.amendSavedDict(a, g); - const b = this._getMKDict(l); - b && g.set('MK', b); - const y = d.encrypt, - w = y ? y.createCipherTransform(this.ref.num, this.ref.gen) : null, - S = [], - x = [{ ref: this.ref, data: '', xfa: m, needAppearances: u }]; - if (null !== h) { - const e = d.getNewTemporaryRef(), - t = new s.Dict(d); - g.set('AP', t); - t.set('N', e); - let i = null; - y && (i = y.createCipherTransform(e.num, e.gen)); - const n = this._getSaveFieldResources(d), - c = new p.StringStream(h), - l = (c.dict = new s.Dict(d)); - l.set('Subtype', s.Name.get('Form')); - l.set('Resources', n); - l.set('BBox', [ - 0, - 0, - this.data.rect[2] - this.data.rect[0], - this.data.rect[3] - this.data.rect[1], - ]); - const u = this.getRotationMatrix(a); - u !== r.IDENTITY_MATRIX && l.set('Matrix', u); - (0, o.writeObject)(e, c, S, i); - x.push({ ref: e, data: S.join(''), xfa: null, needAppearances: !1 }); - S.length = 0; - } - g.set('M', `D:${(0, r.getModificationDate)()}`); - (0, o.writeObject)(this.ref, g, S, w); - x[0].data = S.join(''); - return x; - } - async _getAppearance(e, t, a, s) { - if (this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD)) return null; - const o = s ? s.get(this.data.id) : void 0; - let c, l; - if (o) { - c = o.formattedValue || o.value; - l = o.rotation; - } - if ( - void 0 === l && - void 0 === c && - !this._needAppearances && - (!this._hasValueFromXFA || this.appearance) - ) - return null; - const h = this.getBorderAndBackgroundAppearances(s); - if (void 0 === c) { - c = this.data.fieldValue; - if (!c) return `/Tx BMC q ${h}Q EMC`; - } - Array.isArray(c) && 1 === c.length && (c = c[0]); - (0, r.assert)('string' == typeof c, 'Expected `value` to be a string.'); - c = c.trim(); - if (this.data.combo) { - const e = this.data.options.find(({ exportValue: e }) => c === e); - c = (e && e.displayValue) || c; - } - if ('' === c) return `/Tx BMC q ${h}Q EMC`; - void 0 === l && (l = this.rotation); - let u, - d = -1; - if (this.data.multiLine) { - u = c.split(/\r\n?|\n/).map((e) => e.normalize('NFC')); - d = u.length; - } else u = [c.replace(/\r\n?|\n/, '').normalize('NFC')]; - let f = this.data.rect[3] - this.data.rect[1], - g = this.data.rect[2] - this.data.rect[0]; - (90 !== l && 270 !== l) || ([g, f] = [f, g]); - this._defaultAppearance || - (this.data.defaultAppearanceData = (0, n.parseDefaultAppearance)( - (this._defaultAppearance = '/Helvetica 0 Tf 0 g'), - )); - let p, - m, - b, - y = await WidgetAnnotation._getFontData( - e, - t, - this.data.defaultAppearanceData, - this._fieldResources.mergedResources, - ); - const w = []; - let S = !1; - for (const e of u) { - const t = y.encodeString(e); - t.length > 1 && (S = !0); - w.push(t.join('')); - } - if (S && a & r.RenderingIntentFlag.SAVE) return { needAppearances: !0 }; - if (S && this._isOffscreenCanvasSupported) { - const a = this.data.comb ? 'monospace' : 'sans-serif', - r = new n.FakeUnicodeFont(e.xref, a), - s = r.createFontResources(u.join('')), - o = s.getRaw('Font'); - if (this._fieldResources.mergedResources.has('Font')) { - const e = this._fieldResources.mergedResources.get('Font'); - for (const t of o.getKeys()) e.set(t, o.getRaw(t)); - } else this._fieldResources.mergedResources.set('Font', o); - const l = r.fontName.name; - y = await WidgetAnnotation._getFontData(e, t, { fontName: l, fontSize: 0 }, s); - for (let e = 0, t = w.length; e < t; e++) w[e] = (0, i.stringToUTF16String)(u[e]); - const h = Object.assign(Object.create(null), this.data.defaultAppearanceData); - this.data.defaultAppearanceData.fontSize = 0; - this.data.defaultAppearanceData.fontName = l; - [p, m, b] = this._computeFontSize(f - 2, g - 4, c, y, d); - this.data.defaultAppearanceData = h; - } else { - this._isOffscreenCanvasSupported || - (0, r.warn)( - '_getAppearance: OffscreenCanvas is not supported, annotation may not render correctly.', - ); - [p, m, b] = this._computeFontSize(f - 2, g - 4, c, y, d); - } - let x = y.descent; - x = isNaN(x) - ? r.BASELINE_FACTOR * b - : Math.max(r.BASELINE_FACTOR * b, Math.abs(x) * m); - const C = Math.min(Math.floor((f - m) / 2), 1), - k = this.data.textAlignment; - if (this.data.multiLine) - return this._getMultilineAppearance(p, w, y, m, g, f, k, 2, C, x, b, s); - if (this.data.comb) - return this._getCombAppearance(p, y, w[0], m, g, f, 2, C, x, b, s); - const v = C + x; - if (0 === k || k > 2) - return ( - `/Tx BMC q ${h}BT ` + - p + - ` 1 0 0 1 ${(0, i.numberToString)(2)} ${(0, i.numberToString)(v)} Tm (${(0, - i.escapeString)(w[0])}) Tj ET Q EMC` - ); - return ( - `/Tx BMC q ${h}BT ` + - p + - ` 1 0 0 1 0 0 Tm ${this._renderText(w[0], y, m, g, k, { shift: 0 }, 2, v)} ET Q EMC` - ); - } - static async _getFontData(e, t, a, r) { - const i = new g.OperatorList(), - n = { - font: null, - clone() { - return this; - }, - }, - { fontName: o, fontSize: c } = a; - await e.handleSetFont(r, [o && s.Name.get(o), c], null, i, t, n, null); - return n.font; - } - _getTextWidth(e, t) { - return t.charsToGlyphs(e).reduce((e, t) => e + t.width, 0) / 1e3; - } - _computeFontSize(e, t, a, i, s) { - let { fontSize: o } = this.data.defaultAppearanceData, - c = (o || 12) * r.LINE_FACTOR, - l = Math.round(e / c); - if (!o) { - const roundWithTwoDigits = (e) => Math.floor(100 * e) / 100; - if (-1 === s) { - const n = this._getTextWidth(a, i); - o = roundWithTwoDigits(Math.min(e / r.LINE_FACTOR, n > t ? t / n : 1 / 0)); - l = 1; - } else { - const n = a.split(/\r\n?|\n/), - h = []; - for (const e of n) { - const t = i.encodeString(e).join(''), - a = i.charsToGlyphs(t), - r = i.getCharPositions(t); - h.push({ line: t, glyphs: a, positions: r }); - } - const isTooBig = (a) => { - let r = 0; - for (const n of h) { - r += this._splitLine(null, i, a, t, n).length * a; - if (r > e) return !0; - } - return !1; - }; - l = Math.max(l, s); - for (;;) { - c = e / l; - o = roundWithTwoDigits(c / r.LINE_FACTOR); - if (!isTooBig(o)) break; - l++; - } - } - const { fontName: h, fontColor: u } = this.data.defaultAppearanceData; - this._defaultAppearance = (0, n.createDefaultAppearance)({ - fontSize: o, - fontName: h, - fontColor: u, - }); - } - return [this._defaultAppearance, o, e / l]; - } - _renderText(e, t, a, r, n, s, o, c) { - let l; - if (1 === n) { - l = (r - this._getTextWidth(e, t) * a) / 2; - } else if (2 === n) { - l = r - this._getTextWidth(e, t) * a - o; - } else l = o; - const h = (0, i.numberToString)(l - s.shift); - s.shift = l; - return `${h} ${(c = (0, i.numberToString)(c))} Td (${(0, i.escapeString)(e)}) Tj`; - } - _getSaveFieldResources(e) { - const { - localResources: t, - appearanceResources: a, - acroFormResources: r, - } = this._fieldResources, - i = this.data.defaultAppearanceData && this.data.defaultAppearanceData.fontName; - if (!i) 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(i)) return e; - } - if (r instanceof s.Dict) { - const a = r.get('Font'); - if (a instanceof s.Dict && a.has(i)) { - const r = new s.Dict(e); - r.set(i, a.getRaw(i)); - const n = new s.Dict(e); - n.set('Font', r); - return s.Dict.merge({ xref: e, dictArray: [n, t], mergeSubDicts: !0 }); - } - } - return t || s.Dict.empty; - } - getFieldObject() { - return null; - } - } - class TextWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); - this.data.hasOwnCanvas = this.data.readOnly && !this.data.noHTML; - this._hasText = !0; - const t = e.dict; - 'string' != typeof this.data.fieldValue && (this.data.fieldValue = ''); - let a = (0, i.getInheritableProperty)({ dict: t, key: 'Q' }); - (!Number.isInteger(a) || a < 0 || a > 2) && (a = null); - this.data.textAlignment = a; - let n = (0, i.getInheritableProperty)({ dict: t, key: 'MaxLen' }); - (!Number.isInteger(n) || n < 0) && (n = 0); - this.data.maxLen = n; - 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, r, n, s, o, c, l, h, u) { - const d = n / this.data.maxLen, - f = this.getBorderAndBackgroundAppearances(u), - g = [], - p = t.getCharPositions(a); - for (const [e, t] of p) g.push(`(${(0, i.escapeString)(a.substring(e, t))}) Tj`); - const m = g.join(` ${(0, i.numberToString)(d)} 0 Td `); - return ( - `/Tx BMC q ${f}BT ` + - e + - ` 1 0 0 1 ${(0, i.numberToString)(o)} ${(0, i.numberToString)( - c + l, - )} Tm ${m} ET Q EMC` - ); - } - _getMultilineAppearance(e, t, a, r, n, s, o, c, l, h, u, d) { - const f = [], - g = n - 2 * c, - p = { shift: 0 }; - for (let e = 0, i = t.length; e < i; e++) { - const i = t[e], - s = this._splitLine(i, a, r, g); - for (let t = 0, i = s.length; t < i; t++) { - const i = s[t], - d = 0 === e && 0 === t ? -l - (u - h) : -u; - f.push(this._renderText(i, a, r, n, o, p, c, d)); - } - } - const m = this.getBorderAndBackgroundAppearances(d), - b = f.join('\n'); - return ( - `/Tx BMC q ${m}BT ` + e + ` 1 0 0 1 0 ${(0, i.numberToString)(s)} Tm ${b} ET Q EMC` - ); - } - _splitLine(e, t, a, r, i = {}) { - e = i.line || e; - const n = i.glyphs || t.charsToGlyphs(e); - if (n.length <= 1) return [e]; - const s = i.positions || t.getCharPositions(e), - o = a / 1e3, - c = []; - let l = -1, - h = -1, - u = -1, - d = 0, - f = 0; - for (let t = 0, a = n.length; t < a; t++) { - const [a, i] = s[t], - g = n[t], - p = g.width * o; - if (' ' === g.unicode) - if (f + p > r) { - c.push(e.substring(d, a)); - d = a; - f = p; - l = -1; - u = -1; - } else { - f += p; - l = a; - h = i; - 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 < e.length && c.push(e.substring(d, e.length)); - return c; - } - getFieldObject() { - return { - id: this.data.id, - value: this.data.fieldValue, - defaultValue: this.data.defaultFieldValue || '', - multiline: this.data.multiLine, - password: this.hasFieldFlag(r.AnnotationFieldFlag.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, - type: 'text', - }; - } - } - class ButtonWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); - this.checkedAppearance = null; - this.uncheckedAppearance = null; - this.data.checkBox = - !this.hasFieldFlag(r.AnnotationFieldFlag.RADIO) && - !this.hasFieldFlag(r.AnnotationFieldFlag.PUSHBUTTON); - this.data.radioButton = - this.hasFieldFlag(r.AnnotationFieldFlag.RADIO) && - !this.hasFieldFlag(r.AnnotationFieldFlag.PUSHBUTTON); - this.data.pushButton = this.hasFieldFlag(r.AnnotationFieldFlag.PUSHBUTTON); - this.data.isTooltipOnly = !1; - if (this.data.checkBox) this._processCheckBox(e); - else if (this.data.radioButton) this._processRadioButton(e); - else if (this.data.pushButton) { - this.data.hasOwnCanvas = !0; - this._processPushButton(e); - } else (0, r.warn)('Invalid field flags for button widget annotation'); - } - async getOperatorList(e, t, a, i, n) { - if (this.data.pushButton) return super.getOperatorList(e, t, a, !1, n); - let s = null, - o = null; - if (n) { - const e = n.get(this.data.id); - s = e ? e.value : null; - o = e ? e.rotation : null; - } - if (null === s && this.appearance) return super.getOperatorList(e, t, a, i, n); - null == s && - (s = this.data.checkBox - ? this.data.fieldValue === this.data.exportValue - : this.data.fieldValue === this.data.buttonValue); - const c = s ? this.checkedAppearance : this.uncheckedAppearance; - if (c) { - const s = this.appearance, - l = c.dict.getArray('Matrix') || r.IDENTITY_MATRIX; - o && c.dict.set('Matrix', this.getRotationMatrix(n)); - this.appearance = c; - const h = super.getOperatorList(e, t, a, i, n); - this.appearance = s; - c.dict.set('Matrix', l); - return h; - } - return { opList: new g.OperatorList(), separateForm: !1, separateCanvas: !1 }; - } - async save(e, t, a) { - return this.data.checkBox - ? this._saveCheckbox(e, t, a) - : this.data.radioButton - ? this._saveRadioButton(e, t, a) - : null; - } - async _saveCheckbox(e, t, a) { - if (!a) return null; - const i = a.get(this.data.id); - let n = i && i.rotation, - c = i && i.value; - if (void 0 === n) { - if (void 0 === c) return null; - if ((this.data.fieldValue === this.data.exportValue) === c) return null; - } - const l = e.xref.fetchIfRef(this.ref); - if (!(l instanceof s.Dict)) return null; - void 0 === n && (n = this.rotation); - void 0 === c && (c = this.data.fieldValue === this.data.exportValue); - const h = { path: this.data.fieldName, value: c ? this.data.exportValue : '' }, - u = s.Name.get(c ? this.data.exportValue : 'Off'); - l.set('V', u); - l.set('AS', u); - l.set('M', `D:${(0, r.getModificationDate)()}`); - const d = this._getMKDict(n); - d && l.set('MK', d); - const f = e.xref.encrypt; - let g = null; - f && (g = f.createCipherTransform(this.ref.num, this.ref.gen)); - const p = [`${this.ref.num} ${this.ref.gen} obj\n`]; - (0, o.writeDict)(l, p, g); - p.push('\nendobj\n'); - return [{ ref: this.ref, data: p.join(''), xfa: h }]; - } - async _saveRadioButton(e, t, a) { - if (!a) return null; - const i = a.get(this.data.id); - let n = i && i.rotation, - c = i && i.value; - if (void 0 === n) { - if (void 0 === c) return null; - if ((this.data.fieldValue === this.data.buttonValue) === c) return null; - } - const l = e.xref.fetchIfRef(this.ref); - if (!(l instanceof s.Dict)) return null; - void 0 === c && (c = this.data.fieldValue === this.data.buttonValue); - void 0 === n && (n = this.rotation); - const h = { path: this.data.fieldName, value: c ? this.data.buttonValue : '' }, - u = s.Name.get(c ? this.data.buttonValue : 'Off'); - let d = null; - const f = e.xref.encrypt; - if (c) - if (this.parent instanceof s.Ref) { - const t = e.xref.fetch(this.parent); - let a = null; - f && (a = f.createCipherTransform(this.parent.num, this.parent.gen)); - t.set('V', u); - d = [`${this.parent.num} ${this.parent.gen} obj\n`]; - (0, o.writeDict)(t, d, a); - d.push('\nendobj\n'); - } else this.parent instanceof s.Dict && this.parent.set('V', u); - l.set('AS', u); - l.set('M', `D:${(0, r.getModificationDate)()}`); - const g = this._getMKDict(n); - g && l.set('MK', g); - let p = null; - f && (p = f.createCipherTransform(this.ref.num, this.ref.gen)); - const m = [`${this.ref.num} ${this.ref.gen} obj\n`]; - (0, o.writeDict)(l, m, p); - m.push('\nendobj\n'); - const b = [{ ref: this.ref, data: m.join(''), xfa: h }]; - null !== d && b.push({ ref: this.parent, data: d.join(''), xfa: null }); - return b; - } - _getDefaultCheckedAppearance(e, t) { - const a = this.data.rect[2] - this.data.rect[0], - n = this.data.rect[3] - this.data.rect[1], - o = [0, 0, a, n], - c = 0.8 * Math.min(a, n); - let l, h; - if ('check' === t) { - l = { width: 0.755 * c, height: 0.705 * c }; - h = '3'; - } else if ('disc' === t) { - l = { width: 0.791 * c, height: 0.705 * c }; - h = 'l'; - } else (0, r.unreachable)(`_getDefaultCheckedAppearance - unsupported type: ${t}`); - const u = `q BT /PdfJsZaDb ${c} Tf 0 g ${(0, i.numberToString)( - (a - l.width) / 2, - )} ${(0, i.numberToString)((n - l.height) / 2)} Td (${h}) Tj ET Q`, - d = new s.Dict(e.xref); - d.set('FormType', 1); - d.set('Subtype', s.Name.get('Form')); - d.set('Type', s.Name.get('XObject')); - d.set('BBox', o); - d.set('Matrix', [1, 0, 0, 1, 0, 0]); - d.set('Length', u.length); - const f = new s.Dict(e.xref), - g = new s.Dict(e.xref); - g.set('PdfJsZaDb', this.fallbackFontDict); - f.set('Font', g); - d.set('Resources', f); - this.checkedAppearance = new p.StringStream(u); - this.checkedAppearance.dict = d; - this._streams.push(this.checkedAppearance); - } - _processCheckBox(e) { - const t = e.dict.get('AP'); - if (!(t instanceof s.Dict)) return; - const a = t.get('N'); - if (!(a instanceof s.Dict)) return; - const r = this._decodeFormValue(e.dict.get('AS')); - 'string' == typeof r && (this.data.fieldValue = r); - const i = - null !== this.data.fieldValue && 'Off' !== this.data.fieldValue - ? this.data.fieldValue - : 'Yes', - n = a.getKeys(); - if (0 === n.length) n.push('Off', i); - else if (1 === n.length) 'Off' === n[0] ? n.push(i) : n.unshift('Off'); - else if (n.includes(i)) { - n.length = 0; - n.push('Off', i); - } else { - const e = n.find((e) => 'Off' !== e); - n.length = 0; - n.push('Off', e); - } - n.includes(this.data.fieldValue) || (this.data.fieldValue = 'Off'); - this.data.exportValue = n[1]; - const o = a.get(this.data.exportValue); - this.checkedAppearance = o instanceof c.BaseStream ? o : null; - const l = a.get('Off'); - this.uncheckedAppearance = l instanceof c.BaseStream ? l : 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)) return; - for (const e of r.getKeys()) - if ('Off' !== e) { - this.data.buttonValue = this._decodeFormValue(e); - break; - } - const i = r.get(this.data.buttonValue); - this.checkedAppearance = i instanceof c.BaseStream ? i : null; - const n = r.get('Off'); - this.uncheckedAppearance = n instanceof c.BaseStream ? n : 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, - docAttachments: e.attachments, - }); - } 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); - const { dict: t, xref: a } = e; - this.indices = t.getArray('I'); - this.hasIndices = Array.isArray(this.indices) && this.indices.length > 0; - this.data.options = []; - const n = (0, i.getInheritableProperty)({ dict: t, key: 'Opt' }); - if (Array.isArray(n)) - for (let e = 0, t = n.length; e < t; e++) { - const t = a.fetchIfRef(n[e]), - r = Array.isArray(t); - this.data.options[e] = { - exportValue: this._decodeFormValue(r ? a.fetchIfRef(t[0]) : t), - displayValue: this._decodeFormValue(r ? a.fetchIfRef(t[1]) : t), - }; - } - if (this.hasIndices) { - this.data.fieldValue = []; - const e = this.data.options.length; - for (const t of this.indices) - Number.isInteger(t) && - t >= 0 && - t < e && - this.data.fieldValue.push(this.data.options[t].exportValue); - } else - 'string' == typeof this.data.fieldValue - ? (this.data.fieldValue = [this.data.fieldValue]) - : this.data.fieldValue || (this.data.fieldValue = []); - this.data.combo = this.hasFieldFlag(r.AnnotationFieldFlag.COMBO); - this.data.multiSelect = this.hasFieldFlag(r.AnnotationFieldFlag.MULTISELECT); - this._hasText = !0; - } - getFieldObject() { - const e = this.data.combo ? 'combobox' : 'listbox', - t = this.data.fieldValue.length > 0 ? 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, - }; - } - amendSavedDict(e, t) { - if (!this.hasIndices) return; - const a = e ? e.get(this.data.id) : void 0; - let r = a && a.value; - Array.isArray(r) || (r = [r]); - const i = [], - { options: n } = this.data; - for (let e = 0, t = 0, a = n.length; e < a; e++) - if (n[e].exportValue === r[t]) { - i.push(e); - t += 1; - } - t.set('I', i); - } - async _getAppearance(e, t, a, i) { - if (this.data.combo) return super._getAppearance(e, t, a, i); - let s, o; - const c = i ? i.get(this.data.id) : void 0; - if (c) { - o = c.rotation; - s = c.value; - } - if (void 0 === o && void 0 === s && !this._needAppearances) return null; - void 0 === s ? (s = this.data.fieldValue) : Array.isArray(s) || (s = [s]); - 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]); - const u = this.data.options.length, - d = []; - for (let e = 0; e < u; e++) { - const { exportValue: t } = this.data.options[e]; - s.includes(t) && d.push(e); - } - this._defaultAppearance || - (this.data.defaultAppearanceData = (0, n.parseDefaultAppearance)( - (this._defaultAppearance = '/Helvetica 0 Tf 0 g'), - )); - const f = await WidgetAnnotation._getFontData( - e, - t, - this.data.defaultAppearanceData, - this._fieldResources.mergedResources, - ); - let g, - { fontSize: p } = this.data.defaultAppearanceData; - if (p) g = this._defaultAppearance; - else { - const e = (l - 1) / u; - let t, - a = -1; - for (const { displayValue: e } of this.data.options) { - const r = this._getTextWidth(e, f); - if (r > a) { - a = r; - t = e; - } - } - [g, p] = this._computeFontSize(e, h - 4, t, f, -1); - } - const m = p * r.LINE_FACTOR, - b = (m - p) / 2, - y = Math.floor(l / m); - let w; - if (1 === d.length) { - const e = d[0]; - w = e - (e % y); - } else w = d.length ? d[0] : 0; - const S = Math.min(w + y + 1, u), - x = ['/Tx BMC q', `1 1 ${h} ${l} re W n`]; - if (d.length) { - x.push('0.600006 0.756866 0.854904 rg'); - for (const e of d) - w <= e && e < S && x.push(`1 ${l - (e - w + 1) * m} ${h} ${m} re f`); - } - x.push('BT', g, `1 0 0 1 0 ${l} Tm`); - const C = { shift: 0 }; - for (let e = w; e < S; e++) { - const { displayValue: t } = this.data.options[e], - a = e === w ? b : 0; - x.push(this._renderText(t, f, p, h, 0, C, 2, -m + a)); - } - x.push('ET Q EMC'); - return x.join('\n'); - } - } - class SignatureWidgetAnnotation extends WidgetAnnotation { - constructor(e) { - super(e); - this.data.fieldValue = null; - this.data.hasOwnCanvas = this.data.noRotate; - } - getFieldObject() { - return { - id: this.data.id, - value: null, - page: this.data.pageIndex, - type: 'signature', - }; - } - } - class TextAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.noRotate = !0; - this.data.hasOwnCanvas = this.data.noRotate; - const { dict: t } = e; - this.data.annotationType = r.AnnotationType.TEXT; - if (this.data.hasAppearance) this.data.name = 'NoIcon'; - else { - this.data.rect[1] = this.data.rect[3] - 22; - this.data.rect[2] = this.data.rect[0] + 22; - this.data.name = t.has('Name') ? t.get('Name').name : 'Note'; - } - if (t.has('State')) { - this.data.state = t.get('State') || null; - this.data.stateModel = t.get('StateModel') || null; - } else { - this.data.state = null; - this.data.stateModel = null; - } - } - } - class LinkAnnotation extends Annotation { - constructor(e) { - super(e); - this.data.annotationType = r.AnnotationType.LINK; - const t = getQuadPoints(e.dict, this.rectangle); - t && (this.data.quadPoints = t); - this.data.borderColor ||= this.data.color; - h.Catalog.parseDestDictionary({ - destDict: e.dict, - resultObj: this.data, - docBaseUrl: e.pdfManager.docBaseUrl, - docAttachments: e.attachments, - }); - } - } - class PopupAnnotation extends Annotation { - constructor(e) { - super(e); - const { dict: t } = e; - this.data.annotationType = r.AnnotationType.POPUP; - let a = t.get('Parent'); - if (!a) { - (0, r.warn)('Popup annotation has a missing or invalid parent annotation.'); - return; - } - const i = a.get('Subtype'); - this.data.parentType = i instanceof s.Name ? i.name : null; - const n = t.getRaw('Parent'); - this.data.parentId = n instanceof s.Ref ? n.toString() : null; - const o = a.getArray('Rect'); - Array.isArray(o) && 4 === o.length - ? (this.data.parentRect = r.Util.normalizeRect(o)) - : (this.data.parentRect = [0, 0, 0, 0]); - const c = a.get('RT'); - (0, s.isName)(c, r.AnnotationReplyType.GROUP) && (a = a.get('IRT')); - if (a.has('M')) { - this.setModificationDate(a.get('M')); - this.data.modificationDate = this.modificationDate; - } else this.data.modificationDate = null; - if (a.has('C')) { - this.setColor(a.getArray('C')); - this.data.color = this.color; - } else this.data.color = null; - if (!this.viewable) { - const e = a.get('F'); - this._isViewable(e) && this.setFlags(e); - } - this.setTitle(a.get('T')); - this.data.titleObj = this._title; - this.setContents(a.get('Contents')); - this.data.contentsObj = this._contents; - a.has('RC') && (this.data.richText = m.XFAFactory.getRichTextAsHtml(a.get('RC'))); - } - } - t.PopupAnnotation = PopupAnnotation; - class FreeTextAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.hasOwnCanvas = this.data.noRotate; - const { xref: t } = e; - this.data.annotationType = r.AnnotationType.FREETEXT; - this.setDefaultAppearance(e); - if (!this.appearance && this._isOffscreenCanvasSupported) { - const a = e.dict.get('CA'), - r = new n.FakeUnicodeFont(t, 'sans-serif'), - i = this.data.defaultAppearanceData; - this.appearance = r.createAppearance( - this._contents.str, - this.rectangle, - this.rotation, - i.fontSize || 10, - i.fontColor, - a, - ); - this._streams.push(this.appearance, n.FakeUnicodeFont.toUnicodeStream); - } else - this._isOffscreenCanvasSupported || - (0, r.warn)( - 'FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.', - ); - } - get hasTextContent() { - return !!this.appearance; - } - static createNewDict(e, t, { apRef: a, ap: o }) { - const { color: c, fontSize: l, rect: h, rotation: u, user: d, value: f } = e, - g = new s.Dict(t); - g.set('Type', s.Name.get('Annot')); - g.set('Subtype', s.Name.get('FreeText')); - g.set('CreationDate', `D:${(0, r.getModificationDate)()}`); - g.set('Rect', h); - const p = `/Helv ${l} Tf ${(0, n.getPdfColor)(c, !0)}`; - g.set('DA', p); - g.set('Contents', (0, i.isAscii)(f) ? f : (0, i.stringToUTF16String)(f, !0)); - g.set('F', 4); - g.set('Border', [0, 0, 0]); - g.set('Rotate', u); - d && g.set('T', (0, i.isAscii)(d) ? d : (0, i.stringToUTF16String)(d, !0)); - if (a || o) { - const e = new s.Dict(t); - g.set('AP', e); - a ? e.set('N', a) : e.set('N', o); - } - return g; - } - static async createNewAppearanceStream(e, t, a) { - const { baseFontRef: o, evaluator: c, task: l } = a, - { color: h, fontSize: u, rect: d, rotation: f, value: g } = e, - m = new s.Dict(t), - b = new s.Dict(t); - if (o) b.set('Helv', o); - else { - const e = new s.Dict(t); - 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')); - b.set('Helv', e); - } - m.set('Font', b); - const y = await WidgetAnnotation._getFontData( - c, - l, - { fontName: 'Helvetica', fontSize: u }, - m, - ), - [w, S, x, C] = d; - let k = x - w, - v = C - S; - f % 180 != 0 && ([k, v] = [v, k]); - const F = g.split('\n'), - O = u / 1e3; - let T = -1 / 0; - const M = []; - for (let e of F) { - const t = y.encodeString(e); - if (t.length > 1) return null; - e = t.join(''); - M.push(e); - let a = 0; - const r = y.charsToGlyphs(e); - for (const e of r) a += e.width * O; - T = Math.max(T, a); - } - let E = 1; - T > k && (E = k / 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 _ = u * Math.min(E, D), - $ = [ - 'q', - `0 0 ${(0, i.numberToString)(k)} ${(0, i.numberToString)(v)} re W n`, - 'BT', - `1 0 0 1 0 ${(0, i.numberToString)(v + R)} Tm 0 Tc ${(0, n.getPdfColor)(h, !0)}`, - `/Helv ${(0, i.numberToString)(_)} Tf`, - ], - j = (0, i.numberToString)(N); - for (const e of M) $.push(`0 -${j} Td (${(0, i.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, k, v]); - X.set('Resources', m); - if (f) { - const e = (0, i.getRotationMatrix)(f, k, 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, xref: a } = e; - this.data.annotationType = r.AnnotationType.LINE; - this.data.hasOwnCanvas = this.data.noRotate; - const i = t.getArray('L'); - this.data.lineCoordinates = r.Util.normalizeRect(i); - this.setLineEndings(t.getArray('LE')); - this.data.lineEndings = this.lineEndings; - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - n = t.get('CA'), - s = getRgbColor(t.getArray('IC'), null), - o = s ? getPdfColorArray(s) : null, - c = o ? n : 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: a, - extra: `${l} w`, - strokeColor: e, - fillColor: o, - strokeAlpha: n, - fillAlpha: c, - pointsCallback: (e, t) => { - e.push(`${i[0]} ${i[1]} m`, `${i[2]} ${i[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); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.SQUARE; - this.data.hasOwnCanvas = this.data.noRotate; - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - r = t.get('CA'), - i = getRgbColor(t.getArray('IC'), null), - n = i ? getPdfColorArray(i) : null, - s = n ? r : null; - if (0 === this.borderStyle.width && !n) return; - this._setDefaultAppearance({ - xref: a, - extra: `${this.borderStyle.width} w`, - strokeColor: e, - fillColor: n, - strokeAlpha: r, - fillAlpha: s, - pointsCallback: (e, t) => { - const a = t[2].x + this.borderStyle.width / 2, - r = 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} ${r} ${i} ${s} re`); - n ? 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); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.CIRCLE; - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - r = t.get('CA'), - i = getRgbColor(t.getArray('IC'), null), - n = i ? getPdfColorArray(i) : null, - s = n ? r : null; - if (0 === this.borderStyle.width && !n) return; - const o = (4 / 3) * Math.tan(Math.PI / 8); - this._setDefaultAppearance({ - xref: a, - extra: `${this.borderStyle.width} w`, - strokeColor: e, - fillColor: n, - strokeAlpha: r, - fillAlpha: s, - pointsCallback: (e, t) => { - const a = t[0].x + this.borderStyle.width / 2, - r = t[0].y - this.borderStyle.width / 2, - i = t[3].x - this.borderStyle.width / 2, - s = t[3].y + this.borderStyle.width / 2, - c = a + (i - a) / 2, - l = r + (s - r) / 2, - h = ((i - a) / 2) * o, - u = ((s - r) / 2) * o; - e.push( - `${c} ${s} m`, - `${c + h} ${s} ${i} ${l + u} ${i} ${l} c`, - `${i} ${l - u} ${c + h} ${r} ${c} ${r} c`, - `${c - h} ${r} ${a} ${l - u} ${a} ${l} c`, - `${a} ${l + u} ${c - h} ${s} ${c} ${s} c`, - 'h', - ); - n ? 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, xref: a } = e; - this.data.annotationType = r.AnnotationType.POLYLINE; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.vertices = []; - if (!(this instanceof PolygonAnnotation)) { - this.setLineEndings(t.getArray('LE')); - this.data.lineEndings = this.lineEndings; - } - const i = t.getArray('Vertices'); - if (Array.isArray(i)) { - for (let e = 0, t = i.length; e < t; e += 2) - this.data.vertices.push({ x: i[e], y: i[e + 1] }); - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - i = t.get('CA'), - n = this.borderStyle.width || 1, - s = 2 * n, - 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: a, - extra: `${n} w`, - strokeColor: e, - strokeAlpha: i, - pointsCallback: (e, t) => { - const a = this.data.vertices; - for (let t = 0, r = a.length; t < r; t++) - e.push(`${a[t].x} ${a[t].y} ${0 === t ? 'm' : 'l'}`); - e.push('S'); - return [t[0].x, t[1].x, t[3].y, t[1].y]; - }, - }); - } - } - } - } - class PolygonAnnotation extends PolylineAnnotation { - constructor(e) { - super(e); - this.data.annotationType = r.AnnotationType.POLYGON; - } - } - class CaretAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.annotationType = r.AnnotationType.CARET; - } - } - class InkAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - this.data.hasOwnCanvas = this.data.noRotate; - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.INK; - this.data.inkLists = []; - const i = t.getArray('InkList'); - if (Array.isArray(i)) { - for (let e = 0, t = i.length; e < t; ++e) { - this.data.inkLists.push([]); - for (let t = 0, r = i[e].length; t < r; t += 2) - this.data.inkLists[e].push({ - x: a.fetchIfRef(i[e][t]), - y: a.fetchIfRef(i[e][t + 1]), - }); - } - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - i = t.get('CA'), - n = this.borderStyle.width || 1, - s = 2 * n, - o = [1 / 0, 1 / 0, -1 / 0, -1 / 0]; - for (const e of this.data.inkLists) - for (const t of e) { - o[0] = Math.min(o[0], t.x - s); - o[1] = Math.min(o[1], t.y - s); - o[2] = Math.max(o[2], t.x + s); - o[3] = Math.max(o[3], t.y + s); - } - r.Util.intersect(this.rectangle, o) || (this.rectangle = o); - this._setDefaultAppearance({ - xref: a, - extra: `${n} w`, - strokeColor: e, - strokeAlpha: i, - pointsCallback: (e, t) => { - for (const t of this.data.inkLists) { - for (let a = 0, r = t.length; a < r; a++) - e.push(`${t[a].x} ${t[a].y} ${0 === a ? 'm' : 'l'}`); - e.push('S'); - } - return [t[0].x, t[1].x, t[3].y, t[1].y]; - }, - }); - } - } - } - static createNewDict(e, t, { apRef: a, ap: i }) { - const { paths: n, rect: o, rotation: c } = e, - l = new s.Dict(t); - l.set('Type', s.Name.get('Annot')); - l.set('Subtype', s.Name.get('Ink')); - l.set('CreationDate', `D:${(0, r.getModificationDate)()}`); - l.set('Rect', o); - l.set( - 'InkList', - n.map((e) => e.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', i); - 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, n.getPdfColor)(r, !1)}`]; - 1 !== u && w.push('/R0 gs'); - const S = []; - for (const { bezier: e } of l) { - S.length = 0; - S.push(`${(0, i.numberToString)(e[0])} ${(0, i.numberToString)(e[1])} m`); - for (let t = 2, a = e.length; t < a; t += 6) { - const a = e - .slice(t, t + 6) - .map(i.numberToString) - .join(' '); - S.push(`${a} c`); - } - S.push('S'); - w.push(S.join('\n')); - } - const x = w.join('\n'), - C = new s.Dict(t); - C.set('FormType', 1); - C.set('Subtype', s.Name.get('Form')); - C.set('Type', s.Name.get('XObject')); - C.set('BBox', [0, 0, b, y]); - C.set('Length', x.length); - if (c) { - const e = (0, i.getRotationMatrix)(c, b, y); - C.set('Matrix', e); - } - if (1 !== u) { - const e = new s.Dict(t), - a = new s.Dict(t), - r = new s.Dict(t); - r.set('CA', u); - r.set('Type', s.Name.get('ExtGState')); - a.set('R0', r); - e.set('ExtGState', a); - C.set('Resources', e); - } - const k = new p.StringStream(x); - k.dict = C; - return k; - } - } - class HighlightAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.HIGHLIGHT; - if ((this.data.quadPoints = getQuadPoints(t, null))) { - const e = this.appearance && this.appearance.dict.get('Resources'); - if (!this.appearance || !e || !e.has('ExtGState')) { - this.appearance && - (0, r.warn)('HighlightAnnotation - ignoring built-in appearance stream.'); - const e = this.color ? getPdfColorArray(this.color) : [1, 1, 0], - i = t.get('CA'); - this._setDefaultAppearance({ - xref: a, - fillColor: e, - blendMode: 'Multiply', - fillAlpha: i, - 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); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.UNDERLINE; - if ((this.data.quadPoints = getQuadPoints(t, null))) { - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - r = t.get('CA'); - this._setDefaultAppearance({ - xref: a, - extra: '[] 0 d 1 w', - strokeColor: e, - strokeAlpha: r, - 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); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.SQUIGGLY; - if ((this.data.quadPoints = getQuadPoints(t, null))) { - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - r = t.get('CA'); - this._setDefaultAppearance({ - xref: a, - extra: '[] 0 d 1 w', - strokeColor: e, - strokeAlpha: r, - pointsCallback: (e, t) => { - const a = (t[0].y - t[2].y) / 6; - let r = a, - i = t[2].x; - const n = t[2].y, - s = t[3].x; - e.push(`${i} ${n + r} m`); - do { - i += 2; - r = 0 === r ? a : 0; - e.push(`${i} ${n + r} l`); - } while (i < s); - e.push('S'); - return [t[2].x, s, n - 2 * a, n + 2 * a]; - }, - }); - } - } else this.data.hasPopup = !1; - } - } - class StrikeOutAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: a } = e; - this.data.annotationType = r.AnnotationType.STRIKEOUT; - if ((this.data.quadPoints = getQuadPoints(t, null))) { - if (!this.appearance) { - const e = this.color ? getPdfColorArray(this.color) : [0, 0, 0], - r = t.get('CA'); - this._setDefaultAppearance({ - xref: a, - extra: '[] 0 d 1 w', - strokeColor: e, - strokeAlpha: r, - 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; - this.data.hasOwnCanvas = this.data.noRotate; - } - } - class FileAttachmentAnnotation extends MarkupAnnotation { - constructor(e) { - super(e); - const { dict: t, xref: a } = e, - i = new d.FileSpec(t.get('FS'), a); - this.data.annotationType = r.AnnotationType.FILEATTACHMENT; - this.data.hasOwnCanvas = this.data.noRotate; - this.data.file = i.serializable; - const n = t.get('Name'); - this.data.name = n instanceof s.Name ? (0, r.stringToPDFString)(n.name) : 'PushPin'; - } - } - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.FakeUnicodeFont = void 0; - t.createDefaultAppearance = function createDefaultAppearance({ - fontSize: e, - fontName: t, - fontColor: a, - }) { - return `/${(0, i.escapePDFName)(t)} ${e} Tf ${getPdfColor(a, !0)}`; - }; - t.getPdfColor = getPdfColor; - t.parseDefaultAppearance = function parseDefaultAppearance(e) { - return new DefaultAppearanceEvaluator(e).parse(); - }; - var r = a(4), - i = a(3), - n = a(2), - s = a(12), - o = a(13), - c = a(8); - class DefaultAppearanceEvaluator extends o.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: i } = e; - switch (0 | a) { - case n.OPS.setFont: - const [e, a] = i; - e instanceof r.Name && (t.fontName = e.name); - 'number' == typeof a && a > 0 && (t.fontSize = a); - break; - case n.OPS.setFillRGBColor: - s.ColorSpace.singletons.rgb.getRgbItem(i, 0, t.fontColor, 0); - break; - case n.OPS.setFillGray: - s.ColorSpace.singletons.gray.getRgbItem(i, 0, t.fontColor, 0); - break; - case n.OPS.setFillColorSpace: - s.ColorSpace.singletons.cmyk.getRgbItem(i, 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, i.numberToString)(a)} ${t ? 'g' : 'G'}`; - } - return ( - Array.from(e, (e) => (0, i.numberToString)(e / 255)).join(' ') + - ' ' + - (t ? 'rg' : 'RG') - ); - } - class FakeUnicodeFont { - constructor(e, t) { - this.xref = e; - this.widths = null; - this.firstChar = 1 / 0; - this.lastChar = -1 / 0; - this.fontFamily = t; - const a = new OffscreenCanvas(1, 1); - this.ctxMeasure = a.getContext('2d'); - FakeUnicodeFont._fontNameId || (FakeUnicodeFont._fontNameId = 1); - this.fontName = r.Name.get(`InvalidPDFjsFont_${t}_${FakeUnicodeFont._fontNameId++}`); - } - get toUnicodeRef() { - if (!FakeUnicodeFont._toUnicodeRef) { - const e = - '/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo\n<< /Registry (Adobe)\n/Ordering (UCS) /Supplement 0 >> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000> \nendcodespacerange\n1 beginbfrange\n<0000> <0000>\nendbfrange\nendcmap CMapName currentdict /CMap defineresource pop end end', - t = (FakeUnicodeFont.toUnicodeStream = new c.StringStream(e)), - a = new r.Dict(this.xref); - t.dict = a; - a.set('Length', e.length); - FakeUnicodeFont._toUnicodeRef = this.xref.getNewPersistentRef(t); - } - return FakeUnicodeFont._toUnicodeRef; - } - get fontDescriptorRef() { - if (!FakeUnicodeFont._fontDescriptorRef) { - const e = new r.Dict(this.xref); - e.set('Type', r.Name.get('FontDescriptor')); - e.set('FontName', this.fontName); - e.set('FontFamily', 'MyriadPro Regular'); - e.set('FontBBox', [0, 0, 0, 0]); - e.set('FontStretch', r.Name.get('Normal')); - e.set('FontWeight', 400); - e.set('ItalicAngle', 0); - FakeUnicodeFont._fontDescriptorRef = this.xref.getNewPersistentRef(e); - } - return FakeUnicodeFont._fontDescriptorRef; - } - get descendantFontRef() { - const e = new r.Dict(this.xref); - e.set('BaseFont', this.fontName); - e.set('Type', r.Name.get('Font')); - e.set('Subtype', r.Name.get('CIDFontType0')); - e.set('CIDToGIDMap', r.Name.get('Identity')); - e.set('FirstChar', this.firstChar); - e.set('LastChar', this.lastChar); - e.set('FontDescriptor', this.fontDescriptorRef); - e.set('DW', 1e3); - const t = [], - a = [...this.widths.entries()].sort(); - let i = null, - n = null; - for (const [e, r] of a) - if (i) - if (e === i + n.length) n.push(r); - else { - t.push(i, n); - i = e; - n = [r]; - } - else { - i = e; - n = [r]; - } - i && t.push(i, n); - e.set('W', t); - const s = new r.Dict(this.xref); - s.set('Ordering', 'Identity'); - s.set('Registry', 'Adobe'); - s.set('Supplement', 0); - e.set('CIDSystemInfo', s); - return this.xref.getNewPersistentRef(e); - } - get baseFontRef() { - const e = new r.Dict(this.xref); - e.set('BaseFont', this.fontName); - e.set('Type', r.Name.get('Font')); - e.set('Subtype', r.Name.get('Type0')); - e.set('Encoding', r.Name.get('Identity-H')); - e.set('DescendantFonts', [this.descendantFontRef]); - e.set('ToUnicode', this.toUnicodeRef); - return this.xref.getNewPersistentRef(e); - } - get resources() { - const e = new r.Dict(this.xref), - t = new r.Dict(this.xref); - t.set(this.fontName.name, this.baseFontRef); - e.set('Font', t); - return e; - } - _createContext() { - this.widths = new Map(); - this.ctxMeasure.font = `1000px ${this.fontFamily}`; - return this.ctxMeasure; - } - createFontResources(e) { - const t = this._createContext(); - for (const a of e.split(/\r\n?|\n/)) - for (const e of a.split('')) { - const a = e.charCodeAt(0); - if (this.widths.has(a)) continue; - const r = t.measureText(e), - i = Math.ceil(r.width); - this.widths.set(a, i); - this.firstChar = Math.min(a, this.firstChar); - this.lastChar = Math.max(a, this.lastChar); - } - return this.resources; - } - createAppearance(e, t, a, s, o, l) { - const h = this._createContext(), - u = []; - let d = -1 / 0; - for (const t of e.split(/\r\n?|\n/)) { - u.push(t); - const e = h.measureText(t).width; - d = Math.max(d, e); - for (const e of t.split('')) { - const t = e.charCodeAt(0); - let a = this.widths.get(t); - if (void 0 === a) { - const r = h.measureText(e); - a = Math.ceil(r.width); - this.widths.set(t, a); - this.firstChar = Math.min(t, this.firstChar); - this.lastChar = Math.max(t, this.lastChar); - } - } - } - d *= s / 1e3; - const [f, g, p, m] = t; - let b = p - f, - y = m - g; - a % 180 != 0 && ([b, y] = [y, b]); - let w = 1; - d > b && (w = b / d); - let S = 1; - const x = n.LINE_FACTOR * s, - C = n.LINE_DESCENT_FACTOR * s, - k = x * u.length; - k > y && (S = y / k); - const v = s * Math.min(w, S), - F = [ - 'q', - `0 0 ${(0, i.numberToString)(b)} ${(0, i.numberToString)(y)} re W n`, - 'BT', - `1 0 0 1 0 ${(0, i.numberToString)(y + C)} Tm 0 Tc ${getPdfColor(o, !0)}`, - `/${this.fontName.name} ${(0, i.numberToString)(v)} Tf`, - ], - { resources: O } = this; - if (1 !== (l = 'number' == typeof l && l >= 0 && l <= 1 ? l : 1)) { - F.push('/R0 gs'); - const e = new r.Dict(this.xref), - t = new r.Dict(this.xref); - t.set('ca', l); - t.set('CA', l); - t.set('Type', r.Name.get('ExtGState')); - e.set('R0', t); - O.set('ExtGState', e); - } - const T = (0, i.numberToString)(x); - for (const e of u) F.push(`0 -${T} Td <${(0, i.stringToUTF16HexString)(e)}> Tj`); - F.push('ET', 'Q'); - const M = F.join('\n'), - E = new r.Dict(this.xref); - E.set('Subtype', r.Name.get('Form')); - E.set('Type', r.Name.get('XObject')); - E.set('BBox', [0, 0, b, y]); - E.set('Length', M.length); - E.set('Resources', O); - if (a) { - const e = (0, i.getRotationMatrix)(a, b, y); - E.set('Matrix', e); - } - const D = new c.StringStream(M); - D.dict = E; - return D; - } - } - t.FakeUnicodeFont = FakeUnicodeFont; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.ColorSpace = void 0; - var r = a(2), - i = a(4), - n = a(5), - s = a(3); - 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, i) { - (0, r.unreachable)('Should not call ColorSpace.getRgbItem'); - } - getRgbBuffer(e, t, a, i, n, 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, i, n, s, o, c) { - const l = t * a; - let h = null; - const u = 1 << s, - d = a !== i || t !== r; - if (this.isPassthrough(s)) h = o; - else if ( - 1 === this.numComps && - l > u && - 'DeviceGray' !== this.name && - 'DeviceRGB' !== this.name - ) { - const t = s <= 8 ? new Uint8Array(u) : new Uint16Array(u); - for (let e = 0; e < u; e++) t[e] = e; - const a = new Uint8ClampedArray(3 * u); - this.getRgbBuffer(t, 0, u, a, 0, s, 0); - if (d) { - h = new Uint8Array(3 * l); - let e = 0; - for (let t = 0; t < l; ++t) { - const r = 3 * o[t]; - h[e++] = a[r]; - h[e++] = a[r + 1]; - h[e++] = a[r + 2]; - } - } else { - let t = 0; - for (let r = 0; r < l; ++r) { - const i = 3 * o[r]; - e[t++] = a[i]; - e[t++] = a[i + 1]; - e[t++] = a[i + 2]; - t += c; - } - } - } else if (d) { - h = new Uint8ClampedArray(3 * l); - this.getRgbBuffer(o, 0, l, h, 0, s, 0); - } else this.getRgbBuffer(o, 0, r * n, e, 0, s, c); - if (h) - if (d) - !(function resizeRgbImage(e, t, a, r, i, n, s) { - s = 1 !== s ? 0 : s; - const o = a / i, - c = r / n; - let l, - h = 0; - const u = new Uint16Array(i), - d = 3 * a; - for (let e = 0; e < i; e++) u[e] = 3 * Math.floor(e * o); - for (let a = 0; a < n; a++) { - const r = Math.floor(a * c) * d; - for (let a = 0; a < i; a++) { - l = r + u[a]; - t[h++] = e[l++]; - t[h++] = e[l++]; - t[h++] = e[l++]; - h += s; - } - } - })(h, e, t, a, r, i, c); - else { - let t = 0, - a = 0; - for (let i = 0, s = r * n; i < s; i++) { - e[t++] = h[a++]; - e[t++] = h[a++]; - e[t++] = h[a++]; - t += c; - } - } - } - get usesZeroToOneRange() { - return (0, r.shadow)(this, 'usesZeroToOneRange', !0); - } - static _cache(e, t, a, r) { - if (!a) - throw new Error('ColorSpace._cache - expected "localColorSpaceCache" argument.'); - if (!r) throw new Error('ColorSpace._cache - expected "parsedColorSpace" argument.'); - let n, s; - if (e instanceof i.Ref) { - s = e; - e = t.fetch(e); - } - e instanceof i.Name && (n = e.name); - (n || s) && a.set(n, s, r); - } - static getCached(e, t, a) { - if (!a) - throw new Error('ColorSpace.getCached - expected "localColorSpaceCache" argument.'); - if (e instanceof i.Ref) { - const r = a.getByRef(e); - if (r) return r; - try { - e = t.fetch(e); - } catch (e) { - if (e instanceof s.MissingDataException) throw e; - } - } - if (e instanceof i.Name) { - const t = a.getByName(e.name); - if (t) return t; - } - return null; - } - static async parseAsync({ - cs: e, - xref: t, - resources: a = null, - pdfFunctionFactory: r, - localColorSpaceCache: i, - }) { - const n = this._parse(e, t, a, r); - this._cache(e, t, i, n); - return n; - } - static parse({ - cs: e, - xref: t, - resources: a = null, - pdfFunctionFactory: r, - localColorSpaceCache: i, - }) { - const n = this.getCached(e, t, i); - if (n) return n; - const s = this._parse(e, t, a, r); - this._cache(e, t, i, s); - return s; - } - static _parse(e, t, a = null, n) { - if ((e = t.fetchIfRef(e)) instanceof i.Name) - switch (e.name) { - case 'G': - case 'DeviceGray': - return this.singletons.gray; - case 'RGB': - case 'DeviceRGB': - return this.singletons.rgb; - case 'CMYK': - case 'DeviceCMYK': - return this.singletons.cmyk; - case 'Pattern': - return new PatternCS(null); - default: - if (a instanceof i.Dict) { - const r = a.get('ColorSpace'); - if (r instanceof i.Dict) { - const s = r.get(e.name); - if (s) { - if (s instanceof i.Name) return this._parse(s, t, a, n); - e = s; - break; - } - } - } - throw new r.FormatError(`Unrecognized ColorSpace: ${e.name}`); - } - if (Array.isArray(e)) { - const i = t.fetchIfRef(e[0]).name; - let s, o, u, d, f, g; - switch (i) { - case 'G': - case 'DeviceGray': - return this.singletons.gray; - case 'RGB': - case 'DeviceRGB': - return this.singletons.rgb; - case 'CMYK': - case 'DeviceCMYK': - return this.singletons.cmyk; - case 'CalGray': - s = t.fetchIfRef(e[1]); - d = s.getArray('WhitePoint'); - f = s.getArray('BlackPoint'); - g = s.get('Gamma'); - return new c(d, f, g); - case 'CalRGB': - s = t.fetchIfRef(e[1]); - d = s.getArray('WhitePoint'); - f = s.getArray('BlackPoint'); - g = s.getArray('Gamma'); - const p = s.getArray('Matrix'); - return new l(d, f, g, p); - case 'ICCBased': - const m = t.fetchIfRef(e[1]).dict; - o = m.get('N'); - const b = m.get('Alternate'); - if (b) { - const e = this._parse(b, t, a, n); - if (e.numComps === o) return e; - (0, r.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.'); - } - if (1 === o) return this.singletons.gray; - if (3 === o) return this.singletons.rgb; - if (4 === o) return this.singletons.cmyk; - break; - case 'Pattern': - u = e[1] || null; - u && (u = this._parse(u, t, a, n)); - return new PatternCS(u); - case 'I': - case 'Indexed': - u = this._parse(e[1], t, a, n); - const y = t.fetchIfRef(e[2]) + 1, - w = t.fetchIfRef(e[3]); - return new IndexedCS(u, y, w); - case 'Separation': - case 'DeviceN': - const S = t.fetchIfRef(e[1]); - o = Array.isArray(S) ? S.length : 1; - u = this._parse(e[2], t, a, n); - const x = n.create(e[3]); - return new AlternateCS(o, u, x); - case 'Lab': - s = t.fetchIfRef(e[1]); - d = s.getArray('WhitePoint'); - f = s.getArray('BlackPoint'); - const C = s.getArray('Range'); - return new h(d, f, C); - default: - throw new r.FormatError(`Unimplemented ColorSpace object: ${i}`); - } - } - throw new r.FormatError(`Unrecognized ColorSpace object: ${e}`); - } - static isDefaultDecode(e, t) { - if (!Array.isArray(e)) return !0; - if (2 * t !== e.length) { - (0, r.warn)('The decode map is not the correct length'); - return !0; - } - for (let t = 0, a = e.length; t < a; t += 2) - if (0 !== e[t] || 1 !== e[t + 1]) return !1; - return !0; - } - static get singletons() { - return (0, r.shadow)(this, 'singletons', { - get gray() { - return (0, r.shadow)(this, 'gray', new DeviceGrayCS()); - }, - get rgb() { - return (0, r.shadow)(this, 'rgb', new DeviceRgbCS()); - }, - get cmyk() { - return (0, r.shadow)(this, 'cmyk', new o()); - }, - }); - } - } - t.ColorSpace = ColorSpace; - class AlternateCS extends ColorSpace { - constructor(e, t, a) { - super('Alternate', e); - this.base = t; - this.tintFn = a; - this.tmpBuf = new Float32Array(t.numComps); - } - getRgbItem(e, t, a, r) { - const i = this.tmpBuf; - this.tintFn(e, t, i, 0); - this.base.getRgbItem(i, 0, a, r); - } - getRgbBuffer(e, t, a, r, i, n, s) { - const o = this.tintFn, - c = this.base, - l = 1 / ((1 << n) - 1), - h = c.numComps, - u = c.usesZeroToOneRange, - d = (c.isPassthrough(8) || !u) && 0 === s; - let f = d ? i : 0; - const g = d ? r : new Uint8ClampedArray(h * a), - p = this.numComps, - m = new Float32Array(p), - b = new Float32Array(h); - let y, w; - for (y = 0; y < a; y++) { - for (w = 0; w < p; w++) m[w] = e[t++] * l; - o(m, 0, b, 0); - if (u) for (w = 0; w < h; w++) g[f++] = 255 * b[w]; - else { - c.getRgbItem(b, 0, g, f); - f += h; - } - } - d || c.getRgbBuffer(g, 0, a, r, i, 8, s); - } - getOutputLength(e, t) { - return this.base.getOutputLength((e * this.base.numComps) / this.numComps, t); - } - } - class PatternCS extends ColorSpace { - constructor(e) { - super('Pattern', null); - this.base = e; - } - isDefaultDecode(e, t) { - (0, r.unreachable)('Should not call PatternCS.isDefaultDecode'); - } - } - class IndexedCS extends ColorSpace { - constructor(e, t, a) { - super('Indexed', 1); - this.base = e; - this.highVal = t; - const i = e.numComps * t; - this.lookup = new Uint8Array(i); - if (a instanceof n.BaseStream) { - const e = a.getBytes(i); - this.lookup.set(e); - } else { - if ('string' != typeof a) - throw new r.FormatError(`IndexedCS - unrecognized lookup table: ${a}`); - for (let e = 0; e < i; ++e) this.lookup[e] = 255 & a.charCodeAt(e); - } - } - getRgbItem(e, t, a, r) { - const i = this.base.numComps, - n = e[t] * i; - this.base.getRgbBuffer(this.lookup, n, 1, a, r, 8, 0); - } - getRgbBuffer(e, t, a, r, i, n, s) { - const o = this.base, - c = o.numComps, - l = o.getOutputLength(c, s), - h = this.lookup; - for (let n = 0; n < a; ++n) { - const a = e[t++] * c; - o.getRgbBuffer(h, a, 1, r, i, 8, s); - i += l; - } - } - getOutputLength(e, t) { - return this.base.getOutputLength(e * this.base.numComps, t); - } - isDefaultDecode(e, t) { - if (!Array.isArray(e)) return !0; - if (2 !== e.length) { - (0, r.warn)('Decode map length is not correct'); - return !0; - } - if (!Number.isInteger(t) || t < 1) { - (0, r.warn)('Bits per component is not correct'); - return !0; - } - return 0 === e[0] && e[1] === (1 << t) - 1; - } - } - class DeviceGrayCS extends ColorSpace { - constructor() { - super('DeviceGray', 1); - } - getRgbItem(e, t, a, r) { - const i = 255 * e[t]; - a[r] = a[r + 1] = a[r + 2] = i; - } - getRgbBuffer(e, t, a, r, i, n, s) { - const o = 255 / ((1 << n) - 1); - let c = t, - l = i; - for (let t = 0; t < a; ++t) { - const t = o * e[c++]; - r[l++] = t; - r[l++] = t; - r[l++] = t; - l += s; - } - } - getOutputLength(e, t) { - return e * (3 + t); - } - } - class DeviceRgbCS extends ColorSpace { - constructor() { - super('DeviceRGB', 3); - } - getRgbItem(e, t, a, r) { - a[r] = 255 * e[t]; - a[r + 1] = 255 * e[t + 1]; - a[r + 2] = 255 * e[t + 2]; - } - getRgbBuffer(e, t, a, r, i, n, s) { - if (8 === n && 0 === s) { - r.set(e.subarray(t, t + 3 * a), i); - return; - } - const o = 255 / ((1 << n) - 1); - let c = t, - l = i; - for (let t = 0; t < a; ++t) { - r[l++] = o * e[c++]; - r[l++] = o * e[c++]; - r[l++] = o * e[c++]; - l += s; - } - } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; - } - isPassthrough(e) { - return 8 === e; - } - } - const o = (function DeviceCmykCSClosure() { - function convertToRgb(e, t, a, r, i) { - const n = e[t] * a, - s = e[t + 1] * a, - o = e[t + 2] * a, - c = e[t + 3] * a; - r[i] = - 255 + - n * - (-4.387332384609988 * n + - 54.48615194189176 * s + - 18.82290502165302 * o + - 212.25662451639585 * c - - 285.2331026137004) + - s * - (1.7149763477362134 * s - - 5.6096736904047315 * o + - -17.873870861415444 * c - - 5.497006427196366) + - o * (-2.5217340131683033 * o - 21.248923337353073 * c + 17.5119270841813) + - c * (-21.86122147463605 * c - 189.48180835922747); - r[i + 1] = - 255 + - n * - (8.841041422036149 * n + - 60.118027045597366 * s + - 6.871425592049007 * o + - 31.159100130055922 * c - - 79.2970844816548) + - s * - (-15.310361306967817 * s + - 17.575251261109482 * o + - 131.35250912493976 * c - - 190.9453302588951) + - o * (4.444339102852739 * o + 9.8632861493405 * c - 24.86741582555878) + - c * (-20.737325471181034 * c - 187.80453709719578); - r[i + 2] = - 255 + - n * - (0.8842522430003296 * n + - 8.078677503112928 * s + - 30.89978309703729 * o - - 0.23883238689178934 * c - - 14.183576799673286) + - s * - (10.49593273432072 * s + - 63.02378494754052 * o + - 50.606957656360734 * c - - 112.23884253719248) + - o * (0.03296041114873217 * o + 115.60384449646641 * c - 193.58209356861505) + - c * (-22.33816807309886 * c - 180.12613974708367); - } - return class DeviceCmykCS extends ColorSpace { - constructor() { - super('DeviceCMYK', 4); - } - getRgbItem(e, t, a, r) { - convertToRgb(e, t, 1, a, r); - } - getRgbBuffer(e, t, a, r, i, n, s) { - const o = 1 / ((1 << n) - 1); - for (let n = 0; n < a; n++) { - convertToRgb(e, t, o, r, i); - t += 4; - i += 3 + s; - } - } - getOutputLength(e, t) { - return ((e / 4) * (3 + t)) | 0; - } - }; - })(), - c = (function CalGrayCSClosure() { - function convertToRgb(e, t, a, r, i, n) { - const s = (t[a] * n) ** e.G, - o = e.YW * s, - c = Math.max(295.8 * o ** 0.3333333333333333 - 40.8, 0); - r[i] = c; - r[i + 1] = c; - r[i + 2] = c; - } - return class CalGrayCS extends ColorSpace { - constructor(e, t, a) { - super('CalGray', 1); - if (!e) - throw new r.FormatError( - 'WhitePoint missing - required for color space CalGray', - ); - t = t || [0, 0, 0]; - a = a || 1; - this.XW = e[0]; - this.YW = e[1]; - this.ZW = e[2]; - this.XB = t[0]; - this.YB = t[1]; - this.ZB = t[2]; - this.G = a; - if (this.XW < 0 || this.ZW < 0 || 1 !== this.YW) - throw new r.FormatError( - `Invalid WhitePoint components for ${this.name}, no fallback available`, - ); - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - (0, r.info)(`Invalid BlackPoint for ${this.name}, falling back to default.`); - this.XB = this.YB = this.ZB = 0; - } - (0 === this.XB && 0 === this.YB && 0 === this.ZB) || - (0, r.warn)( - `${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ZB: ${this.ZB}, only default values are supported.`, - ); - if (this.G < 1) { - (0, r.info)( - `Invalid Gamma: ${this.G} for ${this.name}, falling back to default.`, - ); - this.G = 1; - } - } - getRgbItem(e, t, a, r) { - convertToRgb(this, e, t, a, r, 1); - } - getRgbBuffer(e, t, a, r, i, n, s) { - const o = 1 / ((1 << n) - 1); - for (let n = 0; n < a; ++n) { - convertToRgb(this, e, t, r, i, o); - t += 1; - i += 3 + s; - } - } - getOutputLength(e, t) { - return e * (3 + t); - } - }; - })(), - l = (function CalRGBCSClosure() { - const e = new Float32Array([ - 0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296, - ]), - t = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, - 0.0400428, 0.9684867, - ]), - a = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, -0.969266, 1.8760108, 0.041556, 0.0556434, - -0.2040259, 1.0572252, - ]), - i = new Float32Array([1, 1, 1]), - n = new Float32Array(3), - s = new Float32Array(3), - o = new Float32Array(3), - c = (24 / 116) ** 3 / 8; - function matrixProduct(e, t, a) { - a[0] = e[0] * t[0] + e[1] * t[1] + e[2] * t[2]; - a[1] = e[3] * t[0] + e[4] * t[1] + e[5] * t[2]; - a[2] = e[6] * t[0] + e[7] * t[1] + e[8] * t[2]; - } - function sRGBTransferFunction(e) { - return e <= 0.0031308 - ? adjustToRange(0, 1, 12.92 * e) - : e >= 0.99554525 - ? 1 - : adjustToRange(0, 1, 1.055 * e ** (1 / 2.4) - 0.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 : e * c; - } - 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, - C = s; - C[0] = w; - C[1] = S; - C[2] = x; - const k = o; - !(function normalizeWhitePointToFlat(a, r, i) { - if (1 === a[0] && 1 === a[2]) { - i[0] = r[0]; - i[1] = r[1]; - i[2] = r[2]; - return; - } - const s = i; - matrixProduct(e, r, s); - const o = n; - !(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, i); - })(r.whitePoint, C, k); - 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), - i = (1 - r) / (1 - decodeL(e[0])), - n = 1 - i, - s = (1 - r) / (1 - decodeL(e[1])), - o = 1 - s, - c = (1 - r) / (1 - decodeL(e[2])), - l = 1 - c; - a[0] = t[0] * i + n; - a[1] = t[1] * s + o; - a[2] = t[2] * c + l; - })(r.blackPoint, k, v); - const F = o; - !(function normalizeWhitePointToD65(a, r, i) { - const s = i; - matrixProduct(e, r, s); - const o = n; - !(function convertToD65(e, t, a) { - a[0] = (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, i); - })(i, 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, i) { - super('CalRGB', 3); - if (!e) - throw new r.FormatError('WhitePoint missing - required for color space CalRGB'); - t ||= new Float32Array(3); - a ||= new Float32Array([1, 1, 1]); - i ||= new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - const n = 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 = i[0]; - this.MYA = i[1]; - this.MZA = i[2]; - this.MXB = i[3]; - this.MYB = i[4]; - this.MZB = i[5]; - this.MXC = i[6]; - this.MYC = i[7]; - this.MZC = i[8]; - if (n < 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, i, n, s) { - const o = 1 / ((1 << n) - 1); - for (let n = 0; n < a; ++n) { - convertToRgb(this, e, t, r, i, o); - t += 3; - i += 3 + s; - } - } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; - } - }; - })(), - h = (function LabCSClosure() { - function fn_g(e) { - let t; - t = e >= 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, i, n) { - 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) : o < e.amin && (o = e.amin); - c > e.bmax ? (c = e.bmax) : c < e.bmin && (c = e.bmin); - const l = (s + 16) / 116, - h = l + o / 500, - u = l - c / 200, - d = e.XW * fn_g(h), - f = e.YW * fn_g(l), - g = e.ZW * fn_g(u); - let p, m, b; - if (e.ZW < 1) { - p = 3.1339 * d + -1.617 * f + -0.4906 * g; - m = -0.9785 * d + 1.916 * f + 0.0333 * g; - b = 0.072 * d + -0.229 * f + 1.4057 * g; - } else { - p = 3.2406 * d + -1.5372 * f + -0.4986 * g; - m = -0.9689 * d + 1.8758 * f + 0.0415 * g; - b = 0.0557 * d + -0.204 * f + 1.057 * g; - } - i[n] = 255 * Math.sqrt(p); - i[n + 1] = 255 * Math.sqrt(m); - i[n + 2] = 255 * Math.sqrt(b); - } - return class LabCS extends ColorSpace { - constructor(e, t, a) { - super('Lab', 3); - if (!e) - throw new r.FormatError('WhitePoint missing - required for color space Lab'); - t ||= [0, 0, 0]; - a ||= [-100, 100, -100, 100]; - this.XW = e[0]; - this.YW = e[1]; - this.ZW = e[2]; - this.amin = a[0]; - this.amax = a[1]; - this.bmin = a[2]; - this.bmax = a[3]; - this.XB = t[0]; - this.YB = t[1]; - this.ZB = t[2]; - if (this.XW < 0 || this.ZW < 0 || 1 !== this.YW) - throw new r.FormatError('Invalid WhitePoint components, no fallback available'); - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - (0, r.info)('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - if (this.amin > this.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, i, n, s) { - const o = (1 << n) - 1; - for (let n = 0; n < a; n++) { - convertToRgb(this, e, t, o, r, i); - t += 3; - i += 3 + s; - } - } - getOutputLength(e, t) { - return ((e * (3 + t)) / 3) | 0; - } - isDefaultDecode(e, t) { - return !0; - } - get usesZeroToOneRange() { - return (0, r.shadow)(this, 'usesZeroToOneRange', !1); - } - }; - })(); - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.PartialEvaluator = t.EvaluatorPreprocessor = void 0; - var r = a(2), - i = a(14), - n = a(4), - s = a(34), - o = a(37), - c = a(41), - l = a(50), - h = a(51), - u = a(42), - d = a(57), - f = a(16), - g = a(59), - p = a(8), - m = a(5), - b = a(60), - y = a(12), - w = a(18), - S = a(38), - x = a(39), - C = a(3), - k = a(45), - v = a(40), - F = a(61), - O = a(62), - T = a(63), - M = a(64); - const E = Object.freeze({ - maxImageSize: -1, - disableFontFace: !1, - ignoreErrors: !1, - isEvalSupported: !0, - isOffscreenCanvasSupported: !1, - canvasMaxAreaInBytes: -1, - fontExtraProperties: !1, - useSystemFonts: !0, - cMapUrl: null, - standardFontDataUrl: null, - }), - D = 1, - N = 2, - R = Promise.resolve(); - function normalizeBlendMode(e, t = !1) { - if (Array.isArray(e)) { - for (const t of e) { - const e = normalizeBlendMode(t, !0); - if (e) return e; - } - (0, r.warn)(`Unsupported blend mode Array: ${e}`); - return 'source-over'; - } - if (!(e instanceof n.Name)) return t ? null : 'source-over'; - switch (e.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 (t) return null; - (0, r.warn)(`Unsupported blend mode: ${e.name}`); - return 'source-over'; - } - function incrementCachedImageMaskCount(e) { - e.fn === r.OPS.paintImageMaskXObject && - e.args[0] && - e.args[0].count > 0 && - e.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 !1; - 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: e, - handler: t, - pageIndex: a, - idFactory: r, - fontCache: i, - builtInCMapCache: n, - standardFontDataCache: s, - globalImageCache: o, - options: c = null, - }) { - this.xref = e; - this.handler = t; - this.pageIndex = a; - this.idFactory = r; - this.fontCache = i; - this.builtInCMapCache = n; - this.standardFontDataCache = s; - this.globalImageCache = o; - this.options = c || E; - this.parsingType3Font = !1; - this._regionalImageCache = new g.RegionalImageCache(); - this._fetchBuiltInCMapBound = this.fetchBuiltInCMap.bind(this); - F.ImageResizer.setMaxArea(this.options.canvasMaxAreaInBytes); - } - get _pdfFunctionFactory() { - const e = new d.PDFFunctionFactory({ - xref: this.xref, - isEvalSupported: this.options.isEvalSupported, - }); - return (0, r.shadow)(this, '_pdfFunctionFactory', e); - } - clone(e = null) { - const t = Object.create(this); - t.options = Object.assign(Object.create(null), this.options, e); - return t; - } - hasBlendModes(e, t) { - if (!(e instanceof n.Dict)) return !1; - if (e.objId && t.has(e.objId)) return !1; - const a = new n.RefSet(t); - e.objId && a.put(e.objId); - const i = [e], - s = this.xref; - for (; i.length; ) { - const e = i.shift(), - t = e.get('ExtGState'); - if (t instanceof n.Dict) - for (let e of t.getRawValues()) { - if (e instanceof n.Ref) { - if (a.has(e)) continue; - try { - e = s.fetch(e); - } catch (t) { - a.put(e); - (0, r.info)(`hasBlendModes - ignoring ExtGState: "${t}".`); - continue; - } - } - if (!(e instanceof n.Dict)) continue; - e.objId && a.put(e.objId); - const t = e.get('BM'); - if (t instanceof n.Name) { - if ('Normal' !== t.name) return !0; - } else if (void 0 !== t && Array.isArray(t)) - for (const e of t) if (e instanceof n.Name && 'Normal' !== e.name) return !0; - } - const o = e.get('XObject'); - if (o instanceof n.Dict) - for (let e of o.getRawValues()) { - if (e instanceof n.Ref) { - if (a.has(e)) continue; - try { - e = s.fetch(e); - } catch (t) { - a.put(e); - (0, r.info)(`hasBlendModes - ignoring XObject: "${t}".`); - continue; - } - } - if (!(e instanceof m.BaseStream)) continue; - e.dict.objId && a.put(e.dict.objId); - const t = e.dict.get('Resources'); - if (t instanceof n.Dict && (!t.objId || !a.has(t.objId))) { - i.push(t); - t.objId && a.put(t.objId); - } - } - } - for (const e of a) t.put(e); - return !1; - } - async fetchBuiltInCMap(e) { - const t = this.builtInCMapCache.get(e); - if (t) return t; - let a; - if (null !== this.options.cMapUrl) { - const t = `${this.options.cMapUrl}${e}.bcmap`, - i = await fetch(t); - if (!i.ok) - throw new Error( - `fetchBuiltInCMap: failed to fetch file "${t}" with "${i.statusText}".`, - ); - a = { - cMapData: new Uint8Array(await i.arrayBuffer()), - compressionType: r.CMapCompressionType.BINARY, - }; - } else a = await this.handler.sendWithPromise('FetchBuiltInCMap', { name: e }); - a.compressionType !== r.CMapCompressionType.NONE && this.builtInCMapCache.set(e, a); - return a; - } - async fetchStandardFontData(e) { - const t = this.standardFontDataCache.get(e); - if (t) return new p.Stream(t); - if (this.options.useSystemFonts && 'Symbol' !== e && 'ZapfDingbats' !== e) - return null; - const a = (0, c.getFontNameToFileMap)()[e]; - let i; - if (null !== this.options.standardFontDataUrl) { - const e = `${this.options.standardFontDataUrl}${a}`, - t = await fetch(e); - t.ok - ? (i = await t.arrayBuffer()) - : (0, r.warn)( - `fetchStandardFontData: failed to fetch file "${e}" with "${t.statusText}".`, - ); - } else - try { - i = await this.handler.sendWithPromise('FetchStandardFontData', { filename: a }); - } catch (e) { - (0, r.warn)(`fetchStandardFontData: failed to fetch file "${a}" with "${e}".`); - } - if (!i) return null; - this.standardFontDataCache.set(e, i); - return new p.Stream(i); - } - async buildFormXObject(e, t, a, i, s, o, c) { - const l = t.dict, - h = l.getArray('Matrix'); - let u, - d, - f = l.getArray('BBox'); - f = Array.isArray(f) && 4 === f.length ? r.Util.normalizeRect(f) : null; - l.has('OC') && (u = await this.parseMarkedContentProps(l.get('OC'), e)); - void 0 !== u && i.addOp(r.OPS.beginMarkedContentProps, ['OC', u]); - const g = l.get('Group'); - if (g) { - d = { matrix: h, bbox: f, smask: a, isolated: !1, knockout: !1 }; - const t = g.get('S'); - let s = null; - if ((0, n.isName)(t, 'Transparency')) { - d.isolated = g.get('I') || !1; - d.knockout = g.get('K') || !1; - if (g.has('CS')) { - const t = g.getRaw('CS'), - a = y.ColorSpace.getCached(t, this.xref, c); - s = - a || - (await this.parseColorSpace({ - cs: t, - resources: e, - localColorSpaceCache: c, - })); - } - } - if (a && a.backdrop) { - s ||= y.ColorSpace.singletons.rgb; - a.backdrop = s.getRgb(a.backdrop, 0); - } - i.addOp(r.OPS.beginGroup, [d]); - } - const p = g ? [h, null] : [h, f]; - i.addOp(r.OPS.paintFormXObjectBegin, p); - return this.getOperatorList({ - stream: t, - task: s, - resources: l.get('Resources') || e, - operatorList: i, - initialState: o, - }).then(function () { - i.addOp(r.OPS.paintFormXObjectEnd, []); - g && i.addOp(r.OPS.endGroup, [d]); - void 0 !== u && i.addOp(r.OPS.endMarkedContent, []); - }); - } - _sendImgData(e, t, a = !1) { - const r = t ? [t.bitmap || t.data.buffer] : null; - return this.parsingType3Font || a - ? this.handler.send('commonobj', [e, 'Image', t], r) - : this.handler.send('obj', [e, this.pageIndex, 'Image', t], r); - } - async buildPaintImageXObject({ - resources: e, - image: t, - isInline: a = !1, - operatorList: i, - cacheKey: n, - localImageCache: s, - localColorSpaceCache: o, - }) { - const c = t.dict, - l = c.objId, - h = c.get('W', 'Width'), - u = c.get('H', 'Height'); - if (!h || 'number' != typeof h || !u || 'number' != typeof u) { - (0, r.warn)('Image dimensions are missing, or not numbers.'); - return; - } - const d = this.options.maxImageSize; - if (-1 !== d && h * u > d) { - 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 = M.PDFImage.createRawMask({ - imgArray: o, - width: h, - height: u, - imageIsFromDecodeStream: t instanceof w.DecodeStream, - inverseDecode: !!d && d[0] > 0, - interpolate: e, - }); - g.cached = !!n; - p = [g]; - i.addImageOps(r.OPS.paintImageMaskXObject, p, f); - if (n) { - const e = { fn: r.OPS.paintImageMaskXObject, args: p, optionalContent: f }; - s.set(n, l, e); - l && this._regionalImageCache.set(null, l, e); - } - return; - } - g = await M.PDFImage.createMask({ - imgArray: o, - width: h, - height: u, - imageIsFromDecodeStream: t instanceof w.DecodeStream, - inverseDecode: !!d && d[0] > 0, - interpolate: e, - isOffscreenCanvasSupported: this.options.isOffscreenCanvasSupported, - }); - if (g.isSingleOpaquePixel) { - i.addImageOps(r.OPS.paintSolidColorImageMask, [], f); - if (n) { - const e = { fn: r.OPS.paintSolidColorImageMask, args: [], optionalContent: f }; - s.set(n, l, e); - l && this._regionalImageCache.set(null, l, e); - } - return; - } - const m = `mask_${this.idFactory.createObjId()}`; - i.addDependency(m); - this._sendImgData(m, g); - p = [ - { - data: m, - width: g.width, - height: g.height, - interpolate: g.interpolate, - count: 1, - }, - ]; - i.addImageOps(r.OPS.paintImageMaskXObject, p, f); - if (n) { - const e = { fn: r.OPS.paintImageMaskXObject, args: p, optionalContent: f }; - s.set(n, l, e); - l && this._regionalImageCache.set(null, l, e); - } - return; - } - const m = c.get('SM', 'SMask') || !1, - b = c.get('Mask') || !1; - if (a && !m && !b && h + u < 200) { - const n = new M.PDFImage({ - xref: this.xref, - res: e, - image: t, - isInline: a, - pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache: o, - }); - g = await n.createImageData(!0, !1); - i.isOffscreenCanvasSupported = this.options.isOffscreenCanvasSupported; - i.addImageOps(r.OPS.paintInlineImageXObject, [g], f); - return; - } - let y = `img_${this.idFactory.createObjId()}`, - S = !1; - if (this.parsingType3Font) y = `${this.idFactory.getDocId()}_type3_${y}`; - else if (l) { - S = this.globalImageCache.shouldCache(l, this.pageIndex); - S && (y = `${this.idFactory.getDocId()}_${y}`); - } - i.addDependency(y); - p = [y, h, u]; - M.PDFImage.buildImage({ - xref: this.xref, - res: e, - image: t, - isInline: a, - pdfFunctionFactory: this._pdfFunctionFactory, - localColorSpaceCache: o, - }) - .then(async (e) => { - g = await e.createImageData(!1, this.options.isOffscreenCanvasSupported); - if (n && l && S) { - let e = 0; - e = g.bitmap ? g.width * g.height * 4 : g.data.length; - this.globalImageCache.addByteSize(l, e); - } - return this._sendImgData(y, g, S); - }) - .catch((e) => { - (0, r.warn)(`Unable to decode image "${y}": "${e}".`); - return this._sendImgData(y, null, S); - }); - i.addImageOps(r.OPS.paintImageXObject, p, f); - if (n) { - const e = { fn: r.OPS.paintImageXObject, args: p, optionalContent: f }; - s.set(n, l, e); - if (l) { - this._regionalImageCache.set(null, l, e); - if (S) { - (0, r.assert)(!a, 'Cannot cache an inline image globally.'); - this.globalImageCache.setData(l, { - objId: y, - fn: r.OPS.paintImageXObject, - args: p, - optionalContent: f, - byteSize: 0, - }); - } - } - } - } - handleSMask(e, t, a, r, i, n) { - const s = e.get('G'), - o = { subtype: e.get('S').name, backdrop: e.get('BC') }, - c = e.get('TR'); - if ((0, d.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, i.state.clone(), n); - } - handleTransferFunction(e) { - let t; - if (Array.isArray(e)) t = e; - else { - if (!(0, d.isPDFFunction)(e)) return null; - t = [e]; - } - const a = []; - let r = 0, - i = 0; - for (const e of t) { - const t = this.xref.fetchIfRef(e); - r++; - if ((0, n.isName)(t, 'Identity')) { - a.push(null); - continue; - } - if (!(0, d.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); - i++; - } - return (1 !== r && 4 !== r) || 0 === i ? null : a; - } - handleTilingType(e, t, a, i, s, o, c, h) { - const u = new T.OperatorList(), - d = n.Dict.merge({ xref: this.xref, dictArray: [s.get('Resources'), a] }); - return this.getOperatorList({ stream: i, task: c, resources: d, operatorList: u }) - .then(function () { - const a = u.getIR(), - r = (0, l.getTilingPatternIR)(a, s, t); - o.addDependencies(u.dependencies); - o.addOp(e, r); - s.objId && h.set(null, s.objId, { operatorListIR: a, dict: s }); - }) - .catch((e) => { - if (!(e instanceof r.AbortException)) { - if (!this.options.ignoreErrors) throw e; - (0, r.warn)(`handleTilingType - ignoring pattern: "${e}".`); - } - }); - } - handleSetFont(e, t, a, r, i, o, c = null, l = null) { - const h = t && t[0] instanceof n.Name ? t[0].name : null; - return this.loadFont(h, a, e, c, l) - .then((t) => - t.font.isType3Font - ? t - .loadType3Data(this, e, i) - .then(function () { - r.addDependencies(t.type3Dependencies); - return t; - }) - .catch( - (e) => - new TranslatedFont({ - loadedName: 'g_font_error', - font: new s.ErrorFont(`Type3 font load error: ${e}`), - dict: t.font, - evaluatorOptions: this.options, - }), - ) - : t, - ) - .then((e) => { - o.font = e.font; - e.send(this.handler); - return e.loadedName; - }); - } - handleText(e, t) { - const a = t.font, - i = 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, i, this.handler, this.options); - } - return i; - } - 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; - (0, r.warn)(`ensureStateFont: "${t}".`); - } - async setGState({ - resources: e, - gState: t, - operatorList: a, - cacheKey: i, - task: s, - stateManager: o, - localGStateCache: c, - localColorSpaceCache: l, - }) { - const h = t.objId; - let u = !0; - const d = []; - let f = Promise.resolve(); - for (const i of t.getKeys()) { - const c = t.get(i); - switch (i) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - d.push([i, c]); - break; - case 'Font': - u = !1; - f = f.then(() => - this.handleSetFont(e, null, c[0], a, s, o.state).then(function (e) { - a.addDependency(e); - d.push([i, [e, c[1]]]); - }), - ); - break; - case 'BM': - d.push([i, normalizeBlendMode(c)]); - break; - case 'SMask': - if ((0, n.isName)(c, 'None')) { - d.push([i, !1]); - break; - } - if (c instanceof n.Dict) { - u = !1; - f = f.then(() => this.handleSMask(c, e, a, s, o, l)); - d.push([i, !0]); - } else (0, r.warn)('Unsupported SMask type'); - break; - case 'TR': - const t = this.handleTransferFunction(c); - d.push([i, 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 ' + i); - break; - default: - (0, r.info)('Unknown graphic state operator ' + i); - } - } - return f.then(function () { - d.length > 0 && a.addOp(r.OPS.setGState, [d]); - u && c.set(i, h, d); - }); - } - loadFont(e, t, a, i = null, o = null) { - const errorFont = async () => - new TranslatedFont({ - loadedName: 'g_font_error', - font: new s.ErrorFont(`Font "${e}" is not available.`), - dict: t, - evaluatorOptions: this.options, - }), - c = this.xref; - let l; - if (t) t instanceof n.Ref && (l = t); - else { - const t = a.get('Font'); - t && (l = t.getRaw(e)); - } - if (!l) { - const a = `Font "${e || (t && t.toString())}" is not available`; - if (!this.options.ignoreErrors && !this.parsingType3Font) { - (0, r.warn)(`${a}.`); - return errorFont(); - } - (0, r.warn)(`${a} -- attempting to fallback to a default font.`); - l = i || PartialEvaluator.fallbackFontDict; - } - if (this.parsingType3Font && this.type3FontRefs.has(l)) return errorFont(); - if (this.fontCache.has(l)) return this.fontCache.get(l); - if (!((t = c.fetchIfRef(l)) instanceof n.Dict)) return errorFont(); - if (t.cacheKey && this.fontCache.has(t.cacheKey)) - return this.fontCache.get(t.cacheKey); - const h = new r.PromiseCapability(); - let u; - try { - u = this.preEvaluateFont(t); - u.cssFontInfo = o; - } catch (e) { - (0, r.warn)(`loadFont - preEvaluateFont failed: "${e}".`); - return errorFont(); - } - const { descriptor: d, hash: f } = u, - g = l instanceof n.Ref; - let p; - g && (p = `f${l.toString()}`); - if (f && d instanceof n.Dict) { - const e = (d.fontAliases ||= Object.create(null)); - if (e[f]) { - const t = e[f].aliasRef; - if (g && t && this.fontCache.has(t)) { - this.fontCache.putAlias(l, t); - return this.fontCache.get(l); - } - } else e[f] = { fontID: this.idFactory.createFontId() }; - g && (e[f].aliasRef = l); - p = e[f].fontID; - } - if (g) this.fontCache.put(l, h.promise); - else { - p || (p = this.idFactory.createFontId()); - t.cacheKey = `cacheKey_${p}`; - this.fontCache.put(t.cacheKey, h.promise); - } - (0, r.assert)(p && p.startsWith('f'), 'The "fontID" must be (correctly) defined.'); - t.loadedName = `${this.idFactory.getDocId()}_${p}`; - this.translateFont(u) - .then((e) => { - h.resolve( - new TranslatedFont({ - loadedName: t.loadedName, - font: e, - dict: t, - evaluatorOptions: this.options, - }), - ); - }) - .catch((e) => { - (0, r.warn)(`loadFont - translateFont failed: "${e}".`); - h.resolve( - new TranslatedFont({ - loadedName: t.loadedName, - font: new s.ErrorFont(e instanceof Error ? e.message : e), - dict: t, - evaluatorOptions: this.options, - }), - ); - }); - return h.promise; - } - buildPath(e, t, a, i = !1) { - const n = e.length - 1; - a || (a = []); - if (n < 0 || e.fnArray[n] !== r.OPS.constructPath) { - if (i) { - (0, r.warn)(`Encountered path operator "${t}" inside of a text object.`); - e.addOp(r.OPS.save, null); - } - let n; - switch (t) { - case r.OPS.rectangle: - const e = a[0] + a[2], - t = a[1] + a[3]; - n = [ - Math.min(a[0], e), - Math.max(a[0], e), - Math.min(a[1], t), - Math.max(a[1], t), - ]; - break; - case r.OPS.moveTo: - case r.OPS.lineTo: - n = [a[0], a[0], a[1], a[1]]; - break; - default: - n = [1 / 0, -1 / 0, 1 / 0, -1 / 0]; - } - e.addOp(r.OPS.constructPath, [[t], a, n]); - i && e.addOp(r.OPS.restore, null); - } else { - const i = e.argsArray[n]; - i[0].push(t); - i[1].push(...a); - const s = i[2]; - switch (t) { - case r.OPS.rectangle: - const e = a[0] + a[2], - t = a[1] + a[3]; - s[0] = Math.min(s[0], a[0], e); - s[1] = Math.max(s[1], a[0], e); - s[2] = Math.min(s[2], a[1], t); - s[3] = Math.max(s[3], a[1], t); - 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 y.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) { - (0, r.warn)(`parseColorSpace - ignoring ColorSpace: "${e}".`); - return null; - } - throw e; - }); - } - parseShading({ - shading: e, - resources: t, - localColorSpaceCache: a, - localShadingPatternCache: r, - }) { - let i = r.get(e); - if (!i) { - const n = l.Pattern.parseShading( - e, - this.xref, - t, - this._pdfFunctionFactory, - a, - ).getIR(); - i = `pattern_${this.idFactory.createObjId()}`; - this.parsingType3Font && (i = `${this.idFactory.getDocId()}_type3_${i}`); - r.set(e, i); - this.parsingType3Font - ? this.handler.send('commonobj', [i, 'Pattern', n]) - : this.handler.send('obj', [i, this.pageIndex, 'Pattern', n]); - } - return i; - } - handleColorN(e, t, a, i, s, o, c, h, u, d) { - const f = a.pop(); - if (f instanceof n.Name) { - const g = s.getRaw(f.name), - p = g instanceof n.Ref && u.getByRef(g); - if (p) - try { - const r = i.base ? i.base.getRgb(a, 0) : null, - n = (0, l.getTilingPatternIR)(p.operatorListIR, p.dict, r); - e.addOp(t, n); - return; - } catch (e) {} - const b = this.xref.fetchIfRef(g); - if (b) { - const n = b instanceof m.BaseStream ? b.dict : b, - s = n.get('PatternType'); - if (s === D) { - const r = i.base ? i.base.getRgb(a, 0) : null; - return this.handleTilingType(t, r, o, b, n, e, c, u); - } - if (s === N) { - const a = n.get('Shading'), - r = n.getArray('Matrix'), - i = this.parseShading({ - shading: a, - resources: o, - localColorSpaceCache: h, - localShadingPatternCache: d, - }); - e.addOp(t, ['Shading', i, 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 i = e.length, - s = this.xref.fetchIfRef(e[0]); - if (!(i < 2) && s instanceof n.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; r < i; r++) { - const i = e[r], - s = this.xref.fetchIfRef(i); - if (Array.isArray(s)) { - const e = []; - a.push(e); - this._parseVisibilityExpression(s, t, e); - } else i instanceof n.Ref && a.push(i.toString()); - } - } else (0, r.warn)('Invalid visibility expression'); - } - async parseMarkedContentProps(e, t) { - let a; - if (e instanceof n.Name) { - a = t.get('Properties').get(e.name); - } else { - if (!(e instanceof n.Dict)) - throw new r.FormatError('Optional content properties malformed.'); - a = e; - } - const i = a.get('Type').name; - if ('OCG' === i) return { type: i, id: a.objId }; - if ('OCMD' === i) { - const e = a.get('VE'); - if (Array.isArray(e)) { - const t = []; - this._parseVisibilityExpression(e, 0, t); - if (t.length > 0) return { type: 'OCMD', expression: t }; - } - const t = a.get('OCGs'); - if (Array.isArray(t) || t instanceof n.Dict) { - const e = []; - if (Array.isArray(t)) for (const a of t) e.push(a.toString()); - else e.push(t.objId); - return { - type: i, - ids: e, - policy: a.get('P') instanceof n.Name ? a.get('P').name : null, - expression: null, - }; - } - if (t instanceof n.Ref) return { type: i, id: t.toString() }; - } - return null; - } - getOperatorList({ - stream: e, - task: t, - resources: a, - operatorList: i, - initialState: s = null, - fallbackFontDict: o = null, - }) { - a ||= n.Dict.empty; - s ||= new EvalState(); - if (!i) throw new Error('getOperatorList: missing "operatorList" parameter'); - const c = this, - l = this.xref; - let h = !1; - const u = new g.LocalImageCache(), - d = new g.LocalColorSpaceCache(), - f = new g.LocalGStateCache(), - p = new g.LocalTilingPatternCache(), - b = new Map(), - w = a.get('XObject') || n.Dict.empty, - S = a.get('Pattern') || n.Dict.empty, - x = new StateManager(s), - C = new EvaluatorPreprocessor(e, l, x), - k = new TimeSlotManager(); - function closePendingRestoreOPS(e) { - for (let e = 0, t = C.savedStatesDepth; e < t; e++) i.addOp(r.OPS.restore, []); - } - return new Promise(function promiseBody(e, s) { - const next = function (t) { - Promise.all([t, i.ready]).then(function () { - try { - promiseBody(e, s); - } catch (e) { - s(e); - } - }, s); - }; - t.ensureNotTerminated(); - k.reset(); - const g = {}; - let v, F, O, T, M, E; - for (; !(v = k.check()); ) { - g.args = null; - if (!C.read(g)) break; - let e = g.args, - s = g.fn; - switch (0 | s) { - case r.OPS.paintXObject: - E = e[0] instanceof n.Name; - M = e[0].name; - if (E) { - const t = u.getByName(M); - if (t) { - i.addImageOps(t.fn, t.args, t.optionalContent); - incrementCachedImageMaskCount(t); - e = null; - continue; - } - } - next( - new Promise(function (e, s) { - if (!E) throw new r.FormatError('XObject must be referred to by name.'); - let o = w.getRaw(M); - if (o instanceof n.Ref) { - const t = u.getByRef(o) || c._regionalImageCache.getByRef(o); - if (t) { - i.addImageOps(t.fn, t.args, t.optionalContent); - incrementCachedImageMaskCount(t); - e(); - return; - } - const a = c.globalImageCache.getData(o, c.pageIndex); - if (a) { - i.addDependency(a.objId); - i.addImageOps(a.fn, a.args, a.optionalContent); - e(); - return; - } - o = l.fetch(o); - } - if (!(o instanceof m.BaseStream)) - throw new r.FormatError('XObject should be a stream'); - const h = o.dict.get('Subtype'); - if (!(h instanceof n.Name)) - throw new r.FormatError('XObject should have a Name subtype'); - if ('Form' !== h.name) - if ('Image' !== h.name) { - if ('PS' !== h.name) - throw new r.FormatError(`Unhandled XObject subtype ${h.name}`); - (0, r.info)('Ignored XObject subtype PS'); - e(); - } else - c.buildPaintImageXObject({ - resources: a, - image: o, - operatorList: i, - cacheKey: M, - localImageCache: u, - localColorSpaceCache: d, - }).then(e, s); - else { - x.save(); - c.buildFormXObject(a, o, null, i, t, x.state.clone(), d).then( - function () { - x.restore(); - e(); - }, - s, - ); - } - }).catch(function (e) { - if (!(e instanceof r.AbortException)) { - if (!c.options.ignoreErrors) throw e; - (0, r.warn)(`getOperatorList - ignoring XObject: "${e}".`); - } - }), - ); - return; - case r.OPS.setFont: - var D = e[1]; - next( - c.handleSetFont(a, e, null, i, t, x.state, o).then(function (e) { - i.addDependency(e); - i.addOp(r.OPS.setFont, [e, D]); - }), - ); - return; - case r.OPS.beginText: - h = !0; - break; - case r.OPS.endText: - h = !1; - break; - case r.OPS.endInlineImage: - var N = e[0].cacheKey; - if (N) { - const t = u.getByName(N); - if (t) { - i.addImageOps(t.fn, t.args, t.optionalContent); - incrementCachedImageMaskCount(t); - e = null; - continue; - } - } - next( - c.buildPaintImageXObject({ - resources: a, - image: e[0], - isInline: !0, - operatorList: i, - cacheKey: N, - localImageCache: u, - localColorSpaceCache: d, - }), - ); - return; - case r.OPS.showText: - if (!x.state.font) { - c.ensureStateFont(x.state); - continue; - } - e[0] = c.handleText(e[0], x.state); - break; - case r.OPS.showSpacedText: - if (!x.state.font) { - c.ensureStateFont(x.state); - continue; - } - var L = [], - _ = x.state; - for (const t of e[0]) - 'string' == typeof t - ? L.push(...c.handleText(t, _)) - : 'number' == typeof t && L.push(t); - e[0] = L; - s = r.OPS.showText; - break; - case r.OPS.nextLineShowText: - if (!x.state.font) { - c.ensureStateFont(x.state); - continue; - } - i.addOp(r.OPS.nextLine); - e[0] = c.handleText(e[0], x.state); - s = r.OPS.showText; - break; - case r.OPS.nextLineSetSpacingShowText: - if (!x.state.font) { - c.ensureStateFont(x.state); - continue; - } - i.addOp(r.OPS.nextLine); - i.addOp(r.OPS.setWordSpacing, [e.shift()]); - i.addOp(r.OPS.setCharSpacing, [e.shift()]); - e[0] = c.handleText(e[0], x.state); - s = r.OPS.showText; - break; - case r.OPS.setTextRenderingMode: - x.state.textRenderingMode = e[0]; - break; - case r.OPS.setFillColorSpace: { - const t = y.ColorSpace.getCached(e[0], l, d); - if (t) { - x.state.fillColorSpace = t; - continue; - } - next( - c - .parseColorSpace({ cs: e[0], resources: a, localColorSpaceCache: d }) - .then(function (e) { - e && (x.state.fillColorSpace = e); - }), - ); - return; - } - case r.OPS.setStrokeColorSpace: { - const t = y.ColorSpace.getCached(e[0], l, d); - if (t) { - x.state.strokeColorSpace = t; - continue; - } - next( - c - .parseColorSpace({ cs: e[0], resources: a, localColorSpaceCache: d }) - .then(function (e) { - e && (x.state.strokeColorSpace = e); - }), - ); - return; - } - case r.OPS.setFillColor: - T = x.state.fillColorSpace; - e = T.getRgb(e, 0); - s = r.OPS.setFillRGBColor; - break; - case r.OPS.setStrokeColor: - T = x.state.strokeColorSpace; - e = T.getRgb(e, 0); - s = r.OPS.setStrokeRGBColor; - break; - case r.OPS.setFillGray: - x.state.fillColorSpace = y.ColorSpace.singletons.gray; - e = y.ColorSpace.singletons.gray.getRgb(e, 0); - s = r.OPS.setFillRGBColor; - break; - case r.OPS.setStrokeGray: - x.state.strokeColorSpace = y.ColorSpace.singletons.gray; - e = y.ColorSpace.singletons.gray.getRgb(e, 0); - s = r.OPS.setStrokeRGBColor; - break; - case r.OPS.setFillCMYKColor: - x.state.fillColorSpace = y.ColorSpace.singletons.cmyk; - e = y.ColorSpace.singletons.cmyk.getRgb(e, 0); - s = r.OPS.setFillRGBColor; - break; - case r.OPS.setStrokeCMYKColor: - x.state.strokeColorSpace = y.ColorSpace.singletons.cmyk; - e = y.ColorSpace.singletons.cmyk.getRgb(e, 0); - s = r.OPS.setStrokeRGBColor; - break; - case r.OPS.setFillRGBColor: - x.state.fillColorSpace = y.ColorSpace.singletons.rgb; - e = y.ColorSpace.singletons.rgb.getRgb(e, 0); - break; - case r.OPS.setStrokeRGBColor: - x.state.strokeColorSpace = y.ColorSpace.singletons.rgb; - e = y.ColorSpace.singletons.rgb.getRgb(e, 0); - break; - case r.OPS.setFillColorN: - T = x.state.fillColorSpace; - if ('Pattern' === T.name) { - next(c.handleColorN(i, r.OPS.setFillColorN, e, T, S, a, t, d, p, b)); - return; - } - e = T.getRgb(e, 0); - s = r.OPS.setFillRGBColor; - break; - case r.OPS.setStrokeColorN: - T = x.state.strokeColorSpace; - if ('Pattern' === T.name) { - next(c.handleColorN(i, r.OPS.setStrokeColorN, e, T, S, a, t, d, p, b)); - return; - } - e = T.getRgb(e, 0); - s = r.OPS.setStrokeRGBColor; - break; - case r.OPS.shadingFill: - var $ = a.get('Shading'); - if (!$) throw new r.FormatError('No shading resource found'); - var j = $.get(e[0].name); - if (!j) throw new r.FormatError('No shading object found'); - e = [ - c.parseShading({ - shading: j, - resources: a, - localColorSpaceCache: d, - localShadingPatternCache: b, - }), - ]; - s = r.OPS.shadingFill; - break; - case r.OPS.setGState: - E = e[0] instanceof n.Name; - M = e[0].name; - if (E) { - const t = f.getByName(M); - if (t) { - t.length > 0 && i.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 n.Dict)) - throw new r.FormatError('ExtGState should be a dictionary.'); - const l = o.get(M); - if (!(l instanceof n.Dict)) - throw new r.FormatError('GState should be a dictionary.'); - c.setGState({ - resources: a, - gState: l, - operatorList: i, - 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; - (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(i, 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 n.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) => { - i.addOp(r.OPS.beginMarkedContentProps, ['OC', e]); - }) - .catch((e) => { - if (!(e instanceof r.AbortException)) { - if (!c.options.ignoreErrors) throw e; - (0, r.warn)( - `getOperatorList - ignoring beginMarkedContentProps: "${e}".`, - ); - } - }), - ); - return; - } - e = [e[0].name, e[1] instanceof n.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 < O && !(e[F] instanceof n.Dict); F++); - if (F < O) { - (0, r.warn)('getOperatorList - ignoring operator: ' + s); - continue; - } - } - } - i.addOp(s, e); - } - if (v) next(R); - else { - closePendingRestoreOPS(); - e(); - } - }).catch((e) => { - if (!(e instanceof r.AbortException)) { - if (!this.options.ignoreErrors) throw e; - (0, r.warn)(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`); - closePendingRestoreOPS(); - } - }); - } - getTextContent({ - stream: e, - task: t, - resources: a, - stateManager: i = null, - includeMarkedContent: s = !1, - sink: o, - seenStyles: c = new Set(), - viewBox: l, - markedContentData: h = null, - disableNormalization: u = !1, - }) { - a ||= n.Dict.empty; - i ||= new StateManager(new TextState()); - s && (h ||= { level: 0 }); - const d = { items: [], styles: Object.create(null) }, - f = { - 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 y = 0; - function saveLastChar(e) { - const t = (y + 1) % 2, - a = ' ' !== p[y] && ' ' === p[t]; - p[y] = e; - y = t; - return a; - } - function shouldAddWhitepsace() { - return ' ' !== p[y] && ' ' === p[(y + 1) % 2]; - } - function resetLastChars() { - p[0] = p[1] = ' '; - y = 0; - } - const w = this, - S = this.xref, - x = []; - let C = null; - const k = new g.LocalImageCache(), - v = new g.LocalGStateCache(), - F = new EvaluatorPreprocessor(e, S, i); - let O; - function pushWhitespace({ - width: e = 0, - height: t = 0, - transform: a = f.prevTransform, - fontName: r = f.fontName, - }) { - d.items.push({ - str: ' ', - dir: 'ltr', - width: e, - height: t, - transform: a, - fontName: r, - hasEOL: !1, - }); - } - function getCurrentTextTransform() { - const e = O.font, - t = [O.fontSize * O.textHScale, 0, 0, O.fontSize, 0, O.textRise]; - if ( - e.isType3Font && - (O.fontSize <= 1 || e.isCharBBox) && - !(0, r.isArrayEqual)(O.fontMatrix, r.FONT_IDENTITY_MATRIX) - ) { - const a = e.bbox[3] - e.bbox[1]; - a > 0 && (t[3] *= a * O.fontMatrix[3]); - } - return r.Util.transform(O.ctm, r.Util.transform(O.textMatrix, t)); - } - function ensureTextContentItem() { - if (f.initialized) return f; - const { font: e, loadedName: t } = O; - if (!c.has(t)) { - c.add(t); - d.styles[t] = { - fontFamily: e.fallbackName, - ascent: e.ascent, - descent: e.descent, - vertical: e.vertical, - }; - } - f.fontName = t; - const a = (f.transform = getCurrentTextTransform()); - if (e.vertical) { - f.width = f.totalWidth = Math.hypot(a[0], a[1]); - f.height = f.totalHeight = 0; - f.vertical = !0; - } else { - f.width = f.totalWidth = 0; - f.height = f.totalHeight = Math.hypot(a[2], a[3]); - f.vertical = !1; - } - const r = Math.hypot(O.textLineMatrix[0], O.textLineMatrix[1]), - i = Math.hypot(O.ctm[0], O.ctm[1]); - f.textAdvanceScale = i * r; - const { fontSize: n } = O; - f.trackingSpaceMin = 0.102 * n; - f.notASpace = 0.03 * n; - f.negativeSpaceMax = -0.2 * n; - f.spaceInFlowMin = 0.102 * n; - f.spaceInFlowMax = 0.6 * n; - f.hasEOL = !1; - f.initialized = !0; - return f; - } - function updateAdvanceScale() { - if (!f.initialized) return; - const e = Math.hypot(O.textLineMatrix[0], O.textLineMatrix[1]), - t = Math.hypot(O.ctm[0], O.ctm[1]) * e; - if (t !== f.textAdvanceScale) { - if (f.vertical) { - f.totalHeight += f.height * f.textAdvanceScale; - f.height = 0; - } else { - f.totalWidth += f.width * f.textAdvanceScale; - f.width = 0; - } - f.textAdvanceScale = t; - } - } - function handleSetFont(e, i) { - return w - .loadFont(e, i, a) - .then(function (e) { - return e.font.isType3Font - ? e - .loadType3Data(w, a, t) - .catch(function () {}) - .then(function () { - return e; - }) - : e; - }) - .then(function (e) { - O.loadedName = e.loadedName; - O.font = e.font; - O.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(e) { - const t = getCurrentTextTransform(); - let a = t[4], - r = t[5]; - if (O.font && O.font.vertical) { - if (a < l[0] || a > l[2] || r + e < l[1] || r > l[3]) return !1; - } else if (a + e < l[0] || a > l[2] || r < l[1] || r > l[3]) return !1; - if (!O.font || !f.prevTransform) return !0; - let i = f.prevTransform[4], - n = f.prevTransform[5]; - if (i === a && n === r) return !0; - let s = -1; - t[0] && 0 === t[1] && 0 === t[2] - ? (s = t[0] > 0 ? 0 : 180) - : t[1] && 0 === t[0] && 0 === t[3] && (s = t[1] > 0 ? 90 : 270); - switch (s) { - case 0: - break; - case 90: - [a, r] = [r, a]; - [i, n] = [n, i]; - break; - case 180: - [a, r, i, n] = [-a, -r, -i, -n]; - break; - case 270: - [a, r] = [-r, -a]; - [i, n] = [-n, -i]; - break; - default: - [a, r] = applyInverseRotation(a, r, t); - [i, n] = applyInverseRotation(i, n, f.prevTransform); - } - if (O.font.vertical) { - const e = (n - r) / f.textAdvanceScale, - t = a - i, - s = Math.sign(f.height); - if (e < s * f.negativeSpaceMax) { - if (Math.abs(t) > 0.5 * f.width) { - appendEOL(); - return !0; - } - resetLastChars(); - flushTextContentItem(); - return !0; - } - if (Math.abs(t) > f.width) { - appendEOL(); - return !0; - } - e <= s * f.notASpace && resetLastChars(); - if (e <= s * f.trackingSpaceMin) - if (shouldAddWhitepsace()) { - resetLastChars(); - flushTextContentItem(); - pushWhitespace({ height: Math.abs(e) }); - } else f.height += e; - else if (!addFakeSpaces(e, f.prevTransform, s)) - if (0 === f.str.length) { - resetLastChars(); - pushWhitespace({ height: Math.abs(e) }); - } else f.height += e; - Math.abs(t) > 0.25 * f.width && flushTextContentItem(); - return !0; - } - const o = (a - i) / f.textAdvanceScale, - c = r - n, - h = Math.sign(f.width); - if (o < h * f.negativeSpaceMax) { - if (Math.abs(c) > 0.5 * f.height) { - appendEOL(); - return !0; - } - resetLastChars(); - flushTextContentItem(); - return !0; - } - if (Math.abs(c) > f.height) { - appendEOL(); - return !0; - } - o <= h * f.notASpace && resetLastChars(); - if (o <= h * f.trackingSpaceMin) - if (shouldAddWhitepsace()) { - resetLastChars(); - flushTextContentItem(); - pushWhitespace({ width: Math.abs(o) }); - } else f.width += o; - else if (!addFakeSpaces(o, f.prevTransform, h)) - if (0 === f.str.length) { - resetLastChars(); - pushWhitespace({ width: Math.abs(o) }); - } else f.width += o; - Math.abs(c) > 0.25 * f.height && flushTextContentItem(); - return !0; - } - function buildTextContentItem({ chars: e, extraSpacing: t }) { - const a = O.font; - if (!e) { - const e = O.charSpacing + t; - e && - (a.vertical - ? O.translateTextMatrix(0, -e) - : O.translateTextMatrix(e * O.textHScale, 0)); - return; - } - const r = a.charsToGlyphs(e), - i = O.fontMatrix[0] * O.fontSize; - for (let e = 0, n = r.length; e < n; e++) { - const s = r[e], - { category: o } = s; - if (o.isInvisibleFormatMark) continue; - let c = O.charSpacing + (e + 1 === n ? t : 0), - l = s.width; - a.vertical && (l = s.vmetric ? s.vmetric[0] : -l); - let h = l * i; - if (o.isWhitespace) { - if (a.vertical) { - c += -h + O.wordSpacing; - O.translateTextMatrix(0, -c); - } else { - c += h + O.wordSpacing; - O.translateTextMatrix(c * O.textHScale, 0); - } - saveLastChar(' '); - continue; - } - if (!o.isZeroWidthDiacritic && !compareWithLastPosition(h)) { - a.vertical - ? O.translateTextMatrix(0, h) - : O.translateTextMatrix(h * O.textHScale, 0); - continue; - } - const u = ensureTextContentItem(); - o.isZeroWidthDiacritic && (h = 0); - if (a.vertical) { - O.translateTextMatrix(0, h); - h = Math.abs(h); - u.height += h; - } else { - h *= O.textHScale; - O.translateTextMatrix(h, 0); - u.width += h; - } - h && (u.prevTransform = getCurrentTextTransform()); - const d = s.unicode; - saveLastChar(d) && u.str.push(' '); - u.str.push(d); - c && - (a.vertical - ? O.translateTextMatrix(0, -c) - : O.translateTextMatrix(c * O.textHScale, 0)); - } - } - function appendEOL() { - resetLastChars(); - if (f.initialized) { - f.hasEOL = !0; - flushTextContentItem(); - } else - d.items.push({ - str: '', - dir: 'ltr', - width: 0, - height: 0, - transform: getCurrentTextTransform(), - fontName: O.loadedName, - hasEOL: !0, - }); - } - function addFakeSpaces(e, t, a) { - if (a * f.spaceInFlowMin <= e && e <= a * f.spaceInFlowMax) { - if (f.initialized) { - resetLastChars(); - f.str.push(' '); - } - return !1; - } - const r = f.fontName; - let i = 0; - if (f.vertical) { - i = e; - e = 0; - } - flushTextContentItem(); - resetLastChars(); - pushWhitespace({ - width: Math.abs(e), - height: Math.abs(i), - transform: t || getCurrentTextTransform(), - fontName: r, - }); - return !0; - } - function flushTextContentItem() { - if (f.initialized && f.str) { - f.vertical - ? (f.totalHeight += f.height * f.textAdvanceScale) - : (f.totalWidth += f.width * f.textAdvanceScale); - d.items.push( - (function runBidiTransform(e) { - let t = e.str.join(''); - u || (t = (0, r.normalizeUnicode)(t)); - const a = (0, b.bidi)(t, -1, e.vertical); - return { - str: a.str, - dir: a.dir, - width: Math.abs(e.totalWidth), - height: Math.abs(e.totalHeight), - transform: e.transform, - fontName: e.fontName, - hasEOL: e.hasEOL, - }; - })(f), - ); - f.initialized = !1; - f.str.length = 0; - } - } - function enqueueChunk(e = !1) { - const t = d.items.length; - if (0 !== t && !(e && t < 10)) { - o.enqueue(d, t); - d.items = []; - d.styles = Object.create(null); - } - } - const T = new TimeSlotManager(); - return new Promise(function promiseBody(e, f) { - const next = function (t) { - enqueueChunk(!0); - Promise.all([t, o.ready]).then(function () { - try { - promiseBody(e, f); - } catch (e) { - f(e); - } - }, f); - }; - t.ensureNotTerminated(); - T.reset(); - const g = {}; - let p, - b = []; - for (; !(p = T.check()); ) { - b.length = 0; - g.args = b; - if (!F.read(g)) break; - O = i.state; - const e = g.fn; - b = g.args; - switch (0 | e) { - case r.OPS.setFont: - var y = b[0].name, - M = b[1]; - if (O.font && y === O.fontName && M === O.fontSize) break; - flushTextContentItem(); - O.fontName = y; - O.fontSize = M; - next(handleSetFont(y, null)); - return; - case r.OPS.setTextRise: - O.textRise = b[0]; - break; - case r.OPS.setHScale: - O.textHScale = b[0] / 100; - break; - case r.OPS.setLeading: - O.leading = b[0]; - break; - case r.OPS.moveText: - O.translateTextLineMatrix(b[0], b[1]); - O.textMatrix = O.textLineMatrix.slice(); - break; - case r.OPS.setLeadingMoveText: - O.leading = -b[1]; - O.translateTextLineMatrix(b[0], b[1]); - O.textMatrix = O.textLineMatrix.slice(); - break; - case r.OPS.nextLine: - O.carriageReturn(); - break; - case r.OPS.setTextMatrix: - O.setTextMatrix(b[0], b[1], b[2], b[3], b[4], b[5]); - O.setTextLineMatrix(b[0], b[1], b[2], b[3], b[4], b[5]); - updateAdvanceScale(); - break; - case r.OPS.setCharSpacing: - O.charSpacing = b[0]; - break; - case r.OPS.setWordSpacing: - O.wordSpacing = b[0]; - break; - case r.OPS.beginText: - O.textMatrix = r.IDENTITY_MATRIX.slice(); - O.textLineMatrix = r.IDENTITY_MATRIX.slice(); - break; - case r.OPS.showSpacedText: - if (!i.state.font) { - w.ensureStateFont(i.state); - continue; - } - const e = ((O.font.vertical ? 1 : -1) * O.fontSize) / 1e3, - f = b[0]; - for (let t = 0, a = f.length; t < a - 1; t++) { - const a = f[t]; - if ('string' == typeof a) x.push(a); - else if ('number' == typeof a && 0 !== a) { - const t = x.join(''); - x.length = 0; - buildTextContentItem({ chars: t, extraSpacing: a * e }); - } - } - const g = f.at(-1); - 'string' == typeof g && x.push(g); - if (x.length > 0) { - const e = x.join(''); - x.length = 0; - buildTextContentItem({ chars: e, extraSpacing: 0 }); - } - break; - case r.OPS.showText: - if (!i.state.font) { - w.ensureStateFont(i.state); - continue; - } - buildTextContentItem({ chars: b[0], extraSpacing: 0 }); - break; - case r.OPS.nextLineShowText: - if (!i.state.font) { - w.ensureStateFont(i.state); - continue; - } - O.carriageReturn(); - buildTextContentItem({ chars: b[0], extraSpacing: 0 }); - break; - case r.OPS.nextLineSetSpacingShowText: - if (!i.state.font) { - w.ensureStateFont(i.state); - continue; - } - O.wordSpacing = b[0]; - O.charSpacing = b[1]; - O.carriageReturn(); - buildTextContentItem({ chars: b[2], extraSpacing: 0 }); - break; - case r.OPS.paintXObject: - flushTextContentItem(); - C || (C = a.get('XObject') || n.Dict.empty); - var E = b[0] instanceof n.Name, - D = b[0].name; - if (E && k.getByName(D)) break; - next( - new Promise(function (e, d) { - if (!E) throw new r.FormatError('XObject must be referred to by name.'); - let f = C.getRaw(D); - if (f instanceof n.Ref) { - if (k.getByRef(f)) { - e(); - return; - } - if (w.globalImageCache.getData(f, w.pageIndex)) { - e(); - return; - } - f = S.fetch(f); - } - if (!(f instanceof m.BaseStream)) - throw new r.FormatError('XObject should be a stream'); - const g = f.dict.get('Subtype'); - if (!(g instanceof n.Name)) - throw new r.FormatError('XObject should have a Name subtype'); - if ('Form' !== g.name) { - k.set(D, f.dict.objId, !0); - e(); - return; - } - const p = i.state.clone(), - b = new StateManager(p), - y = f.dict.getArray('Matrix'); - Array.isArray(y) && 6 === y.length && b.transform(y); - enqueueChunk(); - const x = { - enqueueInvoked: !1, - enqueue(e, t) { - this.enqueueInvoked = !0; - o.enqueue(e, t); - }, - get desiredSize() { - return o.desiredSize; - }, - get ready() { - return o.ready; - }, - }; - w.getTextContent({ - stream: f, - task: t, - resources: f.dict.get('Resources') || a, - stateManager: b, - includeMarkedContent: s, - sink: x, - seenStyles: c, - viewBox: l, - markedContentData: h, - disableNormalization: u, - }).then(function () { - x.enqueueInvoked || k.set(D, f.dict.objId, !0); - e(); - }, d); - }).catch(function (e) { - if (!(e instanceof r.AbortException)) { - if (!w.options.ignoreErrors) throw e; - (0, r.warn)(`getTextContent - ignoring XObject: "${e}".`); - } - }), - ); - return; - case r.OPS.setGState: - E = b[0] instanceof n.Name; - D = b[0].name; - if (E && v.getByName(D)) break; - next( - new Promise(function (e, t) { - if (!E) throw new r.FormatError('GState must be referred to by name.'); - const i = a.get('ExtGState'); - if (!(i instanceof n.Dict)) - throw new r.FormatError('ExtGState should be a dictionary.'); - const s = i.get(D); - if (!(s instanceof n.Dict)) - throw new r.FormatError('GState should be a dictionary.'); - const o = s.get('Font'); - if (o) { - flushTextContentItem(); - O.fontName = null; - O.fontSize = o[1]; - handleSetFont(null, o[0]).then(e, t); - } else { - v.set(D, s.objId, !0); - e(); - } - }).catch(function (e) { - if (!(e instanceof r.AbortException)) { - if (!w.options.ignoreErrors) throw e; - (0, r.warn)(`getTextContent - ignoring ExtGState: "${e}".`); - } - }), - ); - return; - case r.OPS.beginMarkedContent: - flushTextContentItem(); - if (s) { - h.level++; - d.items.push({ - type: 'beginMarkedContent', - tag: b[0] instanceof n.Name ? b[0].name : null, - }); - } - break; - case r.OPS.beginMarkedContentProps: - flushTextContentItem(); - if (s) { - h.level++; - let e = null; - b[1] instanceof n.Dict && (e = b[1].get('MCID')); - d.items.push({ - type: 'beginMarkedContentProps', - id: Number.isInteger(e) ? `${w.idFactory.getPageObjId()}_mcid${e}` : null, - tag: b[0] instanceof n.Name ? b[0].name : null, - }); - } - break; - case r.OPS.endMarkedContent: - flushTextContentItem(); - if (s) { - if (0 === h.level) break; - h.level--; - d.items.push({ type: 'endMarkedContent' }); - } - } - if (d.items.length >= o.desiredSize) { - p = !0; - break; - } - } - if (p) next(R); - 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 i = this.xref; - let s; - const c = this.readToUnicode(a.toUnicode || e.get('ToUnicode') || t.get('ToUnicode')); - if (a.composite) { - const t = e.get('CIDSystemInfo'); - t instanceof n.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 m.BaseStream && (s = t.getBytes()); - } catch (e) { - if (!this.options.ignoreErrors) throw e; - (0, r.warn)(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`); - } - } - const l = []; - let h, - u = null; - if (e.has('Encoding')) { - h = e.get('Encoding'); - if (h instanceof n.Dict) { - u = h.get('BaseEncoding'); - u = u instanceof n.Name ? u.name : null; - if (h.has('Differences')) { - const e = h.get('Differences'); - let t = 0; - for (const a of e) { - const e = i.fetchIfRef(a); - if ('number' == typeof e) t = e; - else { - if (!(e instanceof n.Name)) - throw new r.FormatError(`Invalid entry in 'Differences' array: ${e}`); - l[t++] = e.name; - } - } - } - } else if (h instanceof n.Name) u = h.name; - else { - const e = 'Encoding is not a Name nor a Dict'; - if (!this.options.ignoreErrors) throw new r.FormatError(e); - (0, r.warn)(e); - } - 'MacRomanEncoding' !== u && - 'MacExpertEncoding' !== u && - 'WinAnsiEncoding' !== u && - (u = null); - } - if (u) a.defaultEncoding = (0, o.getEncoding)(u); - else { - const e = !!(a.flags & S.FontFlags.Symbolic), - t = !!(a.flags & S.FontFlags.Nonsymbolic); - h = o.StandardEncoding; - 'TrueType' !== a.type || t || (h = o.WinAnsiEncoding); - if (e) { - h = o.MacRomanEncoding; - (a.file && !a.isInternalFont) || - (/Symbol/i.test(a.name) - ? (h = o.SymbolSetEncoding) - : /Dingbats|Wingdings/i.test(a.name) && (h = o.ZapfDingbatsEncoding)); - } - a.defaultEncoding = h; - } - a.differences = l; - a.baseEncodingName = u; - a.hasEncoding = !!u || l.length > 0; - a.dict = e; - return c - .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 = [], - i = e.defaultEncoding.slice(), - n = e.baseEncodingName, - s = e.differences; - for (const e in s) { - const t = s[e]; - '.notdef' !== t && (i[e] = t); - } - const c = (0, x.getGlyphsUnicode)(); - for (const r in i) { - let s = i[r]; - if ('' === s) continue; - let l = c[s]; - if (void 0 !== l) { - a[r] = String.fromCharCode(l); - continue; - } - let h = 0; - switch (s[0]) { - case 'G': - 3 === s.length && (h = parseInt(s.substring(1), 16)); - break; - case 'g': - 5 === s.length && (h = parseInt(s.substring(1), 16)); - break; - case 'C': - case 'c': - if (s.length >= 3 && s.length <= 4) { - const a = s.substring(1); - if (t) { - h = parseInt(a, 16); - break; - } - h = +a; - if (Number.isNaN(h) && Number.isInteger(parseInt(a, 16))) - return this._simpleFontToUnicode(e, !0); - } - break; - case 'u': - l = (0, v.getUnicodeForGlyph)(s, c); - -1 !== l && (h = l); - break; - default: - switch (s) { - case 'f_h': - case 'f_t': - case 'T_h': - a[r] = s.replaceAll('_', ''); - continue; - } - } - if (h > 0 && h <= 1114111 && Number.isInteger(h)) { - if (n && h === +r) { - const e = (0, o.getEncoding)(n); - if (e && (s = e[r])) { - a[r] = String.fromCharCode(c[s]); - continue; - } - } - a[r] = String.fromCodePoint(h); - } - } - 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 u.ToUnicodeMap(this._simpleFontToUnicode(e)); - if ( - e.composite && - ((e.cMap.builtInCMap && !(e.cMap instanceof i.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 = n.Name.get(`${t}-${a}-UCS2`), - o = await i.CMapFactory.create({ - encoding: s, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }), - c = [], - l = []; - 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); - if (a) { - l.length = 0; - for (let e = 0, t = a.length; e < t; e += 2) - l.push((a.charCodeAt(e) << 8) + a.charCodeAt(e + 1)); - c[e] = String.fromCharCode(...l); - } - }); - return new u.ToUnicodeMap(c); - } - return new u.IdentityToUnicodeMap(e.firstChar, e.lastChar); - } - readToUnicode(e) { - return e - ? e instanceof n.Name - ? i.CMapFactory.create({ - encoding: e, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }).then(function (e) { - return e instanceof i.IdentityCMap - ? new u.IdentityToUnicodeMap(0, 65535) - : new u.ToUnicodeMap(e.getMap()); - }) - : e instanceof m.BaseStream - ? i.CMapFactory.create({ - encoding: e, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }).then( - function (e) { - if (e instanceof i.IdentityCMap) - return new u.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 < a.length; e += 2) { - const t = (a.charCodeAt(e) << 8) | a.charCodeAt(e + 1); - if (55296 != (63488 & t)) { - r.push(t); - continue; - } - e += 2; - const i = (a.charCodeAt(e) << 8) | a.charCodeAt(e + 1); - r.push(((1023 & t) << 10) + (1023 & i) + 65536); - } - t[e] = String.fromCodePoint(...r); - }); - return new u.ToUnicodeMap(t); - }, - (e) => { - if (e instanceof r.AbortException) return null; - if (this.options.ignoreErrors) { - (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, i = e.length; r < i; r++) { - const i = (e[r++] << 8) | e[r], - n = r >> 1; - (0 !== i || t.has(n)) && (a[n] = i); - } - return a; - } - extractWidths(e, t, a) { - const r = this.xref; - let i = [], - s = 0; - const o = []; - let c, l, h, u, d, f, g, p; - if (a.composite) { - s = e.has('DW') ? e.get('DW') : 1e3; - p = e.get('W'); - if (p) - for (l = 0, h = p.length; l < h; l++) { - f = r.fetchIfRef(p[l++]); - g = r.fetchIfRef(p[l]); - if (Array.isArray(g)) - for (u = 0, d = g.length; u < d; u++) i[f++] = r.fetchIfRef(g[u]); - else { - const e = r.fetchIfRef(p[++l]); - for (u = f; u <= g; u++) i[u] = e; - } - } - if (a.vertical) { - let t = e.getArray('DW2') || [880, -1e3]; - c = [t[1], 0.5 * s, t[0]]; - t = e.get('W2'); - if (t) - for (l = 0, h = t.length; l < h; l++) { - f = r.fetchIfRef(t[l++]); - g = r.fetchIfRef(t[l]); - if (Array.isArray(g)) - for (u = 0, d = g.length; u < d; u++) - o[f++] = [r.fetchIfRef(g[u++]), r.fetchIfRef(g[u++]), r.fetchIfRef(g[u])]; - else { - const e = [ - r.fetchIfRef(t[++l]), - r.fetchIfRef(t[++l]), - r.fetchIfRef(t[++l]), - ]; - for (u = f; u <= g; u++) o[u] = e; - } - } - } - } else { - const o = a.firstChar; - p = e.get('Widths'); - if (p) { - u = o; - for (l = 0, h = p.length; l < h; l++) i[u++] = r.fetchIfRef(p[l]); - s = parseFloat(t.get('MissingWidth')) || 0; - } else { - const t = e.get('BaseFont'); - if (t instanceof n.Name) { - const e = this.getBaseFontMetrics(t.name); - i = this.buildCharCodeToWidth(e.widths, a); - s = e.defaultWidth; - } - } - } - let m = !0, - b = s; - for (const e in i) { - const t = i[e]; - if (t) - if (b) { - if (b !== t) { - m = !1; - break; - } - } else b = t; - } - m && (a.flags |= S.FontFlags.FixedPitch); - a.defaultWidth = s; - a.widths = i; - a.defaultVMetrics = c; - a.vmetrics = o; - } - isSerifFont(e) { - const t = e.split('-')[0]; - return t in (0, c.getSerifFonts)() || /serif/gi.test(t); - } - getBaseFontMetrics(e) { - let t = 0, - a = Object.create(null), - r = !1; - let i = (0, c.getStdFontMap)()[e] || e; - const n = (0, k.getMetrics)(); - i in n || (i = this.isSerifFont(e) ? 'Times-Roman' : 'Helvetica'); - const s = n[i]; - if ('number' == typeof s) { - t = s; - r = !0; - } else a = s(); - return { defaultWidth: t, monospace: r, widths: a }; - } - buildCharCodeToWidth(e, t) { - const a = Object.create(null), - r = t.differences, - i = t.defaultEncoding; - for (let t = 0; t < 256; t++) - t in r && e[r[t]] ? (a[t] = e[r[t]]) : t in i && e[i[t]] && (a[t] = e[i[t]]); - return a; - } - preEvaluateFont(e) { - const t = e; - let a = e.get('Subtype'); - if (!(a instanceof n.Name)) throw new r.FormatError('invalid font Subtype'); - let i, - s, - o = !1; - if ('Type0' === a.name) { - const t = e.get('DescendantFonts'); - if (!t) throw new r.FormatError('Descendant fonts are not specified'); - if (!((e = Array.isArray(t) ? this.xref.fetchIfRef(t[0]) : t) instanceof n.Dict)) - throw new r.FormatError('Descendant font is not a dictionary.'); - a = e.get('Subtype'); - if (!(a instanceof n.Name)) throw new r.FormatError('invalid font Subtype'); - o = !0; - } - const c = e.get('FirstChar') || 0, - l = e.get('LastChar') || (o ? 65535 : 255), - h = e.get('FontDescriptor'); - if (h) { - i = new O.MurmurHash3_64(); - const a = t.getRaw('Encoding'); - if (a instanceof n.Name) i.update(a.name); - else if (a instanceof n.Ref) i.update(a.toString()); - else if (a instanceof n.Dict) - for (const e of a.getRawValues()) - if (e instanceof n.Name) i.update(e.name); - else if (e instanceof n.Ref) i.update(e.toString()); - else if (Array.isArray(e)) { - const t = e.length, - a = new Array(t); - for (let r = 0; r < t; r++) { - const t = e[r]; - t instanceof n.Name - ? (a[r] = t.name) - : ('number' == typeof t || t instanceof n.Ref) && (a[r] = t.toString()); - } - i.update(a.join()); - } - i.update(`${c}-${l}`); - s = e.get('ToUnicode') || t.get('ToUnicode'); - if (s instanceof m.BaseStream) { - const e = s.str || s, - t = e.buffer - ? new Uint8Array(e.buffer.buffer, 0, e.bufferLength) - : new Uint8Array(e.bytes.buffer, e.start, e.end - e.start); - i.update(t); - } else s instanceof n.Name && i.update(s.name); - const r = e.get('Widths') || t.get('Widths'); - if (Array.isArray(r)) { - const e = []; - for (const t of r) - ('number' == typeof t || t instanceof n.Ref) && e.push(t.toString()); - i.update(e.join()); - } - if (o) { - i.update('compositeFont'); - const a = e.get('W') || t.get('W'); - if (Array.isArray(a)) { - const e = []; - for (const t of a) - if ('number' == typeof t || t instanceof n.Ref) e.push(t.toString()); - else if (Array.isArray(t)) { - const a = []; - for (const e of t) - ('number' == typeof e || e instanceof n.Ref) && a.push(e.toString()); - e.push(`[${a.join()}]`); - } - i.update(e.join()); - } - const r = e.getRaw('CIDToGIDMap') || t.getRaw('CIDToGIDMap'); - r instanceof n.Name - ? i.update(r.name) - : r instanceof n.Ref - ? i.update(r.toString()) - : r instanceof m.BaseStream && i.update(r.peekBytes()); - } - } - return { - descriptor: h, - dict: e, - baseDict: t, - composite: o, - type: a.name, - firstChar: c, - lastChar: l, - toUnicode: s, - hash: i ? i.hexdigest() : '', - }; - } - async translateFont({ - descriptor: e, - dict: t, - baseDict: a, - composite: o, - type: l, - firstChar: u, - lastChar: d, - toUnicode: f, - cssFontInfo: g, - }) { - const m = 'Type3' === l; - let b; - if (!e) { - if (!m) { - let e = t.get('BaseFont'); - if (!(e instanceof n.Name)) throw new r.FormatError('Base font is not specified'); - e = e.name.replaceAll(/[,_]/g, '-'); - const i = this.getBaseFontMetrics(e), - o = e.split('-')[0], - h = - (this.isSerifFont(o) ? S.FontFlags.Serif : 0) | - (i.monospace ? S.FontFlags.FixedPitch : 0) | - ((0, c.getSymbolsFonts)()[o] - ? S.FontFlags.Symbolic - : S.FontFlags.Nonsymbolic); - b = { - type: l, - name: e, - loadedName: a.loadedName, - widths: i.widths, - defaultWidth: i.defaultWidth, - isSimulatedFlags: !0, - flags: h, - firstChar: u, - lastChar: d, - toUnicode: f, - xHeight: 0, - capHeight: 0, - italicAngle: 0, - isType3Font: m, - }; - const g = t.get('Widths'), - p = (0, c.getStandardFontName)(e); - let y = null; - if (p) { - y = await this.fetchStandardFontData(p); - b.isInternalFont = !!y; - } - return this.extractDataStructures(t, t, b).then((t) => { - if (g) { - const e = []; - let a = u; - for (const t of g) e[a++] = this.xref.fetchIfRef(t); - t.widths = e; - } else t.widths = this.buildCharCodeToWidth(i.widths, t); - return new s.Font(e, y, t); - }); - } - (e = new n.Dict(null)).set('FontName', n.Name.get(l)); - e.set('FontBBox', t.getArray('FontBBox') || [0, 0, 0, 0]); - } - let y, - w, - x, - C, - k, - v = e.get('FontName'), - F = t.get('BaseFont'); - 'string' == typeof v && (v = n.Name.get(v)); - 'string' == typeof F && (F = n.Name.get(F)); - if (!m) { - const e = v && v.name, - t = F && F.name; - if (e !== t) { - (0, r.info)( - `The FontDescriptor's FontName is "${e}" but should be the same as the Font's BaseFont "${t}".`, - ); - e && t && t.startsWith(e) && (v = F); - } - } - v ||= F; - if (!(v instanceof n.Name)) throw new r.FormatError('invalid font name'); - try { - y = e.get('FontFile', 'FontFile2', 'FontFile3'); - } catch (e) { - if (!this.options.ignoreErrors) throw e; - (0, r.warn)(`translateFont - fetching "${v.name}" font file: "${e}".`); - y = new p.NullStream(); - } - let O = !1, - T = null; - if (y) { - if (y.dict) { - const e = y.dict.get('Subtype'); - e instanceof n.Name && (w = e.name); - x = y.dict.get('Length1'); - C = y.dict.get('Length2'); - k = y.dict.get('Length3'); - } - } else if (g) { - const e = (0, h.getXfaFontName)(v.name); - if (e) { - g.fontFamily = `${g.fontFamily}-PdfJS-XFA`; - g.metrics = e.metrics || null; - T = e.factors || null; - y = await this.fetchStandardFontData(e.name); - O = !!y; - a = t = (0, h.getXfaFontDict)(v.name); - o = !0; - } - } else if (!m) { - const e = (0, c.getStandardFontName)(v.name); - if (e) { - y = await this.fetchStandardFontData(e); - O = !!y; - } - } - b = { - type: l, - name: v.name, - subtype: w, - file: y, - length1: x, - length2: C, - length3: k, - isInternalFont: O, - loadedName: a.loadedName, - composite: o, - fixedPitch: !1, - fontMatrix: t.getArray('FontMatrix') || r.FONT_IDENTITY_MATRIX, - firstChar: u, - lastChar: d, - toUnicode: f, - bbox: e.getArray('FontBBox') || t.getArray('FontBBox'), - ascent: e.get('Ascent'), - descent: e.get('Descent'), - xHeight: e.get('XHeight') || 0, - capHeight: e.get('CapHeight') || 0, - flags: e.get('Flags'), - italicAngle: e.get('ItalicAngle') || 0, - isType3Font: m, - cssFontInfo: g, - scaleFactors: T, - }; - if (o) { - const e = a.get('Encoding'); - e instanceof n.Name && (b.cidEncoding = e.name); - const t = await i.CMapFactory.create({ - encoding: e, - fetchBuiltInCMap: this._fetchBuiltInCMapBound, - useCMap: null, - }); - b.cMap = t; - b.vertical = b.cMap.vertical; - } - return this.extractDataStructures(t, a, b).then((a) => { - this.extractWidths(t, e, a); - return new s.Font(v.name, y, a); - }); - } - static buildFontPaths(e, t, a, i) { - function buildPath(t) { - const n = `${e.loadedName}_path_${t}`; - try { - if (e.renderer.hasBuiltPath(t)) return; - a.send('commonobj', [n, 'FontPath', e.renderer.getPathJs(t)]); - } catch (e) { - if (i.ignoreErrors) { - (0, r.warn)(`buildFontPaths - ignoring ${n} 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 n.Dict(); - e.set('BaseFont', n.Name.get('PDFJS-FallbackFont')); - e.set('Type', n.Name.get('FallbackType')); - e.set('Subtype', n.Name.get('FallbackType')); - e.set('Encoding', n.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 || E; - 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 i = e.clone({ ignoreErrors: !1 }); - i.parsingType3Font = !0; - const s = new n.RefSet(e.type3FontRefs); - this.dict.objId && !s.has(this.dict.objId) && s.put(this.dict.objId); - i.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), - n = new T.OperatorList(); - return i - .getOperatorList({ stream: t, task: a, resources: u, operatorList: n }) - .then(() => { - n.fnArray[0] === r.OPS.setCharWidthAndBounds && - this._removeType3ColorOperators(n, m); - d[e] = n.getIR(); - for (const e of n.dependencies) c.add(e); - }) - .catch(function (t) { - (0, r.warn)(`Type3 font resource "${e}" is not available.`); - const a = new T.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)), - i = a[2] - a[0], - n = a[3] - a[1], - s = Math.hypot(i, n); - if (0 === i || 0 === n) { - 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 < c; ) { - switch (e.fnArray[o]) { - case r.OPS.setCharWidthAndBounds: - break; - case r.OPS.setStrokeColorSpace: - case r.OPS.setFillColorSpace: - case r.OPS.setStrokeColor: - case r.OPS.setStrokeColorN: - case r.OPS.setFillColor: - case r.OPS.setFillColorN: - case r.OPS.setStrokeGray: - case r.OPS.setFillGray: - case r.OPS.setStrokeRGBColor: - case r.OPS.setFillRGBColor: - case r.OPS.setStrokeCMYKColor: - case r.OPS.setFillCMYKColor: - case r.OPS.shadingFill: - case r.OPS.setRenderingIntent: - e.fnArray.splice(o, 1); - e.argsArray.splice(o, 1); - c--; - continue; - case r.OPS.setGState: - const [t] = e.argsArray[o]; - let a = 0, - i = t.length; - for (; a < i; ) { - const [e] = t[a]; - switch (e) { - case 'TR': - case 'TR2': - case 'HT': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - t.splice(a, 1); - i--; - continue; - } - a++; - } - } - o++; - } - } - } - class StateManager { - constructor(e = new EvalState()) { - this.state = e; - this.stateStack = []; - } - save() { - const e = this.state; - this.stateStack.push(this.state); - this.state = e.clone(); - } - restore() { - const e = this.stateStack.pop(); - e && (this.state = e); - } - transform(e) { - this.state.ctm = r.Util.transform(this.state.ctm, e); - } - } - class TextState { - constructor() { - this.ctm = new Float32Array(r.IDENTITY_MATRIX); - this.fontName = null; - this.fontSize = 0; - this.loadedName = null; - this.font = null; - this.fontMatrix = r.FONT_IDENTITY_MATRIX; - this.textMatrix = r.IDENTITY_MATRIX.slice(); - this.textLineMatrix = r.IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - setTextMatrix(e, t, a, r, i, n) { - const s = this.textMatrix; - s[0] = e; - s[1] = t; - s[2] = a; - s[3] = r; - s[4] = i; - s[5] = n; - } - setTextLineMatrix(e, t, a, r, i, n) { - const s = this.textLineMatrix; - s[0] = e; - s[1] = t; - s[2] = a; - s[3] = r; - s[4] = i; - s[5] = n; - } - translateTextMatrix(e, t) { - const a = this.textMatrix; - a[4] = a[0] * e + a[2] * t + a[4]; - a[5] = a[1] * e + a[3] * t + a[5]; - } - translateTextLineMatrix(e, t) { - const a = this.textLineMatrix; - a[4] = a[0] * e + a[2] * t + a[4]; - a[5] = a[1] * e + a[3] * t + a[5]; - } - carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - } - clone() { - const e = Object.create(this); - e.textMatrix = this.textMatrix.slice(); - e.textLineMatrix = this.textLineMatrix.slice(); - e.fontMatrix = this.fontMatrix.slice(); - return e; - } - } - class EvalState { - constructor() { - this.ctm = new Float32Array(r.IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = r.TextRenderingMode.FILL; - this.fillColorSpace = y.ColorSpace.singletons.gray; - this.strokeColorSpace = y.ColorSpace.singletons.gray; - } - clone() { - return Object.create(this); - } - } - class EvaluatorPreprocessor { - static get opMap() { - const e = (0, C.getLookupTableFactory)(function (e) { - e.w = { id: r.OPS.setLineWidth, numArgs: 1, variableArgs: !1 }; - e.J = { id: r.OPS.setLineCap, numArgs: 1, variableArgs: !1 }; - e.j = { id: r.OPS.setLineJoin, numArgs: 1, variableArgs: !1 }; - e.M = { id: r.OPS.setMiterLimit, numArgs: 1, variableArgs: !1 }; - e.d = { id: r.OPS.setDash, numArgs: 2, variableArgs: !1 }; - e.ri = { id: r.OPS.setRenderingIntent, numArgs: 1, variableArgs: !1 }; - e.i = { id: r.OPS.setFlatness, numArgs: 1, variableArgs: !1 }; - e.gs = { id: r.OPS.setGState, numArgs: 1, variableArgs: !1 }; - e.q = { id: r.OPS.save, numArgs: 0, variableArgs: !1 }; - e.Q = { id: r.OPS.restore, numArgs: 0, variableArgs: !1 }; - e.cm = { id: r.OPS.transform, numArgs: 6, variableArgs: !1 }; - e.m = { id: r.OPS.moveTo, numArgs: 2, variableArgs: !1 }; - e.l = { id: r.OPS.lineTo, numArgs: 2, variableArgs: !1 }; - e.c = { id: r.OPS.curveTo, numArgs: 6, variableArgs: !1 }; - e.v = { id: r.OPS.curveTo2, numArgs: 4, variableArgs: !1 }; - e.y = { id: r.OPS.curveTo3, numArgs: 4, variableArgs: !1 }; - e.h = { id: r.OPS.closePath, numArgs: 0, variableArgs: !1 }; - e.re = { id: r.OPS.rectangle, numArgs: 4, variableArgs: !1 }; - e.S = { id: r.OPS.stroke, numArgs: 0, variableArgs: !1 }; - e.s = { id: r.OPS.closeStroke, numArgs: 0, variableArgs: !1 }; - e.f = { id: r.OPS.fill, numArgs: 0, variableArgs: !1 }; - e.F = { id: r.OPS.fill, numArgs: 0, variableArgs: !1 }; - e['f*'] = { id: r.OPS.eoFill, numArgs: 0, variableArgs: !1 }; - e.B = { id: r.OPS.fillStroke, numArgs: 0, variableArgs: !1 }; - e['B*'] = { id: r.OPS.eoFillStroke, numArgs: 0, variableArgs: !1 }; - e.b = { id: r.OPS.closeFillStroke, numArgs: 0, variableArgs: !1 }; - e['b*'] = { id: r.OPS.closeEOFillStroke, numArgs: 0, variableArgs: !1 }; - e.n = { id: r.OPS.endPath, numArgs: 0, variableArgs: !1 }; - e.W = { id: r.OPS.clip, numArgs: 0, variableArgs: !1 }; - e['W*'] = { id: r.OPS.eoClip, numArgs: 0, variableArgs: !1 }; - e.BT = { id: r.OPS.beginText, numArgs: 0, variableArgs: !1 }; - e.ET = { id: r.OPS.endText, numArgs: 0, variableArgs: !1 }; - e.Tc = { id: r.OPS.setCharSpacing, numArgs: 1, variableArgs: !1 }; - e.Tw = { id: r.OPS.setWordSpacing, numArgs: 1, variableArgs: !1 }; - e.Tz = { id: r.OPS.setHScale, numArgs: 1, variableArgs: !1 }; - e.TL = { id: r.OPS.setLeading, numArgs: 1, variableArgs: !1 }; - e.Tf = { id: r.OPS.setFont, numArgs: 2, variableArgs: !1 }; - e.Tr = { id: r.OPS.setTextRenderingMode, numArgs: 1, variableArgs: !1 }; - e.Ts = { id: r.OPS.setTextRise, numArgs: 1, variableArgs: !1 }; - e.Td = { id: r.OPS.moveText, numArgs: 2, variableArgs: !1 }; - e.TD = { id: r.OPS.setLeadingMoveText, numArgs: 2, variableArgs: !1 }; - e.Tm = { id: r.OPS.setTextMatrix, numArgs: 6, variableArgs: !1 }; - e['T*'] = { id: r.OPS.nextLine, numArgs: 0, variableArgs: !1 }; - e.Tj = { id: r.OPS.showText, numArgs: 1, variableArgs: !1 }; - e.TJ = { id: r.OPS.showSpacedText, numArgs: 1, variableArgs: !1 }; - e["'"] = { id: r.OPS.nextLineShowText, numArgs: 1, variableArgs: !1 }; - e['"'] = { id: r.OPS.nextLineSetSpacingShowText, numArgs: 3, variableArgs: !1 }; - e.d0 = { id: r.OPS.setCharWidth, numArgs: 2, variableArgs: !1 }; - e.d1 = { id: r.OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: !1 }; - e.CS = { id: r.OPS.setStrokeColorSpace, numArgs: 1, variableArgs: !1 }; - e.cs = { id: r.OPS.setFillColorSpace, numArgs: 1, variableArgs: !1 }; - e.SC = { id: r.OPS.setStrokeColor, numArgs: 4, variableArgs: !0 }; - e.SCN = { id: r.OPS.setStrokeColorN, numArgs: 33, variableArgs: !0 }; - e.sc = { id: r.OPS.setFillColor, numArgs: 4, variableArgs: !0 }; - e.scn = { id: r.OPS.setFillColorN, numArgs: 33, variableArgs: !0 }; - e.G = { id: r.OPS.setStrokeGray, numArgs: 1, variableArgs: !1 }; - e.g = { id: r.OPS.setFillGray, numArgs: 1, variableArgs: !1 }; - e.RG = { id: r.OPS.setStrokeRGBColor, numArgs: 3, variableArgs: !1 }; - e.rg = { id: r.OPS.setFillRGBColor, numArgs: 3, variableArgs: !1 }; - e.K = { id: r.OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: !1 }; - e.k = { id: r.OPS.setFillCMYKColor, numArgs: 4, variableArgs: !1 }; - e.sh = { id: r.OPS.shadingFill, numArgs: 1, variableArgs: !1 }; - e.BI = { id: r.OPS.beginInlineImage, numArgs: 0, variableArgs: !1 }; - e.ID = { id: r.OPS.beginImageData, numArgs: 0, variableArgs: !1 }; - e.EI = { id: r.OPS.endInlineImage, numArgs: 1, variableArgs: !1 }; - e.Do = { id: r.OPS.paintXObject, numArgs: 1, variableArgs: !1 }; - e.MP = { id: r.OPS.markPoint, numArgs: 1, variableArgs: !1 }; - e.DP = { id: r.OPS.markPointProps, numArgs: 2, variableArgs: !1 }; - e.BMC = { id: r.OPS.beginMarkedContent, numArgs: 1, variableArgs: !1 }; - e.BDC = { id: r.OPS.beginMarkedContentProps, numArgs: 2, variableArgs: !1 }; - e.EMC = { id: r.OPS.endMarkedContent, numArgs: 0, variableArgs: !1 }; - e.BX = { id: r.OPS.beginCompat, numArgs: 0, variableArgs: !1 }; - e.EX = { id: r.OPS.endCompat, numArgs: 0, variableArgs: !1 }; - e.BM = null; - e.BD = null; - e.true = null; - e.fa = null; - e.fal = null; - e.fals = null; - e.false = null; - e.nu = null; - e.nul = null; - e.null = null; - }); - return (0, r.shadow)(this, 'opMap', e()); - } - static MAX_INVALID_PATH_OPS = 10; - constructor(e, t, a = new StateManager()) { - this.parser = new f.Parser({ - lexer: new f.Lexer(e, EvaluatorPreprocessor.opMap), - xref: t, - }); - this.stateManager = a; - this.nonProcessedArgs = []; - this._isPathOp = !1; - this._numInvalidPathOPS = 0; - } - get savedStatesDepth() { - return this.stateManager.stateStack.length; - } - read(e) { - let t = e.args; - for (;;) { - const a = this.parser.getObj(); - if (a instanceof n.Cmd) { - const i = a.cmd, - n = EvaluatorPreprocessor.opMap[i]; - if (!n) { - (0, r.warn)(`Unknown command "${i}".`); - continue; - } - const s = n.id, - o = n.numArgs; - let c = null !== t ? t.length : 0; - this._isPathOp || (this._numInvalidPathOPS = 0); - this._isPathOp = s >= r.OPS.moveTo && s <= r.OPS.endPath; - if (n.variableArgs) - c > o && - (0, r.info)(`Command ${i}: 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 (; c < o && 0 !== e.length; ) { - null === t && (t = []); - t.unshift(e.pop()); - c++; - } - } - if (c < o) { - const e = `command ${i}: expected ${o} args, but received ${c} args.`; - if ( - this._isPathOp && - ++this._numInvalidPathOPS > EvaluatorPreprocessor.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 === n.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), - i = a(4), - n = a(5), - s = a(15), - o = a(16), - c = a(3), - l = a(8); - const h = [ - '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', - ], - u = 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 > u) throw new Error('mapCidRange - ignoring data above MAX_MAP_RANGE.'); - for (; e <= t; ) this._map[e++] = a++; - } - mapBfRange(e, t, a) { - if (t - e > u) 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 > u) - throw new Error('mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.'); - const r = a.length; - let i = 0; - for (; e <= t && i < r; ) { - this._map[e] = a[i++]; - ++e; - } - } - mapOne(e, t) { - this._map[e] = t; - } - lookup(e) { - return this._map[e]; - } - contains(e) { - return void 0 !== this._map[e]; - } - forEach(e) { - const t = this._map, - a = t.length; - if (a <= 65536) for (let r = 0; r < a; r++) void 0 !== t[r] && e(r, t[r]); - else for (const a in t) e(a, t[a]); - } - 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; - } - getMap() { - return this._map; - } - readCharCode(e, t, a) { - let r = 0; - const i = this.codespaceRanges; - for (let n = 0, s = i.length; n < s; n++) { - r = ((r << 8) | e.charCodeAt(t + n)) >>> 0; - const s = i[n]; - for (let e = 0, t = s.length; e < t; ) { - const t = s[e++], - i = s[e++]; - if (r >= t && r <= i) { - a.charcode = r; - a.length = n + 1; - return; - } - } - } - a.charcode = 0; - a.length = 1; - } - getCharCodeLength(e) { - const t = this.codespaceRanges; - for (let a = 0, r = t.length; a < r; a++) { - const r = t[a]; - for (let t = 0, i = r.length; t < i; ) { - const i = r[t++], - n = r[t++]; - if (e >= i && e <= n) 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; - function strToInt(e) { - let t = 0; - for (let a = 0; a < e.length; a++) t = (t << 8) | e.charCodeAt(a); - return t >>> 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 === i.EOF) break; - if ((0, i.isCmd)(a, 'endbfchar')) return; - expectString(a); - const r = strToInt(a); - a = t.getObj(); - expectString(a); - const n = a; - e.mapOne(r, n); - } - } - function parseBfRange(e, t) { - for (;;) { - let a = t.getObj(); - if (a === i.EOF) break; - if ((0, i.isCmd)(a, 'endbfrange')) return; - expectString(a); - const r = strToInt(a); - a = t.getObj(); - expectString(a); - const n = strToInt(a); - a = t.getObj(); - if (Number.isInteger(a) || 'string' == typeof a) { - const t = Number.isInteger(a) ? String.fromCharCode(a) : a; - e.mapBfRange(r, n, t); - } else { - if (!(0, i.isCmd)(a, '[')) break; - { - a = t.getObj(); - const s = []; - for (; !(0, i.isCmd)(a, ']') && a !== i.EOF; ) { - s.push(a); - a = t.getObj(); - } - e.mapBfRangeToArray(r, n, s); - } - } - } - throw new r.FormatError('Invalid bf range.'); - } - function parseCidChar(e, t) { - for (;;) { - let a = t.getObj(); - if (a === i.EOF) break; - if ((0, i.isCmd)(a, 'endcidchar')) return; - expectString(a); - const r = strToInt(a); - a = t.getObj(); - expectInt(a); - const n = a; - e.mapOne(r, n); - } - } - function parseCidRange(e, t) { - for (;;) { - let a = t.getObj(); - if (a === i.EOF) break; - if ((0, i.isCmd)(a, 'endcidrange')) return; - expectString(a); - const r = strToInt(a); - a = t.getObj(); - expectString(a); - const n = strToInt(a); - a = t.getObj(); - expectInt(a); - const s = a; - e.mapCidRange(r, n, s); - } - } - function parseCodespaceRange(e, t) { - for (;;) { - let a = t.getObj(); - if (a === i.EOF) break; - if ((0, i.isCmd)(a, 'endcodespacerange')) return; - if ('string' != typeof a) break; - const r = strToInt(a); - a = t.getObj(); - if ('string' != typeof a) break; - const n = strToInt(a); - e.addCodespaceRange(a.length, r, n); - } - 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 i.Name && (e.name = a.name); - } - async function parseCMap(e, t, a, n) { - let s, o; - e: for (;;) - try { - const a = t.getObj(); - if (a === i.EOF) break; - if (a instanceof i.Name) { - 'WMode' === a.name - ? parseWMode(e, t) - : 'CMapName' === a.name && parseCMapName(e, t); - s = a; - } else if (a instanceof i.Cmd) - switch (a.cmd) { - case 'endcmap': - break e; - case 'usecmap': - s instanceof i.Name && (o = 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 c.MissingDataException) throw e; - (0, r.warn)('Invalid cMap data: ' + e); - continue; - } - !n && o && (n = o); - return n ? extendCMap(e, a, n) : 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; a < t.length; a++) e.codespaceRanges[a] = t[a].slice(); - e.numCodespaceRanges = e.useCMap.numCodespaceRanges; - } - e.useCMap.forEach(function (t, a) { - e.contains(t) || e.mapOne(t, e.useCMap.lookup(t)); - }); - return e; - } - async function createBuiltInCMap(e, t) { - if ('Identity-H' === e) return new IdentityCMap(!1, 2); - if ('Identity-V' === e) return new IdentityCMap(!0, 2); - if (!h.includes(e)) throw new Error('Unknown CMap name: ' + e); - if (!t) throw new Error('Built-in CMap parameters are not provided.'); - const { cMapData: a, compressionType: i } = await t(e), - n = new CMap(!0); - if (i === r.CMapCompressionType.BINARY) - return new s.BinaryCMapReader().process(a, n, (e) => extendCMap(n, t, e)); - if (i === r.CMapCompressionType.NONE) { - const e = new o.Lexer(new l.Stream(a)); - return parseCMap(n, e, t, null); - } - throw new Error(`Invalid CMap "compressionType" value: ${i}`); - } - t.CMapFactory = class CMapFactory { - static async create({ encoding: e, fetchBuiltInCMap: t, useCMap: a }) { - if (e instanceof i.Name) return createBuiltInCMap(e.name, t); - if (e instanceof n.BaseStream) { - const r = await parseCMap(new CMap(), new o.Lexer(e), t, a); - return r.isIdentityCMap ? createBuiltInCMap(r.name, t) : r; - } - throw new Error('Encoding required.'); - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.BinaryCMapReader = void 0; - var r = a(2); - 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(...e.subarray(0, t + 1)); - } - function addHex(e, t, a) { - let r = 0; - for (let i = a; i >= 0; i--) { - r += e[i] + t[i]; - e[i] = 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 i = 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 i = this.tmpBuf; - let n = 0; - do { - const e = this.readByte(); - if (e < 0) throw new r.FormatError('unexpected EOF in bcmap'); - a = !(128 & e); - i[n++] = 127 & e; - } while (!a); - let s = t, - o = 0, - c = 0; - for (; s >= 0; ) { - for (; c < 8 && i.length > 0; ) { - o |= i[--n] << c; - c += 7; - } - e[s] = 255 & o; - s--; - o >>= 8; - c -= 8; - } - } - readHexSigned(e, t) { - this.readHexNumber(e, t); - const a = 1 & e[t] ? 255 : 0; - let r = 0; - for (let i = 0; i <= t; i++) { - r = ((1 & r) << 8) | e[i]; - e[i] = (r >> 1) ^ a; - } - } - readString() { - const e = this.readNumber(), - t = new Array(e); - for (let a = 0; a < e; a++) t[a] = this.readNumber(); - return String.fromCharCode(...t); - } - } - t.BinaryCMapReader = class BinaryCMapReader { - async process(e, t, a) { - const r = new BinaryCMapStream(e), - n = r.readByte(); - t.vertical = !!(1 & n); - let s = null; - const o = new Uint8Array(i), - c = new Uint8Array(i), - l = new Uint8Array(i), - h = new Uint8Array(i), - u = new Uint8Array(i); - let d, f; - for (; (f = r.readByte()) >= 0; ) { - const e = f >> 5; - if (7 === e) { - switch (31 & f) { - case 0: - r.readString(); - break; - case 1: - s = r.readString(); - } - continue; - } - const a = !!(16 & f), - n = 15 & f; - if (n + 1 > i) throw new Error('BinaryCMapReader.process: Invalid dataSize.'); - const g = 1, - p = r.readNumber(); - switch (e) { - case 0: - r.readHex(o, n); - r.readHexNumber(c, n); - addHex(c, o, n); - t.addCodespaceRange(n + 1, hexToInt(o, n), hexToInt(c, n)); - for (let e = 1; e < p; e++) { - incHex(c, n); - r.readHexNumber(o, n); - addHex(o, c, n); - r.readHexNumber(c, n); - addHex(c, o, n); - t.addCodespaceRange(n + 1, hexToInt(o, n), hexToInt(c, n)); - } - break; - case 1: - r.readHex(o, n); - r.readHexNumber(c, n); - addHex(c, o, n); - r.readNumber(); - for (let e = 1; e < p; e++) { - incHex(c, n); - r.readHexNumber(o, n); - addHex(o, c, n); - r.readHexNumber(c, n); - addHex(c, o, n); - r.readNumber(); - } - break; - case 2: - r.readHex(l, n); - d = r.readNumber(); - t.mapOne(hexToInt(l, n), d); - for (let e = 1; e < p; e++) { - incHex(l, n); - if (!a) { - r.readHexNumber(u, n); - addHex(l, u, n); - } - d = r.readSigned() + (d + 1); - t.mapOne(hexToInt(l, n), d); - } - break; - case 3: - r.readHex(o, n); - r.readHexNumber(c, n); - addHex(c, o, n); - d = r.readNumber(); - t.mapCidRange(hexToInt(o, n), hexToInt(c, n), d); - for (let e = 1; e < p; e++) { - incHex(c, n); - if (a) o.set(c); - else { - r.readHexNumber(o, n); - addHex(o, c, n); - } - r.readHexNumber(c, n); - addHex(c, o, n); - d = r.readNumber(); - t.mapCidRange(hexToInt(o, n), hexToInt(c, n), d); - } - break; - case 4: - r.readHex(l, g); - r.readHex(h, n); - t.mapOne(hexToInt(l, g), hexToStr(h, n)); - for (let e = 1; e < p; e++) { - incHex(l, g); - if (!a) { - r.readHexNumber(u, g); - addHex(l, u, g); - } - incHex(h, n); - r.readHexSigned(u, n); - addHex(h, u, n); - t.mapOne(hexToInt(l, g), hexToStr(h, n)); - } - break; - case 5: - r.readHex(o, g); - r.readHexNumber(c, g); - addHex(c, o, g); - r.readHex(h, n); - t.mapBfRange(hexToInt(o, g), hexToInt(c, g), hexToStr(h, n)); - for (let e = 1; e < p; e++) { - incHex(c, g); - if (a) o.set(c); - else { - r.readHexNumber(o, g); - addHex(o, c, g); - } - r.readHexNumber(c, g); - addHex(c, o, g); - r.readHex(h, n); - t.mapBfRange(hexToInt(o, g), hexToInt(c, g), hexToStr(h, n)); - } - break; - default: - throw new Error(`BinaryCMapReader.process - unknown type: ${e}`); - } - } - return s ? a(s) : t; - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Parser = t.Linearization = t.Lexer = void 0; - var r = a(2), - i = a(4), - n = a(3), - s = a(17), - o = a(19), - c = a(20), - l = a(22), - h = a(23), - u = a(26), - d = a(29), - f = a(31), - g = a(8), - p = a(32), - m = a(33); - class Parser { - constructor({ lexer: e, xref: t, allowStreams: a = !1, recoveryMode: r = !1 }) { - this.lexer = e; - this.xref = t; - this.allowStreams = a; - this.recoveryMode = r; - 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 i.Cmd && 'ID' === this.buf2.cmd) { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - } - tryShift() { - try { - this.shift(); - return !0; - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - return !1; - } - } - getObj(e = null) { - const t = this.buf1; - this.shift(); - if (t instanceof i.Cmd) - switch (t.cmd) { - case 'BI': - return this.makeInlineImage(e); - case '[': - const a = []; - for (; !(0, i.isCmd)(this.buf1, ']') && this.buf1 !== i.EOF; ) - a.push(this.getObj(e)); - if (this.buf1 === i.EOF) { - if (this.recoveryMode) return a; - throw new n.ParserEOFException('End of file inside array.'); - } - this.shift(); - return a; - case '<<': - const s = new i.Dict(this.xref); - for (; !(0, i.isCmd)(this.buf1, '>>') && this.buf1 !== i.EOF; ) { - if (!(this.buf1 instanceof i.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 === i.EOF) break; - s.set(t, this.getObj(e)); - } - if (this.buf1 === i.EOF) { - if (this.recoveryMode) return s; - throw new n.ParserEOFException('End of file inside dictionary.'); - } - if ((0, i.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, i.isCmd)(this.buf2, 'R')) { - const e = i.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 if (32 === s || 10 === s || 13 === s) { - o = e.pos; - const a = e.peekBytes(10); - for (let e = 0, t = a.length; e < t; e++) { - s = a[e]; - if ( - (0 !== s || 0 === a[e + 1]) && - 10 !== s && - 13 !== s && - (s < 32 || s > 127) - ) { - c = 0; - break; - } - } - if (2 !== c) continue; - if (t.knownCommands) { - const e = t.peekObj(); - e instanceof i.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, n.isWhiteSpace)(s) || l--; - return e.pos - l - a; - } - findDCTDecodeInlineStreamEnd(e) { - const t = e.pos; - let a, - i, - n = !1; - for (; -1 !== (a = e.getByte()); ) - if (255 === a) { - switch (e.getByte()) { - case 0: - break; - case 255: - e.skip(-1); - break; - case 217: - n = !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: - i = e.getUint16(); - i > 2 ? e.skip(i - 2) : e.skip(-2); - } - if (n) 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, n.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 i = e.pos - t; - if (-1 === a) { - (0, r.warn)( - 'Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.', - ); - e.skip(-i); - return this.findDefaultInlineStreamEnd(e); - } - this.inlineStreamSkipEI(e); - return i; - } - findASCIIHexDecodeInlineStreamEnd(e) { - const t = e.pos; - let a; - for (; -1 !== (a = e.getByte()) && 62 !== a; ); - const i = e.pos - t; - if (-1 === a) { - (0, r.warn)( - 'Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.', - ); - e.skip(-i); - return this.findDefaultInlineStreamEnd(e); - } - this.inlineStreamSkipEI(e); - return i; - } - 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, - n = Object.create(null); - let s; - for (; !(0, i.isCmd)(this.buf1, 'ID') && this.buf1 !== i.EOF; ) { - if (!(this.buf1 instanceof i.Name)) - throw new r.FormatError('Dictionary key must be a name object'); - const t = this.buf1.name; - this.shift(); - if (this.buf1 === i.EOF) break; - n[t] = this.getObj(e); - } - -1 !== t.beginInlineImagePos && (s = a.pos - t.beginInlineImagePos); - const o = this.xref.fetchIfRef(n.F || n.Filter); - let c; - if (o instanceof i.Name) c = o.name; - else if (Array.isArray(o)) { - const e = this.xref.fetchIfRef(o[0]); - e instanceof i.Name && (c = e.name); - } - const l = a.pos; - let h, u; - 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); - } - if (h < 1e3 && s > 0) { - const e = a.pos; - a.pos = t.beginInlineImagePos; - u = (function getInlineImageCacheKey(e) { - const t = [], - a = e.length; - let r = 0; - for (; r < a - 1; ) t.push((e[r++] << 8) | e[r++]); - r < a && t.push(e[r]); - return a + '_' + String.fromCharCode.apply(null, t); - })(a.getBytes(s + h)); - a.pos = e; - const r = this.imageCache[u]; - if (void 0 !== r) { - this.buf2 = i.Cmd.get('EI'); - this.shift(); - r.reset(); - return r; - } - } - const d = new i.Dict(this.xref); - for (const e in n) d.set(e, n[e]); - let f = a.makeSubStream(l, h, d); - e && (f = e.createStream(f, h)); - f = this.filter(f, d, h); - f.dict = d; - if (void 0 !== u) { - f.cacheKey = 'inline_img_' + ++this._imageId; - this.imageCache[u] = f; - } - this.buf2 = i.Cmd.get('EI'); - this.shift(); - return f; - } - _findStreamLength(e, t) { - const { stream: a } = this.lexer; - a.pos = e; - const r = t.length; - for (; a.pos < a.end; ) { - const i = a.peekBytes(2048), - n = i.length - r; - if (n <= 0) break; - let s = 0; - for (; s < n; ) { - let n = 0; - for (; n < r && i[s + n] === t[n]; ) n++; - if (n >= r) { - a.pos += s; - return a.pos - e; - } - s++; - } - a.pos += n; - } - 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, i.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 i = 1; i <= a; i++) { - const a = e.length - i, - c = e.slice(0, a), - l = this._findStreamLength(o, c); - if (l >= 0) { - const e = s.peekBytes(a + 1)[a]; - if (!(0, n.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 n = t.get('F', 'Filter'), - s = t.get('DP', 'DecodeParms'); - if (n instanceof i.Name) { - Array.isArray(s) && - (0, r.warn)('/DecodeParms should not be an Array, when /Filter is a Name.'); - return this.makeFilter(e, n.name, a, s); - } - let o = a; - if (Array.isArray(n)) { - const t = n, - a = s; - for (let c = 0, l = t.length; c < l; ++c) { - n = this.xref.fetchIfRef(t[c]); - if (!(n instanceof i.Name)) throw new r.FormatError(`Bad filter name "${n}"`); - s = null; - Array.isArray(a) && c in a && (s = this.xref.fetchIfRef(a[c])); - e = this.makeFilter(e, n.name, o, s); - o = null; - } - } - return e; - } - makeFilter(e, t, a, i) { - if (0 === a) { - (0, r.warn)(`Empty "${t}" stream.`); - return new g.NullStream(); - } - try { - switch (t) { - case 'Fl': - case 'FlateDecode': - return i - ? new p.PredictorStream(new l.FlateStream(e, a), a, i) - : new l.FlateStream(e, a); - case 'LZW': - case 'LZWDecode': - let t = 1; - if (i) { - i.has('EarlyChange') && (t = i.get('EarlyChange')); - return new p.PredictorStream(new f.LZWStream(e, a, t), a, i); - } - return new f.LZWStream(e, a, t); - case 'DCT': - case 'DCTDecode': - return new u.JpegStream(e, a, i); - case 'JPX': - case 'JPXDecode': - return new d.JpxStream(e, a, i); - case 'A85': - case 'ASCII85Decode': - return new s.Ascii85Stream(e, a); - case 'AHx': - case 'ASCIIHexDecode': - return new o.AsciiHexStream(e, a); - case 'CCF': - case 'CCITTFaxDecode': - return new c.CCITTFaxStream(e, a, i); - case 'RL': - case 'RunLengthDecode': - return new m.RunLengthStream(e, a); - case 'JBIG2Decode': - return new h.Jbig2Stream(e, a, i); - } - (0, r.warn)(`Filter "${t}" is not supported.`); - return e; - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - (0, r.warn)(`Invalid stream: "${e}"`); - return new g.NullStream(); - } - } - } - t.Parser = Parser; - const b = [ - 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(e) { - return e >= 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, - i = 0; - if (45 === e) { - i = -1; - e = this.nextChar(); - 45 === e && (e = this.nextChar()); - } else if (43 === e) { - i = 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) { - const t = `Invalid number: ${String.fromCharCode(e)} (charCode ${e})`; - if ((0, n.isWhiteSpace)(e) || -1 === e) { - (0, r.info)(`Lexer.getNumber - "${t}".`); - return 0; - } - throw new r.FormatError(t); - } - i ||= 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 i * s; - } - getString() { - let e = 1, - t = !1; - const a = this.strBuf; - a.length = 0; - let i = this.nextChar(); - for (;;) { - let n = !1; - switch (0 | i) { - 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: - i = this.nextChar(); - switch (i) { - 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(i)); - break; - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - let e = 15 & i; - i = this.nextChar(); - n = !0; - if (i >= 48 && i <= 55) { - e = (e << 3) + (15 & i); - i = this.nextChar(); - if (i >= 48 && i <= 55) { - n = !1; - e = (e << 3) + (15 & i); - } - } - a.push(String.fromCharCode(e)); - break; - case 13: - 10 === this.peekChar() && this.nextChar(); - break; - case 10: - break; - default: - a.push(String.fromCharCode(i)); - } - break; - default: - a.push(String.fromCharCode(i)); - } - if (t) break; - n || (i = 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 i = toHexDigit(e); - if (-1 !== i) { - t = e; - e = this.nextChar(); - const n = toHexDigit(e); - if (-1 === n) { - (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((i << 4) | n)); - } 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 i.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, - i = this.currentChar, - n = !0; - this._hexStringNumWarn = 0; - for (;;) { - if (i < 0) { - (0, r.warn)('Unterminated hex string'); - break; - } - if (62 === i) { - this.nextChar(); - break; - } - if (1 !== b[i]) { - if (n) { - t = toHexDigit(i); - if (-1 === t) { - this._hexStringWarn(i); - i = this.nextChar(); - continue; - } - } else { - a = toHexDigit(i); - if (-1 === a) { - this._hexStringWarn(i); - i = this.nextChar(); - continue; - } - e.push(String.fromCharCode((t << 4) | a)); - } - n = !n; - i = this.nextChar(); - } else i = this.nextChar(); - } - return e.join(''); - } - getObj() { - let e = !1, - t = this.currentChar; - for (;;) { - if (t < 0) return i.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 i.Cmd.get('['); - case 93: - this.nextChar(); - return i.Cmd.get(']'); - case 60: - t = this.nextChar(); - if (60 === t) { - this.nextChar(); - return i.Cmd.get('<<'); - } - return this.getHexString(); - case 62: - t = this.nextChar(); - if (62 === t) { - this.nextChar(); - return i.Cmd.get('>>'); - } - return i.Cmd.get('>'); - case 123: - this.nextChar(); - return i.Cmd.get('{'); - case 125: - this.nextChar(); - return i.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 i.Cmd.get(a); - } - } - const n = this.knownCommands; - let s = n && void 0 !== n[a]; - for (; (t = this.nextChar()) >= 0 && !b[t]; ) { - const e = a + String.fromCharCode(t); - if (s && void 0 === n[e]) break; - if (128 === a.length) - throw new r.FormatError(`Command token too long: ${a.length}`); - a = e; - s = n && void 0 !== n[a]; - } - if ('true' === a) return !0; - if ('false' === a) return !1; - if ('null' === a) return null; - 'BI' === a && (this.beginInlineImagePos = this.stream.pos); - return i.Cmd.get(a); - } - peekObj() { - const e = this.stream.pos, - t = this.currentChar, - a = this.beginInlineImagePos; - let i; - try { - i = this.getObj(); - } catch (e) { - if (e instanceof n.MissingDataException) throw e; - (0, r.warn)(`peekObj: ${e}`); - } - this.stream.pos = e; - this.currentChar = t; - this.beginInlineImagePos = a; - return i; - } - 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(), - n = t.getObj(), - s = t.getObj(); - let o, c; - if ( - !( - Number.isInteger(a) && - Number.isInteger(r) && - (0, i.isCmd)(n, 'obj') && - s instanceof i.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; e < a; e++) { - const a = t[e]; - if (!(Number.isInteger(a) && a > 0)) - 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(18), - i = a(3); - class Ascii85Stream extends r.DecodeStream { - constructor(e, t) { - t && (t *= 0.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, i.isWhiteSpace)(t); ) t = e.getByte(); - if (-1 === t || 126 === t) { - this.eof = !0; - return; - } - const a = this.bufferLength; - let r, n; - if (122 === t) { - r = this.ensureBuffer(a + 4); - for (n = 0; n < 4; ++n) r[a + n] = 0; - this.bufferLength += 4; - } else { - const s = this.input; - s[0] = t; - for (n = 1; n < 5; ++n) { - t = e.getByte(); - for (; (0, i.isWhiteSpace)(t); ) t = e.getByte(); - s[n] = t; - if (-1 === t || 126 === t) break; - } - r = this.ensureBuffer(a + n - 1); - this.bufferLength += n - 1; - if (n < 5) { - for (; n < 5; ++n) s[n] = 117; - this.eof = !0; - } - let o = 0; - for (n = 0; n < 5; ++n) o = 85 * o + (s[n] - 33); - for (n = 3; n >= 0; --n) { - r[a + n] = 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(5), - i = a(8); - const n = 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 = n; - this.minBufferLength = 512; - if (e) for (; this.minBufferLength < e; ) this.minBufferLength *= 2; - } - get isEmpty() { - for (; !this.eof && 0 === this.bufferLength; ) this.readBlock(); - return 0 === this.bufferLength; - } - ensureBuffer(e) { - const t = this.buffer; - if (e <= t.byteLength) return t; - let a = this.minBufferLength; - for (; a < e; ) a *= 2; - const r = new Uint8Array(a); - r.set(t); - return (this.buffer = r); - } - getByte() { - const e = this.pos; - for (; this.bufferLength <= e; ) { - if (this.eof) return -1; - this.readBlock(); - } - return this.buffer[this.pos++]; - } - getBytes(e) { - const t = this.pos; - let a; - if (e) { - this.ensureBuffer(t + e); - a = t + e; - for (; !this.eof && this.bufferLength < a; ) this.readBlock(); - const r = this.bufferLength; - a > r && (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 i.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, - i = r + a.length; - this.ensureBuffer(i).set(a, r); - this.bufferLength = i; - } - 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(18); - class AsciiHexStream extends r.DecodeStream { - constructor(e, t) { - t && (t *= 0.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, - i = 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 (i < 0) i = e; - else { - a[r++] = (i << 4) | e; - i = -1; - } - } - if (i >= 0 && this.eof) { - a[r++] = i << 4; - i = -1; - } - this.firstDigit = i; - this.bufferLength = r; - } - } - t.AsciiHexStream = AsciiHexStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.CCITTFaxStream = void 0; - var r = a(21), - i = a(18), - n = a(4); - class CCITTFaxStream extends i.DecodeStream { - constructor(e, t, a) { - super(t); - this.str = e; - this.dict = e.dict; - a instanceof n.Dict || (a = n.Dict.empty); - const i = { next: () => e.getByte() }; - this.ccittFaxDecoder = new r.CCITTFaxDecoder(i, { - 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 i = -1, - n = [ - [-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 n, 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] < a; ++c) e[c] = t[c]; - e[c++] = a; - e[c] = a; - t[0] = 0; - this.codingPos = 0; - n = 0; - s = 0; - for (; t[this.codingPos] < a; ) { - o = this._getTwoDimCode(); - switch (o) { - case 0: - this._addPixels(e[n + 1], s); - e[n + 1] < a && (n += 2); - break; - case 1: - o = l = 0; - if (s) { - do { - o += h = this._getBlackCode(); - } while (h >= 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] < a && this._addPixels(t[this.codingPos] + l, 1 ^ s); - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - break; - case 7: - this._addPixels(e[n] + 3, s); - s ^= 1; - if (t[this.codingPos] < a) { - ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 5: - this._addPixels(e[n] + 2, s); - s ^= 1; - if (t[this.codingPos] < a) { - ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 3: - this._addPixels(e[n] + 1, s); - s ^= 1; - if (t[this.codingPos] < a) { - ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 2: - this._addPixels(e[n], s); - s ^= 1; - if (t[this.codingPos] < a) { - ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 8: - this._addPixelsNeg(e[n] - 3, s); - s ^= 1; - if (t[this.codingPos] < a) { - n > 0 ? --n : ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 6: - this._addPixelsNeg(e[n] - 2, s); - s ^= 1; - if (t[this.codingPos] < a) { - n > 0 ? --n : ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case 4: - this._addPixelsNeg(e[n] - 1, s); - s ^= 1; - if (t[this.codingPos] < a) { - n > 0 ? --n : ++n; - for (; e[n] <= t[this.codingPos] && e[n] < a; ) n += 2; - } - break; - case i: - this._addPixels(a, 0); - this.eof = !0; - break; - default: - (0, r.info)('bad 2d code'); - this._addPixels(a, 0); - this.err = !0; - } - } - } else { - t[0] = 0; - this.codingPos = 0; - s = 0; - for (; t[this.codingPos] < a; ) { - o = 0; - if (s) - do { - o += h = this._getBlackCode(); - } while (h >= 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 !== i && 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 === i && (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 === i) { - 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] < a) { - this.codingPos++; - this.outputBits = t[this.codingPos] - t[this.codingPos - 1]; - } - } else { - o = 8; - l = 0; - do { - if ('number' != typeof this.outputBits) - throw new r.FormatError( - 'Invalid /CCITTFaxDecode data, "outputBits" must be a number.', - ); - if (this.outputBits > 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] < a) { - this.codingPos++; - this.outputBits = t[this.codingPos] - t[this.codingPos - 1]; - } else if (o > 0) { - l <<= o; - o = 0; - } - } - } while (o); - } - this.black && (l ^= 255); - return l; - } - _addPixels(e, t) { - const a = this.codingLine; - let i = this.codingPos; - if (e > a[i]) { - if (e > this.columns) { - (0, r.info)('row is wrong length'); - this.err = !0; - e = this.columns; - } - (1 & i) ^ t && ++i; - a[i] = e; - } - this.codingPos = i; - } - _addPixelsNeg(e, t) { - const a = this.codingLine; - let i = this.codingPos; - if (e > a[i]) { - if (e > this.columns) { - (0, r.info)('row is wrong length'); - this.err = !0; - e = this.columns; - } - (1 & i) ^ t && ++i; - a[i] = e; - } else if (e < a[i]) { - if (e < 0) { - (0, r.info)('invalid code'); - this.err = !0; - e = 0; - } - for (; i > 0 && e < a[i - 1]; ) --i; - a[i] = e; - } - this.codingPos = i; - } - _findTableCode(e, t, a, r) { - const n = r || 0; - for (let r = e; r <= t; ++r) { - let e = this._lookBits(r); - if (e === i) return [!0, 1, !1]; - r < t && (e <<= t - r); - if (!n || e >= n) { - const t = a[e - n]; - 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 = n[t]; - if (e && e[0] > 0) { - this._eatBits(e[0]); - return e[1]; - } - } else { - const e = this._findTableCode(1, 7, n); - if (e[0] && e[2]) return e[1]; - } - (0, r.info)('Bad two dim code'); - return i; - } - _getWhiteCode() { - let e, - t = 0; - if (this.eoblock) { - t = this._lookBits(12); - if (t === i) 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 === i) 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 < e; ) { - if (-1 === (t = this.source.next())) - return 0 === this.inputBits - ? i - : (this.inputBuf << (e - this.inputBits)) & (65535 >> (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(18), - i = a(2); - const n = 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 i.FormatError(`Invalid header in flate stream: ${a}, ${r}`); - if (8 != (15 & a)) - throw new i.FormatError(`Unknown compression method in flate stream: ${a}, ${r}`); - if (((a << 8) + r) % 31 != 0) - throw new i.FormatError(`Bad FCHECK in flate stream: ${a}, ${r}`); - if (32 & r) throw new i.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, - n = this.codeBuf; - for (; r < e; ) { - if (-1 === (a = t.getByte())) - throw new i.FormatError('Bad encoding in flate stream'); - n |= a << r; - r += 8; - } - a = n & ((1 << e) - 1); - this.codeBuf = n >> e; - this.codeSize = r -= e; - return a; - } - getCode(e) { - const t = this.str, - a = e[0], - r = e[1]; - let n, - s = this.codeSize, - o = this.codeBuf; - for (; s < r && -1 !== (n = t.getByte()); ) { - o |= n << s; - s += 8; - } - const c = a[o & ((1 << r) - 1)], - l = c >> 16, - h = 65535 & c; - if (l < 1 || s < l) throw new i.FormatError('Bad encoding in flate stream'); - this.codeBuf = o >> l; - this.codeSize = s - l; - return h; - } - generateHuffmanTable(e) { - const t = e.length; - let a, - r = 0; - for (a = 0; a < t; ++a) e[a] > r && (r = e[a]); - const i = 1 << r, - n = new Int32Array(i); - for (let s = 1, o = 0, c = 2; s <= r; ++s, o <<= 1, c <<= 1) - for (let r = 0; r < t; ++r) - if (e[r] === s) { - let e = 0, - t = o; - for (a = 0; a < s; ++a) { - e = (e << 1) | (1 & t); - t >>= 1; - } - for (a = e; a < i; a += c) n[a] = (s << 16) | r; - ++o; - } - return [n, r]; - } - readBlock() { - let e, t; - const a = this.str; - let r, - h, - u = this.getBits(3); - 1 & u && (this.eof = !0); - u >>= 1; - if (0 === u) { - let t; - if (-1 === (t = a.getByte())) - throw new i.FormatError('Bad block header in flate stream'); - let r = t; - if (-1 === (t = a.getByte())) - throw new i.FormatError('Bad block header in flate stream'); - r |= t << 8; - if (-1 === (t = a.getByte())) - throw new i.FormatError('Bad block header in flate stream'); - let n = t; - if (-1 === (t = a.getByte())) - throw new i.FormatError('Bad block header in flate stream'); - n |= t << 8; - if (n !== (65535 & ~r) && (0 !== r || 0 !== n)) - throw new i.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.length < r && (this.eof = !0); - } - return; - } - if (1 === u) { - r = c; - h = l; - } else { - if (2 !== u) throw new i.FormatError('Unknown block type in flate stream'); - { - const e = this.getBits(5) + 257, - a = this.getBits(5) + 1, - i = this.getBits(4) + 4, - s = new Uint8Array(n.length); - let o; - for (o = 0; o < i; ++o) s[n[o]] = this.getBits(3); - const c = this.generateHuffmanTable(s); - t = 0; - o = 0; - const l = e + a, - u = new Uint8Array(l); - let d, f, g; - for (; o < l; ) { - const e = this.getCode(c); - if (16 === e) { - d = 2; - f = 3; - g = t; - } else if (17 === e) { - d = 3; - f = 3; - g = t = 0; - } else { - if (18 !== e) { - u[o++] = t = e; - continue; - } - d = 7; - f = 11; - g = t = 0; - } - let a = this.getBits(d) + f; - for (; a-- > 0; ) 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 i = a >> 16; - i > 0 && (i = this.getBits(i)); - t = (65535 & a) + i; - a = this.getCode(h); - a = o[a]; - i = a >> 16; - i > 0 && (i = this.getBits(i)); - const n = (65535 & a) + i; - if (f + t >= d) { - e = this.ensureBuffer(f + t); - d = e.length; - } - for (let a = 0; a < t; ++a, ++f) e[f] = e[f - n]; - } - } - } - t.FlateStream = FlateStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Jbig2Stream = void 0; - var r = a(5), - i = a(18), - n = a(4), - s = a(24), - o = a(2); - class Jbig2Stream extends i.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 n.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), - i = a.length; - for (let e = 0; e < i; e++) a[e] ^= 255; - this.buffer = a; - this.bufferLength = i; - this.eof = !0; - } - } - t.Jbig2Stream = Jbig2Stream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Jbig2Image = void 0; - var r = a(2), - i = a(3), - n = a(25), - s = a(21); - 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 n.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); - } - } - const o = 2 ** 31 - 1, - c = -(2 ** 31); - function decodeInteger(e, t, a) { - const r = e.getContexts(t); - let i = 1; - function readBits(e) { - let t = 0; - for (let n = 0; n < e; n++) { - const e = a.readBit(r, i); - i = i < 256 ? (i << 1) | e : (511 & ((i << 1) | e)) | 256; - t = (t << 1) | e; - } - return t >>> 0; - } - const n = 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); - let l; - 0 === n ? (l = s) : s > 0 && (l = -s); - return l >= c && l <= o ? l : null; - } - function decodeIAID(e, t, a) { - const r = e.getContexts('IAID'); - let i = 1; - for (let e = 0; e < a; e++) { - i = (i << 1) | t.readBit(r, i); - } - return a < 31 ? i & ((1 << a) - 1) : 2147483647 & i; - } - const l = [ - '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', - ], - h = [ - [ - { 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 }, - ], - ], - u = [ - { - 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 }, - ], - }, - ], - d = [39717, 1941, 229, 405], - f = [32, 8]; - function decodeBitmap(e, t, a, r, i, n, s, o) { - if (e) { - return decodeMMRBitmap(new Reader(o.data, o.start, o.end), t, a, !1); - } - if ( - 0 === r && - !n && - !i && - 4 === s.length && - 3 === s[0].x && - -1 === s[0].y && - -3 === s[1].x && - -1 === s[1].y && - 2 === s[2].x && - -2 === s[2].y && - -2 === s[3].x && - -2 === s[3].y - ) - return (function decodeBitmapTemplate0(e, t, a) { - const r = a.decoder, - i = a.contextCache.getContexts('GB'), - n = []; - let s, o, c, l, h, u, d; - for (o = 0; o < t; o++) { - h = n[o] = new Uint8Array(e); - u = o < 1 ? h : n[o - 1]; - d = o < 2 ? h : n[o - 2]; - s = - (d[0] << 13) | - (d[1] << 12) | - (d[2] << 11) | - (u[0] << 7) | - (u[1] << 6) | - (u[2] << 5) | - (u[3] << 4); - for (c = 0; c < e; c++) { - h[c] = l = r.readBit(i, s); - s = - ((31735 & s) << 1) | - (c + 3 < e ? d[c + 3] << 11 : 0) | - (c + 4 < e ? u[c + 4] << 4 : 0) | - l; - } - } - return n; - })(t, a, o); - const c = !!n, - l = h[r].concat(s); - l.sort(function (e, t) { - return e.y - t.y || e.x - t.x; - }); - const u = l.length, - f = new Int8Array(u), - g = new Int8Array(u), - p = []; - let m, - b, - y = 0, - w = 0, - S = 0, - x = 0; - for (b = 0; b < u; b++) { - f[b] = l[b].x; - g[b] = l[b].y; - w = Math.min(w, l[b].x); - S = Math.max(S, l[b].x); - x = Math.min(x, l[b].y); - b < u - 1 && l[b].y === l[b + 1].y && l[b].x === l[b + 1].x - 1 - ? (y |= 1 << (u - 1 - b)) - : p.push(b); - } - const C = p.length, - k = new Int8Array(C), - v = new Int8Array(C), - F = new Uint16Array(C); - for (m = 0; m < C; m++) { - b = p[m]; - k[m] = l[b].x; - v[m] = l[b].y; - F[m] = 1 << (u - 1 - b); - } - const O = -w, - T = -x, - M = t - S, - E = d[r]; - let D = new Uint8Array(t); - const N = [], - R = o.decoder, - L = o.contextCache.getContexts('GB'); - let _, - $, - j, - U, - X, - H = 0, - q = 0; - for (let e = 0; e < a; e++) { - if (i) { - H ^= R.readBit(L, E); - if (H) { - N.push(D); - continue; - } - } - D = new Uint8Array(D); - N.push(D); - for (_ = 0; _ < t; _++) { - if (c && n[e][_]) { - D[_] = 0; - continue; - } - if (_ >= O && _ < M && e >= T) { - q = (q << 1) & y; - for (b = 0; b < C; b++) { - $ = e + v[b]; - j = _ + k[b]; - U = N[$][j]; - if (U) { - U = F[b]; - q |= U; - } - } - } else { - q = 0; - X = u - 1; - for (b = 0; b < u; b++, X--) { - j = _ + f[b]; - if (j >= 0 && j < t) { - $ = e + g[b]; - if ($ >= 0) { - U = N[$][j]; - U && (q |= U << X); - } - } - } - } - const a = R.readBit(L, q); - D[_] = a; - } - } - return N; - } - function decodeRefinement(e, t, a, r, i, n, s, o, c) { - let l = u[a].coding; - 0 === a && (l = l.concat([o[0]])); - const h = l.length, - d = new Int32Array(h), - g = new Int32Array(h); - let p; - for (p = 0; p < h; p++) { - d[p] = l[p].x; - g[p] = l[p].y; - } - let m = u[a].reference; - 0 === a && (m = m.concat([o[1]])); - const b = m.length, - y = new Int32Array(b), - w = new Int32Array(b); - for (p = 0; p < b; p++) { - y[p] = m[p].x; - w[p] = m[p].y; - } - const S = r[0].length, - x = r.length, - C = f[a], - k = [], - v = c.decoder, - F = c.contextCache.getContexts('GR'); - let O = 0; - for (let a = 0; a < t; a++) { - if (s) { - O ^= v.readBit(F, C); - if (O) throw new Jbig2Error('prediction is not supported'); - } - const t = new Uint8Array(e); - k.push(t); - for (let s = 0; s < e; s++) { - let o, - c, - l = 0; - for (p = 0; p < h; p++) { - o = a + g[p]; - c = s + d[p]; - o < 0 || c < 0 || c >= e ? (l <<= 1) : (l = (l << 1) | k[o][c]); - } - for (p = 0; p < b; p++) { - o = a + w[p] - n; - c = s + y[p] - i; - o < 0 || o >= x || c < 0 || c >= S ? (l <<= 1) : (l = (l << 1) | r[o][c]); - } - const u = v.readBit(F, l); - t[s] = u; - } - } - return k; - } - function decodeTextRegion(e, t, a, r, i, n, 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; S < r; S++) { - x = new Uint8Array(a); - if (i) for (let e = 0; e < a; e++) x[e] = i; - w.push(x); - } - const C = m.decoder, - k = m.contextCache; - let v = e ? -f.tableDeltaT.decode(y) : -decodeInteger(k, 'IADT', C), - F = 0; - S = 0; - for (; S < n; ) { - v += e ? f.tableDeltaT.decode(y) : decodeInteger(k, 'IADT', C); - F += e ? f.tableFirstS.decode(y) : decodeInteger(k, 'IAFS', C); - let r = F; - for (;;) { - let i = 0; - s > 1 && (i = e ? y.readBits(b) : decodeInteger(k, 'IAIT', C)); - const n = s * v + i, - F = e ? f.symbolIDTable.decode(y) : decodeIAID(k, C, c), - O = t && (e ? y.readBit() : decodeInteger(k, 'IARI', C)); - let T = o[F], - M = T[0].length, - E = T.length; - if (O) { - const e = decodeInteger(k, 'IARDW', C), - t = decodeInteger(k, 'IARDH', C); - M += e; - E += t; - T = decodeRefinement( - M, - E, - g, - T, - (e >> 1) + decodeInteger(k, 'IARDX', C), - (t >> 1) + decodeInteger(k, 'IARDY', C), - !1, - p, - m, - ); - } - const D = n - (1 & u ? 0 : E - 1), - N = r - (2 & u ? M - 1 : 0); - let R, L, _; - if (l) { - for (R = 0; R < E; R++) { - x = w[N + R]; - if (!x) continue; - _ = T[R]; - const e = Math.min(a - D, M); - switch (d) { - case 0: - for (L = 0; L < e; L++) x[D + L] |= _[L]; - break; - case 2: - for (L = 0; L < e; L++) x[D + L] ^= _[L]; - break; - default: - throw new Jbig2Error(`operator ${d} is not supported`); - } - } - r += E - 1; - } else { - for (L = 0; L < E; L++) { - x = w[D + L]; - if (x) { - _ = T[L]; - switch (d) { - case 0: - for (R = 0; R < M; R++) x[N + R] |= _[R]; - break; - case 2: - for (R = 0; R < M; R++) x[N + R] ^= _[R]; - break; - default: - throw new Jbig2Error(`operator ${d} is not supported`); - } - } - } - r += M - 1; - } - S++; - const $ = e ? f.tableDeltaS.decode(y) : decodeInteger(k, 'IADS', C); - if (null === $) break; - r += $ + h; - } - } - return w; - } - function readSegmentHeader(e, t) { - const a = {}; - a.number = (0, i.readUint32)(e, t); - const r = e[t + 4], - n = 63 & r; - if (!l[n]) throw new Jbig2Error('invalid segment type: ' + n); - a.type = n; - a.typeName = l[n]; - a.deferredNonRetain = !!(128 & r); - const s = !!(64 & r), - o = e[t + 5]; - let c = (o >> 5) & 7; - const h = [31 & o]; - let u = t + 6; - if (7 === o) { - c = 536870911 & (0, i.readUint32)(e, u - 1); - u += 3; - let t = (c + 7) >> 3; - h[0] = e[u++]; - for (; --t > 0; ) h.push(e[u++]); - } else if (5 === o || 6 === o) throw new Jbig2Error('invalid referred-to flags'); - a.retainBits = h; - let d = 4; - a.number <= 256 ? (d = 1) : a.number <= 65536 && (d = 2); - const f = []; - let p, m; - for (p = 0; p < c; p++) { - let t; - t = 1 === d ? e[u] : 2 === d ? (0, i.readUint16)(e, u) : (0, i.readUint32)(e, u); - f.push(t); - u += d; - } - a.referredTo = f; - if (s) { - a.pageAssociation = (0, i.readUint32)(e, u); - u += 4; - } else a.pageAssociation = e[u++]; - a.length = (0, i.readUint32)(e, u); - u += 4; - if (4294967295 === a.length) { - if (38 !== n) throw new Jbig2Error('invalid unknown segment length'); - { - const t = readRegionSegmentInformation(e, u), - r = !!(1 & e[u + g]), - i = 6, - n = new Uint8Array(i); - if (!r) { - n[0] = 255; - n[1] = 172; - } - n[2] = (t.height >>> 24) & 255; - n[3] = (t.height >> 16) & 255; - n[4] = (t.height >> 8) & 255; - n[5] = 255 & t.height; - for (p = u, m = e.length; p < m; p++) { - let t = 0; - for (; t < i && n[t] === e[p + t]; ) t++; - if (t === i) { - a.length = p + i; - break; - } - } - if (4294967295 === a.length) throw new Jbig2Error('segment end was not found'); - } - } - a.headerEnd = u; - return a; - } - function readSegments(e, t, a, r) { - const i = []; - let n = a; - for (; n < r; ) { - const a = readSegmentHeader(t, n); - n = a.headerEnd; - const r = { header: a, data: t }; - if (!e.randomAccess) { - r.start = n; - n += a.length; - r.end = n; - } - i.push(r); - if (51 === a.type) break; - } - if (e.randomAccess) - for (let e = 0, t = i.length; e < t; e++) { - i[e].start = n; - n += i[e].header.length; - i[e].end = n; - } - return i; - } - function readRegionSegmentInformation(e, t) { - return { - width: (0, i.readUint32)(e, t), - height: (0, i.readUint32)(e, t + 4), - x: (0, i.readUint32)(e, t + 8), - y: (0, i.readUint32)(e, t + 12), - combinationOperator: 7 & e[t + 16], - }; - } - const g = 17; - function processSegment(e, t) { - const a = e.header, - r = e.data, - n = e.end; - let s, - o, - c, - l, - h = e.start; - switch (a.type) { - case 0: - const e = {}, - t = (0, i.readUint16)(r, h); - e.huffman = !!(1 & t); - e.refinement = !!(2 & t); - e.huffmanDHSelector = (t >> 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 < l; c++) { - o.push({ x: (0, i.readInt8)(r, h), y: (0, i.readInt8)(r, h + 1) }); - h += 2; - } - e.at = o; - } - if (e.refinement && !e.refinementTemplate) { - o = []; - for (c = 0; c < 2; c++) { - o.push({ x: (0, i.readInt8)(r, h), y: (0, i.readInt8)(r, h + 1) }); - h += 2; - } - e.refinementAt = o; - } - e.numberOfExportedSymbols = (0, i.readUint32)(r, h); - h += 4; - e.numberOfNewSymbols = (0, i.readUint32)(r, h); - h += 4; - s = [e, a.number, a.referredTo, r, h, n]; - break; - case 6: - case 7: - const u = {}; - u.info = readRegionSegmentInformation(r, h); - h += g; - const d = (0, i.readUint16)(r, h); - h += 2; - u.huffman = !!(1 & d); - u.refinement = !!(2 & d); - u.logStripSize = (d >> 2) & 3; - u.stripSize = 1 << u.logStripSize; - u.referenceCorner = (d >> 4) & 3; - u.transposed = !!(64 & d); - u.combinationOperator = (d >> 7) & 3; - u.defaultPixelValue = (d >> 9) & 1; - u.dsOffset = (d << 17) >> 27; - u.refinementTemplate = (d >> 15) & 1; - if (u.huffman) { - const e = (0, i.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, i.readInt8)(r, h), y: (0, i.readInt8)(r, h + 1) }); - h += 2; - } - u.refinementAt = o; - } - u.numberOfSymbolInstances = (0, i.readUint32)(r, h); - h += 4; - s = [u, a.referredTo, r, h, n]; - break; - case 16: - const f = {}, - p = r[h++]; - f.mmr = !!(1 & p); - f.template = (p >> 1) & 3; - f.patternWidth = r[h++]; - f.patternHeight = r[h++]; - f.maxPatternIndex = (0, i.readUint32)(r, h); - h += 4; - s = [f, a.number, r, h, n]; - break; - case 22: - case 23: - const m = {}; - m.info = readRegionSegmentInformation(r, h); - h += g; - 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, i.readUint32)(r, h); - h += 4; - m.gridHeight = (0, i.readUint32)(r, h); - h += 4; - m.gridOffsetX = 4294967295 & (0, i.readUint32)(r, h); - h += 4; - m.gridOffsetY = 4294967295 & (0, i.readUint32)(r, h); - h += 4; - m.gridVectorX = (0, i.readUint16)(r, h); - h += 2; - m.gridVectorY = (0, i.readUint16)(r, h); - h += 2; - s = [m, a.referredTo, r, h, n]; - break; - case 38: - case 39: - const y = {}; - y.info = readRegionSegmentInformation(r, h); - h += g; - 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 < l; c++) { - o.push({ x: (0, i.readInt8)(r, h), y: (0, i.readInt8)(r, h + 1) }); - h += 2; - } - y.at = o; - } - s = [y, r, h, n]; - break; - case 48: - const S = { - width: (0, i.readUint32)(r, h), - height: (0, i.readUint32)(r, h + 4), - resolutionX: (0, i.readUint32)(r, h + 8), - resolutionY: (0, i.readUint32)(r, h + 12), - }; - 4294967295 === S.height && delete S.height; - const x = r[h + 16]; - (0, i.readUint16)(r, h + 17); - S.lossless = !!(1 & x); - S.refinement = !!(2 & x); - S.defaultPixelValue = (x >> 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, n]; - 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 < r; a++) processSegment(e[a], t); - } - class SimpleSegmentVisitor { - onPageInformation(e) { - this.currentPageInfo = e; - const t = (e.width + 7) >> 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, - i = e.height, - n = (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 * n + (e.x >> 3); - switch (s) { - case 0: - for (l = 0; l < i; l++) { - u = c; - d = f; - for (h = 0; h < r; h++) { - t[l][h] && (o[d] |= u); - u >>= 1; - if (!u) { - u = 128; - d++; - } - } - f += n; - } - break; - case 2: - for (l = 0; l < i; l++) { - u = c; - d = f; - for (h = 0; h < r; h++) { - t[l][h] && (o[d] ^= u); - u >>= 1; - if (!u) { - u = 128; - d++; - } - } - f += n; - } - break; - default: - throw new Jbig2Error(`operator ${s} is not supported`); - } - } - onImmediateGenericRegion(e, t, a, r) { - const i = e.info, - n = new DecodingContext(t, a, r), - s = decodeBitmap(e.mmr, i.width, i.height, e.template, e.prediction, null, e.at, n); - this.drawBitmap(i, s); - } - onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion(...arguments); - } - onSymbolDictionary(e, t, a, r, n, s) { - let o, c; - if (e.huffman) { - o = (function getSymbolDictionaryHuffmanTables(e, t, a) { - let r, - i, - n, - 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: - i = getStandardTable(e.huffmanDWSelector + 2); - break; - case 3: - i = getCustomHuffmanTable(o, t, a); - o++; - break; - default: - throw new Jbig2Error('invalid Huffman DW selector'); - } - if (e.bitmapSizeSelector) { - n = getCustomHuffmanTable(o, t, a); - o++; - } else n = getStandardTable(1); - s = e.aggregationInstancesSelector - ? getCustomHuffmanTable(o, t, a) - : getStandardTable(1); - return { - tableDeltaHeight: r, - tableDeltaWidth: i, - tableBitmapSize: n, - tableAggregateInstances: s, - }; - })(e, a, this.customTables); - c = new Reader(r, n, 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, n, s); - l[t] = (function decodeSymbolDictionary(e, t, a, r, n, 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, i.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.length < r; ) { - g += e ? s.tableDeltaHeight.decode(d) : decodeInteger(b, 'IADH', m); - let r = 0, - i = 0; - const n = e ? w.length : 0; - for (;;) { - const n = e ? s.tableDeltaWidth.decode(d) : decodeInteger(b, 'IADW', m); - if (null === n) break; - r += n; - i += r; - let y; - if (t) { - const i = decodeInteger(b, 'IAAI', m); - if (i > 1) - y = decodeTextRegion( - e, - t, - r, - g, - 0, - i, - 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), - i = decodeInteger(b, 'IARDY', m); - y = decodeRefinement( - r, - g, - l, - e < a.length ? a[e] : f[e - a.length], - t, - i, - !1, - h, - u, - ); - } - f.push(y); - } else if (e) w.push(r); - else { - y = decodeBitmap(!1, r, g, o, !1, null, c, u); - f.push(y); - } - } - if (e && !t) { - const e = s.tableBitmapSize.decode(d); - d.byteAlign(); - let t; - if (0 === e) t = readUncompressedBitmap(d, i, g); - else { - const a = d.end, - r = d.position + e; - d.end = r; - t = decodeMMRBitmap(d, i, g, !1); - d.end = a; - d.position = r; - } - const a = w.length; - if (n === a - 1) f.push(t); - else { - let e, - r, - i, - s, - o, - c = 0; - for (e = n; e < a; e++) { - s = w[e]; - i = c + s; - o = []; - for (r = 0; r < g; r++) o.push(t[r].subarray(c, i)); - f.push(o); - c = i; - } - } - } - } - const S = [], - x = []; - let C, - k, - v = !1; - const F = a.length + r; - for (; x.length < F; ) { - let t = e ? y.decode(d) : decodeInteger(b, 'IAEX', m); - for (; t--; ) x.push(v); - v = !v; - } - for (C = 0, k = a.length; C < k; C++) x[C] && S.push(a[C]); - for (let e = 0; e < r; C++, e++) x[C] && S.push(f[e]); - return S; - })( - e.huffman, - e.refinement, - h, - e.numberOfNewSymbols, - e.numberOfExportedSymbols, - o, - e.template, - e.at, - e.refinementTemplate, - e.refinementAt, - u, - c, - ); - } - onImmediateTextRegion(e, t, a, r, n) { - const s = e.info; - let o, c; - const l = this.symbols, - h = []; - for (const e of t) { - const t = l[e]; - t && h.push(...t); - } - const u = (0, i.log2)(h.length); - if (e.huffman) { - c = new Reader(a, r, n); - o = (function getTextRegionHuffmanTables(e, t, a, r, i) { - const n = []; - for (let e = 0; e <= 34; e++) { - const t = i.readBits(4); - n.push(new HuffmanLine([e, t, 0, 0])); - } - const s = new HuffmanTable(n, !1); - n.length = 0; - for (let e = 0; e < r; ) { - const t = s.decode(i); - if (t >= 32) { - let a, r, s; - switch (t) { - case 32: - if (0 === e) throw new Jbig2Error('no previous value in symbol ID table'); - r = i.readBits(2) + 3; - a = n[e - 1].prefixLength; - break; - case 33: - r = i.readBits(3) + 3; - a = 0; - break; - case 34: - r = i.readBits(7) + 11; - a = 0; - break; - default: - throw new Jbig2Error('invalid code length in symbol ID table'); - } - for (s = 0; s < r; s++) { - n.push(new HuffmanLine([e, a, 0, 0])); - e++; - } - } else { - n.push(new HuffmanLine([e, t, 0, 0])); - e++; - } - } - i.byteAlign(); - const o = new HuffmanTable(n, !1); - let c, - l, - h, - u = 0; - switch (e.huffmanFS) { - case 0: - case 1: - c = getStandardTable(e.huffmanFS + 6); - break; - case 3: - c = getCustomHuffmanTable(u, t, a); - u++; - break; - default: - throw new Jbig2Error('invalid Huffman FS selector'); - } - switch (e.huffmanDS) { - case 0: - case 1: - case 2: - l = getStandardTable(e.huffmanDS + 8); - break; - case 3: - l = getCustomHuffmanTable(u, t, a); - u++; - break; - default: - throw new Jbig2Error('invalid Huffman DS selector'); - } - switch (e.huffmanDT) { - case 0: - case 1: - case 2: - h = getStandardTable(e.huffmanDT + 11); - break; - case 3: - h = getCustomHuffmanTable(u, t, a); - u++; - break; - default: - throw new Jbig2Error('invalid Huffman DT selector'); - } - if (e.refinement) - throw new Jbig2Error('refinement with Huffman is not supported'); - return { symbolIDTable: o, tableFirstS: c, tableDeltaS: l, tableDeltaT: h }; - })(e, t, this.customTables, h.length, c); - } - const d = new DecodingContext(a, r, n), - f = decodeTextRegion( - e.huffman, - e.refinement, - s.width, - s.height, - e.defaultPixelValue, - e.numberOfSymbolInstances, - e.stripSize, - h, - u, - e.transposed, - e.dsOffset, - e.referenceCorner, - e.combinationOperator, - o, - e.refinementTemplate, - e.refinementAt, - d, - e.logStripSize, - c, - ); - this.drawBitmap(s, f); - } - onImmediateLosslessTextRegion() { - this.onImmediateTextRegion(...arguments); - } - onPatternDictionary(e, t, a, r, i) { - let n = this.patterns; - n || (this.patterns = n = {}); - const s = new DecodingContext(a, r, i); - n[t] = (function decodePatternDictionary(e, t, a, r, i, n) { - const s = []; - if (!e) { - s.push({ x: -t, y: 0 }); - 0 === i && s.push({ x: -3, y: -1 }, { x: 2, y: -2 }, { x: -2, y: -2 }); - } - const o = decodeBitmap(e, (r + 1) * t, a, i, !1, null, s, n), - c = []; - for (let e = 0; e <= r; e++) { - const r = [], - i = t * e, - n = i + t; - for (let e = 0; e < a; e++) r.push(o[e].subarray(i, n)); - c.push(r); - } - return c; - })(e.mmr, e.patternWidth, e.patternHeight, e.maxPatternIndex, e.template, s); - } - onImmediateHalftoneRegion(e, t, a, r, n) { - const s = this.patterns[t[0]], - o = e.info, - c = new DecodingContext(a, r, n), - l = (function decodeHalftoneRegion(e, t, a, r, n, s, o, c, l, h, u, d, f, g, p) { - if (o) throw new Jbig2Error('skip is not supported'); - if (0 !== c) - throw new Jbig2Error(`operator "${c}" is not supported in halftone region`); - const m = []; - let b, y, w; - for (b = 0; b < n; b++) { - w = new Uint8Array(r); - if (s) for (y = 0; y < r; y++) w[y] = s; - m.push(w); - } - const S = t.length, - x = t[0], - C = x[0].length, - k = x.length, - v = (0, i.log2)(S), - F = []; - if (!e) { - F.push({ x: a <= 1 ? 3 : 2, y: -1 }); - 0 === a && F.push({ x: -3, y: -1 }, { x: 2, y: -2 }, { x: -2, y: -2 }); - } - const O = []; - let T, M, E, D, N, R, L, _, $, j, U; - e && (T = new Reader(p.data, p.start, p.end)); - for (b = v - 1; b >= 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 < h; E++) - for (D = 0; D < l; D++) { - N = 0; - R = 0; - for (y = v - 1; y >= 0; y--) { - N ^= O[y][E][D]; - R |= N << y; - } - L = t[R]; - _ = (u + E * g + D * f) >> 8; - $ = (d + E * f - D * g) >> 8; - if (_ >= 0 && _ + C <= r && $ >= 0 && $ + k <= n) - for (b = 0; b < k; b++) { - U = m[$ + b]; - j = L[b]; - for (y = 0; y < C; y++) U[_ + y] |= j[y]; - } - else { - let e, t; - for (b = 0; b < k; b++) { - t = $ + b; - if (!(t < 0 || t >= n)) { - U = m[t]; - j = L[b]; - for (y = 0; y < C; y++) { - e = _ + y; - e >= 0 && e < r && (U[e] |= j[y]); - } - } - } - } - } - return m; - })( - e.mmr, - s, - e.template, - o.width, - o.height, - e.defaultPixelValue, - e.enableSkip, - e.combinationOperator, - e.gridWidth, - e.gridHeight, - e.gridOffsetX, - e.gridOffsetY, - e.gridVectorX, - e.gridVectorY, - c, - ); - this.drawBitmap(o, l); - } - onImmediateLosslessHalftoneRegion() { - this.onImmediateHalftoneRegion(...arguments); - } - onTables(e, t, a, r) { - let n = this.customTables; - n || (this.customTables = n = {}); - n[e] = (function decodeTablesSegment(e, t, a) { - const r = e[t], - n = 4294967295 & (0, i.readUint32)(e, t + 1), - s = 4294967295 & (0, i.readUint32)(e, t + 5), - o = new Reader(e, t + 9, a), - c = 1 + ((r >> 1) & 7), - l = 1 + ((r >> 4) & 7), - h = []; - let u, - d, - f = n; - do { - u = o.readBits(c); - d = o.readBits(l); - h.push(new HuffmanLine([f, u, d, 0])); - f += 1 << d; - } while (f < s); - u = o.readBits(c); - h.push(new HuffmanLine([n - 1, u, 32, 0, 'lower'])); - u = o.readBits(c); - h.push(new HuffmanLine([s, u, 32, 0])); - if (1 & r) { - u = o.readBits(c); - h.push(new HuffmanLine([u, 0])); - } - return new HuffmanTable(h, !1); - })(t, a, r); - } - } - class HuffmanLine { - constructor(e) { - if (2 === e.length) { - this.isOOB = !0; - this.rangeLow = 0; - this.prefixLength = e[0]; - this.rangeLength = 0; - this.prefixCode = e[1]; - this.isLowerRange = !1; - } else { - this.isOOB = !1; - this.rangeLow = e[0]; - this.prefixLength = e[1]; - this.rangeLength = e[2]; - this.prefixCode = e[3]; - this.isLowerRange = 'lower' === e[4]; - } - } - } - class HuffmanTreeNode { - constructor(e) { - this.children = []; - if (e) { - this.isLeaf = !0; - this.rangeLength = e.rangeLength; - this.rangeLow = e.rangeLow; - this.isLowerRange = e.isLowerRange; - this.isOOB = e.isOOB; - } else this.isLeaf = !1; - } - buildTree(e, t) { - const a = (e.prefixCode >> 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; t < a; t++) { - const a = e[t]; - a.prefixLength > 0 && 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 < t; r++) a = Math.max(a, e[r].prefixLength); - const r = new Uint32Array(a + 1); - for (let a = 0; a < t; a++) r[e[a].prefixLength]++; - let i, - n, - s, - o = 1, - c = 0; - r[0] = 0; - for (; o <= a; ) { - c = (c + r[o - 1]) << 1; - i = c; - n = 0; - for (; n < t; ) { - s = e[n]; - if (s.prefixLength === o) { - s.prefixCode = i; - i++; - } - n++; - } - o++; - } - } - } - const p = {}; - function getStandardTable(e) { - let t, - a = p[e]; - if (a) return a; - switch (e) { - case 1: - t = [ - [0, 1, 4, 0], - [16, 2, 8, 2], - [272, 3, 16, 6], - [65808, 3, 32, 7], - ]; - break; - case 2: - t = [ - [0, 1, 0, 0], - [1, 2, 0, 2], - [2, 3, 0, 6], - [3, 4, 3, 14], - [11, 5, 6, 30], - [75, 6, 32, 62], - [6, 63], - ]; - break; - case 3: - t = [ - [-256, 8, 8, 254], - [0, 1, 0, 0], - [1, 2, 0, 2], - [2, 3, 0, 6], - [3, 4, 3, 14], - [11, 5, 6, 30], - [-257, 8, 32, 255, 'lower'], - [75, 7, 32, 126], - [6, 62], - ]; - break; - case 4: - t = [ - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 0, 6], - [4, 4, 3, 14], - [12, 5, 6, 30], - [76, 5, 32, 31], - ]; - break; - case 5: - t = [ - [-255, 7, 8, 126], - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 0, 6], - [4, 4, 3, 14], - [12, 5, 6, 30], - [-256, 7, 32, 127, 'lower'], - [76, 6, 32, 62], - ]; - break; - case 6: - t = [ - [-2048, 5, 10, 28], - [-1024, 4, 9, 8], - [-512, 4, 8, 9], - [-256, 4, 7, 10], - [-128, 5, 6, 29], - [-64, 5, 5, 30], - [-32, 4, 5, 11], - [0, 2, 7, 0], - [128, 3, 7, 2], - [256, 3, 8, 3], - [512, 4, 9, 12], - [1024, 4, 10, 13], - [-2049, 6, 32, 62, 'lower'], - [2048, 6, 32, 63], - ]; - break; - case 7: - t = [ - [-1024, 4, 9, 8], - [-512, 3, 8, 0], - [-256, 4, 7, 9], - [-128, 5, 6, 26], - [-64, 5, 5, 27], - [-32, 4, 5, 10], - [0, 4, 5, 11], - [32, 5, 5, 28], - [64, 5, 6, 29], - [128, 4, 7, 12], - [256, 3, 8, 1], - [512, 3, 9, 2], - [1024, 3, 10, 3], - [-1025, 5, 32, 30, 'lower'], - [2048, 5, 32, 31], - ]; - break; - case 8: - t = [ - [-15, 8, 3, 252], - [-7, 9, 1, 508], - [-5, 8, 1, 253], - [-3, 9, 0, 509], - [-2, 7, 0, 124], - [-1, 4, 0, 10], - [0, 2, 1, 0], - [2, 5, 0, 26], - [3, 6, 0, 58], - [4, 3, 4, 4], - [20, 6, 1, 59], - [22, 4, 4, 11], - [38, 4, 5, 12], - [70, 5, 6, 27], - [134, 5, 7, 28], - [262, 6, 7, 60], - [390, 7, 8, 125], - [646, 6, 10, 61], - [-16, 9, 32, 510, 'lower'], - [1670, 9, 32, 511], - [2, 1], - ]; - break; - case 9: - t = [ - [-31, 8, 4, 252], - [-15, 9, 2, 508], - [-11, 8, 2, 253], - [-7, 9, 1, 509], - [-5, 7, 1, 124], - [-3, 4, 1, 10], - [-1, 3, 1, 2], - [1, 3, 1, 3], - [3, 5, 1, 26], - [5, 6, 1, 58], - [7, 3, 5, 4], - [39, 6, 2, 59], - [43, 4, 5, 11], - [75, 4, 6, 12], - [139, 5, 7, 27], - [267, 5, 8, 28], - [523, 6, 8, 60], - [779, 7, 9, 125], - [1291, 6, 11, 61], - [-32, 9, 32, 510, 'lower'], - [3339, 9, 32, 511], - [2, 0], - ]; - break; - case 10: - t = [ - [-21, 7, 4, 122], - [-5, 8, 0, 252], - [-4, 7, 0, 123], - [-3, 5, 0, 24], - [-2, 2, 2, 0], - [2, 5, 0, 25], - [3, 6, 0, 54], - [4, 7, 0, 124], - [5, 8, 0, 253], - [6, 2, 6, 1], - [70, 5, 5, 26], - [102, 6, 5, 55], - [134, 6, 6, 56], - [198, 6, 7, 57], - [326, 6, 8, 58], - [582, 6, 9, 59], - [1094, 6, 10, 60], - [2118, 7, 11, 125], - [-22, 8, 32, 254, 'lower'], - [4166, 8, 32, 255], - [2, 2], - ]; - break; - case 11: - t = [ - [1, 1, 0, 0], - [2, 2, 1, 2], - [4, 4, 0, 12], - [5, 4, 1, 13], - [7, 5, 1, 28], - [9, 5, 2, 29], - [13, 6, 2, 60], - [17, 7, 2, 122], - [21, 7, 3, 123], - [29, 7, 4, 124], - [45, 7, 5, 125], - [77, 7, 6, 126], - [141, 7, 32, 127], - ]; - break; - case 12: - t = [ - [1, 1, 0, 0], - [2, 2, 0, 2], - [3, 3, 1, 6], - [5, 5, 0, 28], - [6, 5, 1, 29], - [8, 6, 1, 60], - [10, 7, 0, 122], - [11, 7, 1, 123], - [13, 7, 2, 124], - [17, 7, 3, 125], - [25, 7, 4, 126], - [41, 8, 5, 254], - [73, 8, 32, 255], - ]; - break; - case 13: - t = [ - [1, 1, 0, 0], - [2, 3, 0, 4], - [3, 4, 0, 12], - [4, 5, 0, 28], - [5, 4, 1, 13], - [7, 3, 3, 5], - [15, 6, 1, 58], - [17, 6, 2, 59], - [21, 6, 3, 60], - [29, 6, 4, 61], - [45, 6, 5, 62], - [77, 7, 6, 126], - [141, 7, 32, 127], - ]; - break; - case 14: - t = [ - [-2, 3, 0, 4], - [-1, 3, 0, 5], - [0, 1, 0, 0], - [1, 3, 0, 6], - [2, 3, 0, 7], - ]; - break; - case 15: - t = [ - [-24, 7, 4, 124], - [-8, 6, 2, 60], - [-4, 5, 1, 28], - [-2, 4, 0, 12], - [-1, 3, 0, 4], - [0, 1, 0, 0], - [1, 3, 0, 5], - [2, 4, 0, 13], - [3, 5, 1, 29], - [5, 6, 2, 61], - [9, 7, 4, 125], - [-25, 7, 32, 126, 'lower'], - [25, 7, 32, 127], - ]; - break; - default: - throw new Jbig2Error(`standard table B.${e} does not exist`); - } - for (let e = 0, a = t.length; e < a; e++) t[e] = new HuffmanLine(t[e]); - a = new HuffmanTable(t, !0); - p[e] = a; - return a; - } - class Reader { - constructor(e, t, a) { - this.data = e; - this.start = t; - this.end = a; - this.position = t; - 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 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() << t; - return a; - } - byteAlign() { - this.shift = -1; - } - next() { - return this.position >= this.end ? -1 : this.data[this.position++]; - } - } - function getCustomHuffmanTable(e, t, a) { - let r = 0; - for (let i = 0, n = t.length; i < n; i++) { - const n = a[t[i]]; - if (n) { - if (e === r) return n; - r++; - } - } - throw new Jbig2Error("can't find custom Huffman table"); - } - function readUncompressedBitmap(e, t, a) { - const r = []; - for (let i = 0; i < a; i++) { - const a = new Uint8Array(t); - r.push(a); - for (let r = 0; r < t; r++) a[r] = e.readBit(); - e.byteAlign(); - } - return r; - } - function decodeMMRBitmap(e, t, a, r) { - const i = { K: -1, Columns: t, Rows: a, BlackIs1: !0, EndOfBlock: r }, - n = new s.CCITTFaxDecoder(e, i), - o = []; - let c, - l = !1; - for (let e = 0; e < a; e++) { - const e = new Uint8Array(t); - o.push(e); - let a = -1; - for (let r = 0; r < t; r++) { - if (a < 0) { - c = n.readNextChar(); - if (-1 === c) { - c = 0; - l = !0; - } - a = 7; - } - e[r] = (c >> a) & 1; - a--; - } - } - if (r && !l) { - const e = 5; - for (let t = 0; t < e && -1 !== n.readNextChar(); t++); - } - return o; - } - t.Jbig2Image = class Jbig2Image { - parseChunks(e) { - return (function parseJbig2Chunks(e) { - const t = new SimpleSegmentVisitor(); - for (let a = 0, r = e.length; a < r; a++) { - const r = e[a]; - processSegments(readSegments({}, r.data, r.start, r.end), t); - } - return t.buffer; - })(e); - } - parse(e) { - throw new Error('Not implemented: Jbig2Image.parse'); - } - }; - }, - (e, 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 += t < this.dataEnd ? e[t] << 8 : 65280; - this.ct = 8; - this.bp = t; - } - if (this.clow > 65535) { - this.chigh += this.clow >> 16; - this.clow &= 65535; - } - } - readBit(e, t) { - let r = e[t] >> 1, - i = 1 & e[t]; - const n = a[r], - s = n.qe; - let o, - c = this.a - s; - if (this.chigh < s) - if (c < s) { - c = s; - o = i; - r = n.nmps; - } else { - c = s; - o = 1 ^ i; - 1 === n.switchFlag && (i = o); - r = n.nlps; - } - else { - this.chigh -= s; - if (0 != (32768 & c)) { - this.a = c; - return i; - } - if (c < s) { - o = 1 ^ i; - 1 === n.switchFlag && (i = o); - r = n.nlps; - } else { - o = i; - r = n.nmps; - } - } - do { - 0 === this.ct && this.byteIn(); - c <<= 1; - this.chigh = ((this.chigh << 1) & 65535) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 65535; - this.ct--; - } while (0 == (32768 & c)); - this.a = c; - e[t] = (r << 1) | i; - return o; - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.JpegStream = void 0; - var r = a(18), - i = a(4), - n = a(27), - 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.forceRGBA || this.forceRGB) && Array.isArray(t)) { - const a = this.dict.get('BPC', 'BitsPerComponent') || 8, - r = t.length, - i = new Int32Array(r); - let n = !1; - const s = (1 << a) - 1; - for (let e = 0; e < r; e += 2) { - i[e] = (256 * (t[e + 1] - t[e])) | 0; - i[e + 1] = (t[e] * s) | 0; - (256 === i[e] && 0 === i[e + 1]) || (n = !0); - } - n && (e.decodeTransform = i); - } - if (this.params instanceof i.Dict) { - const t = this.params.get('ColorTransform'); - Number.isInteger(t) && (e.colorTransform = t); - } - const a = new n.JpegImage(e); - a.parse(this.bytes); - const r = a.getData({ - width: this.drawWidth, - height: this.drawHeight, - forceRGBA: this.forceRGBA, - forceRGB: this.forceRGB, - isSourcePDF: !0, - }); - this.buffer = r; - this.bufferLength = r.length; - this.eof = !0; - } - } - t.JpegStream = JpegStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.JpegImage = void 0; - var r = a(2), - i = a(28), - n = a(3); - 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 s = 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, - ]), - o = 4017, - c = 799, - l = 3406, - h = 2276, - u = 1567, - d = 3784, - f = 5793, - g = 2896; - function buildHuffmanTable(e, t) { - let a, - r, - i = 0, - n = 16; - for (; n > 0 && !e[n - 1]; ) n--; - const s = [{ children: [], index: 0 }]; - let o, - c = s[0]; - for (a = 0; a < n; a++) { - for (r = 0; r < e[a]; r++) { - c = s.pop(); - c.children[c.index] = t[i]; - for (; c.index > 0; ) 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; - } - i++; - } - if (a + 1 < n) { - s.push((o = { children: [], index: 0 })); - c.children[c.index] = o.children; - c = o; - } - } - return s[0].children; - } - function getBlockBufferOffset(e, t, a) { - return 64 * ((e.blocksPerLine + 1) * t + a); - } - function decodeScan(e, t, a, i, o, c, l, h, u, d = !1) { - const f = a.mcusPerLine, - g = a.progressive, - p = t; - let m = 0, - b = 0; - function readBit() { - if (b > 0) { - 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) >= 5) - 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 << (e - 1) ? t : t + (-1 << e) + 1; - } - let y = 0; - let w, - S = 0; - let x = 0; - function decodeMcu(e, t, a, r, i) { - const n = a % f; - x = ((a / f) | 0) * e.v + r; - const s = n * e.h + i; - t(e, getBlockBufferOffset(e, x, s)); - } - function decodeBlock(e, t, a) { - x = (a / e.blocksPerLine) | 0; - const r = a % e.blocksPerLine; - t(e, getBlockBufferOffset(e, x, r)); - } - const C = i.length; - let k, v, F, O, T, M; - M = g - ? 0 === c - ? 0 === h - ? function decodeDCFirst(e, t) { - const a = decodeHuffman(e.huffmanTableDC), - r = 0 === a ? 0 : receiveAndExtend(a) << u; - e.blockData[t] = e.pred += r; - } - : function decodeDCSuccessive(e, t) { - e.blockData[t] |= readBit() << u; - } - : 0 === h - ? function decodeACFirst(e, t) { - if (y > 0) { - y--; - return; - } - let a = c; - const r = l; - for (; a <= r; ) { - const r = decodeHuffman(e.huffmanTableAC), - i = 15 & r, - n = r >> 4; - if (0 === i) { - if (n < 15) { - y = receive(n) + (1 << n) - 1; - break; - } - a += 16; - continue; - } - a += n; - const o = s[a]; - e.blockData[t + o] = receiveAndExtend(i) * (1 << u); - a++; - } - } - : function decodeACSuccessive(e, t) { - let a = c; - const r = l; - let i, - n, - o = 0; - for (; a <= r; ) { - const r = t + s[a], - c = e.blockData[r] < 0 ? -1 : 1; - switch (S) { - case 0: - n = decodeHuffman(e.huffmanTableAC); - i = 15 & n; - o = n >> 4; - if (0 === i) - if (o < 15) { - y = receive(o) + (1 << o); - S = 4; - } else { - o = 16; - S = 1; - } - else { - if (1 !== i) throw new JpegError('invalid ACn encoding'); - w = receiveAndExtend(i); - S = o ? 2 : 3; - } - continue; - case 1: - case 2: - if (e.blockData[r]) e.blockData[r] += c * (readBit() << u); - else { - o--; - 0 === o && (S = 2 === S ? 3 : 0); - } - break; - case 3: - if (e.blockData[r]) e.blockData[r] += c * (readBit() << u); - else { - e.blockData[r] = w << u; - S = 0; - } - break; - case 4: - e.blockData[r] && (e.blockData[r] += c * (readBit() << u)); - } - a++; - } - if (4 === S) { - y--; - 0 === y && (S = 0); - } - } - : function decodeBaseline(e, t) { - const a = decodeHuffman(e.huffmanTableDC), - r = 0 === a ? 0 : receiveAndExtend(a); - e.blockData[t] = e.pred += r; - let i = 1; - for (; i < 64; ) { - const a = decodeHuffman(e.huffmanTableAC), - r = 15 & a, - n = a >> 4; - if (0 === r) { - if (n < 15) break; - i += 16; - continue; - } - i += n; - const o = s[i]; - e.blockData[t + o] = receiveAndExtend(r); - i++; - } - }; - let E, - D, - N, - R, - L = 0; - D = 1 === C ? i[0].blocksPerLine * i[0].blocksPerColumn : f * a.mcusPerColumn; - for (; L <= D; ) { - const a = o ? Math.min(D - L, o) : D; - if (a > 0) { - for (v = 0; v < C; v++) i[v].pred = 0; - y = 0; - if (1 === C) { - k = i[0]; - for (T = 0; T < a; T++) { - decodeBlock(k, M, L); - L++; - } - } else - for (T = 0; T < a; T++) { - for (v = 0; v < C; v++) { - k = i[v]; - N = k.h; - R = k.v; - for (F = 0; F < R; F++) for (O = 0; O < N; O++) decodeMcu(k, M, L, F, O); - } - L++; - } - } - b = 0; - E = findNextFileMarker(e, t); - if (!E) break; - if (E.invalid) { - const e = a > 0 ? '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, - i = e.blockData; - let n, s, p, m, b, y, w, S, x, C, k, v, F, O, T, M, E; - if (!r) throw new JpegError('missing required Quantization Table.'); - for (let e = 0; e < 64; e += 8) { - x = i[t + e]; - C = i[t + e + 1]; - k = i[t + e + 2]; - v = i[t + e + 3]; - F = i[t + e + 4]; - O = i[t + e + 5]; - T = i[t + e + 6]; - M = i[t + e + 7]; - x *= r[e]; - if (0 != (C | k | v | F | O | T | M)) { - C *= r[e + 1]; - k *= r[e + 2]; - v *= r[e + 3]; - F *= r[e + 4]; - O *= r[e + 5]; - T *= r[e + 6]; - M *= r[e + 7]; - n = (f * x + 128) >> 8; - s = (f * F + 128) >> 8; - p = k; - m = T; - b = (g * (C - M) + 128) >> 8; - S = (g * (C + M) + 128) >> 8; - y = v << 4; - w = O << 4; - n = (n + s + 1) >> 1; - s = n - s; - E = (p * d + m * u + 128) >> 8; - p = (p * u - m * d + 128) >> 8; - m = E; - b = (b + w + 1) >> 1; - w = b - w; - S = (S + y + 1) >> 1; - y = S - y; - n = (n + m + 1) >> 1; - m = n - m; - s = (s + p + 1) >> 1; - p = s - p; - E = (b * h + S * l + 2048) >> 12; - b = (b * l - S * h + 2048) >> 12; - S = E; - E = (y * c + w * o + 2048) >> 12; - y = (y * o - w * c + 2048) >> 12; - w = E; - a[e] = n + S; - a[e + 7] = n - S; - a[e + 1] = s + w; - a[e + 6] = s - w; - a[e + 2] = p + y; - a[e + 5] = p - y; - a[e + 3] = m + b; - a[e + 4] = m - b; - } else { - E = (f * 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]; - C = a[e + 8]; - k = 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 != (C | k | v | F | O | T | M)) { - n = (f * x + 2048) >> 12; - s = (f * F + 2048) >> 12; - p = k; - m = T; - b = (g * (C - M) + 2048) >> 12; - S = (g * (C + M) + 2048) >> 12; - y = v; - w = O; - n = 4112 + ((n + s + 1) >> 1); - s = n - s; - E = (p * d + m * u + 2048) >> 12; - p = (p * u - m * d + 2048) >> 12; - m = E; - b = (b + w + 1) >> 1; - w = b - w; - S = (S + y + 1) >> 1; - y = S - y; - n = (n + m + 1) >> 1; - m = n - m; - s = (s + p + 1) >> 1; - p = s - p; - E = (b * h + S * l + 2048) >> 12; - b = (b * l - S * h + 2048) >> 12; - S = E; - E = (y * c + w * o + 2048) >> 12; - y = (y * o - w * c + 2048) >> 12; - w = E; - x = n + S; - M = n - S; - C = s + w; - T = s - w; - k = p + y; - O = p - y; - v = m + b; - F = m - b; - x < 16 ? (x = 0) : x >= 4080 ? (x = 255) : (x >>= 4); - C < 16 ? (C = 0) : C >= 4080 ? (C = 255) : (C >>= 4); - k < 16 ? (k = 0) : k >= 4080 ? (k = 255) : (k >>= 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); - i[t + e] = x; - i[t + e + 8] = C; - i[t + e + 16] = k; - i[t + e + 24] = v; - i[t + e + 32] = F; - i[t + e + 40] = O; - i[t + e + 48] = T; - i[t + e + 56] = M; - } else { - E = (f * x + 8192) >> 14; - E = E < -2040 ? 0 : E >= 2024 ? 255 : (E + 2056) >> 4; - i[t + e] = E; - i[t + e + 8] = E; - i[t + e + 16] = E; - i[t + e + 24] = E; - i[t + e + 32] = E; - i[t + e + 40] = E; - i[t + e + 48] = E; - i[t + e + 56] = E; - } - } - } - function buildComponentData(e, t) { - const a = t.blocksPerLine, - r = t.blocksPerColumn, - i = new Int16Array(64); - for (let e = 0; e < r; e++) - for (let r = 0; r < a; r++) { - quantizeAndInverse(t, getBlockBufferOffset(t, e, r), i); - } - return t.blockData; - } - function findNextFileMarker(e, t, a = t) { - const r = e.length - 1; - let i = a < t ? a : t; - if (t >= 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 (const r of e.components) { - const i = Math.ceil((Math.ceil(e.samplesPerLine / 8) * r.h) / e.maxH), - n = Math.ceil((Math.ceil(e.scanLines / 8) * r.v) / e.maxV), - s = t * r.h, - o = 64 * (a * r.v) * (s + 1); - r.blockData = new Int16Array(o); - r.blocksPerLine = i; - r.blocksPerColumn = n; - } - e.mcusPerLine = t; - e.mcusPerColumn = a; - } - let a, - i, - o = 0, - c = null, - l = null, - h = 0; - const u = [], - d = [], - f = []; - let g = (0, n.readUint16)(e, o); - o += 2; - if (65496 !== g) throw new JpegError('SOI not found'); - g = (0, n.readUint16)(e, o); - o += 2; - e: for (; 65497 !== g; ) { - let p, m, b; - switch (g) { - case 65504: - case 65505: - case 65506: - case 65507: - case 65508: - case 65509: - case 65510: - case 65511: - case 65512: - case 65513: - case 65514: - case 65515: - case 65516: - case 65517: - case 65518: - case 65519: - case 65534: - const y = readDataBlock(); - 65504 === g && - 74 === y[0] && - 70 === y[1] && - 73 === y[2] && - 70 === y[3] && - 0 === y[4] && - (c = { - version: { major: y[5], minor: y[6] }, - densityUnits: y[7], - xDensity: (y[8] << 8) | y[9], - yDensity: (y[10] << 8) | y[11], - thumbWidth: y[12], - thumbHeight: y[13], - thumbData: y.subarray(14, 14 + 3 * y[12] * y[13]), - }); - 65518 === g && - 65 === y[0] && - 100 === y[1] && - 111 === y[2] && - 98 === y[3] && - 101 === y[4] && - (l = { - version: (y[5] << 8) | y[6], - flags0: (y[7] << 8) | y[8], - flags1: (y[9] << 8) | y[10], - transformCode: y[11], - }); - break; - case 65499: - const w = (0, n.readUint16)(e, o); - o += 2; - const S = w + o - 2; - let x; - for (; o < S; ) { - const t = e[o++], - a = new Uint16Array(64); - if (t >> 4 == 0) - for (m = 0; m < 64; m++) { - x = s[m]; - a[x] = e[o++]; - } - else { - if (t >> 4 != 1) throw new JpegError('DQT - invalid table spec'); - for (m = 0; m < 64; m++) { - x = s[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 C = (0, n.readUint16)(e, o); - o += 2; - a.scanLines = t || C; - a.samplesPerLine = (0, n.readUint16)(e, o); - o += 2; - a.components = []; - a.componentIds = {}; - const k = e[o++]; - let v = 0, - F = 0; - for (p = 0; p < k; p++) { - const t = e[o], - r = e[o + 1] >> 4, - i = 15 & e[o + 1]; - v < r && (v = r); - F < i && (F = i); - const n = e[o + 2]; - b = a.components.push({ - h: r, - v: i, - quantizationId: n, - quantizationTable: null, - }); - a.componentIds[t] = b - 1; - o += 3; - } - a.maxH = v; - a.maxV = F; - prepareComponents(a); - break; - case 65476: - const O = (0, n.readUint16)(e, o); - o += 2; - for (p = 2; p < O; ) { - const t = e[o++], - a = new Uint8Array(16); - let r = 0; - for (m = 0; m < 16; m++, o++) r += a[m] = e[o]; - const i = new Uint8Array(r); - for (m = 0; m < r; m++, o++) i[m] = e[o]; - p += 17 + r; - (t >> 4 == 0 ? f : d)[15 & t] = buildHuffmanTable(a, i); - } - break; - case 65501: - o += 2; - i = (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 < M; p++) { - const t = e[o++], - r = a.componentIds[t], - i = a.components[r]; - i.index = t; - const n = e[o++]; - i.huffmanTableDC = f[n >> 4]; - i.huffmanTableAC = d[15 & n]; - E.push(i); - } - const D = e[o++], - N = e[o++], - R = e[o++]; - try { - const t = decodeScan(e, o, a, E, i, 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 (const e of a.components) { - const t = u[e.quantizationId]; - t && (e.quantizationTable = t); - this.components.push({ - index: e.index, - output: buildComponentData(0, e), - scaleX: e.h / a.maxH, - scaleY: e.v / a.maxV, - blocksPerLine: e.blocksPerLine, - blocksPerColumn: e.blocksPerColumn, - }); - } - this.numComponents = this.components.length; - } - _getLinearizedBlockData(e, t, a = !1) { - const r = this.width / e, - i = this.height / t; - let n, - s, - o, - c, - l, - h, - u, - d, - f, - g, - p, - m = 0; - const b = this.components.length, - y = e * t * b, - w = new Uint8ClampedArray(y), - S = new Uint32Array(e), - x = 4294967288; - let C; - for (u = 0; u < b; u++) { - n = this.components[u]; - s = n.scaleX * r; - o = n.scaleY * i; - m = u; - p = n.output; - c = (n.blocksPerLine + 1) << 3; - if (s !== C) { - for (l = 0; l < e; l++) { - d = 0 | (l * s); - S[l] = ((d & x) << 3) | (7 & d); - } - C = s; - } - for (h = 0; h < t; h++) { - d = 0 | (h * o); - g = (c * (d & x)) | ((7 & d) << 3); - for (l = 0; l < e; l++) { - w[m] = p[g + S[l]]; - m += b; - } - } - } - let k = this._decodeTransform; - a || - 4 !== b || - k || - (k = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255])); - if (k) - for (u = 0; u < y; ) - for (d = 0, f = 0; d < b; d++, u++, f += 2) - w[u] = ((w[u] * k[f]) >> 8) + k[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 i = 0, n = e.length; i < n; i += 3) { - t = e[i]; - a = e[i + 1]; - r = e[i + 2]; - e[i] = t - 179.456 + 1.402 * r; - e[i + 1] = t + 135.459 - 0.344 * a - 0.714 * r; - e[i + 2] = t - 226.816 + 1.772 * a; - } - return e; - } - _convertYccToRgba(e, t) { - for (let a = 0, r = 0, i = e.length; a < i; a += 3, r += 4) { - const i = e[a], - n = e[a + 1], - s = e[a + 2]; - t[r] = i - 179.456 + 1.402 * s; - t[r + 1] = i + 135.459 - 0.344 * n - 0.714 * s; - t[r + 2] = i - 226.816 + 1.772 * n; - t[r + 3] = 255; - } - return t; - } - _convertYcckToRgb(e) { - let t, - a, - r, - i, - n = 0; - for (let s = 0, o = e.length; s < o; s += 4) { - t = e[s]; - a = e[s + 1]; - r = e[s + 2]; - i = e[s + 3]; - e[n++] = - a * - (-660635669420364e-19 * a + - 0.000437130475926232 * r - - 54080610064599e-18 * t + - 0.00048449797120281 * i - - 0.154362151871126) - - 122.67195406894 + - r * - (-0.000957964378445773 * r + - 0.000817076911346625 * t - - 0.00477271405408747 * i + - 1.53380253221734) + - t * (0.000961250184130688 * t - 0.00266257332283933 * i + 0.48357088451265) + - i * (-0.000336197177618394 * i + 0.484791561490776); - e[n++] = - 107.268039397724 + - a * - (219927104525741e-19 * a - - 0.000640992018297945 * r + - 0.000659397001245577 * t + - 0.000426105652938837 * i - - 0.176491792462875) + - r * - (-0.000778269941513683 * r + - 0.00130872261408275 * t + - 0.000770482631801132 * i - - 0.151051492775562) + - t * (0.00126935368114843 * t - 0.00265090189010898 * i + 0.25802910206845) + - i * (-0.000318913117588328 * i - 0.213742400323665); - e[n++] = - a * - (-0.000570115196973677 * a - - 263409051004589e-19 * r + - 0.0020741088115012 * t - - 0.00288260236853442 * i + - 0.814272968359295) - - 20.810012546947 + - r * - (-153496057440975e-19 * r - - 0.000132689043961446 * t + - 0.000560833691242812 * i - - 0.195152027534049) + - t * (0.00174418132927582 * t - 0.00255243321439347 * i + 0.116935020465145) + - i * (-0.000343531996510555 * i + 0.24165260232407); - } - return e.subarray(0, n); - } - _convertYcckToRgba(e) { - for (let t = 0, a = e.length; t < a; t += 4) { - const a = e[t], - r = e[t + 1], - i = e[t + 2], - n = e[t + 3]; - e[t] = - r * - (-660635669420364e-19 * r + - 0.000437130475926232 * i - - 54080610064599e-18 * a + - 0.00048449797120281 * n - - 0.154362151871126) - - 122.67195406894 + - i * - (-0.000957964378445773 * i + - 0.000817076911346625 * a - - 0.00477271405408747 * n + - 1.53380253221734) + - a * (0.000961250184130688 * a - 0.00266257332283933 * n + 0.48357088451265) + - n * (-0.000336197177618394 * n + 0.484791561490776); - e[t + 1] = - 107.268039397724 + - r * - (219927104525741e-19 * r - - 0.000640992018297945 * i + - 0.000659397001245577 * a + - 0.000426105652938837 * n - - 0.176491792462875) + - i * - (-0.000778269941513683 * i + - 0.00130872261408275 * a + - 0.000770482631801132 * n - - 0.151051492775562) + - a * (0.00126935368114843 * a - 0.00265090189010898 * n + 0.25802910206845) + - n * (-0.000318913117588328 * n - 0.213742400323665); - e[t + 2] = - r * - (-0.000570115196973677 * r - - 263409051004589e-19 * i + - 0.0020741088115012 * a - - 0.00288260236853442 * n + - 0.814272968359295) - - 20.810012546947 + - i * - (-153496057440975e-19 * i - - 0.000132689043961446 * a + - 0.000560833691242812 * n - - 0.195152027534049) + - a * (0.00174418132927582 * a - 0.00255243321439347 * n + 0.116935020465145) + - n * (-0.000343531996510555 * n + 0.24165260232407); - e[t + 3] = 255; - } - return e; - } - _convertYcckToCmyk(e) { - let t, a, r; - for (let i = 0, n = e.length; i < n; i += 4) { - t = e[i]; - a = e[i + 1]; - r = e[i + 2]; - e[i] = 434.456 - t - 1.402 * r; - e[i + 1] = 119.541 - t + 0.344 * a + 0.714 * r; - e[i + 2] = 481.816 - t - 1.772 * a; - } - return e; - } - _convertCmykToRgb(e) { - let t, - a, - r, - i, - n = 0; - for (let s = 0, o = e.length; s < o; s += 4) { - t = e[s]; - a = e[s + 1]; - r = e[s + 2]; - i = e[s + 3]; - e[n++] = - 255 + - t * - (-6747147073602441e-20 * t + - 0.0008379262121013727 * a + - 0.0002894718188643294 * r + - 0.003264231057537806 * i - - 1.1185611867203937) + - a * - (26374107616089405e-21 * a - - 8626949158638572e-20 * r - - 0.0002748769067499491 * i - - 0.02155688794978967) + - r * (-3878099212869363e-20 * r - 0.0003267808279485286 * i + 0.0686742238595345) - - i * (0.0003361971776183937 * i + 0.7430659151342254); - e[n++] = - 255 + - t * - (0.00013596372813588848 * t + - 0.000924537132573585 * a + - 0.00010567359618683593 * r + - 0.0004791864687436512 * i - - 0.3109689587515875) + - a * - (-0.00023545346108370344 * a + - 0.0002702845253534714 * r + - 0.0020200308977307156 * i - - 0.7488052167015494) + - r * - (6834815998235662e-20 * r + 0.00015168452363460973 * i - 0.09751927774728933) - - i * (0.0003189131175883281 * i + 0.7364883807733168); - e[n++] = - 255 + - t * - (13598650411385307e-21 * t + - 0.00012423956175490851 * a + - 0.0004751985097583589 * r - - 36729317476630422e-22 * i - - 0.05562186980264034) + - a * - (0.00016141380598724676 * a + - 0.0009692239130725186 * r + - 0.0007782692450036253 * i - - 0.44015232367526463) + - r * (5.068882914068769e-7 * r + 0.0017778369011375071 * i - 0.7591454649749609) - - i * (0.0003435319965105553 * i + 0.7063770186160144); - } - return e.subarray(0, n); - } - _convertCmykToRgba(e) { - for (let t = 0, a = e.length; t < a; t += 4) { - const a = e[t], - r = e[t + 1], - i = e[t + 2], - n = e[t + 3]; - e[t] = - 255 + - a * - (-6747147073602441e-20 * a + - 0.0008379262121013727 * r + - 0.0002894718188643294 * i + - 0.003264231057537806 * n - - 1.1185611867203937) + - r * - (26374107616089405e-21 * r - - 8626949158638572e-20 * i - - 0.0002748769067499491 * n - - 0.02155688794978967) + - i * (-3878099212869363e-20 * i - 0.0003267808279485286 * n + 0.0686742238595345) - - n * (0.0003361971776183937 * n + 0.7430659151342254); - e[t + 1] = - 255 + - a * - (0.00013596372813588848 * a + - 0.000924537132573585 * r + - 0.00010567359618683593 * i + - 0.0004791864687436512 * n - - 0.3109689587515875) + - r * - (-0.00023545346108370344 * r + - 0.0002702845253534714 * i + - 0.0020200308977307156 * n - - 0.7488052167015494) + - i * - (6834815998235662e-20 * i + 0.00015168452363460973 * n - 0.09751927774728933) - - n * (0.0003189131175883281 * n + 0.7364883807733168); - e[t + 2] = - 255 + - a * - (13598650411385307e-21 * a + - 0.00012423956175490851 * r + - 0.0004751985097583589 * i - - 36729317476630422e-22 * n - - 0.05562186980264034) + - r * - (0.00016141380598724676 * r + - 0.0009692239130725186 * i + - 0.0007782692450036253 * n - - 0.44015232367526463) + - i * (5.068882914068769e-7 * i + 0.0017778369011375071 * n - 0.7591454649749609) - - n * (0.0003435319965105553 * n + 0.7063770186160144); - e[t + 3] = 255; - } - return e; - } - getData({ - width: e, - height: t, - forceRGBA: a = !1, - forceRGB: r = !1, - isSourcePDF: n = !1, - }) { - if (this.numComponents > 4) throw new JpegError('Unsupported color mode'); - const s = this._getLinearizedBlockData(e, t, n); - if (1 === this.numComponents && (a || r)) { - const e = s.length * (a ? 4 : 3), - t = new Uint8ClampedArray(e); - let r = 0; - if (a) (0, i.grayToRGBA)(s, new Uint32Array(t.buffer)); - else - for (const e of s) { - t[r++] = e; - t[r++] = e; - t[r++] = e; - } - return t; - } - if (3 === this.numComponents && this._isColorConversionNeeded) { - if (a) { - const e = new Uint8ClampedArray((s.length / 3) * 4); - return this._convertYccToRgba(s, e); - } - return this._convertYccToRgb(s); - } - if (4 === this.numComponents) { - if (this._isColorConversionNeeded) - return a - ? this._convertYcckToRgba(s) - : r - ? this._convertYcckToRgb(s) - : this._convertYcckToCmyk(s); - if (a) return this._convertCmykToRgba(s); - if (r) return this._convertCmykToRgb(s); - } - return s; - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.convertBlackAndWhiteToRGBA = convertBlackAndWhiteToRGBA; - t.convertToRGBA = function convertToRGBA(e) { - switch (e.kind) { - case r.ImageKind.GRAYSCALE_1BPP: - return convertBlackAndWhiteToRGBA(e); - case r.ImageKind.RGB_24BPP: - return (function convertRGBToRGBA({ - src: e, - srcPos: t = 0, - dest: a, - destPos: i = 0, - width: n, - height: s, - }) { - let o = 0; - const c = e.length >> 2, - l = new Uint32Array(e.buffer, t, c); - if (r.FeatureTest.isLittleEndian) { - for (; o < c - 2; o += 3, i += 4) { - const e = l[o], - t = l[o + 1], - r = l[o + 2]; - a[i] = 4278190080 | e; - a[i + 1] = (e >>> 24) | (t << 8) | 4278190080; - a[i + 2] = (t >>> 16) | (r << 16) | 4278190080; - a[i + 3] = (r >>> 8) | 4278190080; - } - for (let t = 4 * o, r = e.length; t < r; t += 3) - a[i++] = e[t] | (e[t + 1] << 8) | (e[t + 2] << 16) | 4278190080; - } else { - for (; o < c - 2; o += 3, i += 4) { - const e = l[o], - t = l[o + 1], - r = l[o + 2]; - a[i] = 255 | e; - a[i + 1] = (e << 24) | (t >>> 8) | 255; - a[i + 2] = (t << 16) | (r >>> 16) | 255; - a[i + 3] = (r << 8) | 255; - } - for (let t = 4 * o, r = e.length; t < r; t += 3) - a[i++] = (e[t] << 24) | (e[t + 1] << 16) | (e[t + 2] << 8) | 255; - } - return { srcPos: t, destPos: i }; - })(e); - } - return null; - }; - t.grayToRGBA = function grayToRGBA(e, t) { - if (r.FeatureTest.isLittleEndian) - for (let a = 0, r = e.length; a < r; a++) t[a] = (65793 * e[a]) | 4278190080; - else for (let a = 0, r = e.length; a < r; a++) t[a] = (16843008 * e[a]) | 255; - }; - var r = a(2); - function convertBlackAndWhiteToRGBA({ - src: e, - srcPos: t = 0, - dest: a, - width: i, - height: n, - nonBlackColor: s = 4294967295, - inverseDecode: o = !1, - }) { - const c = r.FeatureTest.isLittleEndian ? 4278190080 : 255, - [l, h] = o ? [s, c] : [c, s], - u = i >> 3, - d = 7 & i, - f = e.length; - a = new Uint32Array(a.buffer); - let g = 0; - for (let r = 0; r < n; r++) { - for (const r = t + u; t < r; t++) { - const r = t < f ? e[t] : 255; - a[g++] = 128 & r ? h : l; - a[g++] = 64 & r ? h : l; - a[g++] = 32 & r ? h : l; - a[g++] = 16 & r ? h : l; - a[g++] = 8 & r ? h : l; - a[g++] = 4 & r ? h : l; - a[g++] = 2 & r ? h : l; - a[g++] = 1 & r ? h : l; - } - if (0 === d) continue; - const r = t < f ? e[t++] : 255; - for (let e = 0; e < d; e++) a[g++] = r & (1 << (7 - e)) ? h : l; - } - return { srcPos: t, destPos: g }; - } - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.JpxStream = void 0; - var r = a(18), - i = a(30), - n = 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, n.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength)); - } - ensureBuffer(e) {} - readBlock() { - if (this.eof) return; - const e = new i.JpxImage(); - e.parse(this.bytes); - const t = e.width, - a = e.height, - r = e.componentsCount, - n = e.tiles.length; - if (1 === n) this.buffer = e.tiles[0].items; - else { - const i = new Uint8ClampedArray(t * a * r); - for (let a = 0; a < n; a++) { - const n = e.tiles[a], - s = n.width, - o = n.height, - c = n.left, - l = n.top, - h = n.items; - let u = 0, - d = (t * l + c) * r; - const f = t * r, - g = s * r; - for (let e = 0; e < o; e++) { - const e = h.subarray(u, u + g); - i.set(e, d); - u += g; - d += f; - } - } - this.buffer = i; - } - this.bufferLength = this.buffer.length; - this.eof = !0; - } - } - t.JpxStream = JpxStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.JpxImage = void 0; - var r = a(2), - i = a(3), - n = a(25); - 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, i.readUint16)(e, 0)) { - this.parseCodestream(e, 0, e.length); - return; - } - const t = e.length; - let a = 0; - for (; a < t; ) { - let n = 8, - s = (0, i.readUint32)(e, a); - const o = (0, i.readUint32)(e, a + 4); - a += n; - if (1 === s) { - s = 4294967296 * (0, i.readUint32)(e, a) + (0, i.readUint32)(e, a + 4); - a += 8; - n += 8; - } - 0 === s && (s = t - a + n); - if (s < n) throw new JpxError('Invalid box field size'); - const c = s - n; - let l = !0; - switch (o) { - case 1785737832: - l = !1; - break; - case 1668246642: - const t = e[a]; - if (1 === t) { - const t = (0, i.readUint32)(e, a + 3); - switch (t) { - case 16: - case 17: - case 18: - break; - default: - (0, r.warn)('Unknown colorspace ' + t); - } - } else 2 === t && (0, r.info)('ICC profile not supported'); - break; - case 1785737827: - this.parseCodestream(e, a, a + c); - break; - case 1783636e3: - 218793738 !== (0, i.readUint32)(e, a) && (0, r.warn)('Invalid JP2 signature'); - break; - case 1783634458: - case 1718909296: - case 1920099697: - case 1919251232: - case 1768449138: - break; - default: - const n = String.fromCharCode( - (o >> 24) & 255, - (o >> 16) & 255, - (o >> 8) & 255, - 255 & o, - ); - (0, r.warn)(`Unsupported header type ${o} (${n}).`); - } - 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, - i = e.getInt32() >>> 0; - e.skip(16); - const n = e.getUint16(); - this.width = t - r; - this.height = a - i; - this.componentsCount = n; - this.bitsPerComponent = 8; - return; - } - } - throw new JpxError('No size marker found in JPX stream'); - } - parseCodestream(e, t, a) { - const n = {}; - let s = !1; - try { - let o = t; - for (; o + 1 < a; ) { - const t = (0, i.readUint16)(e, o); - o += 2; - let a, - c, - l, - h, - u, - d, - f = 0; - switch (t) { - case 65359: - n.mainHeader = !0; - break; - case 65497: - break; - case 65361: - f = (0, i.readUint16)(e, o); - const g = {}; - g.Xsiz = (0, i.readUint32)(e, o + 4); - g.Ysiz = (0, i.readUint32)(e, o + 8); - g.XOsiz = (0, i.readUint32)(e, o + 12); - g.YOsiz = (0, i.readUint32)(e, o + 16); - g.XTsiz = (0, i.readUint32)(e, o + 20); - g.YTsiz = (0, i.readUint32)(e, o + 24); - g.XTOsiz = (0, i.readUint32)(e, o + 28); - g.YTOsiz = (0, i.readUint32)(e, o + 32); - const p = (0, i.readUint16)(e, o + 36); - g.Csiz = p; - const m = []; - a = o + 38; - for (let t = 0; t < p; t++) { - const t = { - precision: 1 + (127 & e[a]), - isSigned: !!(128 & e[a]), - XRsiz: e[a + 1], - YRsiz: e[a + 2], - }; - a += 3; - calculateComponentDimensions(t, g); - m.push(t); - } - n.SIZ = g; - n.components = m; - calculateTileGrids(n, m); - n.QCC = []; - n.COC = []; - break; - case 65372: - f = (0, i.readUint16)(e, o); - const b = {}; - a = o + 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); - } - b.noQuantization = 8 === h; - b.scalarExpounded = u; - b.guardBits = c >> 5; - l = []; - for (; a < f + o; ) { - const t = {}; - if (8 === h) { - t.epsilon = e[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 (n.mainHeader) n.QCD = b; - else { - n.currentTile.QCD = b; - n.currentTile.QCC = []; - } - break; - case 65373: - f = (0, i.readUint16)(e, o); - const y = {}; - a = o + 2; - let w; - if (n.SIZ.Csiz < 257) w = e[a++]; - else { - w = (0, i.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 < f + o; ) { - const t = {}; - if (8 === h) { - t.epsilon = e[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; - n.mainHeader ? (n.QCC[w] = y) : (n.currentTile.QCC[w] = y); - break; - case 65362: - f = (0, i.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, i.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 C = e[a++]; - S.selectiveArithmeticCodingBypass = !!(1 & C); - S.resetContextProbabilities = !!(2 & C); - S.terminationOnEachCodingPass = !!(4 & C); - S.verticallyStripe = !!(8 & C); - S.predictableTermination = !!(16 & C); - S.segmentationSymbolUsed = !!(32 & C); - S.reversibleTransformation = e[a++]; - if (S.entropyCoderWithCustomPrecincts) { - const t = []; - for (; a < f + o; ) { - const r = e[a++]; - t.push({ PPx: 15 & r, PPy: r >> 4 }); - } - S.precinctsSizes = t; - } - const k = []; - S.selectiveArithmeticCodingBypass && - k.push('selectiveArithmeticCodingBypass'); - S.terminationOnEachCodingPass && k.push('terminationOnEachCodingPass'); - S.verticallyStripe && k.push('verticallyStripe'); - S.predictableTermination && k.push('predictableTermination'); - if (k.length > 0) { - s = !0; - (0, r.warn)(`JPX: Unsupported COD options (${k.join(', ')}).`); - } - if (n.mainHeader) n.COD = S; - else { - n.currentTile.COD = S; - n.currentTile.COC = []; - } - break; - case 65424: - f = (0, i.readUint16)(e, o); - d = {}; - d.index = (0, i.readUint16)(e, o + 2); - d.length = (0, i.readUint32)(e, o + 4); - d.dataEnd = d.length + o - 2; - d.partIndex = e[o + 8]; - d.partsCount = e[o + 9]; - n.mainHeader = !1; - if (0 === d.partIndex) { - d.COD = n.COD; - d.COC = n.COC.slice(0); - d.QCD = n.QCD; - d.QCC = n.QCC.slice(0); - } - n.currentTile = d; - break; - case 65427: - d = n.currentTile; - if (0 === d.partIndex) { - initializeTile(n, d.index); - buildPackets(n); - } - f = d.dataEnd - o; - parseTilePackets(n, 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, i.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, - i = []; - for (let t = 0, n = e.tiles.length; t < n; t++) { - const n = e.tiles[t], - s = []; - for (let t = 0; t < r; t++) s[t] = transformTile(e, n, t); - const o = s[0], - c = new Uint8ClampedArray(o.items.length * r), - l = { left: o.left, top: o.top, width: o.width, height: o.height, items: c }; - let h, - u, - d, - f, - g, - p, - m, - b = 0; - if (n.codingStyleDefaultParameters.multipleComponentTransform) { - const e = 4 === r, - t = s[0].items, - i = s[1].items, - o = s[2].items, - l = e ? s[3].items : null; - h = a[0].precision - 8; - u = 0.5 + (128 << h); - const y = n.components[0], - w = r - 3; - f = t.length; - if (y.codingStyleParameters.reversibleTransformation) - for (d = 0; d < f; d++, b += w) { - g = t[d] + u; - p = i[d]; - m = o[d]; - const e = g - ((m + p) >> 2); - c[b++] = (e + m) >> h; - c[b++] = e >> h; - c[b++] = (e + p) >> h; - } - else - for (d = 0; d < f; d++, b += w) { - g = t[d] + u; - p = i[d]; - m = o[d]; - c[b++] = (g + 1.402 * m) >> h; - c[b++] = (g - 0.34413 * p - 0.71414 * m) >> h; - c[b++] = (g + 1.772 * p) >> h; - } - if (e) for (d = 0, b = 3; d < f; d++, b += 4) c[b] = (l[d] + u) >> h; - } else - for (let e = 0; e < r; e++) { - const t = s[e].items; - h = a[e].precision - 8; - u = 0.5 + (128 << h); - for (b = e, d = 0, f = t.length; d < f; d++) { - c[b] = (t[d] + u) >> h; - b += r; - } - } - i.push(l); - } - return i; - })(n); - this.width = n.SIZ.Xsiz - n.SIZ.XOsiz; - this.height = n.SIZ.Ysiz - n.SIZ.YOsiz; - this.componentsCount = n.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 i; - const n = Math.ceil((a.Xsiz - a.XTOsiz) / a.XTsiz), - s = Math.ceil((a.Ysiz - a.YTOsiz) / a.YTsiz); - for (let e = 0; e < s; e++) - for (let t = 0; t < n; t++) { - i = {}; - i.tx0 = Math.max(a.XTOsiz + t * a.XTsiz, a.XOsiz); - i.ty0 = Math.max(a.YTOsiz + e * a.YTsiz, a.YOsiz); - i.tx1 = Math.min(a.XTOsiz + (t + 1) * a.XTsiz, a.Xsiz); - i.ty1 = Math.min(a.YTOsiz + (e + 1) * a.YTsiz, a.Ysiz); - i.width = i.tx1 - i.tx0; - i.height = i.ty1 - i.ty0; - i.components = []; - r.push(i); - } - e.tiles = r; - for (let e = 0, n = a.Csiz; e < n; e++) { - const a = t[e]; - for (let t = 0, n = r.length; t < n; t++) { - const n = {}; - i = r[t]; - n.tcx0 = Math.ceil(i.tx0 / a.XRsiz); - n.tcy0 = Math.ceil(i.ty0 / a.YRsiz); - n.tcx1 = Math.ceil(i.tx1 / a.XRsiz); - n.tcy1 = Math.ceil(i.ty1 / a.YRsiz); - n.width = n.tcx1 - n.tcx0; - n.height = n.tcy1 - n.tcy0; - i.components[e] = n; - } - } - } - function getBlocksDimensions(e, t, a) { - const r = t.codingStyleParameters, - i = {}; - if (r.entropyCoderWithCustomPrecincts) { - i.PPx = r.precinctsSizes[a].PPx; - i.PPy = r.precinctsSizes[a].PPy; - } else { - i.PPx = 15; - i.PPy = 15; - } - i.xcb_ = a > 0 ? Math.min(r.xcb, i.PPx - 1) : Math.min(r.xcb, i.PPx); - i.ycb_ = a > 0 ? Math.min(r.ycb, i.PPy - 1) : Math.min(r.ycb, i.PPy); - return i; - } - function buildPrecincts(e, t, a) { - const r = 1 << a.PPx, - i = 1 << a.PPy, - n = 0 === t.resLevel, - s = 1 << (a.PPx + (n ? 0 : -1)), - o = 1 << (a.PPy + (n ? 0 : -1)), - c = t.trx1 > t.trx0 ? Math.ceil(t.trx1 / r) - Math.floor(t.trx0 / r) : 0, - l = t.try1 > t.try0 ? Math.ceil(t.try1 / i) - Math.floor(t.try0 / i) : 0, - h = c * l; - t.precinctParameters = { - precinctWidth: r, - precinctHeight: i, - numprecinctswide: c, - numprecinctshigh: l, - numprecincts: h, - precinctWidthInSubband: s, - precinctHeightInSubband: o, - }; - } - function buildCodeblocks(e, t, a) { - const r = a.xcb_, - i = a.ycb_, - n = 1 << r, - s = 1 << i, - o = t.tbx0 >> r, - c = t.tby0 >> i, - l = (t.tbx1 + n - 1) >> r, - h = (t.tby1 + s - 1) >> i, - u = t.resolution.precinctParameters, - d = [], - f = []; - let g, p, m, b; - for (p = c; p < h; p++) - for (g = o; g < l; g++) { - m = { - cbx: g, - cby: p, - tbx0: n * g, - tby0: s * p, - tbx1: n * (g + 1), - tby1: s * (p + 1), - }; - m.tbx0_ = Math.max(t.tbx0, m.tbx0); - m.tby0_ = Math.max(t.tby0, m.tby0); - m.tbx1_ = Math.min(t.tbx1, m.tbx1); - m.tby1_ = Math.min(t.tby1, m.tby1); - b = - Math.floor((m.tbx0_ - t.tbx0) / u.precinctWidthInSubband) + - Math.floor((m.tby0_ - t.tby0) / u.precinctHeightInSubband) * u.numprecinctswide; - m.precinctNumber = b; - m.subbandType = t.type; - m.Lblock = 3; - if (m.tbx1_ <= m.tbx0_ || m.tby1_ <= m.tby0_) continue; - d.push(m); - let e = f[b]; - if (void 0 !== e) { - g < e.cbxMin ? (e.cbxMin = g) : g > e.cbxMax && (e.cbxMax = g); - p < e.cbyMin ? (e.cbxMin = p) : p > e.cbyMax && (e.cbyMax = p); - } else f[b] = e = { cbxMin: g, cbyMin: p, cbxMax: g, cbyMax: p }; - m.precinct = e; - } - t.codeblockParameters = { - codeblockWidth: r, - codeblockHeight: i, - numcodeblockwide: l - o + 1, - numcodeblockhigh: h - c + 1, - }; - t.codeblocks = d; - t.precincts = f; - } - function createPacket(e, t, a) { - const r = [], - i = e.subbands; - for (let e = 0, a = i.length; e < a; e++) { - const a = i[e].codeblocks; - for (let e = 0, i = a.length; e < i; e++) { - const i = a[e]; - i.precinctNumber === t && r.push(i); - } - } - return { layerNumber: a, codeblocks: r }; - } - function LayerResolutionComponentPositionIterator(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = r.codingStyleDefaultParameters.layersCount, - n = t.Csiz; - let s = 0; - for (let e = 0; e < n; e++) - s = Math.max(s, r.components[e].codingStyleParameters.decompositionLevelsCount); - let o = 0, - c = 0, - l = 0, - h = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; o < i; o++) { - for (; c <= s; c++) { - for (; l < n; l++) { - const e = r.components[l]; - if (c > e.codingStyleParameters.decompositionLevelsCount) continue; - const t = e.resolutions[c], - a = t.precinctParameters.numprecincts; - for (; h < a; ) { - const e = createPacket(t, h, o); - h++; - return e; - } - h = 0; - } - l = 0; - } - c = 0; - } - throw new JpxError('Out of packets'); - }; - } - function ResolutionLayerComponentPositionIterator(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = r.codingStyleDefaultParameters.layersCount, - n = t.Csiz; - let s = 0; - for (let e = 0; e < n; e++) - s = Math.max(s, r.components[e].codingStyleParameters.decompositionLevelsCount); - let o = 0, - c = 0, - l = 0, - h = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; o <= s; o++) { - for (; c < i; c++) { - for (; l < n; l++) { - const e = r.components[l]; - if (o > e.codingStyleParameters.decompositionLevelsCount) continue; - const t = e.resolutions[o], - a = t.precinctParameters.numprecincts; - for (; h < a; ) { - const e = createPacket(t, h, c); - h++; - return e; - } - h = 0; - } - l = 0; - } - c = 0; - } - throw new JpxError('Out of packets'); - }; - } - function ResolutionPositionComponentLayerIterator(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = r.codingStyleDefaultParameters.layersCount, - n = t.Csiz; - let s, - o, - c, - l, - h = 0; - for (c = 0; c < n; c++) { - const e = r.components[c]; - h = Math.max(h, e.codingStyleParameters.decompositionLevelsCount); - } - const u = new Int32Array(h + 1); - for (o = 0; o <= h; ++o) { - let e = 0; - for (c = 0; c < n; ++c) { - const t = r.components[c].resolutions; - o < t.length && (e = Math.max(e, t[o].precinctParameters.numprecincts)); - } - u[o] = e; - } - s = 0; - o = 0; - c = 0; - l = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; o <= h; o++) { - for (; l < u[o]; l++) { - for (; c < n; c++) { - const e = r.components[c]; - if (o > e.codingStyleParameters.decompositionLevelsCount) continue; - const t = e.resolutions[o], - a = t.precinctParameters.numprecincts; - if (!(l >= a)) { - for (; s < i; ) { - const e = createPacket(t, l, s); - s++; - return e; - } - s = 0; - } - } - c = 0; - } - l = 0; - } - throw new JpxError('Out of packets'); - }; - } - function PositionComponentResolutionLayerIterator(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = r.codingStyleDefaultParameters.layersCount, - n = t.Csiz, - s = getPrecinctSizesInImageScale(r), - o = s; - let c = 0, - l = 0, - h = 0, - u = 0, - d = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; d < o.maxNumHigh; d++) { - for (; u < o.maxNumWide; u++) { - for (; h < n; h++) { - const e = r.components[h], - t = e.codingStyleParameters.decompositionLevelsCount; - for (; l <= t; l++) { - const t = e.resolutions[l], - a = s.components[h].resolutions[l], - r = getPrecinctIndexIfExist(u, d, a, o, t); - if (null !== r) { - for (; c < i; ) { - const e = createPacket(t, r, c); - c++; - return e; - } - c = 0; - } - } - l = 0; - } - h = 0; - } - u = 0; - } - throw new JpxError('Out of packets'); - }; - } - function ComponentPositionResolutionLayerIterator(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = r.codingStyleDefaultParameters.layersCount, - n = t.Csiz, - s = getPrecinctSizesInImageScale(r); - let o = 0, - c = 0, - l = 0, - h = 0, - u = 0; - this.nextPacket = function JpxImage_nextPacket() { - for (; l < n; ++l) { - const e = r.components[l], - t = s.components[l], - a = e.codingStyleParameters.decompositionLevelsCount; - for (; u < t.maxNumHigh; u++) { - for (; h < t.maxNumWide; h++) { - for (; c <= a; c++) { - const a = e.resolutions[c], - r = t.resolutions[c], - n = getPrecinctIndexIfExist(h, u, r, t, a); - if (null !== n) { - for (; o < i; ) { - const e = createPacket(a, n, o); - o++; - return e; - } - o = 0; - } - } - c = 0; - } - h = 0; - } - u = 0; - } - throw new JpxError('Out of packets'); - }; - } - function getPrecinctIndexIfExist(e, t, a, r, i) { - const n = e * r.minWidth, - s = t * r.minHeight; - if (n % a.width != 0 || s % a.height != 0) return null; - const o = (s / a.width) * i.precinctParameters.numprecinctswide; - return n / a.height + o; - } - function getPrecinctSizesInImageScale(e) { - const t = e.components.length; - let a = Number.MAX_VALUE, - r = Number.MAX_VALUE, - i = 0, - n = 0; - const s = new Array(t); - for (let o = 0; o < t; o++) { - const t = e.components[o], - c = t.codingStyleParameters.decompositionLevelsCount, - l = new Array(c + 1); - let h = Number.MAX_VALUE, - u = Number.MAX_VALUE, - d = 0, - f = 0, - g = 1; - for (let e = c; e >= 0; --e) { - const a = t.resolutions[e], - r = g * a.precinctParameters.precinctWidth, - i = g * a.precinctParameters.precinctHeight; - h = Math.min(h, r); - u = Math.min(u, i); - d = Math.max(d, a.precinctParameters.numprecinctswide); - f = Math.max(f, a.precinctParameters.numprecinctshigh); - l[e] = { width: r, height: i }; - g <<= 1; - } - a = Math.min(a, h); - r = Math.min(r, u); - i = Math.max(i, d); - n = Math.max(n, f); - s[o] = { resolutions: l, minWidth: h, minHeight: u, maxNumWide: d, maxNumHigh: f }; - } - return { components: s, minWidth: a, minHeight: r, maxNumWide: i, maxNumHigh: n }; - } - function buildPackets(e) { - const t = e.SIZ, - a = e.currentTile.index, - r = e.tiles[a], - i = t.Csiz; - for (let e = 0; e < i; e++) { - const t = r.components[e], - a = t.codingStyleParameters.decompositionLevelsCount, - i = [], - n = []; - for (let e = 0; e <= a; e++) { - const r = getBlocksDimensions(0, t, e), - s = {}, - o = 1 << (a - e); - s.trx0 = Math.ceil(t.tcx0 / o); - s.try0 = Math.ceil(t.tcy0 / o); - s.trx1 = Math.ceil(t.tcx1 / o); - s.try1 = Math.ceil(t.tcy1 / o); - s.resLevel = e; - buildPrecincts(0, s, r); - i.push(s); - let c; - if (0 === e) { - c = {}; - c.type = 'LL'; - c.tbx0 = Math.ceil(t.tcx0 / o); - c.tby0 = Math.ceil(t.tcy0 / o); - c.tbx1 = Math.ceil(t.tcx1 / o); - c.tby1 = Math.ceil(t.tcy1 / o); - c.resolution = s; - buildCodeblocks(0, c, r); - n.push(c); - s.subbands = [c]; - } else { - const i = 1 << (a - e + 1), - o = []; - c = {}; - c.type = 'HL'; - c.tbx0 = Math.ceil(t.tcx0 / i - 0.5); - c.tby0 = Math.ceil(t.tcy0 / i); - c.tbx1 = Math.ceil(t.tcx1 / i - 0.5); - c.tby1 = Math.ceil(t.tcy1 / i); - c.resolution = s; - buildCodeblocks(0, c, r); - n.push(c); - o.push(c); - c = {}; - c.type = 'LH'; - c.tbx0 = Math.ceil(t.tcx0 / i); - c.tby0 = Math.ceil(t.tcy0 / i - 0.5); - c.tbx1 = Math.ceil(t.tcx1 / i); - c.tby1 = Math.ceil(t.tcy1 / i - 0.5); - c.resolution = s; - buildCodeblocks(0, c, r); - n.push(c); - o.push(c); - c = {}; - c.type = 'HH'; - c.tbx0 = Math.ceil(t.tcx0 / i - 0.5); - c.tby0 = Math.ceil(t.tcy0 / i - 0.5); - c.tbx1 = Math.ceil(t.tcx1 / i - 0.5); - c.tby1 = Math.ceil(t.tcy1 / i - 0.5); - c.resolution = s; - buildCodeblocks(0, c, r); - n.push(c); - o.push(c); - s.subbands = o; - } - } - t.resolutions = i; - t.subbands = n; - } - const n = r.codingStyleDefaultParameters.progressionOrder; - switch (n) { - case 0: - r.packetsIterator = new LayerResolutionComponentPositionIterator(e); - break; - case 1: - r.packetsIterator = new ResolutionLayerComponentPositionIterator(e); - break; - case 2: - r.packetsIterator = new ResolutionPositionComponentLayerIterator(e); - break; - case 3: - r.packetsIterator = new PositionComponentResolutionLayerIterator(e); - break; - case 4: - r.packetsIterator = new ComponentPositionResolutionLayerIterator(e); - break; - default: - throw new JpxError(`Unsupported progression order ${n}`); - } - } - function parseTilePackets(e, t, a, r) { - let n, - s = 0, - o = 0, - c = !1; - function readBits(e) { - for (; o < e; ) { - const e = t[a + s]; - s++; - if (c) { - n = (n << 7) | e; - o += 7; - c = !1; - } else { - n = (n << 8) | e; - o += 8; - } - 255 === e && (c = !0); - } - o -= e; - return (n >>> o) & ((1 << e) - 1); - } - function skipMarkerIfEqual(e) { - if (255 === t[a + s - 1] && t[a + s] === e) { - skipBytes(1); - return !0; - } - if (255 === t[a + s] && t[a + s + 1] === e) { - skipBytes(2); - return !0; - } - return !1; - } - function skipBytes(e) { - s += e; - } - function alignToByte() { - o = 0; - if (c) { - s++; - c = !1; - } - } - function readCodingpasses() { - if (0 === readBits(1)) return 1; - if (0 === readBits(1)) return 2; - let e = readBits(2); - if (e < 3) return e + 3; - e = readBits(5); - if (e < 31) return e + 6; - e = readBits(7); - return e + 37; - } - const l = e.currentTile.index, - h = e.tiles[l], - u = e.COD.sopMarkerUsed, - d = e.COD.ephMarkerUsed, - f = h.packetsIterator; - for (; s < r; ) { - alignToByte(); - u && skipMarkerIfEqual(145) && skipBytes(4); - const e = f.nextPacket(); - if (!readBits(1)) continue; - const r = e.layerNumber, - n = []; - let o; - for (let t = 0, a = e.codeblocks.length; t < a; t++) { - o = e.codeblocks[t]; - let a = o.precinct; - const s = o.cbx - a.cbxMin, - c = o.cby - a.cbyMin; - let l, - h, - u = !1, - d = !1; - if (void 0 !== o.included) u = !!readBits(1); - else { - a = o.precinct; - let e; - if (void 0 !== a.inclusionTree) e = a.inclusionTree; - else { - const t = a.cbxMax - a.cbxMin + 1, - i = a.cbyMax - a.cbyMin + 1; - e = new InclusionTree(t, i, r); - h = new TagTree(t, i); - a.inclusionTree = e; - a.zeroBitPlanesTree = h; - for (let e = 0; e < r; e++) - if (0 !== readBits(1)) throw new JpxError('Invalid tag tree'); - } - if (e.reset(s, c, r)) - for (;;) { - if (!readBits(1)) { - e.incrementValue(r); - break; - } - l = !e.nextLevel(); - if (l) { - o.included = !0; - u = d = !0; - break; - } - } - } - if (!u) continue; - if (d) { - h = a.zeroBitPlanesTree; - h.reset(s, c); - for (;;) - if (readBits(1)) { - l = !h.nextLevel(); - if (l) break; - } else h.incrementValue(); - o.zeroBitPlanes = h.value; - } - const f = readCodingpasses(); - for (; readBits(1); ) o.Lblock++; - const g = (0, i.log2)(f), - p = readBits((f < 1 << g ? g - 1 : g) + o.Lblock); - n.push({ codeblock: o, codingpasses: f, dataLength: p }); - } - alignToByte(); - d && skipMarkerIfEqual(146); - for (; n.length > 0; ) { - const e = n.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, i, s, o, c, l) { - const h = r.tbx0, - u = r.tby0, - d = r.tbx1 - r.tbx0, - f = r.codeblocks, - g = 'H' === r.type.charAt(0) ? 1 : 0, - p = 'H' === r.type.charAt(1) ? t : 0; - for (let a = 0, m = f.length; a < m; ++a) { - const m = f[a], - b = m.tbx1_ - m.tbx0_, - y = m.tby1_ - m.tby0_; - if (0 === b || 0 === y) continue; - if (void 0 === m.data) continue; - const w = new BitModel(b, y, m.subbandType, m.zeroBitPlanes, s); - let S = 2; - const x = m.data; - let C, - k, - v, - F = 0, - O = 0; - for (C = 0, k = x.length; C < k; C++) { - v = x[C]; - F += v.end - v.start; - O += v.codingpasses; - } - const T = new Uint8Array(F); - let M = 0; - for (C = 0, k = x.length; C < k; C++) { - v = x[C]; - const e = v.data.subarray(v.start, v.end); - T.set(e, M); - M += e.length; - } - const E = new n.ArithmeticDecoder(T, 0, F); - w.setDecoder(E); - for (C = 0; C < O; C++) { - switch (S) { - case 0: - w.runSignificancePropagationPass(); - break; - case 1: - w.runMagnitudeRefinementPass(); - break; - case 2: - w.runCleanupPass(); - c && w.checkSegmentationSymbol(); - } - l && w.reset(); - S = (S + 1) % 3; - } - let D = m.tbx0_ - h + (m.tby0_ - u) * d; - const N = w.coefficentsSign, - R = w.coefficentsMagnitude, - L = w.bitsDecoded, - _ = o ? 0 : 0.5; - let $, j, U; - M = 0; - const X = 'LL' !== r.type; - for (C = 0; C < y; C++) { - const a = 2 * ((D / d) | 0) * (t - d) + g + p; - for ($ = 0; $ < b; $++) { - j = R[M]; - if (0 !== j) { - j = (j + _) * i; - 0 !== N[M] && (j = -j); - U = L[M]; - const t = X ? a + (D << 1) : D; - e[t] = o && U >= s ? j : j * (1 << (s - U)); - } - D++; - M++; - } - D += d - b; - } - } - } - function transformTile(e, t, a) { - const r = t.components[a], - i = r.codingStyleParameters, - n = r.quantizationParameters, - o = i.decompositionLevelsCount, - c = n.SPqcds, - l = n.scalarExpounded, - h = n.guardBits, - u = i.segmentationSymbolUsed, - d = i.resetContextProbabilities, - f = e.components[a].precision, - g = i.reversibleTransformation, - p = g ? new ReversibleTransform() : new IrreversibleTransform(), - m = []; - let b = 0; - for (let e = 0; e <= o; e++) { - const t = r.resolutions[e], - a = t.trx1 - t.trx0, - i = t.try1 - t.try0, - n = new Float32Array(a * i); - for (let r = 0, i = t.subbands.length; r < i; r++) { - let i, o; - if (l) { - i = c[b].mu; - o = c[b].epsilon; - b++; - } else { - i = c[0].mu; - o = c[0].epsilon + (e > 0 ? 1 - e : 0); - } - const p = t.subbands[r], - m = s[p.type]; - copyCoefficients( - n, - a, - 0, - p, - g ? 1 : 2 ** (f + m - o) * (1 + i / 2048), - h + o - 1, - g, - u, - d, - ); - } - m.push({ width: a, height: i, items: n }); - } - 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 < a; t++) { - const a = r.components[t], - i = void 0 !== e.currentTile.QCC[t] ? e.currentTile.QCC[t] : e.currentTile.QCD; - a.quantizationParameters = i; - const n = void 0 !== e.currentTile.COC[t] ? e.currentTile.COC[t] : e.currentTile.COD; - a.codingStyleParameters = n; - } - r.codingStyleDefaultParameters = e.currentTile.COD; - } - class TagTree { - constructor(e, t) { - const a = (0, i.log2)(Math.max(e, t)) + 1; - this.levels = []; - for (let r = 0; r < a; r++) { - const a = { width: e, height: t, items: [] }; - this.levels.push(a); - e = Math.ceil(e / 2); - t = Math.ceil(t / 2); - } - } - reset(e, t) { - let a, - r = 0, - i = 0; - for (; r < this.levels.length; ) { - a = this.levels[r]; - const n = e + t * a.width; - if (void 0 !== a.items[n]) { - i = a.items[n]; - break; - } - a.index = n; - e >>= 1; - t >>= 1; - r++; - } - r--; - a = this.levels[r]; - a.items[a.index] = i; - 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, i.log2)(Math.max(e, t)) + 1; - this.levels = []; - for (let i = 0; i < r; i++) { - const r = new Uint8Array(e * t); - for (let e = 0, t = r.length; e < t; e++) r[e] = a; - const i = { width: e, height: t, items: r }; - this.levels.push(i); - e = Math.ceil(e / 2); - t = Math.ceil(t / 2); - } - } - reset(e, t, a) { - let r = 0; - for (; r < this.levels.length; ) { - const i = this.levels[r], - n = e + t * i.width; - i.index = n; - const s = i.items[n]; - if (255 === s) break; - if (s > a) { - 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; - } - } - class BitModel { - static UNIFORM_CONTEXT = 17; - static RUNLENGTH_CONTEXT = 18; - static LLAndLHContextsLabel = 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, - ]); - static HLContextLabel = 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, - ]); - static HHContextLabel = 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, - ]); - constructor(e, t, a, r, i) { - this.width = e; - this.height = t; - let n; - n = - 'HH' === a - ? BitModel.HHContextLabel - : 'HL' === a - ? BitModel.HLContextLabel - : BitModel.LLAndLHContextsLabel; - this.contextLabelTable = n; - const s = e * t; - this.neighborsSignificance = new Uint8Array(s); - this.coefficentsSign = new Uint8Array(s); - let o; - o = i > 14 ? new Uint32Array(s) : i > 6 ? new Uint16Array(s) : new Uint8Array(s); - this.coefficentsMagnitude = o; - this.processingFlags = new Uint8Array(s); - const c = new Uint8Array(s); - if (0 !== r) for (let e = 0; e < s; e++) c[e] = r; - this.bitsDecoded = c; - this.reset(); - } - setDecoder(e) { - this.decoder = e; - } - reset() { - this.contexts = new Int8Array(19); - this.contexts[0] = 8; - this.contexts[BitModel.UNIFORM_CONTEXT] = 92; - this.contexts[BitModel.RUNLENGTH_CONTEXT] = 6; - } - setNeighborsSignificance(e, t, a) { - const r = this.neighborsSignificance, - i = this.width, - n = this.height, - s = t > 0, - o = t + 1 < i; - let c; - if (e > 0) { - c = a - i; - s && (r[c - 1] += 16); - o && (r[c + 1] += 16); - r[c] += 4; - } - if (e + 1 < n) { - c = a + i; - s && (r[c - 1] += 16); - o && (r[c + 1] += 16); - r[c] += 4; - } - s && (r[a - 1] += 1); - o && (r[a + 1] += 1); - r[a] |= 128; - } - runSignificancePropagationPass() { - const e = this.decoder, - t = this.width, - a = this.height, - r = this.coefficentsMagnitude, - i = this.coefficentsSign, - n = this.neighborsSignificance, - s = this.processingFlags, - o = this.contexts, - c = this.contextLabelTable, - l = this.bitsDecoded; - for (let h = 0; h < a; h += 4) - for (let u = 0; u < t; u++) { - let d = h * t + u; - for (let f = 0; f < 4; f++, d += t) { - const t = h + f; - if (t >= a) break; - s[d] &= -2; - if (r[d] || !n[d]) continue; - const g = c[n[d]]; - if (e.readBit(o, g)) { - const e = this.decodeSignBit(t, u, d); - i[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, - i = this.height, - n = this.coefficentsMagnitude, - s = this.coefficentsSign; - let o, c, l, h, u, d; - h = t > 0 && 0 !== n[a - 1]; - if (t + 1 < r && 0 !== n[a + 1]) { - l = s[a + 1]; - if (h) { - c = s[a - 1]; - o = 1 - l - c; - } else o = 1 - l - l; - } else if (h) { - c = s[a - 1]; - o = 1 - c - c; - } else o = 0; - const f = 3 * o; - h = e > 0 && 0 !== n[a - r]; - if (e + 1 < i && 0 !== n[a + r]) { - l = s[a + r]; - if (h) { - c = s[a - r]; - o = 1 - l - c + f; - } else o = 1 - l - l + f; - } else if (h) { - c = s[a - r]; - o = 1 - c - c + f; - } else o = f; - if (o >= 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, - i = this.neighborsSignificance, - n = this.contexts, - s = this.bitsDecoded, - o = this.processingFlags, - c = t * a, - l = 4 * t; - for (let a, h = 0; h < c; h = a) { - a = Math.min(c, h + l); - for (let c = 0; c < t; c++) - for (let l = h + c; l < a; l += t) { - if (!r[l] || 0 != (1 & o[l])) continue; - let t = 16; - if (0 != (2 & o[l])) { - o[l] ^= 2; - t = 0 === (127 & i[l]) ? 15 : 14; - } - const a = e.readBit(n, t); - r[l] = (r[l] << 1) | a; - s[l]++; - o[l] |= 1; - } - } - } - runCleanupPass() { - const e = this.decoder, - t = this.width, - a = this.height, - r = this.neighborsSignificance, - i = this.coefficentsMagnitude, - n = this.coefficentsSign, - s = this.contexts, - o = this.contextLabelTable, - c = this.bitsDecoded, - l = this.processingFlags, - h = t, - u = 2 * t, - d = 3 * t; - let f; - for (let g = 0; g < a; g = f) { - f = Math.min(g + 4, a); - const p = g * t, - m = g + 3 < a; - for (let a = 0; a < t; a++) { - const b = p + a; - let y, - w = 0, - S = b, - x = g; - if ( - m && - 0 === l[b] && - 0 === l[b + h] && - 0 === l[b + u] && - 0 === l[b + d] && - 0 === r[b] && - 0 === r[b + h] && - 0 === r[b + u] && - 0 === r[b + d] - ) { - if (!e.readBit(s, BitModel.RUNLENGTH_CONTEXT)) { - c[b]++; - c[b + h]++; - c[b + u]++; - c[b + d]++; - continue; - } - w = - (e.readBit(s, BitModel.UNIFORM_CONTEXT) << 1) | - e.readBit(s, BitModel.UNIFORM_CONTEXT); - if (0 !== w) { - x = g + w; - S += w * t; - } - y = this.decodeSignBit(x, a, S); - n[S] = y; - i[S] = 1; - this.setNeighborsSignificance(x, a, S); - l[S] |= 2; - S = b; - for (let e = g; e <= x; e++, S += t) c[S]++; - w++; - } - for (x = g + w; x < f; x++, S += t) { - if (i[S] || 0 != (1 & l[S])) continue; - const t = o[r[S]]; - if (1 === e.readBit(s, t)) { - y = this.decodeSignBit(x, a, S); - n[S] = y; - i[S] = 1; - this.setNeighborsSignificance(x, a, S); - l[S] |= 2; - } - c[S]++; - } - } - } - } - checkSegmentationSymbol() { - const e = this.decoder, - t = this.contexts; - if ( - 10 !== - ((e.readBit(t, BitModel.UNIFORM_CONTEXT) << 3) | - (e.readBit(t, BitModel.UNIFORM_CONTEXT) << 2) | - (e.readBit(t, BitModel.UNIFORM_CONTEXT) << 1) | - e.readBit(t, BitModel.UNIFORM_CONTEXT)) - ) - throw new JpxError('Invalid segmentation symbol'); - } - } - class Transform { - constructor() { - this.constructor === Transform && (0, r.unreachable)('Cannot initialize Transform.'); - } - calculate(e, t, a) { - let r = e[0]; - for (let i = 1, n = e.length; i < n; i++) r = this.iterate(r, e[i], t, a); - return r; - } - extend(e, t, a) { - let r = t - 1, - i = t + 1, - n = t + a - 2, - s = t + a; - e[r--] = e[i++]; - e[s++] = e[n--]; - e[r--] = e[i++]; - e[s++] = e[n--]; - e[r--] = e[i++]; - e[s++] = e[n--]; - e[r] = e[i]; - e[s] = e[n]; - } - filter(e, t, a) { - (0, r.unreachable)('Abstract method `filter` called'); - } - iterate(e, t, a, r) { - const i = e.width, - n = e.height; - let s = e.items; - const o = t.width, - c = t.height, - l = t.items; - let h, u, d, f, g, p; - for (d = 0, h = 0; h < n; h++) { - f = 2 * h * o; - for (u = 0; u < i; u++, d++, f += 2) l[f] = s[d]; - } - s = e.items = null; - const m = new Float32Array(o + 8); - if (1 === o) { - if (0 != (1 & a)) for (p = 0, d = 0; p < c; p++, d += o) l[d] *= 0.5; - } else - for (p = 0, d = 0; p < c; p++, d += o) { - m.set(l.subarray(d, d + o), 4); - this.extend(m, 4, o); - this.filter(m, 4, o); - l.set(m.subarray(4, 4 + o), d); - } - let b = 16; - const y = []; - for (h = 0; h < b; h++) y.push(new Float32Array(c + 8)); - let w, - S = 0; - e = 4 + c; - if (1 === c) { - if (0 != (1 & r)) for (g = 0; g < o; g++) l[g] *= 0.5; - } else - for (g = 0; g < o; g++) { - if (0 === S) { - b = Math.min(o - g, b); - for (d = g, f = 4; f < e; d += o, f++) - for (w = 0; w < b; w++) y[w][f] = l[d + w]; - S = b; - } - S--; - const t = y[S]; - this.extend(t, 4, c); - this.filter(t, 4, c); - if (0 === S) { - d = g - b + 1; - for (f = 4; f < e; d += o, f++) for (w = 0; w < b; w++) l[d + w] = y[w][f]; - } - } - return { width: o, height: c, items: l }; - } - } - class IrreversibleTransform extends Transform { - filter(e, t, a) { - const r = a >> 1; - let i, n, s, o; - const c = -1.586134342059924, - l = -0.052980118572961, - h = 0.882911075530934, - u = 0.443506852043971, - d = 1.230174104914001; - i = (t |= 0) - 3; - for (n = r + 4; n--; i += 2) e[i] *= 0.8128930661159609; - i = t - 2; - s = u * e[i - 1]; - for (n = r + 3; n--; i += 2) { - o = u * e[i + 1]; - e[i] = d * e[i] - s - o; - if (!n--) break; - i += 2; - s = u * e[i + 1]; - e[i] = d * e[i] - s - o; - } - i = t - 1; - s = h * e[i - 1]; - for (n = r + 2; n--; i += 2) { - o = h * e[i + 1]; - e[i] -= s + o; - if (!n--) break; - i += 2; - s = h * e[i + 1]; - e[i] -= s + o; - } - i = t; - s = l * e[i - 1]; - for (n = r + 1; n--; i += 2) { - o = l * e[i + 1]; - e[i] -= s + o; - if (!n--) break; - i += 2; - s = l * e[i + 1]; - e[i] -= s + o; - } - if (0 !== r) { - i = t + 1; - s = c * e[i - 1]; - for (n = r; n--; i += 2) { - o = c * e[i + 1]; - e[i] -= s + o; - if (!n--) break; - i += 2; - s = c * e[i + 1]; - e[i] -= s + o; - } - } - } - } - class ReversibleTransform extends Transform { - filter(e, t, a) { - const r = a >> 1; - let i, n; - for (i = t |= 0, n = r + 1; n--; i += 2) e[i] -= (e[i - 1] + e[i + 1] + 2) >> 2; - for (i = t + 1, n = r; n--; i += 2) e[i] += (e[i - 1] + e[i + 1]) >> 1; - } - } - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.LZWStream = void 0; - var r = a(18); - 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, - i = { - 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) { - i.dictionaryValues[e] = e; - i.dictionaryLengths[e] = 1; - } - this.lzwState = i; - } - readBits(e) { - let t = this.bitsCached, - a = this.cachedData; - for (; t < e; ) { - const e = this.str.getByte(); - if (-1 === e) { - this.eof = !0; - return null; - } - a = (a << 8) | e; - t += 8; - } - this.bitsCached = t -= e; - this.cachedData = a; - this.lastCode = null; - return (a >>> t) & ((1 << e) - 1); - } - readBlock() { - let e, - t, - a, - r = 1024; - const i = this.lzwState; - if (!i) return; - const n = i.earlyChange; - let s = i.nextCode; - const o = i.dictionaryValues, - c = i.dictionaryLengths, - l = i.dictionaryPrevCodes; - let h = i.codeLength, - u = i.prevCode; - const d = i.currentSequence; - let f = i.currentSequenceLength, - g = 0, - p = this.bufferLength, - m = this.ensureBuffer(this.bufferLength + r); - for (e = 0; e < 512; e++) { - const e = this.readBits(h), - i = f > 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 < s) { - f = c[e]; - for (t = f - 1, a = e; t >= 0; t--) { - d[t] = o[a]; - a = l[a]; - } - } else d[f++] = d[0]; - } - if (i) { - l[s] = u; - c[s] = c[u] + 1; - o[s] = d[0]; - s++; - h = - (s + n) & (s + n - 1) - ? h - : 0 | Math.min(Math.log(s + n) / 0.6931471805599453 + 1, 12); - } - u = e; - g += f; - if (r < g) { - do { - r += 512; - } while (r < g); - m = this.ensureBuffer(this.bufferLength + r); - } - for (t = 0; t < f; t++) m[p++] = d[t]; - } - i.nextCode = s; - i.codeLength = h; - i.prevCode = u; - i.currentSequenceLength = f; - this.bufferLength = p; - } - } - t.LZWStream = LZWStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.PredictorStream = void 0; - var r = a(18), - i = a(4), - n = a(2); - class PredictorStream extends r.DecodeStream { - constructor(e, t, a) { - super(t); - if (!(a instanceof i.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 n.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, - i = this.colors, - n = this.str.getBytes(e); - this.eof = !n.length; - if (this.eof) return; - let s, - o = 0, - c = 0, - l = 0, - h = 0, - u = t; - if (1 === r && 1 === i) - for (s = 0; s < e; ++s) { - let e = n[s] ^ o; - e ^= e >> 1; - e ^= e >> 2; - e ^= e >> 4; - o = (1 & e) << 7; - a[u++] = e; - } - else if (8 === r) { - for (s = 0; s < i; ++s) a[u++] = n[s]; - for (; s < e; ++s) { - a[u] = a[u - i] + n[s]; - u++; - } - } else if (16 === r) { - const t = 2 * i; - for (s = 0; s < t; ++s) a[u++] = n[s]; - for (; s < e; s += 2) { - const e = - ((255 & n[s]) << 8) + - (255 & n[s + 1]) + - ((255 & a[u - t]) << 8) + - (255 & a[u - t + 1]); - a[u++] = (e >> 8) & 255; - a[u++] = 255 & e; - } - } else { - const e = new Uint8Array(i + 1), - u = (1 << r) - 1; - let d = 0, - f = t; - const g = this.columns; - for (s = 0; s < g; ++s) - for (let t = 0; t < i; ++t) { - if (l < r) { - o = (o << 8) | (255 & n[d++]); - l += 8; - } - e[t] = (e[t] + (o >> (l - r))) & u; - l -= r; - c = (c << r) | e[t]; - h += r; - if (h >= 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 i = this.bufferLength, - s = this.ensureBuffer(i + e); - let o = s.subarray(i - e, i); - 0 === o.length && (o = new Uint8Array(e)); - let c, - l, - h, - u = i; - switch (a) { - case 0: - for (c = 0; c < e; ++c) s[u++] = r[c]; - break; - case 1: - for (c = 0; c < t; ++c) s[u++] = r[c]; - for (; c < e; ++c) { - s[u] = (s[u - t] + r[c]) & 255; - u++; - } - break; - case 2: - for (c = 0; c < e; ++c) s[u++] = (o[c] + r[c]) & 255; - break; - case 3: - for (c = 0; c < t; ++c) s[u++] = (o[c] >> 1) + r[c]; - for (; c < e; ++c) { - s[u] = (((o[c] + s[u - t]) >> 1) + r[c]) & 255; - u++; - } - break; - case 4: - for (c = 0; c < t; ++c) { - l = o[c]; - h = r[c]; - s[u++] = l + h; - } - for (; c < e; ++c) { - l = o[c]; - const e = o[c - t], - a = s[u - t], - i = a + l - e; - let n = i - a; - n < 0 && (n = -n); - let d = i - l; - d < 0 && (d = -d); - let f = i - e; - f < 0 && (f = -f); - h = r[c]; - s[u++] = n <= d && n <= f ? a + h : d <= f ? l + h : e + h; - } - break; - default: - throw new n.FormatError(`Unsupported predictor: ${a}`); - } - this.bufferLength += e; - } - } - t.PredictorStream = PredictorStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.RunLengthStream = void 0; - var r = a(18); - 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 i = e[1]; - t = this.ensureBuffer(a + r + 1); - for (let e = 0; e < r; e++) t[a++] = i; - } - this.bufferLength = a; - } - } - t.RunLengthStream = RunLengthStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Font = t.ErrorFont = void 0; - var r = a(2), - i = a(35), - n = 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(14), - m = a(47), - b = a(3), - y = a(8), - w = a(48); - const S = [ - [57344, 63743], - [1048576, 1114109], - ], - x = 1e3, - C = [ - 'ascent', - 'bbox', - 'black', - 'bold', - 'charProcOperatorList', - 'composite', - 'cssFontInfo', - 'data', - 'defaultVMetrics', - 'defaultWidth', - 'descent', - 'fallbackName', - 'fontMatrix', - 'isInvalidPDFjsFont', - 'isType3Font', - 'italic', - 'loadedName', - 'mimetype', - 'missingFile', - 'name', - 'remeasure', - 'subtype', - 'type', - 'vertical', - ], - k = [ - '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 = 0.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, i, n, s, o, c) { - this.originalCharCode = e; - this.fontChar = t; - this.unicode = a; - this.accent = r; - this.width = i; - this.vmetric = n; - this.operatorListId = s; - this.isSpace = o; - this.isInFont = c; - } - get category() { - return (0, r.shadow)( - this, - 'category', - (0, s.getCharUnicodeCategory)(this.unicode), - !0, - ); - } - } - 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: i }) { - let n, 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) - ) - n = i ? 'CIDFontType2' : 'TrueType'; - else if ( - (function isOpenTypeFile(e) { - const t = e.peekBytes(4); - return 'OTTO' === (0, r.bytesToString)(t); - })(e) - ) - n = i ? '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) - ) - n = i ? '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 (i) { - n = 'CIDFontType0'; - s = 'CIDFontType0C'; - } else { - n = 'MMType1' === t ? 'MMType1' : 'Type1'; - s = 'Type1C'; - } - else { - (0, r.warn)('getFontFileType: Unable to detect correct font file Type/Subtype.'); - n = t; - s = a; - } - return [n, s]; - } - function applyStandardFontGlyphMap(e, t) { - for (const a in t) e[+a] = t[a]; - } - function buildToFontChar(e, t, a) { - const r = []; - let i; - for (let a = 0, n = e.length; a < n; a++) { - i = (0, s.getUnicodeForGlyph)(e[a], t); - -1 !== i && (r[a] = i); - } - for (const e in a) { - i = (0, s.getUnicodeForGlyph)(a[e], t); - -1 !== i && (r[+e] = i); - } - return r; - } - function isMacNameRecord(e) { - return 1 === e.platform && 0 === e.encoding && 0 === e.language; - } - function isWinNameRecord(e) { - return 3 === e.platform && 1 === e.encoding && 1033 === e.language; - } - function convertCidString(e, t, a = !1) { - switch (t.length) { - case 1: - return t.charCodeAt(0); - case 2: - return (t.charCodeAt(0) << 8) | t.charCodeAt(1); - } - const i = `Unsupported CID string (charCode ${e}): "${t}".`; - if (a) throw new r.FormatError(i); - (0, r.warn)(i); - return t; - } - function adjustMapping(e, t, a, i) { - const n = Object.create(null), - s = new Map(), - o = [], - c = new Set(); - let l = 0; - let h = S[l][0], - u = S[l][1]; - for (let f in e) { - f |= 0; - let g = e[f]; - if (!t(g)) continue; - if (h > u) { - l++; - if (l >= S.length) { - (0, r.warn)('Ran out of space in font private use area.'); - break; - } - h = S[l][0]; - u = S[l][1]; - } - const p = h++; - 0 === g && (g = a); - let m = i.get(f); - 'string' == typeof m && (m = m.codePointAt(0)); - if ( - m && - !((d = m), (S[0][0] <= d && d <= S[0][1]) || (S[1][0] <= d && d <= S[1][1])) && - !c.has(g) - ) { - s.set(m, g); - c.add(g); - } - n[p] = g; - o[f] = p; - } - var d; - return { - toFontChar: o, - charCodeToGlyphId: n, - toUnicodeExtraMap: s, - nextAvailableFontCharCode: h, - }; - } - function createCmapTable(e, t, a) { - const i = (function getRanges(e, t, a) { - const r = []; - for (const t in e) e[t] >= a || r.push({ fontCharCode: 0 | t, glyphId: e[t] }); - if (t) for (const [e, i] of t) i >= a || r.push({ fontCharCode: e, glyphId: i }); - 0 === r.length && r.push({ fontCharCode: 0, glyphId: 0 }); - r.sort(function fontGetRangesSort(e, t) { - return e.fontCharCode - t.fontCharCode; - }); - const i = [], - n = r.length; - for (let e = 0; e < n; ) { - const t = r[e].fontCharCode, - a = [r[e].glyphId]; - ++e; - let s = t; - for (; e < n && s + 1 === r[e].fontCharCode; ) { - a.push(r[e].glyphId); - ++s; - ++e; - if (65535 === s) break; - } - i.push([t, s, a]); - } - return i; - })(e, t, a), - n = i.at(-1)[1] > 65535 ? 2 : 1; - let s, - o, - c, - l, - h = '\0\0' + string16(n) + '\0\0' + (0, r.string32)(4 + 8 * n); - for (s = i.length - 1; s >= 0 && !(i[s][0] <= 65535); --s); - const u = s + 1; - i[s][0] < 65535 && 65535 === i[s][1] && (i[s][1] = 65534); - const d = i[s][1] < 65535 ? 1 : 0, - f = u + d, - g = m.OpenTypeFileBuilder.getSearchParams(f, 2); - let p, - b, - y, - w, - S = '', - x = '', - C = '', - k = '', - v = '', - F = 0; - for (s = 0, o = u; s < o; s++) { - p = i[s]; - b = p[0]; - y = p[1]; - S += string16(b); - x += string16(y); - w = p[2]; - let e = !0; - for (c = 1, l = w.length; c < l; ++c) - if (w[c] !== w[c - 1] + 1) { - e = !1; - break; - } - if (e) { - C += string16((w[0] - b) & 65535); - k += string16(0); - } else { - const e = 2 * (f - s) + 2 * F; - F += y - b + 1; - C += string16(0); - k += string16(e); - for (c = 0, l = w.length; c < l; ++c) v += string16(w[c]); - } - } - if (d > 0) { - x += 'ÿÿ'; - S += 'ÿÿ'; - C += '\0'; - k += '\0\0'; - } - const O = - '\0\0' + - string16(2 * f) + - string16(g.range) + - string16(g.entry) + - string16(g.rangeShift) + - x + - '\0\0' + - S + - C + - k + - v; - let T = '', - M = ''; - if (n > 1) { - h += '\0\0\n' + (0, r.string32)(4 + 8 * n + 4 + O.length); - T = ''; - for (s = 0, o = i.length; s < o; s++) { - p = i[s]; - b = p[0]; - w = p[2]; - let e = w[0]; - for (c = 1, l = w.length; c < l; ++c) - if (w[c] !== w[c - 1] + 1) { - y = p[0] + c - 1; - T += (0, r.string32)(b) + (0, r.string32)(y) + (0, r.string32)(e); - b = y + 1; - e = w[c]; - } - T += (0, r.string32)(b) + (0, r.string32)(p[1]) + (0, r.string32)(e); - } - M = - '\0\f\0\0' + - (0, r.string32)(T.length + 16) + - '\0\0\0\0' + - (0, r.string32)(T.length / 12); - } - return h + '\0' + string16(O.length + 4) + O + M + T; - } - function createOS2Table(e, t, a) { - a ||= { unitsPerEm: 0, yMax: 0, yMin: 0, ascent: 0, descent: 0 }; - let i = 0, - n = 0, - o = 0, - c = 0, - l = null, - h = 0, - u = -1; - if (t) { - for (let e in t) { - e |= 0; - (l > e || !l) && (l = e); - h < e && (h = e); - u = (0, s.getUnicodeRangeFor)(e, u); - if (u < 32) i |= 1 << u; - else if (u < 64) n |= 1 << (u - 32); - else if (u < 96) o |= 1 << (u - 64); - else { - if (!(u < 123)) - throw new r.FormatError( - 'Unicode ranges Bits > 123 are reserved for internal usage', - ); - c |= 1 << (u - 96); - } - } - h > 65535 && (h = 65535); - } else { - l = 0; - h = 255; - } - const d = e.bbox || [0, 0, 0, 0], - f = a.unitsPerEm || 1 / (e.fontMatrix || r.FONT_IDENTITY_MATRIX)[0], - g = e.ascentScaled ? 1 : f / x, - p = a.ascent || Math.round(g * (e.ascent || d[3])); - let m = a.descent || Math.round(g * (e.descent || d[1])); - m > 0 && e.descent > 0 && d[1] < 0 && (m = -m); - const b = a.yMax || p, - y = -a.yMin || -m; - 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)(i) + - (0, r.string32)(n) + - (0, r.string32)(o) + - (0, r.string32)(c) + - '*21*' + - string16(e.italicAngle ? 1 : 0) + - string16(l || e.firstChar) + - string16(h || e.lastChar) + - string16(p) + - string16(m) + - '\0d' + - string16(b) + - string16(y) + - '\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.replaceAll(/[^\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 i, n, s, o, c; - for (i = 0, n = a.length; i < n; i++) { - c = t[1][i] || a[i]; - const e = []; - for (s = 0, o = c.length; s < o; s++) e.push(string16(c.charCodeAt(s))); - r.push(e.join('')); - } - const l = [a, r], - h = ['\0', '\0'], - u = ['\0\0', '\0'], - d = ['\0\0', '\t'], - f = a.length * h.length; - let g = '\0\0' + string16(f) + string16(12 * f + 6), - p = 0; - for (i = 0, n = h.length; i < n; i++) { - const e = l[i]; - for (s = 0, o = e.length; s < o; s++) { - c = e[s]; - g += h[i] + u[i] + d[i] + string16(s) + string16(c.length) + string16(p); - p += c.length; - } - } - g += a.join('') + r.join(''); - return g; - } - t.Font = class Font { - constructor(e, t, a) { - this.name = e; - this.psName = null; - this.mimetype = null; - this.disableFontFace = !1; - this.loadedName = a.loadedName; - this.isType3Font = a.isType3Font; - this.missingFile = !1; - this.cssFontInfo = a.cssFontInfo; - this._charsCache = Object.create(null); - this._glyphCache = Object.create(null); - let i = !!(a.flags & n.FontFlags.Serif); - if (!i && !a.isSimulatedFlags) { - const t = e.replaceAll(/[,_]/g, '-').split('-')[0], - a = (0, l.getSerifFonts)(); - for (const e of t.split('+')) - if (a[e]) { - i = !0; - break; - } - } - this.isSerifFont = i; - this.isSymbolicFont = !!(a.flags & n.FontFlags.Symbolic); - this.isMonospace = !!(a.flags & n.FontFlags.FixedPitch); - let { type: s, subtype: o } = a; - this.type = s; - this.subtype = o; - const c = e.match(/^InvalidPDFjsFont_(.*)_\d+$/); - this.isInvalidPDFjsFont = !!c; - this.isInvalidPDFjsFont - ? (this.fallbackName = c[1]) - : this.isMonospace - ? (this.fallbackName = 'monospace') - : this.isSerifFont - ? (this.fallbackName = 'serif') - : (this.fallbackName = 'sans-serif'); - this.differences = a.differences; - this.widths = a.widths; - this.defaultWidth = a.defaultWidth; - this.composite = a.composite; - this.cMap = a.cMap; - this.capHeight = a.capHeight / x; - this.ascent = a.ascent / x; - this.descent = a.descent / x; - this.lineHeight = this.ascent - this.descent; - this.fontMatrix = a.fontMatrix; - this.bbox = a.bbox; - this.defaultEncoding = a.defaultEncoding; - this.toUnicode = a.toUnicode; - this.toFontChar = []; - if ('Type3' === a.type) { - for (let e = 0; e < 256; e++) - this.toFontChar[e] = this.differences[e] || a.defaultEncoding[e]; - return; - } - this.cidEncoding = a.cidEncoding || ''; - this.vertical = !!a.vertical; - if (this.vertical) { - this.vmetrics = a.vmetrics; - this.defaultVMetrics = a.defaultVMetrics; - } - if (!t || t.isEmpty) { - t && (0, r.warn)('Font file is empty in "' + e + '" (' + this.loadedName + ')'); - this.fallbackToSystemFont(a); - return; - } - [s, o] = getFontFileType(t, a); - (s === this.type && o === this.subtype) || - (0, r.info)( - `Inconsistent font file Type/SubType, expected: ${this.type}/${this.subtype} but found: ${s}/${o}.`, - ); - let h; - try { - switch (s) { - case 'MMType1': - (0, r.info)('MMType1 font (' + e + '), falling back to Type1.'); - case 'Type1': - case 'CIDFontType0': - this.mimetype = 'font/opentype'; - const i = - 'Type1C' === o || 'CIDFontType0C' === o - ? new u.CFFFont(t, a) - : new w.Type1Font(e, t, a); - adjustWidths(a); - h = this.convert(e, i, a); - break; - case 'OpenType': - case 'TrueType': - case 'CIDFontType2': - this.mimetype = 'font/opentype'; - h = this.checkAndRepair(e, t, a); - if (this.isOpenType) { - adjustWidths(a); - s = 'OpenType'; - } - break; - default: - throw new r.FormatError(`Font ${s} is not supported`); - } - } catch (e) { - (0, r.warn)(e); - this.fallbackToSystemFont(a); - return; - } - amendFallbackToUnicode(a); - this.data = h; - this.type = s; - this.subtype = o; - this.fontMatrix = a.fontMatrix; - this.widths = a.widths; - this.defaultWidth = a.defaultWidth; - this.toUnicode = a.toUnicode; - this.seacMap = a.seacMap; - } - get renderer() { - const e = d.FontRendererFactory.create(this, n.SEAC_ANALYSIS_ENABLED); - return (0, r.shadow)(this, 'renderer', e); - } - exportData(e = !1) { - const t = e ? [...C, ...k] : C, - a = Object.create(null); - let r, i; - for (r of t) { - i = this[r]; - void 0 !== i && (a[r] = i); - } - return a; - } - fallbackToSystemFont(e) { - this.missingFile = !0; - const { name: t, type: a } = this; - let i = (0, n.normalizeFontName)(t); - const u = (0, l.getStdFontMap)(), - d = (0, l.getNonStdFontMap)(), - g = !!u[i], - p = !(!d[i] || !u[d[i]]); - i = u[i] || d[i] || i; - const m = (0, f.getFontBasicMetrics)()[i]; - if (m) { - isNaN(this.ascent) && (this.ascent = m.ascent / x); - isNaN(this.descent) && (this.descent = m.descent / x); - isNaN(this.capHeight) && (this.capHeight = m.capHeight / x); - } - this.bold = /bold/gi.test(i); - this.italic = /oblique|italic/gi.test(i); - this.black = /Black/g.test(t); - const b = /Narrow/g.test(t); - this.remeasure = (!g || b) && Object.keys(this.widths).length > 0; - if ((g || p) && '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 i = r[e]; - void 0 === a[i] && (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(i)) - this.toFontChar = buildToFontChar( - c.SymbolSetEncoding, - (0, o.getGlyphsUnicode)(), - this.differences, - ); - else if (/Dingbats/i.test(i)) { - /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 (g) { - 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], - i = (0, s.getUnicodeForGlyph)(a, e); - -1 !== i && (r = i); - } - a[+t] = r; - }); - this.composite && - this.toUnicode instanceof h.IdentityToUnicodeMap && - /Tahoma|Verdana/i.test(t) && - applyStandardFontGlyphMap(a, (0, l.getGlyphMapForStandardFonts)()); - this.toFontChar = a; - } - amendFallbackToUnicode(e); - this.loadedName = i.split('-')[0]; - } - 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 < t; r++) { - const t = readTableEntry(e); - s.includes(t.tag) && 0 !== t.length && (a[t.tag] = t); - } - return a; - } - function readTableEntry(e) { - const t = e.getString(4), - a = e.getInt32() >>> 0, - r = e.getInt32() >>> 0, - i = e.getInt32() >>> 0, - n = e.pos; - e.pos = e.start || 0; - e.skip(r); - const s = e.getBytes(i); - e.pos = n; - if ('head' === t) { - s[8] = s[9] = s[10] = s[11] = 0; - s[17] |= 32; - } - return { tag: t, checksum: a, length: i, 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, i, n) { - 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, i); - s.length = o.length; - return s; - } - let l, - h = 10, - u = 0; - for (l = 0; l < c; l++) { - u = ((o[h] << 8) | o[h + 1]) + 1; - h += 2; - } - const d = h, - f = (o[h] << 8) | o[h + 1]; - s.sizeOfInstructions = f; - h += 2 + f; - const g = h; - let p = 0; - for (l = 0; l < u; l++) { - const e = o[h++]; - 192 & e && (o[h - 1] = 63 & e); - let t = 2; - 2 & e ? (t = 1) : 16 & e && (t = 0); - let a = 2; - 4 & e ? (a = 1) : 32 & e && (a = 0); - const r = t + a; - p += r; - if (8 & e) { - const e = o[h++]; - l += e; - p += e * r; - } - } - if (0 === p) return s; - let m = h + p; - if (m > o.length) return s; - if (!n && f > 0) { - r.set(o.subarray(0, d), i); - r.set([0, 0], i + d); - r.set(o.subarray(g, m), i + 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), i); - s.length = m; - return s; - } - r.set(o, i); - s.length = o.length; - return s; - } - function readNameTable(e) { - const a = (t.start || 0) + e.offset; - t.pos = a; - const r = [[], []], - i = [], - n = e.length, - s = a + n; - if (0 !== t.getUint16() || n < 6) return [r, i]; - const o = t.getUint16(), - c = t.getUint16(); - let l, h; - for (l = 0; l < o && t.pos + 12 <= s; l++) { - const e = { - platform: t.getUint16(), - encoding: t.getUint16(), - language: t.getUint16(), - name: t.getUint16(), - length: t.getUint16(), - offset: t.getUint16(), - }; - (isMacNameRecord(e) || isWinNameRecord(e)) && i.push(e); - } - for (l = 0, h = i.length; l < h; l++) { - const e = i[l]; - if (e.length <= 0) continue; - const n = a + c + e.offset; - if (n + e.length > s) continue; - t.pos = n; - const o = e.name; - if (e.encoding) { - let a = ''; - for (let r = 0, i = e.length; r < i; r += 2) - a += String.fromCharCode(t.getUint16()); - r[1][o] = a; - } else r[0][o] = t.getString(e.length); - } - return [r, i]; - } - const l = [ - 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(e, t) { - let a, - i, - n, - s, - o, - c = e.data, - h = 0, - u = 0, - d = 0; - const f = [], - g = [], - p = []; - let m = t.tooComplexToFollowFunctions, - b = !1, - y = 0, - w = 0; - for (let e = c.length; h < e; ) { - const e = c[h++]; - if (64 === e) { - i = c[h++]; - if (b || w) h += i; - else for (a = 0; a < i; a++) f.push(c[h++]); - } else if (65 === e) { - i = c[h++]; - if (b || w) h += 2 * i; - else - for (a = 0; a < i; a++) { - n = c[h++]; - f.push((n << 8) | c[h++]); - } - } else if (176 == (248 & e)) { - i = e - 176 + 1; - if (b || w) h += i; - else for (a = 0; a < i; a++) f.push(c[h++]); - } else if (184 == (248 & e)) { - i = e - 184 + 1; - if (b || w) h += 2 * i; - else - for (a = 0; a < i; a++) { - n = c[h++]; - f.push((n << 8) | c[h++]); - } - } else if (43 !== e || m) - if (44 !== e || m) { - if (45 === e) - if (b) { - b = !1; - u = h; - } else { - o = g.pop(); - if (!o) { - (0, r.warn)('TT: ENDF bad stack'); - t.hintsValid = !1; - return; - } - s = p.pop(); - c = o.data; - h = o.i; - t.functionsStackDeltas[s] = f.length - o.stackTop; - } - else if (137 === e) { - if (b || w) { - (0, r.warn)('TT: nested IDEFs not allowed'); - m = !0; - } - b = !0; - d = h; - } else if (88 === e) ++y; - else if (27 === e) w = y; - else if (89 === e) { - w === y && (w = 0); - --y; - } else if (28 === e && !b && !w) { - const e = f.at(-1); - e > 0 && (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) { - i = f.pop(); - isNaN(i) || (t = 2 * -i); - } - 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, - i = 0; - for (a = 0, r = t.length; a < r; a++) i += t[a].length; - i = (i + 3) & -4; - const n = new Uint8Array(i); - let s = 0; - for (a = 0, r = t.length; a < r; a++) { - n.set(t[a], s); - s += t[a].length; - } - e.data = n; - e.length = i; - } - })(e, S); - } - let d, f, b, w; - if (isTrueTypeCollectionFile((t = new y.Stream(new Uint8Array(t.getBytes()))))) { - const e = (function readTrueTypeCollectionData(e, t) { - const { numFonts: a, offsetTable: i } = (function readTrueTypeCollectionHeader( - e, - ) { - const t = e.getString(4); - (0, r.assert)('ttcf' === t, 'Must be a TrueType Collection font.'); - const a = e.getUint16(), - i = e.getUint16(), - n = e.getInt32() >>> 0, - s = []; - for (let t = 0; t < n; t++) s.push(e.getInt32() >>> 0); - const o = { - ttcTag: t, - majorVersion: a, - minorVersion: i, - numFonts: n, - 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), - n = t.split('+'); - let s; - for (let o = 0; o < a; o++) { - e.pos = (e.start || 0) + i[o]; - const a = readOpenTypeHeader(e), - c = readTables(e, a.numTables); - if (!c.name) - throw new r.FormatError( - 'TrueType Collection font must contain a "name" table.', - ); - const [l] = readNameTable(c.name); - for (let e = 0, r = l.length; e < r; e++) - for (let r = 0, i = l[e].length; r < i; r++) { - const i = l[e][r] && l[e][r].replaceAll(/\s/g, ''); - if (i) { - if (i === t) return { header: a, tables: c }; - if (!(n.length < 2)) - for (const e of n) i === e && (s = { name: e, header: a, tables: c }); - } - } - } - if (s) { - (0, r.warn)( - `TrueType Collection does not contain "${t}" font, falling back to "${s.name}" font instead.`, - ); - return { header: s.header, tables: s.tables }; - } - throw new r.FormatError(`TrueType Collection does not contain "${t}" font.`); - })(t, this.name); - d = e.header; - f = e.tables; - } else { - d = readOpenTypeHeader(t); - f = readTables(t, d.numTables); - } - const S = !f['CFF ']; - if (S) { - if (!f.loca) throw new r.FormatError('Required "loca" table is not found'); - if (!f.glyf) { - (0, r.warn)('Required "glyf" table is not found -- trying to recover.'); - f.glyf = { tag: 'glyf', data: new Uint8Array(0) }; - } - this.isOpenType = !1; - } else { - const t = - a.composite && - ((a.cidToGidMap || []).length > 0 || !(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(), - C = t.getUint16(); - if (a.scaleFactors && a.scaleFactors.length === C && 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: C, - }); - r.scale(e); - const { glyf: i, loca: n, isLocationLong: s } = r.write(); - f.glyf.data = i; - f.loca.data = n; - 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 < C; t++) { - const a = 4 * t, - r = Math.round(e[t] * int16(o[a], o[a + 1])); - o[a] = (r >> 8) & 255; - o[a + 1] = 255 & r; - writeSignedInt16(o, a + 2, Math.round(e[t] * signedInt16(o[a + 2], o[a + 3]))); - } - } - let k = C + 1, - v = !0; - if (k > 65535) { - v = !1; - k = C; - (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] = k >> 8; - f.maxp.data[5] = 255 & k; - const T = (function sanitizeTTPrograms(e, t, a, i) { - const n = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: !1, - hintsValid: !0, - }; - e && sanitizeTTProgram(e, n); - t && sanitizeTTProgram(t, n); - 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, i = e.functionsUsed.length; a < i; a++) { - if (a > t) { - (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; - } - } - })(n, i); - if (a && 1 & a.length) { - const e = new Uint8Array(a.length + 1); - e.set(a.data); - a.data = e; - } - return n.hintsValid; - })(f.fpgm, f.prep, f['cvt '], F); - if (!T) { - delete f.fpgm; - delete f.prep; - delete f['cvt ']; - } - !(function sanitizeMetrics(e, t, a, i, n, 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(i.data[44], i.data[45]))) { - t.data[22] = 0; - t.data[23] = 0; - } - } - if (c > n) { - (0, r.info)( - `The numOfMetrics (${c}) should not be greater than the numGlyphs (${n}).`, - ); - c = n; - t.data[34] = (65280 & c) >> 8; - t.data[35] = 255 & c; - } - const l = n - 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, k, v); - if (!f.head) throw new r.FormatError('Required "head" table is not found'); - !(function sanitizeHead(e, t, a) { - const i = e.data, - n = (function int32(e, t, a, r) { - return (e << 24) + (t << 16) + (a << 8) + r; - })(i[0], i[1], i[2], i[3]); - if (n >> 16 != 1) { - (0, r.info)('Attempting to fix invalid version in head table: ' + n); - i[0] = 0; - i[1] = 1; - i[2] = 0; - i[3] = 0; - } - const s = int16(i[50], i[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) { - i[50] = 0; - i[51] = 0; - } else { - if (a !== e << 2) - throw new r.FormatError('Could not fix indexToLocFormat: ' + s); - i[50] = 0; - i[51] = 1; - } - } - })(f.head, C, 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, i, n, 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 = n ? 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; m < a + 1; m++, b += o) { - let e = c(d, b); - e > g && (e = g); - y.push({ index: m, offset: e, endOffset: 0 }); - } - y.sort((e, t) => e.offset - t.offset); - for (m = 0; m < a; m++) y[m].endOffset = y[m + 1].offset; - y.sort((e, t) => e.index - t.index); - for (m = 0; m < a; m++) { - const { offset: e, endOffset: t } = y[m]; - if (0 !== e || 0 !== t) break; - const a = y[m + 1].offset; - if (0 !== a) { - y[m].endOffset = a; - break; - } - } - const w = Object.create(null); - let S = 0; - l(d, 0, S); - for (m = 0, b = o; m < a; m++, b += o) { - const e = sanitizeGlyph(f, y[m].offset, y[m].endOffset, p, S, i), - t = e.length; - 0 === t && (w[m] = !0); - e.sizeOfInstructions > s && (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; m < h; m++, b += o) l(d, b, e.length); - t.data = e; - } else if (n) { - const a = c(d, o); - if (p.length > a + 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, C, 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, i) { - 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 = n.MacStandardGlyphOrdering; - break; - case 131072: - const e = t.getUint16(); - if (e !== i) { - u = !1; - break; - } - const s = []; - for (h = 0; h < e; ++h) { - const e = t.getUint16(); - if (e >= 32768) { - u = !1; - break; - } - s.push(e); - } - if (!u) break; - const d = [], - f = []; - for (; t.pos < o; ) { - const e = t.getByte(); - f.length = e; - for (h = 0; h < e; ++h) f[h] = String.fromCharCode(t.getByte()); - d.push(f.join('')); - } - l = []; - for (h = 0; h < e; ++h) { - const e = s[h]; - e < 258 ? l.push(n.MacStandardGlyphOrdering[e]) : l.push(d[e - 258]); - } - break; - case 196608: - break; - default: - (0, r.warn)('Unknown/unsupported post table version ' + c); - u = !1; - a.defaultEncoding && (l = a.defaultEncoding); - } - a.glyphNames = l; - return u; - })(f.post, a, C); - f.post = { tag: 'post', data: createPostTable(a) }; - const D = []; - function hasGlyph(e) { - return !M[e]; - } - if (a.composite) { - const e = a.cidToGidMap || [], - t = 0 === e.length; - a.cMap.forEach(function (a, i) { - 'string' == typeof i && (i = convertCidString(a, i, !0)); - if (i > 65535) throw new r.FormatError('Max size of CID is 65,535'); - let n = -1; - t ? (n = i) : void 0 !== e[i] && (n = e[i]); - n >= 0 && n < C && hasGlyph(n) && (D[a] = n); - }); - } else { - const e = (function readCmapTable(e, t, a, i) { - if (!e) { - (0, r.warn)('No cmap table available.'); - return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: !1 }; - } - let n, - s = (t.start || 0) + e.offset; - t.pos = s; - t.skip(2); - const o = t.getUint16(); - let c, - l = !1; - for (let e = 0; e < o; e++) { - const r = t.getUint16(), - n = t.getUint16(), - s = t.getInt32() >>> 0; - let h = !1; - if (!c || c.platformId !== r || c.encodingId !== n) { - if (0 !== r || (0 !== n && 1 !== n && 3 !== n)) - if (1 === r && 0 === n) h = !0; - else if (3 !== r || 1 !== n || (!i && c)) { - if (a && 3 === r && 0 === n) { - h = !0; - let a = !0; - if (e < o - 1) { - const e = t.peekBytes(2); - int16(e[0], e[1]) < r && (a = !1); - } - a && (l = !0); - } - } else { - h = !0; - a || (l = !0); - } - else h = !0; - h && (c = { platformId: r, encodingId: n, offset: s }); - if (l) break; - } - } - c && (t.pos = s + c.offset); - if (!c || -1 === t.peekByte()) { - (0, r.warn)('Could not find a preferred cmap table.'); - return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: !1 }; - } - const h = t.getUint16(); - let u = !1; - const d = []; - let f, g; - if (0 === h) { - t.skip(4); - for (f = 0; f < 256; f++) { - const e = t.getByte(); - e && d.push({ charCode: f, glyphId: e }); - } - u = !0; - } else if (2 === h) { - t.skip(4); - const e = []; - let a = 0; - for (let r = 0; r < 256; r++) { - const r = t.getUint16() >> 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 i = r[e[a]]; - for (f = 0; f < i.entryCount; f++) { - const e = (a << 8) + f + i.firstCode; - t.pos = i.idRangePos + 2 * f; - g = t.getUint16(); - 0 !== g && (g = (g + i.idDelta) % 65536); - d.push({ charCode: e, glyphId: g }); - } - } - } else if (4 === h) { - t.skip(4); - const e = t.getUint16() >> 1; - t.skip(6); - const a = []; - let r; - for (r = 0; r < e; r++) a.push({ end: t.getUint16() }); - t.skip(2); - for (r = 0; r < e; r++) a[r].start = t.getUint16(); - for (r = 0; r < e; r++) a[r].delta = t.getUint16(); - let i, - o = 0; - for (r = 0; r < e; r++) { - n = a[r]; - const s = t.getUint16(); - if (s) { - i = (s >> 1) - (e - r); - n.offsetIndex = i; - o = Math.max(o, i + n.end - n.start + 1); - } else n.offsetIndex = -1; - } - const c = []; - for (f = 0; f < o; f++) c.push(t.getUint16()); - for (r = 0; r < e; r++) { - n = a[r]; - s = n.start; - const e = n.end, - t = n.delta; - i = n.offsetIndex; - for (f = s; f <= e; f++) - if (65535 !== f) { - g = i < 0 ? f : c[i + f - s]; - g = (g + t) & 65535; - d.push({ charCode: f, glyphId: g }); - } - } - } else if (6 === h) { - t.skip(4); - const e = t.getUint16(), - a = t.getUint16(); - for (f = 0; f < a; f++) { - g = t.getUint16(); - const a = e + f; - d.push({ charCode: a, glyphId: g }); - } - } else { - if (12 !== h) { - (0, r.warn)('cmap table has unsupported format: ' + h); - return { platformId: -1, encodingId: -1, mappings: [], hasShortCmap: !1 }; - } - { - t.skip(10); - const e = t.getInt32() >>> 0; - for (f = 0; f < e; f++) { - const e = t.getInt32() >>> 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 < d.length; e++) - if (d[e - 1].charCode === d[e].charCode) { - d.splice(e, 1); - e--; - } - return { - platformId: c.platformId, - encodingId: c.encodingId, - mappings: d, - hasShortCmap: u, - }; - })(f.cmap, t, this.isSymbolicFont, a.hasEncoding), - i = e.platformId, - s = e.encodingId, - l = e.mappings; - let u = [], - d = !1; - !a.hasEncoding || - ('MacRomanEncoding' !== a.baseEncodingName && - 'WinAnsiEncoding' !== a.baseEncodingName) || - (u = (0, c.getEncoding)(a.baseEncodingName)); - if ( - a.hasEncoding && - !this.isSymbolicFont && - ((3 === i && 1 === s) || (1 === i && 0 === s)) - ) { - const e = (0, o.getGlyphsUnicode)(); - for (let t = 0; t < 256; t++) { - let r; - r = - void 0 !== this.differences[t] - ? this.differences[t] - : u.length && '' !== u[t] - ? u[t] - : c.StandardEncoding[t]; - if (!r) continue; - const o = (0, n.recoverGlyphName)(r, e); - let d; - 3 === i && 1 === s - ? (d = e[o]) - : 1 === i && 0 === s && (d = c.MacRomanEncoding.indexOf(o)); - if (void 0 === d) { - if ( - !a.glyphNames && - a.hasIncludedToUnicodeMap && - !(this.toUnicode instanceof h.IdentityToUnicodeMap) - ) { - const e = this.toUnicode.get(t); - e && (d = e.codePointAt(0)); - } - if (void 0 === d) continue; - } - for (const e of l) - if (e.charCode === d) { - D[t] = e.glyphId; - break; - } - } - } else if (0 === i) { - for (const e of l) D[e.charCode] = e.glyphId; - d = !0; - } else - for (const e of l) { - let t = e.charCode; - 3 === i && t >= 61440 && t <= 61695 && (t &= 255); - D[t] = e.glyphId; - } - if (a.glyphNames && (u.length || this.differences.length)) - for (let e = 0; e < 256; ++e) { - if (!d && void 0 !== D[e]) continue; - const t = this.differences[e] || u[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 = k - 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, k), - }; - (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 i.CFFParser(w, a, n.SEAC_ANALYSIS_ENABLED).parse(); - b.duplicateFirstGlyph(); - const e = new i.CFFCompiler(b); - f['CFF '].data = e.compile(); - } catch (e) { - (0, r.warn)('Failed to compile font ' + a.loadedName); - } - if (f.name) { - const [t, r] = readNameTable(f.name); - f.name.data = createNameTable(e, t); - this.psName = t[0][6] || null; - a.composite || - (function adjustTrueTypeToUnicode(e, t, a) { - if (e.isInternalFont) return; - if (e.hasIncludedToUnicodeMap) return; - if (e.hasEncoding) return; - if (e.toUnicode instanceof h.IdentityToUnicodeMap) return; - if (!t) return; - if (0 === a.length) return; - if (e.defaultEncoding === c.WinAnsiEncoding) return; - for (const e of a) if (!isWinNameRecord(e)) return; - const r = c.WinAnsiEncoding, - i = [], - n = (0, o.getGlyphsUnicode)(); - for (const e in r) { - const t = r[e]; - if ('' === t) continue; - const a = n[t]; - void 0 !== a && (i[e] = String.fromCharCode(a)); - } - i.length > 0 && e.toUnicode.amend(i); - })(a, this.isSymbolicFont, r); - } 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 adjustType1ToUnicode(e, t) { - if (e.isInternalFont) return; - if (e.hasIncludedToUnicodeMap) return; - if (t === e.defaultEncoding) return; - if (e.toUnicode instanceof h.IdentityToUnicodeMap) return; - const a = [], - r = (0, o.getGlyphsUnicode)(); - for (const i in t) { - if (e.hasEncoding && (e.baseEncodingName || void 0 !== e.differences[i])) - continue; - const n = t[i], - o = (0, s.getUnicodeForGlyph)(n, r); - -1 !== o && (a[i] = String.fromCharCode(o)); - } - a.length > 0 && e.toUnicode.amend(a); - })(a, a.builtInEncoding); - let i = 1; - t instanceof u.CFFFont && (i = 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), i, 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) t === e[r] && (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 && n.SEAC_ANALYSIS_ENABLED && b && b.length) { - const e = a.fontMatrix || r.FONT_IDENTITY_MATRIX, - i = t.getCharset(), - n = 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 = i.indexOf(r), - h = i.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 (const e of f) { - const t = d.charCodeToGlyphId, - a = createCharCode(t, o), - r = createCharCode(t, h); - n[e] = { baseFontCharCode: a, accentFontCharCode: r, accentOffset: u }; - } - } - a.seacMap = n; - } - const y = 1 / (a.fontMatrix || r.FONT_IDENTITY_MATRIX)[0], - w = new m.OpenTypeFileBuilder('OTTO'); - w.addTable('CFF ', t.data); - w.addTable('OS/2', createOS2Table(a, f)); - w.addTable('cmap', createCmapTable(f, g, p)); - w.addTable( - 'head', - '\0\0\0\0\0\0\0\0\0\0_<õ\0\0' + - safeString16(y) + - "\0\0\0\0ž\v~'\0\0\0\0ž\v~'\0\0" + - safeString16(a.descent) + - 'ÿ' + - safeString16(a.ascent) + - string16(a.italicAngle ? 2 : 0) + - '\0\0\0\0\0\0\0', - ); - w.addTable( - 'hhea', - '\0\0\0' + - safeString16(a.ascent) + - safeString16(a.descent) + - '\0\0ÿÿ\0\0\0\0\0\0' + - safeString16(a.capHeight) + - safeString16(Math.tan(a.italicAngle) * a.xHeight) + - '\0\0\0\0\0\0\0\0\0\0\0\0' + - string16(p), - ); - w.addTable( - 'hmtx', - (function fontFieldsHmtx() { - const e = t.charstrings, - a = t.cff ? t.cff.widths : null; - let r = '\0\0\0\0'; - for (let t = 1, i = p; t < i; t++) { - let i = 0; - if (e) { - const a = e[t - 1]; - i = 'width' in a ? a.width : 0; - } else a && (i = Math.ceil(a[t] || 0)); - r += string16(i) + string16(0); - } - return r; - })(), - ); - w.addTable('maxp', '\0\0P\0' + string16(p)); - w.addTable('name', createNameTable(e)); - w.addTable('post', createPostTable(a)); - return w.toArray(); - } - get spaceWidth() { - const e = ['space', 'minus', 'one', 'i', 'I']; - let t; - for (const a of e) { - if (a in this.widths) { - t = this.widths[a]; - break; - } - const e = (0, o.getGlyphsUnicode)()[a]; - let r = 0; - if (this.composite && this.cMap.contains(e)) { - r = this.cMap.lookup(e); - 'string' == typeof r && (r = convertCidString(e, r)); - } - !r && this.toUnicode && (r = this.toUnicode.charCodeOf(e)); - r <= 0 && (r = e); - t = this.widths[r]; - if (t) break; - } - return (0, r.shadow)(this, 'spaceWidth', t || this.defaultWidth); - } - _charToGlyph(e, t = !1) { - let a, - i, - n, - o = this._glyphCache[e]; - if (o && o.isSpace === t) return o; - let c = e; - if (this.cMap && this.cMap.contains(e)) { - c = this.cMap.lookup(e); - 'string' == typeof c && (c = convertCidString(e, c)); - } - i = this.widths[c]; - 'number' != typeof i && (i = this.defaultWidth); - const l = this.vmetrics && this.vmetrics[c]; - let h = this.toUnicode.get(e) || e; - 'number' == typeof h && (h = String.fromCharCode(h)); - let u = void 0 !== this.toFontChar[e]; - a = this.toFontChar[e] || e; - if (this.missingFile) { - const t = this.differences[e] || this.defaultEncoding[e]; - ('.notdef' !== t && '' !== t) || 'Type1' !== this.type || (a = 32); - a = (0, s.mapSpecialUnicodeValues)(a); - } - this.isType3Font && (n = a); - let d = null; - if (this.seacMap && this.seacMap[e]) { - u = !0; - const t = this.seacMap[e]; - a = t.baseFontCharCode; - d = { - fontChar: String.fromCodePoint(t.accentFontCharCode), - offset: t.accentOffset, - }; - } - let f = ''; - 'number' == typeof a && - (a <= 1114111 - ? (f = String.fromCodePoint(a)) - : (0, r.warn)(`charToGlyph - invalid fontCharCode: ${a}`)); - o = new Glyph(e, f, h, d, i, l, n, t, u); - return (this._glyphCache[e] = o); - } - charsToGlyphs(e) { - let t = this._charsCache[e]; - if (t) return t; - t = []; - if (this.cMap) { - const a = Object.create(null), - r = e.length; - let i = 0; - for (; i < r; ) { - this.cMap.readCharCode(e, i, a); - const { charcode: r, length: n } = a; - i += n; - const s = this._charToGlyph(r, 1 === n && 32 === e.charCodeAt(i - 1)); - t.push(s); - } - } else - for (let a = 0, r = e.length; a < r; ++a) { - const r = e.charCodeAt(a), - i = this._charToGlyph(r, 32 === r); - t.push(i); - } - return (this._charsCache[e] = t); - } - getCharPositions(e) { - const t = []; - if (this.cMap) { - const a = Object.create(null); - let r = 0; - for (; r < e.length; ) { - this.cMap.readCharCode(e, r, a); - const i = a.length; - t.push([r, r + i]); - r += i; - } - } else for (let a = 0, r = e.length; a < r; ++a) t.push([a, a + 1]); - return t; - } - get glyphCacheValues() { - return Object.values(this._glyphCache); - } - encodeString(e) { - const t = [], - a = [], - hasCurrentBufErrors = () => t.length % 2 == 1, - r = - this.toUnicode instanceof h.IdentityToUnicodeMap - ? (e) => this.toUnicode.charCodeOf(e) - : (e) => this.toUnicode.charCodeOf(String.fromCodePoint(e)); - for (let i = 0, n = e.length; i < n; i++) { - const n = e.codePointAt(i); - n > 55295 && (n < 57344 || n > 65533) && i++; - if (this.toUnicode) { - const e = r(n); - 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(n)); - } - 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), - i = a(36), - n = 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), - i = this.parseIndex(r.endPos), - n = this.parseIndex(i.endPos), - s = this.parseIndex(n.endPos), - o = this.parseDict(i.obj.get(0)), - c = this.createDict(CFFTopDict, o, t.strings); - t.header = a.obj; - t.names = this.parseNameIndex(r.obj); - t.strings = this.parseStringIndex(n.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 < r; ++a) { - const r = e.get(a), - i = this.createDict(CFFTopDict, this.parseDict(r), t.strings); - this.parsePrivateDict(i); - t.fdArray.push(i); - } - g = null; - f = this.parseCharsets(c.getByName('charset'), h.count, t.strings, !0); - t.fdSelect = this.parseFDSelect(c.getByName('FDSelect'), h.count); - } else { - f = this.parseCharsets(c.getByName('charset'), h.count, t.strings, !1); - g = this.parseEncoding(c.getByName('Encoding'), e, t.strings, f.charset); - } - t.charset = f; - t.encoding = g; - const p = this.parseCharStrings({ - charStrings: h, - localSubrIndex: c.privateDict.subrsIndex, - globalSubrIndex: s.obj, - fdSelect: t.fdSelect, - fdArray: t.fdArray, - privateDict: c.privateDict, - }); - t.charStrings = p.charStrings; - t.seacs = p.seacs; - t.widths = p.widths; - return t; - } - parseHeader() { - let e = this.bytes; - const t = e.length; - let a = 0; - for (; a < t && 1 !== e[a]; ) ++a; - if (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 i = e[0], - n = e[1], - s = e[2], - o = e[3]; - return { obj: new CFFHeader(i, n, 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, - i = [ - '0', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '.', - 'E', - 'E-', - null, - '-', - ], - n = e.length; - for (; t < n; ) { - const n = e[t++], - s = n >> 4, - o = 15 & n; - if (s === r) break; - a += i[s]; - if (o === r) break; - a += i[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 i = []; - t = 0; - const n = e.length; - for (; t < n; ) { - let r = e[t]; - if (r <= 21) { - 12 === r && (r = (r << 8) | e[++t]); - i.push([r, a]); - a = []; - ++t; - } else a.push(parseOperand()); - } - return i; - } - parseIndex(e) { - const t = new CFFIndex(), - a = this.bytes, - r = (a[e++] << 8) | a[e++], - i = []; - let n, - s, - o = e; - if (0 !== r) { - const t = a[e++], - c = e + (r + 1) * t - 1; - for (n = 0, s = r + 1; n < s; ++n) { - let r = 0; - for (let i = 0; i < t; ++i) { - r <<= 8; - r += a[e++]; - } - i.push(c + r); - } - o = i[r]; - } - for (n = 0, s = i.length - 1; n < s; ++n) { - const e = i[n], - r = i[n + 1]; - t.add(a.subarray(e, r)); - } - return { obj: t, endPos: o }; - } - parseNameIndex(e) { - const t = []; - for (let a = 0, i = e.count; a < i; ++a) { - const i = e.get(a); - t.push((0, r.bytesToString)(i)); - } - return t; - } - parseStringIndex(e) { - const t = new CFFStrings(); - for (let a = 0, i = e.count; a < i; ++a) { - const i = e.get(a); - t.add((0, r.bytesToString)(i)); - } - return t; - } - createDict(e, t, a) { - const r = new e(a); - for (const [e, a] of t) r.setByKey(e, a); - return r; - } - parseCharString(e, t, a, i) { - if (!t || e.callDepth > 10) return !1; - let n = e.stackSize; - const s = e.stack; - let o = t.length; - for (let h = 0; h < o; ) { - const u = t[h++]; - let d = null; - if (12 === u) { - const e = t[h++]; - if (0 === e) { - t[h - 2] = 139; - t[h - 1] = 22; - n = 0; - } else d = l[e]; - } else if (28 === u) { - s[n] = ((t[h] << 24) | (t[h + 1] << 16)) >> 16; - h += 2; - n++; - } else if (14 === u) { - if (n >= 4) { - n -= 4; - if (this.seacAnalysisEnabled) { - e.seac = s.slice(n, n + 4); - return !1; - } - } - d = c[u]; - } else if (u >= 32 && u <= 246) { - s[n] = u - 139; - n++; - } else if (u >= 247 && u <= 254) { - s[n] = u < 251 ? ((u - 247) << 8) + t[h] + 108 : -((u - 251) << 8) - t[h] - 108; - h++; - n++; - } else if (255 === u) { - s[n] = ((t[h] << 24) | (t[h + 1] << 16) | (t[h + 2] << 8) | t[h + 3]) / 65536; - h += 4; - n++; - } else if (19 === u || 20 === u) { - e.hints += n >> 1; - h += (e.hints + 7) >> 3; - n %= 2; - d = c[u]; - } else { - if (10 === u || 29 === u) { - let t; - t = 10 === u ? a : i; - if (!t) { - d = c[u]; - (0, r.warn)('Missing subrsIndex for ' + d.id); - return !1; - } - let o = 32768; - t.count < 1240 ? (o = 107) : t.count < 33900 && (o = 1131); - const l = s[--n] + o; - if (l < 0 || l >= t.count || isNaN(l)) { - d = c[u]; - (0, r.warn)('Out of bounds subrIndex for ' + d.id); - return !1; - } - e.stackSize = n; - e.callDepth++; - if (!this.parseCharString(e, t.get(l), a, i)) return !1; - e.callDepth--; - n = e.stackSize; - continue; - } - if (11 === u) { - e.stackSize = n; - return !0; - } - if (0 === u && h === t.length) { - t[h - 1] = 14; - d = c[14]; - } else { - if (9 === u) { - t.copyWithin(h - 1, h, -1); - h -= 1; - o -= 1; - continue; - } - d = c[u]; - } - } - if (d) { - if (d.stem) { - e.hints += n >> 1; - if (3 === u || 23 === u) e.hasVStems = !0; - else if (e.hasVStems && (1 === u || 18 === u)) { - (0, r.warn)('CFF stem hints are in wrong order'); - t[h - 1] = 1 === u ? 3 : 23; - } - } - if ('min' in d && !e.undefStack && n < d.min) { - (0, r.warn)( - 'Not enough parameters for ' + - d.id + - '; actual: ' + - n + - ', expected: ' + - d.min, - ); - if (0 === n) { - t[h - 1] = 14; - return !0; - } - return !1; - } - if (e.firstStackClearing && d.stackClearing) { - e.firstStackClearing = !1; - n -= d.min; - n >= 2 && d.stem - ? (n %= 2) - : n > 1 && - (0, r.warn)('Found too many parameters for stack-clearing command'); - n > 0 && (e.width = s[n - 1]); - } - if ('stackDelta' in d) { - 'stackFn' in d && d.stackFn(s, n); - n += d.stackDelta; - } else if (d.stackClearing) n = 0; - else if (d.resetStack) { - n = 0; - e.undefStack = !1; - } else if (d.undefStack) { - n = 0; - e.undefStack = !0; - e.firstStackClearing = !1; - } - } - } - o < t.length && t.fill(14, o); - e.stackSize = n; - return !0; - } - parseCharStrings({ - charStrings: e, - localSubrIndex: t, - globalSubrIndex: a, - fdSelect: i, - fdArray: n, - privateDict: s, - }) { - const o = [], - c = [], - l = e.count; - for (let h = 0; h < l; h++) { - const l = e.get(h), - u = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: !0, - hints: 0, - firstStackClearing: !0, - seac: null, - width: null, - hasVStems: !1, - }; - let d = !0, - f = null, - g = s; - if (i && n.length) { - const e = i.getFDIndex(h); - if (-1 === e) { - (0, r.warn)('Glyph index is not in fd select.'); - d = !1; - } - if (e >= n.length) { - (0, r.warn)('Invalid fd index for glyph index.'); - d = !1; - } - if (d) { - g = n[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 i = r + a, - n = this.bytes.subarray(r, i), - s = this.parseDict(n), - o = this.createDict(CFFPrivateDict, s, e.strings); - e.privateDict = o; - 0 === o.getByName('ExpansionFactor') && o.setByName('ExpansionFactor', 0.06); - 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, n) { - if (0 === e) return new CFFCharset(!0, d.ISO_ADOBE, i.ISOAdobeCharset); - if (1 === e) return new CFFCharset(!0, d.EXPERT, i.ExpertCharset); - if (2 === e) return new CFFCharset(!0, d.EXPERT_SUBSET, i.ExpertSubsetCharset); - const s = this.bytes, - o = e, - c = s[e++], - l = [n ? 0 : '.notdef']; - let h, u, f; - t -= 1; - switch (c) { - case 0: - for (f = 0; f < t; f++) { - h = (s[e++] << 8) | s[e++]; - l.push(n ? h : a.get(h)); - } - break; - case 1: - for (; l.length <= t; ) { - h = (s[e++] << 8) | s[e++]; - u = s[e++]; - for (f = 0; f <= u; f++) l.push(n ? h++ : a.get(h++)); - } - break; - case 2: - for (; l.length <= t; ) { - h = (s[e++] << 8) | s[e++]; - u = (s[e++] << 8) | s[e++]; - for (f = 0; f <= u; f++) l.push(n ? h++ : a.get(h++)); - } - break; - default: - throw new r.FormatError('Unknown charset format'); - } - const g = e, - p = s.subarray(o, g); - return new CFFCharset(!1, c, l, p); - } - parseEncoding(e, t, a, i) { - const s = Object.create(null), - o = this.bytes; - let c, - l, - h, - u = !1, - d = null; - if (0 === e || 1 === e) { - u = !0; - c = e; - const t = e ? n.ExpertEncoding : n.StandardEncoding; - for (l = 0, h = i.length; l < h; l++) { - const e = t.indexOf(i[l]); - -1 !== e && (s[e] = l); - } - } else { - const t = e; - c = o[e++]; - switch (127 & c) { - case 0: - const t = o[e++]; - for (l = 1; l <= t; l++) s[o[e++]] = l; - break; - case 1: - const a = o[e++]; - let i = 1; - for (l = 0; l < a; l++) { - const t = o[e++], - a = o[e++]; - for (let e = t; e <= t + a; e++) s[e] = i++; - } - break; - default: - throw new r.FormatError(`Unknown encoding format: ${c} in CFF`); - } - const n = e; - if (128 & c) { - o[t] &= 127; - !(function readSupplement() { - const t = o[e++]; - for (l = 0; l < t; l++) { - const t = o[e++], - r = (o[e++] << 8) + (255 & o[e++]); - s[t] = i.indexOf(a.get(r)); - } - })(); - } - d = o.subarray(t, n); - } - c &= 127; - return new CFFEncoding(u, c, s, d); - } - parseFDSelect(e, t) { - const a = this.bytes, - i = a[e++], - n = []; - let s; - switch (i) { - case 0: - for (s = 0; s < t; ++s) { - const t = a[e++]; - n.push(t); - } - break; - case 3: - const o = (a[e++] << 8) | a[e++]; - for (s = 0; s < o; ++s) { - let t = (a[e++] << 8) | a[e++]; - if (0 === s && 0 !== t) { - (0, r.warn)( - 'parseFDSelect: The first range must have a first GID of 0 -- trying to recover.', - ); - t = 0; - } - const i = a[e++], - o = (a[e] << 8) | a[e + 1]; - for (let e = t; e < o; ++e) n.push(i); - } - e += 2; - break; - default: - throw new r.FormatError(`parseFDSelect: Unknown format "${i}".`); - } - if (n.length !== t) throw new r.FormatError('parseFDSelect: Invalid font data.'); - return new CFFFDSelect(i, n); - } - }; - 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 = !1; - } - duplicateFirstGlyph() { - if (this.charStrings.count >= 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; - if (0 === t.length) return !0; - for (const a of t) - if (isNaN(a)) { - (0, r.warn)(`Invalid CFFDict value: "${t}" for key "${e}".`); - return !0; - } - const a = this.types[e]; - ('num' !== a && 'sid' !== a && 'offset' !== a) || (t = t[0]); - this.values[e] = t; - return !0; - } - setByName(e, t) { - if (!(e in this.nameToKeyMap)) - throw new r.FormatError(`Invalid dictionary name "${e}"`); - this.values[this.nameToKeyMap[e]] = t; - } - hasName(e) { - return this.nameToKeyMap[e] in this.values; - } - getByName(e) { - if (!(e in this.nameToKeyMap)) - throw new r.FormatError(`Invalid dictionary name ${e}"`); - const t = this.nameToKeyMap[e]; - return t in this.values ? this.values[t] : this.defaults[t]; - } - removeByName(e) { - delete this.values[this.nameToKeyMap[e]]; - } - static createTables(e) { - const t = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [], - }; - for (const a of e) { - const e = Array.isArray(a[0]) ? (a[0][0] << 8) + a[0][1] : a[0]; - t.keyToNameMap[e] = a[1]; - t.nameToKeyMap[a[1]] = e; - t.types[e] = a[2]; - t.defaults[e] = a[3]; - t.opcodes[e] = Array.isArray(a[0]) ? a[0] : [a[0]]; - t.order.push(e); - } - return t; - } - } - const h = [ - [[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 (0, r.shadow)(this, 'tables', this.createTables(h)); - } - constructor(e) { - super(CFFTopDict.tables, e); - this.privateDict = null; - } - } - t.CFFTopDict = CFFTopDict; - const u = [ - [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 (0, r.shadow)(this, 'tables', this.createTables(u)); - } - constructor(e) { - super(CFFPrivateDict.tables, e); - this.subrsIndex = null; - } - } - t.CFFPrivateDict = CFFPrivateDict; - const d = { ISO_ADOBE: 0, EXPERT: 1, EXPERT_SUBSET: 2 }; - class CFFCharset { - constructor(e, t, a, r) { - this.predefined = e; - this.format = t; - this.charset = a; - this.raw = r; - } - } - t.CFFCharset = CFFCharset; - class CFFEncoding { - constructor(e, t, a, r) { - this.predefined = e; - this.format = t; - this.encoding = a; - this.raw = r; - } - } - class CFFFDSelect { - constructor(e, t) { - this.format = e; - this.fdSelect = t; - } - getFDIndex(e) { - return e < 0 || e >= 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 i = a.data, - n = this.offsets[e]; - for (let e = 0, a = t.length; e < a; ++e) { - const a = 5 * e + n, - s = a + 1, - o = a + 2, - c = a + 3, - l = a + 4; - if (29 !== i[a] || 0 !== i[s] || 0 !== i[o] || 0 !== i[c] || 0 !== i[l]) - throw new r.FormatError('writing to an offset that is not empty'); - const h = t[e]; - i[a] = 29; - i[s] = (h >> 24) & 255; - i[o] = (h >> 16) & 255; - i[c] = (h >> 8) & 255; - i[l] = 255 & h; - } - } - } - class CFFCompiler { - constructor(e) { - this.cff = e; - } - compile() { - const e = this.cff, - t = { - data: [], - length: 0, - add(e) { - e.length <= 65536 ? this.data.push(...e) : (this.data = this.data.concat(e)); - this.length = this.data.length; - }, - }, - a = this.compileHeader(e.header); - t.add(a); - const i = this.compileNameIndex(e.names); - t.add(i); - if (e.isCIDFont && e.topDict.hasName('FontMatrix')) { - const t = e.topDict.getByName('FontMatrix'); - e.topDict.removeByName('FontMatrix'); - for (const a of e.fdArray) { - let e = t.slice(0); - a.hasName('FontMatrix') && (e = r.Util.transform(e, a.getByName('FontMatrix'))); - a.setByName('FontMatrix', e); - } - } - const n = e.topDict.getByName('XUID'); - n && n.length > 16 && 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, - i, - n = ''; - for (r = 0, i = t.length; r < i; ++r) { - const e = t[r]; - n += - 'e' === e ? ('-' === t[++r] ? 'c' : 'b') : '.' === e ? 'a' : '-' === e ? 'e' : e; - } - n += 1 & n.length ? 'f' : 'ff'; - const s = [30]; - for (r = 0, i = n.length; r < i; r += 2) s.push(parseInt(n.substring(r, r + 2), 16)); - return s; - } - encodeInteger(e) { - let t; - t = - e >= -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 (const a of e) { - const e = Math.min(a.length, 127); - let i = new Array(e); - for (let t = 0; t < e; t++) { - let e = a[t]; - (e < '!' || - e > '~' || - '[' === e || - ']' === e || - '(' === e || - ')' === e || - '{' === e || - '}' === e || - '<' === e || - '>' === e || - '/' === e || - '%' === e) && - (e = '_'); - i[t] = e; - } - i = i.join(''); - '' === i && (i = 'Bad_Font_Name'); - t.add((0, r.stringToBytes)(i)); - } - return this.compileIndex(t); - } - compileTopDicts(e, t, a) { - const r = []; - let i = new CFFIndex(); - for (const n of e) { - if (a) { - n.removeByName('CIDFontVersion'); - n.removeByName('CIDFontRevision'); - n.removeByName('CIDFontType'); - n.removeByName('CIDCount'); - n.removeByName('UIDBase'); - } - const e = new CFFOffsetTracker(), - s = this.compileDict(n, e); - r.push(e); - i.add(s); - e.offset(t); - } - i = this.compileIndex(i, r); - return { trackers: r, output: i }; - } - compilePrivateDicts(e, t, a) { - for (let i = 0, n = e.length; i < n; ++i) { - const n = e[i], - s = n.privateDict; - if (!s || !n.hasName('Private')) - throw new r.FormatError('There must be a private dictionary.'); - const o = new CFFOffsetTracker(), - c = this.compileDict(s, o); - let l = a.length; - o.offset(l); - c.length || (l = 0); - t[i].setEntryLocation('Private', [c.length, l], a); - a.add(c); - if (s.subrsIndex && s.hasName('Subrs')) { - const e = this.compileIndex(s.subrsIndex); - o.setEntryLocation('Subrs', [c.length], a); - a.add(e); - } - } - } - compileDict(e, t) { - const a = []; - for (const i of e.order) { - if (!(i in e.values)) continue; - let n = e.values[i], - s = e.types[i]; - Array.isArray(s) || (s = [s]); - Array.isArray(n) || (n = [n]); - if (0 !== n.length) { - for (let o = 0, c = s.length; o < c; ++o) { - const c = s[o], - l = n[o]; - switch (c) { - case 'num': - case 'sid': - a.push(...this.encodeNumber(l)); - break; - case 'offset': - const s = e.keyToNameMap[i]; - t.isTracking(s) || t.track(s, a.length); - a.push(29, 0, 0, 0, 0); - break; - case 'array': - case 'delta': - a.push(...this.encodeNumber(l)); - for (let e = 1, t = n.length; e < t; ++e) - a.push(...this.encodeNumber(n[e])); - break; - default: - throw new r.FormatError(`Unknown data type of ${c}`); - } - } - a.push(...e.opcodes[i]); - } - } - return a; - } - compileStringIndex(e) { - const t = new CFFIndex(); - for (const a of e) t.add((0, r.stringToBytes)(a)); - return this.compileIndex(t); - } - compileCharStrings(e) { - const t = new CFFIndex(); - for (let a = 0; a < e.count; a++) { - const r = e.get(a); - 0 !== r.length ? t.add(r) : t.add(new Uint8Array([139, 14])); - } - return this.compileIndex(t); - } - compileCharset(e, t, a, i) { - let n; - const s = t - 1; - if (i) n = new Uint8Array([2, 0, 0, (s >> 8) & 255, 255 & s]); - else { - n = new Uint8Array(1 + 2 * s); - n[0] = 0; - let t = 0; - const i = e.charset.length; - let o = !1; - for (let s = 1; s < n.length; s += 2) { - let c = 0; - if (t < i) { - const i = e.charset[t++]; - c = a.getSID(i); - if (-1 === c) { - c = 0; - if (!o) { - o = !0; - (0, r.warn)(`Couldn't find ${i} in CFF strings`); - } - } - } - n[s] = (c >> 8) & 255; - n[s + 1] = 255 & c; - } - } - return this.compileTypedArray(n); - } - 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 < e.fdSelect.length; r++) a[r + 1] = e.fdSelect[r]; - break; - case 3: - const i = 0; - let n = e.fdSelect[0]; - const s = [t, 0, 0, (i >> 8) & 255, 255 & i, n]; - for (r = 1; r < e.fdSelect.length; r++) { - const t = e.fdSelect[r]; - if (t !== n) { - s.push((r >> 8) & 255, 255 & r, t); - n = 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) { - return Array.from(e); - } - compileIndex(e, t = []) { - const a = e.objects, - r = a.length; - if (0 === r) return [0, 0]; - const i = [(r >> 8) & 255, 255 & r]; - let n, - s, - o = 1; - for (n = 0; n < r; ++n) o += a[n].length; - s = o < 256 ? 1 : o < 65536 ? 2 : o < 16777216 ? 3 : 4; - i.push(s); - let c = 1; - for (n = 0; n < r + 1; n++) { - 1 === s - ? i.push(255 & c) - : 2 === s - ? i.push((c >> 8) & 255, 255 & c) - : 3 === s - ? i.push((c >> 16) & 255, (c >> 8) & 255, 255 & c) - : i.push((c >>> 24) & 255, (c >> 16) & 255, (c >> 8) & 255, 255 & c); - a[n] && (c += a[n].length); - } - for (n = 0; n < r; n++) { - t[n] && t[n].offset(i.length); - i.push(...a[n]); - } - return i; - } - } - t.CFFCompiler = CFFCompiler; - }, - (e, t) => { - 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 n; - case 'MacRomanEncoding': - return i; - 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', - '', - '', - '', - '', - ], - i = [ - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '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 = i; - const n = [ - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '', - '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 = n; - 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.normalizeFontName = function normalizeFontName(e) { - return e.replaceAll(/[,_]/g, '-').replaceAll(/\s/g, ''); - }; - t.recoverGlyphName = recoverGlyphName; - t.type1FontGlyphMapping = function type1FontGlyphMapping(e, t, a) { - const n = Object.create(null); - let s, c, l; - const h = !!(e.flags & o.Symbolic); - if (e.isInternalFont) { - l = t; - for (c = 0; c < l.length; c++) { - s = a.indexOf(l[c]); - n[c] = s >= 0 ? s : 0; - } - } else if (e.baseEncodingName) { - l = (0, r.getEncoding)(e.baseEncodingName); - for (c = 0; c < l.length; c++) { - s = a.indexOf(l[c]); - n[c] = s >= 0 ? s : 0; - } - } else if (h) for (c in t) n[c] = t[c]; - else { - l = r.StandardEncoding; - for (c = 0; c < l.length; c++) { - s = a.indexOf(l[c]); - n[c] = s >= 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)); - } - n[c] = s >= 0 ? s : 0; - } - return n; - }; - var r = a(37), - i = a(39), - n = a(40), - s = a(2); - 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, n.getUnicodeForGlyph)(e, t); - if (-1 !== a) for (const e in t) if (t[e] === a) return e; - (0, s.info)('Unable to recover a standard glyph name for: ' + e); - return e; - } - }, - (e, t, a) => { - a.r(t); - a.d(t, { getDingbatsGlyphsUnicode: () => n, getGlyphsUnicode: () => i }); - var r = a(3); - const i = (0, r.getLookupTableFactory)(function (e) { - e.A = 65; - e.AE = 198; - e.AEacute = 508; - e.AEmacron = 482; - e.AEsmall = 63462; - e.Aacute = 193; - e.Aacutesmall = 63457; - e.Abreve = 258; - e.Abreveacute = 7854; - e.Abrevecyrillic = 1232; - e.Abrevedotbelow = 7862; - e.Abrevegrave = 7856; - e.Abrevehookabove = 7858; - e.Abrevetilde = 7860; - e.Acaron = 461; - e.Acircle = 9398; - e.Acircumflex = 194; - e.Acircumflexacute = 7844; - e.Acircumflexdotbelow = 7852; - e.Acircumflexgrave = 7846; - e.Acircumflexhookabove = 7848; - e.Acircumflexsmall = 63458; - e.Acircumflextilde = 7850; - e.Acute = 63177; - e.Acutesmall = 63412; - e.Acyrillic = 1040; - e.Adblgrave = 512; - e.Adieresis = 196; - e.Adieresiscyrillic = 1234; - e.Adieresismacron = 478; - e.Adieresissmall = 63460; - e.Adotbelow = 7840; - e.Adotmacron = 480; - e.Agrave = 192; - e.Agravesmall = 63456; - e.Ahookabove = 7842; - e.Aiecyrillic = 1236; - e.Ainvertedbreve = 514; - e.Alpha = 913; - e.Alphatonos = 902; - e.Amacron = 256; - e.Amonospace = 65313; - e.Aogonek = 260; - e.Aring = 197; - e.Aringacute = 506; - e.Aringbelow = 7680; - e.Aringsmall = 63461; - e.Asmall = 63329; - e.Atilde = 195; - e.Atildesmall = 63459; - e.Aybarmenian = 1329; - e.B = 66; - e.Bcircle = 9399; - e.Bdotaccent = 7682; - e.Bdotbelow = 7684; - e.Becyrillic = 1041; - e.Benarmenian = 1330; - e.Beta = 914; - e.Bhook = 385; - e.Blinebelow = 7686; - e.Bmonospace = 65314; - e.Brevesmall = 63220; - e.Bsmall = 63330; - e.Btopbar = 386; - e.C = 67; - e.Caarmenian = 1342; - e.Cacute = 262; - e.Caron = 63178; - e.Caronsmall = 63221; - e.Ccaron = 268; - e.Ccedilla = 199; - e.Ccedillaacute = 7688; - e.Ccedillasmall = 63463; - e.Ccircle = 9400; - e.Ccircumflex = 264; - e.Cdot = 266; - e.Cdotaccent = 266; - e.Cedillasmall = 63416; - e.Chaarmenian = 1353; - e.Cheabkhasiancyrillic = 1212; - e.Checyrillic = 1063; - e.Chedescenderabkhasiancyrillic = 1214; - e.Chedescendercyrillic = 1206; - e.Chedieresiscyrillic = 1268; - e.Cheharmenian = 1347; - e.Chekhakassiancyrillic = 1227; - e.Cheverticalstrokecyrillic = 1208; - e.Chi = 935; - e.Chook = 391; - e.Circumflexsmall = 63222; - e.Cmonospace = 65315; - e.Coarmenian = 1361; - e.Csmall = 63331; - e.D = 68; - e.DZ = 497; - e.DZcaron = 452; - e.Daarmenian = 1332; - e.Dafrican = 393; - e.Dcaron = 270; - e.Dcedilla = 7696; - e.Dcircle = 9401; - e.Dcircumflexbelow = 7698; - e.Dcroat = 272; - e.Ddotaccent = 7690; - e.Ddotbelow = 7692; - e.Decyrillic = 1044; - e.Deicoptic = 1006; - e.Delta = 8710; - e.Deltagreek = 916; - e.Dhook = 394; - e.Dieresis = 63179; - e.DieresisAcute = 63180; - e.DieresisGrave = 63181; - e.Dieresissmall = 63400; - e.Digammagreek = 988; - e.Djecyrillic = 1026; - e.Dlinebelow = 7694; - e.Dmonospace = 65316; - e.Dotaccentsmall = 63223; - e.Dslash = 272; - e.Dsmall = 63332; - e.Dtopbar = 395; - e.Dz = 498; - e.Dzcaron = 453; - e.Dzeabkhasiancyrillic = 1248; - e.Dzecyrillic = 1029; - e.Dzhecyrillic = 1039; - e.E = 69; - e.Eacute = 201; - e.Eacutesmall = 63465; - e.Ebreve = 276; - e.Ecaron = 282; - e.Ecedillabreve = 7708; - e.Echarmenian = 1333; - e.Ecircle = 9402; - e.Ecircumflex = 202; - e.Ecircumflexacute = 7870; - e.Ecircumflexbelow = 7704; - e.Ecircumflexdotbelow = 7878; - e.Ecircumflexgrave = 7872; - e.Ecircumflexhookabove = 7874; - e.Ecircumflexsmall = 63466; - e.Ecircumflextilde = 7876; - e.Ecyrillic = 1028; - e.Edblgrave = 516; - e.Edieresis = 203; - e.Edieresissmall = 63467; - e.Edot = 278; - e.Edotaccent = 278; - e.Edotbelow = 7864; - e.Efcyrillic = 1060; - e.Egrave = 200; - e.Egravesmall = 63464; - e.Eharmenian = 1335; - e.Ehookabove = 7866; - e.Eightroman = 8551; - e.Einvertedbreve = 518; - e.Eiotifiedcyrillic = 1124; - e.Elcyrillic = 1051; - e.Elevenroman = 8554; - e.Emacron = 274; - e.Emacronacute = 7702; - e.Emacrongrave = 7700; - e.Emcyrillic = 1052; - e.Emonospace = 65317; - e.Encyrillic = 1053; - e.Endescendercyrillic = 1186; - e.Eng = 330; - e.Enghecyrillic = 1188; - e.Enhookcyrillic = 1223; - e.Eogonek = 280; - e.Eopen = 400; - e.Epsilon = 917; - e.Epsilontonos = 904; - e.Ercyrillic = 1056; - e.Ereversed = 398; - e.Ereversedcyrillic = 1069; - e.Escyrillic = 1057; - e.Esdescendercyrillic = 1194; - e.Esh = 425; - e.Esmall = 63333; - e.Eta = 919; - e.Etarmenian = 1336; - e.Etatonos = 905; - e.Eth = 208; - e.Ethsmall = 63472; - e.Etilde = 7868; - e.Etildebelow = 7706; - e.Euro = 8364; - e.Ezh = 439; - e.Ezhcaron = 494; - e.Ezhreversed = 440; - e.F = 70; - e.Fcircle = 9403; - e.Fdotaccent = 7710; - e.Feharmenian = 1366; - e.Feicoptic = 996; - e.Fhook = 401; - e.Fitacyrillic = 1138; - e.Fiveroman = 8548; - e.Fmonospace = 65318; - e.Fourroman = 8547; - e.Fsmall = 63334; - e.G = 71; - e.GBsquare = 13191; - e.Gacute = 500; - e.Gamma = 915; - e.Gammaafrican = 404; - e.Gangiacoptic = 1002; - e.Gbreve = 286; - e.Gcaron = 486; - e.Gcedilla = 290; - e.Gcircle = 9404; - e.Gcircumflex = 284; - e.Gcommaaccent = 290; - e.Gdot = 288; - e.Gdotaccent = 288; - e.Gecyrillic = 1043; - e.Ghadarmenian = 1346; - e.Ghemiddlehookcyrillic = 1172; - e.Ghestrokecyrillic = 1170; - e.Gheupturncyrillic = 1168; - e.Ghook = 403; - e.Gimarmenian = 1331; - e.Gjecyrillic = 1027; - e.Gmacron = 7712; - e.Gmonospace = 65319; - e.Grave = 63182; - e.Gravesmall = 63328; - e.Gsmall = 63335; - e.Gsmallhook = 667; - e.Gstroke = 484; - e.H = 72; - e.H18533 = 9679; - e.H18543 = 9642; - e.H18551 = 9643; - e.H22073 = 9633; - e.HPsquare = 13259; - e.Haabkhasiancyrillic = 1192; - e.Hadescendercyrillic = 1202; - e.Hardsigncyrillic = 1066; - e.Hbar = 294; - e.Hbrevebelow = 7722; - e.Hcedilla = 7720; - e.Hcircle = 9405; - e.Hcircumflex = 292; - e.Hdieresis = 7718; - e.Hdotaccent = 7714; - e.Hdotbelow = 7716; - e.Hmonospace = 65320; - e.Hoarmenian = 1344; - e.Horicoptic = 1e3; - e.Hsmall = 63336; - e.Hungarumlaut = 63183; - e.Hungarumlautsmall = 63224; - e.Hzsquare = 13200; - e.I = 73; - e.IAcyrillic = 1071; - e.IJ = 306; - e.IUcyrillic = 1070; - e.Iacute = 205; - e.Iacutesmall = 63469; - e.Ibreve = 300; - e.Icaron = 463; - e.Icircle = 9406; - e.Icircumflex = 206; - e.Icircumflexsmall = 63470; - e.Icyrillic = 1030; - e.Idblgrave = 520; - e.Idieresis = 207; - e.Idieresisacute = 7726; - e.Idieresiscyrillic = 1252; - e.Idieresissmall = 63471; - e.Idot = 304; - e.Idotaccent = 304; - e.Idotbelow = 7882; - e.Iebrevecyrillic = 1238; - e.Iecyrillic = 1045; - e.Ifraktur = 8465; - e.Igrave = 204; - e.Igravesmall = 63468; - e.Ihookabove = 7880; - e.Iicyrillic = 1048; - e.Iinvertedbreve = 522; - e.Iishortcyrillic = 1049; - e.Imacron = 298; - e.Imacroncyrillic = 1250; - e.Imonospace = 65321; - e.Iniarmenian = 1339; - e.Iocyrillic = 1025; - e.Iogonek = 302; - e.Iota = 921; - e.Iotaafrican = 406; - e.Iotadieresis = 938; - e.Iotatonos = 906; - e.Ismall = 63337; - e.Istroke = 407; - e.Itilde = 296; - e.Itildebelow = 7724; - e.Izhitsacyrillic = 1140; - e.Izhitsadblgravecyrillic = 1142; - e.J = 74; - e.Jaarmenian = 1345; - e.Jcircle = 9407; - e.Jcircumflex = 308; - e.Jecyrillic = 1032; - e.Jheharmenian = 1355; - e.Jmonospace = 65322; - e.Jsmall = 63338; - e.K = 75; - e.KBsquare = 13189; - e.KKsquare = 13261; - e.Kabashkircyrillic = 1184; - e.Kacute = 7728; - e.Kacyrillic = 1050; - e.Kadescendercyrillic = 1178; - e.Kahookcyrillic = 1219; - e.Kappa = 922; - e.Kastrokecyrillic = 1182; - e.Kaverticalstrokecyrillic = 1180; - e.Kcaron = 488; - e.Kcedilla = 310; - e.Kcircle = 9408; - e.Kcommaaccent = 310; - e.Kdotbelow = 7730; - e.Keharmenian = 1364; - e.Kenarmenian = 1343; - e.Khacyrillic = 1061; - e.Kheicoptic = 998; - e.Khook = 408; - e.Kjecyrillic = 1036; - e.Klinebelow = 7732; - e.Kmonospace = 65323; - e.Koppacyrillic = 1152; - e.Koppagreek = 990; - e.Ksicyrillic = 1134; - e.Ksmall = 63339; - e.L = 76; - e.LJ = 455; - e.LL = 63167; - e.Lacute = 313; - e.Lambda = 923; - e.Lcaron = 317; - e.Lcedilla = 315; - e.Lcircle = 9409; - e.Lcircumflexbelow = 7740; - e.Lcommaaccent = 315; - e.Ldot = 319; - e.Ldotaccent = 319; - e.Ldotbelow = 7734; - e.Ldotbelowmacron = 7736; - e.Liwnarmenian = 1340; - e.Lj = 456; - e.Ljecyrillic = 1033; - e.Llinebelow = 7738; - e.Lmonospace = 65324; - e.Lslash = 321; - e.Lslashsmall = 63225; - e.Lsmall = 63340; - e.M = 77; - e.MBsquare = 13190; - e.Macron = 63184; - e.Macronsmall = 63407; - e.Macute = 7742; - e.Mcircle = 9410; - e.Mdotaccent = 7744; - e.Mdotbelow = 7746; - e.Menarmenian = 1348; - e.Mmonospace = 65325; - e.Msmall = 63341; - e.Mturned = 412; - e.Mu = 924; - e.N = 78; - e.NJ = 458; - e.Nacute = 323; - e.Ncaron = 327; - e.Ncedilla = 325; - e.Ncircle = 9411; - e.Ncircumflexbelow = 7754; - e.Ncommaaccent = 325; - e.Ndotaccent = 7748; - e.Ndotbelow = 7750; - e.Nhookleft = 413; - e.Nineroman = 8552; - e.Nj = 459; - e.Njecyrillic = 1034; - e.Nlinebelow = 7752; - e.Nmonospace = 65326; - e.Nowarmenian = 1350; - e.Nsmall = 63342; - e.Ntilde = 209; - e.Ntildesmall = 63473; - e.Nu = 925; - e.O = 79; - e.OE = 338; - e.OEsmall = 63226; - e.Oacute = 211; - e.Oacutesmall = 63475; - e.Obarredcyrillic = 1256; - e.Obarreddieresiscyrillic = 1258; - e.Obreve = 334; - e.Ocaron = 465; - e.Ocenteredtilde = 415; - e.Ocircle = 9412; - e.Ocircumflex = 212; - e.Ocircumflexacute = 7888; - e.Ocircumflexdotbelow = 7896; - e.Ocircumflexgrave = 7890; - e.Ocircumflexhookabove = 7892; - e.Ocircumflexsmall = 63476; - e.Ocircumflextilde = 7894; - e.Ocyrillic = 1054; - e.Odblacute = 336; - e.Odblgrave = 524; - e.Odieresis = 214; - e.Odieresiscyrillic = 1254; - e.Odieresissmall = 63478; - e.Odotbelow = 7884; - e.Ogoneksmall = 63227; - e.Ograve = 210; - e.Ogravesmall = 63474; - e.Oharmenian = 1365; - e.Ohm = 8486; - e.Ohookabove = 7886; - e.Ohorn = 416; - e.Ohornacute = 7898; - e.Ohorndotbelow = 7906; - e.Ohorngrave = 7900; - e.Ohornhookabove = 7902; - e.Ohorntilde = 7904; - e.Ohungarumlaut = 336; - e.Oi = 418; - e.Oinvertedbreve = 526; - e.Omacron = 332; - e.Omacronacute = 7762; - e.Omacrongrave = 7760; - e.Omega = 8486; - e.Omegacyrillic = 1120; - e.Omegagreek = 937; - e.Omegaroundcyrillic = 1146; - e.Omegatitlocyrillic = 1148; - e.Omegatonos = 911; - e.Omicron = 927; - e.Omicrontonos = 908; - e.Omonospace = 65327; - e.Oneroman = 8544; - e.Oogonek = 490; - e.Oogonekmacron = 492; - e.Oopen = 390; - e.Oslash = 216; - e.Oslashacute = 510; - e.Oslashsmall = 63480; - e.Osmall = 63343; - e.Ostrokeacute = 510; - e.Otcyrillic = 1150; - e.Otilde = 213; - e.Otildeacute = 7756; - e.Otildedieresis = 7758; - e.Otildesmall = 63477; - e.P = 80; - e.Pacute = 7764; - e.Pcircle = 9413; - e.Pdotaccent = 7766; - e.Pecyrillic = 1055; - e.Peharmenian = 1354; - e.Pemiddlehookcyrillic = 1190; - e.Phi = 934; - e.Phook = 420; - e.Pi = 928; - e.Piwrarmenian = 1363; - e.Pmonospace = 65328; - e.Psi = 936; - e.Psicyrillic = 1136; - e.Psmall = 63344; - e.Q = 81; - e.Qcircle = 9414; - e.Qmonospace = 65329; - e.Qsmall = 63345; - e.R = 82; - e.Raarmenian = 1356; - e.Racute = 340; - e.Rcaron = 344; - e.Rcedilla = 342; - e.Rcircle = 9415; - e.Rcommaaccent = 342; - e.Rdblgrave = 528; - e.Rdotaccent = 7768; - e.Rdotbelow = 7770; - e.Rdotbelowmacron = 7772; - e.Reharmenian = 1360; - e.Rfraktur = 8476; - e.Rho = 929; - e.Ringsmall = 63228; - e.Rinvertedbreve = 530; - e.Rlinebelow = 7774; - e.Rmonospace = 65330; - e.Rsmall = 63346; - e.Rsmallinverted = 641; - e.Rsmallinvertedsuperior = 694; - e.S = 83; - e.SF010000 = 9484; - e.SF020000 = 9492; - e.SF030000 = 9488; - e.SF040000 = 9496; - e.SF050000 = 9532; - e.SF060000 = 9516; - e.SF070000 = 9524; - e.SF080000 = 9500; - e.SF090000 = 9508; - e.SF100000 = 9472; - e.SF110000 = 9474; - e.SF190000 = 9569; - e.SF200000 = 9570; - e.SF210000 = 9558; - e.SF220000 = 9557; - e.SF230000 = 9571; - e.SF240000 = 9553; - e.SF250000 = 9559; - e.SF260000 = 9565; - e.SF270000 = 9564; - e.SF280000 = 9563; - e.SF360000 = 9566; - e.SF370000 = 9567; - e.SF380000 = 9562; - e.SF390000 = 9556; - e.SF400000 = 9577; - e.SF410000 = 9574; - e.SF420000 = 9568; - e.SF430000 = 9552; - e.SF440000 = 9580; - e.SF450000 = 9575; - e.SF460000 = 9576; - e.SF470000 = 9572; - e.SF480000 = 9573; - e.SF490000 = 9561; - e.SF500000 = 9560; - e.SF510000 = 9554; - e.SF520000 = 9555; - e.SF530000 = 9579; - e.SF540000 = 9578; - e.Sacute = 346; - e.Sacutedotaccent = 7780; - e.Sampigreek = 992; - e.Scaron = 352; - e.Scarondotaccent = 7782; - e.Scaronsmall = 63229; - e.Scedilla = 350; - e.Schwa = 399; - e.Schwacyrillic = 1240; - e.Schwadieresiscyrillic = 1242; - e.Scircle = 9416; - e.Scircumflex = 348; - e.Scommaaccent = 536; - e.Sdotaccent = 7776; - e.Sdotbelow = 7778; - e.Sdotbelowdotaccent = 7784; - e.Seharmenian = 1357; - e.Sevenroman = 8550; - e.Shaarmenian = 1351; - e.Shacyrillic = 1064; - e.Shchacyrillic = 1065; - e.Sheicoptic = 994; - e.Shhacyrillic = 1210; - e.Shimacoptic = 1004; - e.Sigma = 931; - e.Sixroman = 8549; - e.Smonospace = 65331; - e.Softsigncyrillic = 1068; - e.Ssmall = 63347; - e.Stigmagreek = 986; - e.T = 84; - e.Tau = 932; - e.Tbar = 358; - e.Tcaron = 356; - e.Tcedilla = 354; - e.Tcircle = 9417; - e.Tcircumflexbelow = 7792; - e.Tcommaaccent = 354; - e.Tdotaccent = 7786; - e.Tdotbelow = 7788; - e.Tecyrillic = 1058; - e.Tedescendercyrillic = 1196; - e.Tenroman = 8553; - e.Tetsecyrillic = 1204; - e.Theta = 920; - e.Thook = 428; - e.Thorn = 222; - e.Thornsmall = 63486; - e.Threeroman = 8546; - e.Tildesmall = 63230; - e.Tiwnarmenian = 1359; - e.Tlinebelow = 7790; - e.Tmonospace = 65332; - e.Toarmenian = 1337; - e.Tonefive = 444; - e.Tonesix = 388; - e.Tonetwo = 423; - e.Tretroflexhook = 430; - e.Tsecyrillic = 1062; - e.Tshecyrillic = 1035; - e.Tsmall = 63348; - e.Twelveroman = 8555; - e.Tworoman = 8545; - e.U = 85; - e.Uacute = 218; - e.Uacutesmall = 63482; - e.Ubreve = 364; - e.Ucaron = 467; - e.Ucircle = 9418; - e.Ucircumflex = 219; - e.Ucircumflexbelow = 7798; - e.Ucircumflexsmall = 63483; - e.Ucyrillic = 1059; - e.Udblacute = 368; - e.Udblgrave = 532; - e.Udieresis = 220; - e.Udieresisacute = 471; - e.Udieresisbelow = 7794; - e.Udieresiscaron = 473; - e.Udieresiscyrillic = 1264; - e.Udieresisgrave = 475; - e.Udieresismacron = 469; - e.Udieresissmall = 63484; - e.Udotbelow = 7908; - e.Ugrave = 217; - e.Ugravesmall = 63481; - e.Uhookabove = 7910; - e.Uhorn = 431; - e.Uhornacute = 7912; - e.Uhorndotbelow = 7920; - e.Uhorngrave = 7914; - e.Uhornhookabove = 7916; - e.Uhorntilde = 7918; - e.Uhungarumlaut = 368; - e.Uhungarumlautcyrillic = 1266; - e.Uinvertedbreve = 534; - e.Ukcyrillic = 1144; - e.Umacron = 362; - e.Umacroncyrillic = 1262; - e.Umacrondieresis = 7802; - e.Umonospace = 65333; - e.Uogonek = 370; - e.Upsilon = 933; - e.Upsilon1 = 978; - e.Upsilonacutehooksymbolgreek = 979; - e.Upsilonafrican = 433; - e.Upsilondieresis = 939; - e.Upsilondieresishooksymbolgreek = 980; - e.Upsilonhooksymbol = 978; - e.Upsilontonos = 910; - e.Uring = 366; - e.Ushortcyrillic = 1038; - e.Usmall = 63349; - e.Ustraightcyrillic = 1198; - e.Ustraightstrokecyrillic = 1200; - e.Utilde = 360; - e.Utildeacute = 7800; - e.Utildebelow = 7796; - e.V = 86; - e.Vcircle = 9419; - e.Vdotbelow = 7806; - e.Vecyrillic = 1042; - e.Vewarmenian = 1358; - e.Vhook = 434; - e.Vmonospace = 65334; - e.Voarmenian = 1352; - e.Vsmall = 63350; - e.Vtilde = 7804; - e.W = 87; - e.Wacute = 7810; - e.Wcircle = 9420; - e.Wcircumflex = 372; - e.Wdieresis = 7812; - e.Wdotaccent = 7814; - e.Wdotbelow = 7816; - e.Wgrave = 7808; - e.Wmonospace = 65335; - e.Wsmall = 63351; - e.X = 88; - e.Xcircle = 9421; - e.Xdieresis = 7820; - e.Xdotaccent = 7818; - e.Xeharmenian = 1341; - e.Xi = 926; - e.Xmonospace = 65336; - e.Xsmall = 63352; - e.Y = 89; - e.Yacute = 221; - e.Yacutesmall = 63485; - e.Yatcyrillic = 1122; - e.Ycircle = 9422; - e.Ycircumflex = 374; - e.Ydieresis = 376; - e.Ydieresissmall = 63487; - e.Ydotaccent = 7822; - e.Ydotbelow = 7924; - e.Yericyrillic = 1067; - e.Yerudieresiscyrillic = 1272; - e.Ygrave = 7922; - e.Yhook = 435; - e.Yhookabove = 7926; - e.Yiarmenian = 1349; - e.Yicyrillic = 1031; - e.Yiwnarmenian = 1362; - e.Ymonospace = 65337; - e.Ysmall = 63353; - e.Ytilde = 7928; - e.Yusbigcyrillic = 1130; - e.Yusbigiotifiedcyrillic = 1132; - e.Yuslittlecyrillic = 1126; - e.Yuslittleiotifiedcyrillic = 1128; - e.Z = 90; - e.Zaarmenian = 1334; - e.Zacute = 377; - e.Zcaron = 381; - e.Zcaronsmall = 63231; - e.Zcircle = 9423; - e.Zcircumflex = 7824; - e.Zdot = 379; - e.Zdotaccent = 379; - e.Zdotbelow = 7826; - e.Zecyrillic = 1047; - e.Zedescendercyrillic = 1176; - e.Zedieresiscyrillic = 1246; - e.Zeta = 918; - e.Zhearmenian = 1338; - e.Zhebrevecyrillic = 1217; - e.Zhecyrillic = 1046; - e.Zhedescendercyrillic = 1174; - e.Zhedieresiscyrillic = 1244; - e.Zlinebelow = 7828; - e.Zmonospace = 65338; - e.Zsmall = 63354; - e.Zstroke = 437; - e.a = 97; - e.aabengali = 2438; - e.aacute = 225; - e.aadeva = 2310; - e.aagujarati = 2694; - e.aagurmukhi = 2566; - e.aamatragurmukhi = 2622; - e.aarusquare = 13059; - e.aavowelsignbengali = 2494; - e.aavowelsigndeva = 2366; - e.aavowelsigngujarati = 2750; - e.abbreviationmarkarmenian = 1375; - e.abbreviationsigndeva = 2416; - e.abengali = 2437; - e.abopomofo = 12570; - e.abreve = 259; - e.abreveacute = 7855; - e.abrevecyrillic = 1233; - e.abrevedotbelow = 7863; - e.abrevegrave = 7857; - e.abrevehookabove = 7859; - e.abrevetilde = 7861; - e.acaron = 462; - e.acircle = 9424; - e.acircumflex = 226; - e.acircumflexacute = 7845; - e.acircumflexdotbelow = 7853; - e.acircumflexgrave = 7847; - e.acircumflexhookabove = 7849; - e.acircumflextilde = 7851; - e.acute = 180; - e.acutebelowcmb = 791; - e.acutecmb = 769; - e.acutecomb = 769; - e.acutedeva = 2388; - e.acutelowmod = 719; - e.acutetonecmb = 833; - e.acyrillic = 1072; - e.adblgrave = 513; - e.addakgurmukhi = 2673; - e.adeva = 2309; - e.adieresis = 228; - e.adieresiscyrillic = 1235; - e.adieresismacron = 479; - e.adotbelow = 7841; - e.adotmacron = 481; - e.ae = 230; - e.aeacute = 509; - e.aekorean = 12624; - e.aemacron = 483; - e.afii00208 = 8213; - e.afii08941 = 8356; - e.afii10017 = 1040; - e.afii10018 = 1041; - e.afii10019 = 1042; - e.afii10020 = 1043; - e.afii10021 = 1044; - e.afii10022 = 1045; - e.afii10023 = 1025; - e.afii10024 = 1046; - e.afii10025 = 1047; - e.afii10026 = 1048; - e.afii10027 = 1049; - e.afii10028 = 1050; - e.afii10029 = 1051; - e.afii10030 = 1052; - e.afii10031 = 1053; - e.afii10032 = 1054; - e.afii10033 = 1055; - e.afii10034 = 1056; - e.afii10035 = 1057; - e.afii10036 = 1058; - e.afii10037 = 1059; - e.afii10038 = 1060; - e.afii10039 = 1061; - e.afii10040 = 1062; - e.afii10041 = 1063; - e.afii10042 = 1064; - e.afii10043 = 1065; - e.afii10044 = 1066; - e.afii10045 = 1067; - e.afii10046 = 1068; - e.afii10047 = 1069; - e.afii10048 = 1070; - e.afii10049 = 1071; - e.afii10050 = 1168; - e.afii10051 = 1026; - e.afii10052 = 1027; - e.afii10053 = 1028; - e.afii10054 = 1029; - e.afii10055 = 1030; - e.afii10056 = 1031; - e.afii10057 = 1032; - e.afii10058 = 1033; - e.afii10059 = 1034; - e.afii10060 = 1035; - e.afii10061 = 1036; - e.afii10062 = 1038; - e.afii10063 = 63172; - e.afii10064 = 63173; - e.afii10065 = 1072; - e.afii10066 = 1073; - e.afii10067 = 1074; - e.afii10068 = 1075; - e.afii10069 = 1076; - e.afii10070 = 1077; - e.afii10071 = 1105; - e.afii10072 = 1078; - e.afii10073 = 1079; - e.afii10074 = 1080; - e.afii10075 = 1081; - e.afii10076 = 1082; - e.afii10077 = 1083; - e.afii10078 = 1084; - e.afii10079 = 1085; - e.afii10080 = 1086; - e.afii10081 = 1087; - e.afii10082 = 1088; - e.afii10083 = 1089; - e.afii10084 = 1090; - e.afii10085 = 1091; - e.afii10086 = 1092; - e.afii10087 = 1093; - e.afii10088 = 1094; - e.afii10089 = 1095; - e.afii10090 = 1096; - e.afii10091 = 1097; - e.afii10092 = 1098; - e.afii10093 = 1099; - e.afii10094 = 1100; - e.afii10095 = 1101; - e.afii10096 = 1102; - e.afii10097 = 1103; - e.afii10098 = 1169; - e.afii10099 = 1106; - e.afii10100 = 1107; - e.afii10101 = 1108; - e.afii10102 = 1109; - e.afii10103 = 1110; - e.afii10104 = 1111; - e.afii10105 = 1112; - e.afii10106 = 1113; - e.afii10107 = 1114; - e.afii10108 = 1115; - e.afii10109 = 1116; - e.afii10110 = 1118; - e.afii10145 = 1039; - e.afii10146 = 1122; - e.afii10147 = 1138; - e.afii10148 = 1140; - e.afii10192 = 63174; - e.afii10193 = 1119; - e.afii10194 = 1123; - e.afii10195 = 1139; - e.afii10196 = 1141; - e.afii10831 = 63175; - e.afii10832 = 63176; - e.afii10846 = 1241; - e.afii299 = 8206; - e.afii300 = 8207; - e.afii301 = 8205; - e.afii57381 = 1642; - e.afii57388 = 1548; - e.afii57392 = 1632; - e.afii57393 = 1633; - e.afii57394 = 1634; - e.afii57395 = 1635; - e.afii57396 = 1636; - e.afii57397 = 1637; - e.afii57398 = 1638; - e.afii57399 = 1639; - e.afii57400 = 1640; - e.afii57401 = 1641; - e.afii57403 = 1563; - e.afii57407 = 1567; - e.afii57409 = 1569; - e.afii57410 = 1570; - e.afii57411 = 1571; - e.afii57412 = 1572; - e.afii57413 = 1573; - e.afii57414 = 1574; - e.afii57415 = 1575; - e.afii57416 = 1576; - e.afii57417 = 1577; - e.afii57418 = 1578; - e.afii57419 = 1579; - e.afii57420 = 1580; - e.afii57421 = 1581; - e.afii57422 = 1582; - e.afii57423 = 1583; - e.afii57424 = 1584; - e.afii57425 = 1585; - e.afii57426 = 1586; - e.afii57427 = 1587; - e.afii57428 = 1588; - e.afii57429 = 1589; - e.afii57430 = 1590; - e.afii57431 = 1591; - e.afii57432 = 1592; - e.afii57433 = 1593; - e.afii57434 = 1594; - e.afii57440 = 1600; - e.afii57441 = 1601; - e.afii57442 = 1602; - e.afii57443 = 1603; - e.afii57444 = 1604; - e.afii57445 = 1605; - e.afii57446 = 1606; - e.afii57448 = 1608; - e.afii57449 = 1609; - e.afii57450 = 1610; - e.afii57451 = 1611; - e.afii57452 = 1612; - e.afii57453 = 1613; - e.afii57454 = 1614; - e.afii57455 = 1615; - e.afii57456 = 1616; - e.afii57457 = 1617; - e.afii57458 = 1618; - e.afii57470 = 1607; - e.afii57505 = 1700; - e.afii57506 = 1662; - e.afii57507 = 1670; - e.afii57508 = 1688; - e.afii57509 = 1711; - e.afii57511 = 1657; - e.afii57512 = 1672; - e.afii57513 = 1681; - e.afii57514 = 1722; - e.afii57519 = 1746; - e.afii57534 = 1749; - e.afii57636 = 8362; - e.afii57645 = 1470; - e.afii57658 = 1475; - e.afii57664 = 1488; - e.afii57665 = 1489; - e.afii57666 = 1490; - e.afii57667 = 1491; - e.afii57668 = 1492; - e.afii57669 = 1493; - e.afii57670 = 1494; - e.afii57671 = 1495; - e.afii57672 = 1496; - e.afii57673 = 1497; - e.afii57674 = 1498; - e.afii57675 = 1499; - e.afii57676 = 1500; - e.afii57677 = 1501; - e.afii57678 = 1502; - e.afii57679 = 1503; - e.afii57680 = 1504; - e.afii57681 = 1505; - e.afii57682 = 1506; - e.afii57683 = 1507; - e.afii57684 = 1508; - e.afii57685 = 1509; - e.afii57686 = 1510; - e.afii57687 = 1511; - e.afii57688 = 1512; - e.afii57689 = 1513; - e.afii57690 = 1514; - e.afii57694 = 64298; - e.afii57695 = 64299; - e.afii57700 = 64331; - e.afii57705 = 64287; - e.afii57716 = 1520; - e.afii57717 = 1521; - e.afii57718 = 1522; - e.afii57723 = 64309; - e.afii57793 = 1460; - e.afii57794 = 1461; - e.afii57795 = 1462; - e.afii57796 = 1467; - e.afii57797 = 1464; - e.afii57798 = 1463; - e.afii57799 = 1456; - e.afii57800 = 1458; - e.afii57801 = 1457; - e.afii57802 = 1459; - e.afii57803 = 1474; - e.afii57804 = 1473; - e.afii57806 = 1465; - e.afii57807 = 1468; - e.afii57839 = 1469; - e.afii57841 = 1471; - e.afii57842 = 1472; - e.afii57929 = 700; - e.afii61248 = 8453; - e.afii61289 = 8467; - e.afii61352 = 8470; - e.afii61573 = 8236; - e.afii61574 = 8237; - e.afii61575 = 8238; - e.afii61664 = 8204; - e.afii63167 = 1645; - e.afii64937 = 701; - e.agrave = 224; - e.agujarati = 2693; - e.agurmukhi = 2565; - e.ahiragana = 12354; - e.ahookabove = 7843; - e.aibengali = 2448; - e.aibopomofo = 12574; - e.aideva = 2320; - e.aiecyrillic = 1237; - e.aigujarati = 2704; - e.aigurmukhi = 2576; - e.aimatragurmukhi = 2632; - e.ainarabic = 1593; - e.ainfinalarabic = 65226; - e.aininitialarabic = 65227; - e.ainmedialarabic = 65228; - e.ainvertedbreve = 515; - e.aivowelsignbengali = 2504; - e.aivowelsigndeva = 2376; - e.aivowelsigngujarati = 2760; - e.akatakana = 12450; - e.akatakanahalfwidth = 65393; - e.akorean = 12623; - e.alef = 1488; - e.alefarabic = 1575; - e.alefdageshhebrew = 64304; - e.aleffinalarabic = 65166; - e.alefhamzaabovearabic = 1571; - e.alefhamzaabovefinalarabic = 65156; - e.alefhamzabelowarabic = 1573; - e.alefhamzabelowfinalarabic = 65160; - e.alefhebrew = 1488; - e.aleflamedhebrew = 64335; - e.alefmaddaabovearabic = 1570; - e.alefmaddaabovefinalarabic = 65154; - e.alefmaksuraarabic = 1609; - e.alefmaksurafinalarabic = 65264; - e.alefmaksurainitialarabic = 65267; - e.alefmaksuramedialarabic = 65268; - e.alefpatahhebrew = 64302; - e.alefqamatshebrew = 64303; - e.aleph = 8501; - e.allequal = 8780; - e.alpha = 945; - e.alphatonos = 940; - e.amacron = 257; - e.amonospace = 65345; - e.ampersand = 38; - e.ampersandmonospace = 65286; - e.ampersandsmall = 63270; - e.amsquare = 13250; - e.anbopomofo = 12578; - e.angbopomofo = 12580; - e.angbracketleft = 12296; - e.angbracketright = 12297; - e.angkhankhuthai = 3674; - e.angle = 8736; - e.anglebracketleft = 12296; - e.anglebracketleftvertical = 65087; - e.anglebracketright = 12297; - e.anglebracketrightvertical = 65088; - e.angleleft = 9001; - e.angleright = 9002; - e.angstrom = 8491; - e.anoteleia = 903; - e.anudattadeva = 2386; - e.anusvarabengali = 2434; - e.anusvaradeva = 2306; - e.anusvaragujarati = 2690; - e.aogonek = 261; - e.apaatosquare = 13056; - e.aparen = 9372; - e.apostrophearmenian = 1370; - e.apostrophemod = 700; - e.apple = 63743; - e.approaches = 8784; - e.approxequal = 8776; - e.approxequalorimage = 8786; - e.approximatelyequal = 8773; - e.araeaekorean = 12686; - e.araeakorean = 12685; - e.arc = 8978; - e.arighthalfring = 7834; - e.aring = 229; - e.aringacute = 507; - e.aringbelow = 7681; - e.arrowboth = 8596; - e.arrowdashdown = 8675; - e.arrowdashleft = 8672; - e.arrowdashright = 8674; - e.arrowdashup = 8673; - e.arrowdblboth = 8660; - e.arrowdbldown = 8659; - e.arrowdblleft = 8656; - e.arrowdblright = 8658; - e.arrowdblup = 8657; - e.arrowdown = 8595; - e.arrowdownleft = 8601; - e.arrowdownright = 8600; - e.arrowdownwhite = 8681; - e.arrowheaddownmod = 709; - e.arrowheadleftmod = 706; - e.arrowheadrightmod = 707; - e.arrowheadupmod = 708; - e.arrowhorizex = 63719; - e.arrowleft = 8592; - e.arrowleftdbl = 8656; - e.arrowleftdblstroke = 8653; - e.arrowleftoverright = 8646; - e.arrowleftwhite = 8678; - e.arrowright = 8594; - e.arrowrightdblstroke = 8655; - e.arrowrightheavy = 10142; - e.arrowrightoverleft = 8644; - e.arrowrightwhite = 8680; - e.arrowtableft = 8676; - e.arrowtabright = 8677; - e.arrowup = 8593; - e.arrowupdn = 8597; - e.arrowupdnbse = 8616; - e.arrowupdownbase = 8616; - e.arrowupleft = 8598; - e.arrowupleftofdown = 8645; - e.arrowupright = 8599; - e.arrowupwhite = 8679; - e.arrowvertex = 63718; - e.asciicircum = 94; - e.asciicircummonospace = 65342; - e.asciitilde = 126; - e.asciitildemonospace = 65374; - e.ascript = 593; - e.ascriptturned = 594; - e.asmallhiragana = 12353; - e.asmallkatakana = 12449; - e.asmallkatakanahalfwidth = 65383; - e.asterisk = 42; - e.asteriskaltonearabic = 1645; - e.asteriskarabic = 1645; - e.asteriskmath = 8727; - e.asteriskmonospace = 65290; - e.asterisksmall = 65121; - e.asterism = 8258; - e.asuperior = 63209; - e.asymptoticallyequal = 8771; - e.at = 64; - e.atilde = 227; - e.atmonospace = 65312; - e.atsmall = 65131; - e.aturned = 592; - e.aubengali = 2452; - e.aubopomofo = 12576; - e.audeva = 2324; - e.augujarati = 2708; - e.augurmukhi = 2580; - e.aulengthmarkbengali = 2519; - e.aumatragurmukhi = 2636; - e.auvowelsignbengali = 2508; - e.auvowelsigndeva = 2380; - e.auvowelsigngujarati = 2764; - e.avagrahadeva = 2365; - e.aybarmenian = 1377; - e.ayin = 1506; - e.ayinaltonehebrew = 64288; - e.ayinhebrew = 1506; - e.b = 98; - e.babengali = 2476; - e.backslash = 92; - e.backslashmonospace = 65340; - e.badeva = 2348; - e.bagujarati = 2732; - e.bagurmukhi = 2604; - e.bahiragana = 12400; - e.bahtthai = 3647; - e.bakatakana = 12496; - e.bar = 124; - e.barmonospace = 65372; - e.bbopomofo = 12549; - e.bcircle = 9425; - e.bdotaccent = 7683; - e.bdotbelow = 7685; - e.beamedsixteenthnotes = 9836; - e.because = 8757; - e.becyrillic = 1073; - e.beharabic = 1576; - e.behfinalarabic = 65168; - e.behinitialarabic = 65169; - e.behiragana = 12409; - e.behmedialarabic = 65170; - e.behmeeminitialarabic = 64671; - e.behmeemisolatedarabic = 64520; - e.behnoonfinalarabic = 64621; - e.bekatakana = 12505; - e.benarmenian = 1378; - e.bet = 1489; - e.beta = 946; - e.betasymbolgreek = 976; - e.betdagesh = 64305; - e.betdageshhebrew = 64305; - e.bethebrew = 1489; - e.betrafehebrew = 64332; - e.bhabengali = 2477; - e.bhadeva = 2349; - e.bhagujarati = 2733; - e.bhagurmukhi = 2605; - e.bhook = 595; - e.bihiragana = 12403; - e.bikatakana = 12499; - e.bilabialclick = 664; - e.bindigurmukhi = 2562; - e.birusquare = 13105; - e.blackcircle = 9679; - e.blackdiamond = 9670; - e.blackdownpointingtriangle = 9660; - e.blackleftpointingpointer = 9668; - e.blackleftpointingtriangle = 9664; - e.blacklenticularbracketleft = 12304; - e.blacklenticularbracketleftvertical = 65083; - e.blacklenticularbracketright = 12305; - e.blacklenticularbracketrightvertical = 65084; - e.blacklowerlefttriangle = 9699; - e.blacklowerrighttriangle = 9698; - e.blackrectangle = 9644; - e.blackrightpointingpointer = 9658; - e.blackrightpointingtriangle = 9654; - e.blacksmallsquare = 9642; - e.blacksmilingface = 9787; - e.blacksquare = 9632; - e.blackstar = 9733; - e.blackupperlefttriangle = 9700; - e.blackupperrighttriangle = 9701; - e.blackuppointingsmalltriangle = 9652; - e.blackuppointingtriangle = 9650; - e.blank = 9251; - e.blinebelow = 7687; - e.block = 9608; - e.bmonospace = 65346; - e.bobaimaithai = 3610; - e.bohiragana = 12412; - e.bokatakana = 12508; - e.bparen = 9373; - e.bqsquare = 13251; - e.braceex = 63732; - e.braceleft = 123; - e.braceleftbt = 63731; - e.braceleftmid = 63730; - e.braceleftmonospace = 65371; - e.braceleftsmall = 65115; - e.bracelefttp = 63729; - e.braceleftvertical = 65079; - e.braceright = 125; - e.bracerightbt = 63742; - e.bracerightmid = 63741; - e.bracerightmonospace = 65373; - e.bracerightsmall = 65116; - e.bracerighttp = 63740; - e.bracerightvertical = 65080; - e.bracketleft = 91; - e.bracketleftbt = 63728; - e.bracketleftex = 63727; - e.bracketleftmonospace = 65339; - e.bracketlefttp = 63726; - e.bracketright = 93; - e.bracketrightbt = 63739; - e.bracketrightex = 63738; - e.bracketrightmonospace = 65341; - e.bracketrighttp = 63737; - e.breve = 728; - e.brevebelowcmb = 814; - e.brevecmb = 774; - e.breveinvertedbelowcmb = 815; - e.breveinvertedcmb = 785; - e.breveinverteddoublecmb = 865; - e.bridgebelowcmb = 810; - e.bridgeinvertedbelowcmb = 826; - e.brokenbar = 166; - e.bstroke = 384; - e.bsuperior = 63210; - e.btopbar = 387; - e.buhiragana = 12406; - e.bukatakana = 12502; - e.bullet = 8226; - e.bulletinverse = 9688; - e.bulletoperator = 8729; - e.bullseye = 9678; - e.c = 99; - e.caarmenian = 1390; - e.cabengali = 2458; - e.cacute = 263; - e.cadeva = 2330; - e.cagujarati = 2714; - e.cagurmukhi = 2586; - e.calsquare = 13192; - e.candrabindubengali = 2433; - e.candrabinducmb = 784; - e.candrabindudeva = 2305; - e.candrabindugujarati = 2689; - e.capslock = 8682; - e.careof = 8453; - e.caron = 711; - e.caronbelowcmb = 812; - e.caroncmb = 780; - e.carriagereturn = 8629; - e.cbopomofo = 12568; - e.ccaron = 269; - e.ccedilla = 231; - e.ccedillaacute = 7689; - e.ccircle = 9426; - e.ccircumflex = 265; - e.ccurl = 597; - e.cdot = 267; - e.cdotaccent = 267; - e.cdsquare = 13253; - e.cedilla = 184; - e.cedillacmb = 807; - e.cent = 162; - e.centigrade = 8451; - e.centinferior = 63199; - e.centmonospace = 65504; - e.centoldstyle = 63394; - e.centsuperior = 63200; - e.chaarmenian = 1401; - e.chabengali = 2459; - e.chadeva = 2331; - e.chagujarati = 2715; - e.chagurmukhi = 2587; - e.chbopomofo = 12564; - e.cheabkhasiancyrillic = 1213; - e.checkmark = 10003; - e.checyrillic = 1095; - e.chedescenderabkhasiancyrillic = 1215; - e.chedescendercyrillic = 1207; - e.chedieresiscyrillic = 1269; - e.cheharmenian = 1395; - e.chekhakassiancyrillic = 1228; - e.cheverticalstrokecyrillic = 1209; - e.chi = 967; - e.chieuchacirclekorean = 12919; - e.chieuchaparenkorean = 12823; - e.chieuchcirclekorean = 12905; - e.chieuchkorean = 12618; - e.chieuchparenkorean = 12809; - e.chochangthai = 3594; - e.chochanthai = 3592; - e.chochingthai = 3593; - e.chochoethai = 3596; - e.chook = 392; - e.cieucacirclekorean = 12918; - e.cieucaparenkorean = 12822; - e.cieuccirclekorean = 12904; - e.cieuckorean = 12616; - e.cieucparenkorean = 12808; - e.cieucuparenkorean = 12828; - e.circle = 9675; - e.circlecopyrt = 169; - e.circlemultiply = 8855; - e.circleot = 8857; - e.circleplus = 8853; - e.circlepostalmark = 12342; - e.circlewithlefthalfblack = 9680; - e.circlewithrighthalfblack = 9681; - e.circumflex = 710; - e.circumflexbelowcmb = 813; - e.circumflexcmb = 770; - e.clear = 8999; - e.clickalveolar = 450; - e.clickdental = 448; - e.clicklateral = 449; - e.clickretroflex = 451; - e.club = 9827; - e.clubsuitblack = 9827; - e.clubsuitwhite = 9831; - e.cmcubedsquare = 13220; - e.cmonospace = 65347; - e.cmsquaredsquare = 13216; - e.coarmenian = 1409; - e.colon = 58; - e.colonmonetary = 8353; - e.colonmonospace = 65306; - e.colonsign = 8353; - e.colonsmall = 65109; - e.colontriangularhalfmod = 721; - e.colontriangularmod = 720; - e.comma = 44; - e.commaabovecmb = 787; - e.commaaboverightcmb = 789; - e.commaaccent = 63171; - e.commaarabic = 1548; - e.commaarmenian = 1373; - e.commainferior = 63201; - e.commamonospace = 65292; - e.commareversedabovecmb = 788; - e.commareversedmod = 701; - e.commasmall = 65104; - e.commasuperior = 63202; - e.commaturnedabovecmb = 786; - e.commaturnedmod = 699; - e.compass = 9788; - e.congruent = 8773; - e.contourintegral = 8750; - e.control = 8963; - e.controlACK = 6; - e.controlBEL = 7; - e.controlBS = 8; - e.controlCAN = 24; - e.controlCR = 13; - e.controlDC1 = 17; - e.controlDC2 = 18; - e.controlDC3 = 19; - e.controlDC4 = 20; - e.controlDEL = 127; - e.controlDLE = 16; - e.controlEM = 25; - e.controlENQ = 5; - e.controlEOT = 4; - e.controlESC = 27; - e.controlETB = 23; - e.controlETX = 3; - e.controlFF = 12; - e.controlFS = 28; - e.controlGS = 29; - e.controlHT = 9; - e.controlLF = 10; - e.controlNAK = 21; - e.controlNULL = 0; - e.controlRS = 30; - e.controlSI = 15; - e.controlSO = 14; - e.controlSOT = 2; - e.controlSTX = 1; - e.controlSUB = 26; - e.controlSYN = 22; - e.controlUS = 31; - e.controlVT = 11; - e.copyright = 169; - e.copyrightsans = 63721; - e.copyrightserif = 63193; - e.cornerbracketleft = 12300; - e.cornerbracketlefthalfwidth = 65378; - e.cornerbracketleftvertical = 65089; - e.cornerbracketright = 12301; - e.cornerbracketrighthalfwidth = 65379; - e.cornerbracketrightvertical = 65090; - e.corporationsquare = 13183; - e.cosquare = 13255; - e.coverkgsquare = 13254; - e.cparen = 9374; - e.cruzeiro = 8354; - e.cstretched = 663; - e.curlyand = 8911; - e.curlyor = 8910; - e.currency = 164; - e.cyrBreve = 63185; - e.cyrFlex = 63186; - e.cyrbreve = 63188; - e.cyrflex = 63189; - e.d = 100; - e.daarmenian = 1380; - e.dabengali = 2470; - e.dadarabic = 1590; - e.dadeva = 2342; - e.dadfinalarabic = 65214; - e.dadinitialarabic = 65215; - e.dadmedialarabic = 65216; - e.dagesh = 1468; - e.dageshhebrew = 1468; - e.dagger = 8224; - e.daggerdbl = 8225; - e.dagujarati = 2726; - e.dagurmukhi = 2598; - e.dahiragana = 12384; - e.dakatakana = 12480; - e.dalarabic = 1583; - e.dalet = 1491; - e.daletdagesh = 64307; - e.daletdageshhebrew = 64307; - e.dalethebrew = 1491; - e.dalfinalarabic = 65194; - e.dammaarabic = 1615; - e.dammalowarabic = 1615; - e.dammatanaltonearabic = 1612; - e.dammatanarabic = 1612; - e.danda = 2404; - e.dargahebrew = 1447; - e.dargalefthebrew = 1447; - e.dasiapneumatacyrilliccmb = 1157; - e.dblGrave = 63187; - e.dblanglebracketleft = 12298; - e.dblanglebracketleftvertical = 65085; - e.dblanglebracketright = 12299; - e.dblanglebracketrightvertical = 65086; - e.dblarchinvertedbelowcmb = 811; - e.dblarrowleft = 8660; - e.dblarrowright = 8658; - e.dbldanda = 2405; - e.dblgrave = 63190; - e.dblgravecmb = 783; - e.dblintegral = 8748; - e.dbllowline = 8215; - e.dbllowlinecmb = 819; - e.dbloverlinecmb = 831; - e.dblprimemod = 698; - e.dblverticalbar = 8214; - e.dblverticallineabovecmb = 782; - e.dbopomofo = 12553; - e.dbsquare = 13256; - e.dcaron = 271; - e.dcedilla = 7697; - e.dcircle = 9427; - e.dcircumflexbelow = 7699; - e.dcroat = 273; - e.ddabengali = 2465; - e.ddadeva = 2337; - e.ddagujarati = 2721; - e.ddagurmukhi = 2593; - e.ddalarabic = 1672; - e.ddalfinalarabic = 64393; - e.dddhadeva = 2396; - e.ddhabengali = 2466; - e.ddhadeva = 2338; - e.ddhagujarati = 2722; - e.ddhagurmukhi = 2594; - e.ddotaccent = 7691; - e.ddotbelow = 7693; - e.decimalseparatorarabic = 1643; - e.decimalseparatorpersian = 1643; - e.decyrillic = 1076; - e.degree = 176; - e.dehihebrew = 1453; - e.dehiragana = 12391; - e.deicoptic = 1007; - e.dekatakana = 12487; - e.deleteleft = 9003; - e.deleteright = 8998; - e.delta = 948; - e.deltaturned = 397; - e.denominatorminusonenumeratorbengali = 2552; - e.dezh = 676; - e.dhabengali = 2471; - e.dhadeva = 2343; - e.dhagujarati = 2727; - e.dhagurmukhi = 2599; - e.dhook = 599; - e.dialytikatonos = 901; - e.dialytikatonoscmb = 836; - e.diamond = 9830; - e.diamondsuitwhite = 9826; - e.dieresis = 168; - e.dieresisacute = 63191; - e.dieresisbelowcmb = 804; - e.dieresiscmb = 776; - e.dieresisgrave = 63192; - e.dieresistonos = 901; - e.dihiragana = 12386; - e.dikatakana = 12482; - e.dittomark = 12291; - e.divide = 247; - e.divides = 8739; - e.divisionslash = 8725; - e.djecyrillic = 1106; - e.dkshade = 9619; - e.dlinebelow = 7695; - e.dlsquare = 13207; - e.dmacron = 273; - e.dmonospace = 65348; - e.dnblock = 9604; - e.dochadathai = 3598; - e.dodekthai = 3604; - e.dohiragana = 12393; - e.dokatakana = 12489; - e.dollar = 36; - e.dollarinferior = 63203; - e.dollarmonospace = 65284; - e.dollaroldstyle = 63268; - e.dollarsmall = 65129; - e.dollarsuperior = 63204; - e.dong = 8363; - e.dorusquare = 13094; - e.dotaccent = 729; - e.dotaccentcmb = 775; - e.dotbelowcmb = 803; - e.dotbelowcomb = 803; - e.dotkatakana = 12539; - e.dotlessi = 305; - e.dotlessj = 63166; - e.dotlessjstrokehook = 644; - e.dotmath = 8901; - e.dottedcircle = 9676; - e.doubleyodpatah = 64287; - e.doubleyodpatahhebrew = 64287; - e.downtackbelowcmb = 798; - e.downtackmod = 725; - e.dparen = 9375; - e.dsuperior = 63211; - e.dtail = 598; - e.dtopbar = 396; - e.duhiragana = 12389; - e.dukatakana = 12485; - e.dz = 499; - e.dzaltone = 675; - e.dzcaron = 454; - e.dzcurl = 677; - e.dzeabkhasiancyrillic = 1249; - e.dzecyrillic = 1109; - e.dzhecyrillic = 1119; - e.e = 101; - e.eacute = 233; - e.earth = 9793; - e.ebengali = 2447; - e.ebopomofo = 12572; - e.ebreve = 277; - e.ecandradeva = 2317; - e.ecandragujarati = 2701; - e.ecandravowelsigndeva = 2373; - e.ecandravowelsigngujarati = 2757; - e.ecaron = 283; - e.ecedillabreve = 7709; - e.echarmenian = 1381; - e.echyiwnarmenian = 1415; - e.ecircle = 9428; - e.ecircumflex = 234; - e.ecircumflexacute = 7871; - e.ecircumflexbelow = 7705; - e.ecircumflexdotbelow = 7879; - e.ecircumflexgrave = 7873; - e.ecircumflexhookabove = 7875; - e.ecircumflextilde = 7877; - e.ecyrillic = 1108; - e.edblgrave = 517; - e.edeva = 2319; - e.edieresis = 235; - e.edot = 279; - e.edotaccent = 279; - e.edotbelow = 7865; - e.eegurmukhi = 2575; - e.eematragurmukhi = 2631; - e.efcyrillic = 1092; - e.egrave = 232; - e.egujarati = 2703; - e.eharmenian = 1383; - e.ehbopomofo = 12573; - e.ehiragana = 12360; - e.ehookabove = 7867; - e.eibopomofo = 12575; - e.eight = 56; - e.eightarabic = 1640; - e.eightbengali = 2542; - e.eightcircle = 9319; - e.eightcircleinversesansserif = 10129; - e.eightdeva = 2414; - e.eighteencircle = 9329; - e.eighteenparen = 9349; - e.eighteenperiod = 9369; - e.eightgujarati = 2798; - e.eightgurmukhi = 2670; - e.eighthackarabic = 1640; - e.eighthangzhou = 12328; - e.eighthnotebeamed = 9835; - e.eightideographicparen = 12839; - e.eightinferior = 8328; - e.eightmonospace = 65304; - e.eightoldstyle = 63288; - e.eightparen = 9339; - e.eightperiod = 9359; - e.eightpersian = 1784; - e.eightroman = 8567; - e.eightsuperior = 8312; - e.eightthai = 3672; - e.einvertedbreve = 519; - e.eiotifiedcyrillic = 1125; - e.ekatakana = 12456; - e.ekatakanahalfwidth = 65396; - e.ekonkargurmukhi = 2676; - e.ekorean = 12628; - e.elcyrillic = 1083; - e.element = 8712; - e.elevencircle = 9322; - e.elevenparen = 9342; - e.elevenperiod = 9362; - e.elevenroman = 8570; - e.ellipsis = 8230; - e.ellipsisvertical = 8942; - e.emacron = 275; - e.emacronacute = 7703; - e.emacrongrave = 7701; - e.emcyrillic = 1084; - e.emdash = 8212; - e.emdashvertical = 65073; - e.emonospace = 65349; - e.emphasismarkarmenian = 1371; - e.emptyset = 8709; - e.enbopomofo = 12579; - e.encyrillic = 1085; - e.endash = 8211; - e.endashvertical = 65074; - e.endescendercyrillic = 1187; - e.eng = 331; - e.engbopomofo = 12581; - e.enghecyrillic = 1189; - e.enhookcyrillic = 1224; - e.enspace = 8194; - e.eogonek = 281; - e.eokorean = 12627; - e.eopen = 603; - e.eopenclosed = 666; - e.eopenreversed = 604; - e.eopenreversedclosed = 606; - e.eopenreversedhook = 605; - e.eparen = 9376; - e.epsilon = 949; - e.epsilontonos = 941; - e.equal = 61; - e.equalmonospace = 65309; - e.equalsmall = 65126; - e.equalsuperior = 8316; - e.equivalence = 8801; - e.erbopomofo = 12582; - e.ercyrillic = 1088; - e.ereversed = 600; - e.ereversedcyrillic = 1101; - e.escyrillic = 1089; - e.esdescendercyrillic = 1195; - e.esh = 643; - e.eshcurl = 646; - e.eshortdeva = 2318; - e.eshortvowelsigndeva = 2374; - e.eshreversedloop = 426; - e.eshsquatreversed = 645; - e.esmallhiragana = 12359; - e.esmallkatakana = 12455; - e.esmallkatakanahalfwidth = 65386; - e.estimated = 8494; - e.esuperior = 63212; - e.eta = 951; - e.etarmenian = 1384; - e.etatonos = 942; - e.eth = 240; - e.etilde = 7869; - e.etildebelow = 7707; - e.etnahtafoukhhebrew = 1425; - e.etnahtafoukhlefthebrew = 1425; - e.etnahtahebrew = 1425; - e.etnahtalefthebrew = 1425; - e.eturned = 477; - e.eukorean = 12641; - e.euro = 8364; - e.evowelsignbengali = 2503; - e.evowelsigndeva = 2375; - e.evowelsigngujarati = 2759; - e.exclam = 33; - e.exclamarmenian = 1372; - e.exclamdbl = 8252; - e.exclamdown = 161; - e.exclamdownsmall = 63393; - e.exclammonospace = 65281; - e.exclamsmall = 63265; - e.existential = 8707; - e.ezh = 658; - e.ezhcaron = 495; - e.ezhcurl = 659; - e.ezhreversed = 441; - e.ezhtail = 442; - e.f = 102; - e.fadeva = 2398; - e.fagurmukhi = 2654; - e.fahrenheit = 8457; - e.fathaarabic = 1614; - e.fathalowarabic = 1614; - e.fathatanarabic = 1611; - e.fbopomofo = 12552; - e.fcircle = 9429; - e.fdotaccent = 7711; - e.feharabic = 1601; - e.feharmenian = 1414; - e.fehfinalarabic = 65234; - e.fehinitialarabic = 65235; - e.fehmedialarabic = 65236; - e.feicoptic = 997; - e.female = 9792; - e.ff = 64256; - e.f_f = 64256; - e.ffi = 64259; - e.f_f_i = 64259; - e.ffl = 64260; - e.f_f_l = 64260; - e.fi = 64257; - e.f_i = 64257; - e.fifteencircle = 9326; - e.fifteenparen = 9346; - e.fifteenperiod = 9366; - e.figuredash = 8210; - e.filledbox = 9632; - e.filledrect = 9644; - e.finalkaf = 1498; - e.finalkafdagesh = 64314; - e.finalkafdageshhebrew = 64314; - e.finalkafhebrew = 1498; - e.finalmem = 1501; - e.finalmemhebrew = 1501; - e.finalnun = 1503; - e.finalnunhebrew = 1503; - e.finalpe = 1507; - e.finalpehebrew = 1507; - e.finaltsadi = 1509; - e.finaltsadihebrew = 1509; - e.firsttonechinese = 713; - e.fisheye = 9673; - e.fitacyrillic = 1139; - e.five = 53; - e.fivearabic = 1637; - e.fivebengali = 2539; - e.fivecircle = 9316; - e.fivecircleinversesansserif = 10126; - e.fivedeva = 2411; - e.fiveeighths = 8541; - e.fivegujarati = 2795; - e.fivegurmukhi = 2667; - e.fivehackarabic = 1637; - e.fivehangzhou = 12325; - e.fiveideographicparen = 12836; - e.fiveinferior = 8325; - e.fivemonospace = 65301; - e.fiveoldstyle = 63285; - e.fiveparen = 9336; - e.fiveperiod = 9356; - e.fivepersian = 1781; - e.fiveroman = 8564; - e.fivesuperior = 8309; - e.fivethai = 3669; - e.fl = 64258; - e.f_l = 64258; - e.florin = 402; - e.fmonospace = 65350; - e.fmsquare = 13209; - e.fofanthai = 3615; - e.fofathai = 3613; - e.fongmanthai = 3663; - e.forall = 8704; - e.four = 52; - e.fourarabic = 1636; - e.fourbengali = 2538; - e.fourcircle = 9315; - e.fourcircleinversesansserif = 10125; - e.fourdeva = 2410; - e.fourgujarati = 2794; - e.fourgurmukhi = 2666; - e.fourhackarabic = 1636; - e.fourhangzhou = 12324; - e.fourideographicparen = 12835; - e.fourinferior = 8324; - e.fourmonospace = 65300; - e.fournumeratorbengali = 2551; - e.fouroldstyle = 63284; - e.fourparen = 9335; - e.fourperiod = 9355; - e.fourpersian = 1780; - e.fourroman = 8563; - e.foursuperior = 8308; - e.fourteencircle = 9325; - e.fourteenparen = 9345; - e.fourteenperiod = 9365; - e.fourthai = 3668; - e.fourthtonechinese = 715; - e.fparen = 9377; - e.fraction = 8260; - e.franc = 8355; - e.g = 103; - e.gabengali = 2455; - e.gacute = 501; - e.gadeva = 2327; - e.gafarabic = 1711; - e.gaffinalarabic = 64403; - e.gafinitialarabic = 64404; - e.gafmedialarabic = 64405; - e.gagujarati = 2711; - e.gagurmukhi = 2583; - e.gahiragana = 12364; - e.gakatakana = 12460; - e.gamma = 947; - e.gammalatinsmall = 611; - e.gammasuperior = 736; - e.gangiacoptic = 1003; - e.gbopomofo = 12557; - e.gbreve = 287; - e.gcaron = 487; - e.gcedilla = 291; - e.gcircle = 9430; - e.gcircumflex = 285; - e.gcommaaccent = 291; - e.gdot = 289; - e.gdotaccent = 289; - e.gecyrillic = 1075; - e.gehiragana = 12370; - e.gekatakana = 12466; - e.geometricallyequal = 8785; - e.gereshaccenthebrew = 1436; - e.gereshhebrew = 1523; - e.gereshmuqdamhebrew = 1437; - e.germandbls = 223; - e.gershayimaccenthebrew = 1438; - e.gershayimhebrew = 1524; - e.getamark = 12307; - e.ghabengali = 2456; - e.ghadarmenian = 1394; - e.ghadeva = 2328; - e.ghagujarati = 2712; - e.ghagurmukhi = 2584; - e.ghainarabic = 1594; - e.ghainfinalarabic = 65230; - e.ghaininitialarabic = 65231; - e.ghainmedialarabic = 65232; - e.ghemiddlehookcyrillic = 1173; - e.ghestrokecyrillic = 1171; - e.gheupturncyrillic = 1169; - e.ghhadeva = 2394; - e.ghhagurmukhi = 2650; - e.ghook = 608; - e.ghzsquare = 13203; - e.gihiragana = 12366; - e.gikatakana = 12462; - e.gimarmenian = 1379; - e.gimel = 1490; - e.gimeldagesh = 64306; - e.gimeldageshhebrew = 64306; - e.gimelhebrew = 1490; - e.gjecyrillic = 1107; - e.glottalinvertedstroke = 446; - e.glottalstop = 660; - e.glottalstopinverted = 662; - e.glottalstopmod = 704; - e.glottalstopreversed = 661; - e.glottalstopreversedmod = 705; - e.glottalstopreversedsuperior = 740; - e.glottalstopstroke = 673; - e.glottalstopstrokereversed = 674; - e.gmacron = 7713; - e.gmonospace = 65351; - e.gohiragana = 12372; - e.gokatakana = 12468; - e.gparen = 9378; - e.gpasquare = 13228; - e.gradient = 8711; - e.grave = 96; - e.gravebelowcmb = 790; - e.gravecmb = 768; - e.gravecomb = 768; - e.gravedeva = 2387; - e.gravelowmod = 718; - e.gravemonospace = 65344; - e.gravetonecmb = 832; - e.greater = 62; - e.greaterequal = 8805; - e.greaterequalorless = 8923; - e.greatermonospace = 65310; - e.greaterorequivalent = 8819; - e.greaterorless = 8823; - e.greateroverequal = 8807; - e.greatersmall = 65125; - e.gscript = 609; - e.gstroke = 485; - e.guhiragana = 12368; - e.guillemotleft = 171; - e.guillemotright = 187; - e.guilsinglleft = 8249; - e.guilsinglright = 8250; - e.gukatakana = 12464; - e.guramusquare = 13080; - e.gysquare = 13257; - e.h = 104; - e.haabkhasiancyrillic = 1193; - e.haaltonearabic = 1729; - e.habengali = 2489; - e.hadescendercyrillic = 1203; - e.hadeva = 2361; - e.hagujarati = 2745; - e.hagurmukhi = 2617; - e.haharabic = 1581; - e.hahfinalarabic = 65186; - e.hahinitialarabic = 65187; - e.hahiragana = 12399; - e.hahmedialarabic = 65188; - e.haitusquare = 13098; - e.hakatakana = 12495; - e.hakatakanahalfwidth = 65418; - e.halantgurmukhi = 2637; - e.hamzaarabic = 1569; - e.hamzalowarabic = 1569; - e.hangulfiller = 12644; - e.hardsigncyrillic = 1098; - e.harpoonleftbarbup = 8636; - e.harpoonrightbarbup = 8640; - e.hasquare = 13258; - e.hatafpatah = 1458; - e.hatafpatah16 = 1458; - e.hatafpatah23 = 1458; - e.hatafpatah2f = 1458; - e.hatafpatahhebrew = 1458; - e.hatafpatahnarrowhebrew = 1458; - e.hatafpatahquarterhebrew = 1458; - e.hatafpatahwidehebrew = 1458; - e.hatafqamats = 1459; - e.hatafqamats1b = 1459; - e.hatafqamats28 = 1459; - e.hatafqamats34 = 1459; - e.hatafqamatshebrew = 1459; - e.hatafqamatsnarrowhebrew = 1459; - e.hatafqamatsquarterhebrew = 1459; - e.hatafqamatswidehebrew = 1459; - e.hatafsegol = 1457; - e.hatafsegol17 = 1457; - e.hatafsegol24 = 1457; - e.hatafsegol30 = 1457; - e.hatafsegolhebrew = 1457; - e.hatafsegolnarrowhebrew = 1457; - e.hatafsegolquarterhebrew = 1457; - e.hatafsegolwidehebrew = 1457; - e.hbar = 295; - e.hbopomofo = 12559; - e.hbrevebelow = 7723; - e.hcedilla = 7721; - e.hcircle = 9431; - e.hcircumflex = 293; - e.hdieresis = 7719; - e.hdotaccent = 7715; - e.hdotbelow = 7717; - e.he = 1492; - e.heart = 9829; - e.heartsuitblack = 9829; - e.heartsuitwhite = 9825; - e.hedagesh = 64308; - e.hedageshhebrew = 64308; - e.hehaltonearabic = 1729; - e.heharabic = 1607; - e.hehebrew = 1492; - e.hehfinalaltonearabic = 64423; - e.hehfinalalttwoarabic = 65258; - e.hehfinalarabic = 65258; - e.hehhamzaabovefinalarabic = 64421; - e.hehhamzaaboveisolatedarabic = 64420; - e.hehinitialaltonearabic = 64424; - e.hehinitialarabic = 65259; - e.hehiragana = 12408; - e.hehmedialaltonearabic = 64425; - e.hehmedialarabic = 65260; - e.heiseierasquare = 13179; - e.hekatakana = 12504; - e.hekatakanahalfwidth = 65421; - e.hekutaarusquare = 13110; - e.henghook = 615; - e.herutusquare = 13113; - e.het = 1495; - e.hethebrew = 1495; - e.hhook = 614; - e.hhooksuperior = 689; - e.hieuhacirclekorean = 12923; - e.hieuhaparenkorean = 12827; - e.hieuhcirclekorean = 12909; - e.hieuhkorean = 12622; - e.hieuhparenkorean = 12813; - e.hihiragana = 12402; - e.hikatakana = 12498; - e.hikatakanahalfwidth = 65419; - e.hiriq = 1460; - e.hiriq14 = 1460; - e.hiriq21 = 1460; - e.hiriq2d = 1460; - e.hiriqhebrew = 1460; - e.hiriqnarrowhebrew = 1460; - e.hiriqquarterhebrew = 1460; - e.hiriqwidehebrew = 1460; - e.hlinebelow = 7830; - e.hmonospace = 65352; - e.hoarmenian = 1392; - e.hohipthai = 3627; - e.hohiragana = 12411; - e.hokatakana = 12507; - e.hokatakanahalfwidth = 65422; - e.holam = 1465; - e.holam19 = 1465; - e.holam26 = 1465; - e.holam32 = 1465; - e.holamhebrew = 1465; - e.holamnarrowhebrew = 1465; - e.holamquarterhebrew = 1465; - e.holamwidehebrew = 1465; - e.honokhukthai = 3630; - e.hookabovecomb = 777; - e.hookcmb = 777; - e.hookpalatalizedbelowcmb = 801; - e.hookretroflexbelowcmb = 802; - e.hoonsquare = 13122; - e.horicoptic = 1001; - e.horizontalbar = 8213; - e.horncmb = 795; - e.hotsprings = 9832; - e.house = 8962; - e.hparen = 9379; - e.hsuperior = 688; - e.hturned = 613; - e.huhiragana = 12405; - e.huiitosquare = 13107; - e.hukatakana = 12501; - e.hukatakanahalfwidth = 65420; - e.hungarumlaut = 733; - e.hungarumlautcmb = 779; - e.hv = 405; - e.hyphen = 45; - e.hypheninferior = 63205; - e.hyphenmonospace = 65293; - e.hyphensmall = 65123; - e.hyphensuperior = 63206; - e.hyphentwo = 8208; - e.i = 105; - e.iacute = 237; - e.iacyrillic = 1103; - e.ibengali = 2439; - e.ibopomofo = 12583; - e.ibreve = 301; - e.icaron = 464; - e.icircle = 9432; - e.icircumflex = 238; - e.icyrillic = 1110; - e.idblgrave = 521; - e.ideographearthcircle = 12943; - e.ideographfirecircle = 12939; - e.ideographicallianceparen = 12863; - e.ideographiccallparen = 12858; - e.ideographiccentrecircle = 12965; - e.ideographicclose = 12294; - e.ideographiccomma = 12289; - e.ideographiccommaleft = 65380; - e.ideographiccongratulationparen = 12855; - e.ideographiccorrectcircle = 12963; - e.ideographicearthparen = 12847; - e.ideographicenterpriseparen = 12861; - e.ideographicexcellentcircle = 12957; - e.ideographicfestivalparen = 12864; - e.ideographicfinancialcircle = 12950; - e.ideographicfinancialparen = 12854; - e.ideographicfireparen = 12843; - e.ideographichaveparen = 12850; - e.ideographichighcircle = 12964; - e.ideographiciterationmark = 12293; - e.ideographiclaborcircle = 12952; - e.ideographiclaborparen = 12856; - e.ideographicleftcircle = 12967; - e.ideographiclowcircle = 12966; - e.ideographicmedicinecircle = 12969; - e.ideographicmetalparen = 12846; - e.ideographicmoonparen = 12842; - e.ideographicnameparen = 12852; - e.ideographicperiod = 12290; - e.ideographicprintcircle = 12958; - e.ideographicreachparen = 12867; - e.ideographicrepresentparen = 12857; - e.ideographicresourceparen = 12862; - e.ideographicrightcircle = 12968; - e.ideographicsecretcircle = 12953; - e.ideographicselfparen = 12866; - e.ideographicsocietyparen = 12851; - e.ideographicspace = 12288; - e.ideographicspecialparen = 12853; - e.ideographicstockparen = 12849; - e.ideographicstudyparen = 12859; - e.ideographicsunparen = 12848; - e.ideographicsuperviseparen = 12860; - e.ideographicwaterparen = 12844; - e.ideographicwoodparen = 12845; - e.ideographiczero = 12295; - e.ideographmetalcircle = 12942; - e.ideographmooncircle = 12938; - e.ideographnamecircle = 12948; - e.ideographsuncircle = 12944; - e.ideographwatercircle = 12940; - e.ideographwoodcircle = 12941; - e.ideva = 2311; - e.idieresis = 239; - e.idieresisacute = 7727; - e.idieresiscyrillic = 1253; - e.idotbelow = 7883; - e.iebrevecyrillic = 1239; - e.iecyrillic = 1077; - e.ieungacirclekorean = 12917; - e.ieungaparenkorean = 12821; - e.ieungcirclekorean = 12903; - e.ieungkorean = 12615; - e.ieungparenkorean = 12807; - e.igrave = 236; - e.igujarati = 2695; - e.igurmukhi = 2567; - e.ihiragana = 12356; - e.ihookabove = 7881; - e.iibengali = 2440; - e.iicyrillic = 1080; - e.iideva = 2312; - e.iigujarati = 2696; - e.iigurmukhi = 2568; - e.iimatragurmukhi = 2624; - e.iinvertedbreve = 523; - e.iishortcyrillic = 1081; - e.iivowelsignbengali = 2496; - e.iivowelsigndeva = 2368; - e.iivowelsigngujarati = 2752; - e.ij = 307; - e.ikatakana = 12452; - e.ikatakanahalfwidth = 65394; - e.ikorean = 12643; - e.ilde = 732; - e.iluyhebrew = 1452; - e.imacron = 299; - e.imacroncyrillic = 1251; - e.imageorapproximatelyequal = 8787; - e.imatragurmukhi = 2623; - e.imonospace = 65353; - e.increment = 8710; - e.infinity = 8734; - e.iniarmenian = 1387; - e.integral = 8747; - e.integralbottom = 8993; - e.integralbt = 8993; - e.integralex = 63733; - e.integraltop = 8992; - e.integraltp = 8992; - e.intersection = 8745; - e.intisquare = 13061; - e.invbullet = 9688; - e.invcircle = 9689; - e.invsmileface = 9787; - e.iocyrillic = 1105; - e.iogonek = 303; - e.iota = 953; - e.iotadieresis = 970; - e.iotadieresistonos = 912; - e.iotalatin = 617; - e.iotatonos = 943; - e.iparen = 9380; - e.irigurmukhi = 2674; - e.ismallhiragana = 12355; - e.ismallkatakana = 12451; - e.ismallkatakanahalfwidth = 65384; - e.issharbengali = 2554; - e.istroke = 616; - e.isuperior = 63213; - e.iterationhiragana = 12445; - e.iterationkatakana = 12541; - e.itilde = 297; - e.itildebelow = 7725; - e.iubopomofo = 12585; - e.iucyrillic = 1102; - e.ivowelsignbengali = 2495; - e.ivowelsigndeva = 2367; - e.ivowelsigngujarati = 2751; - e.izhitsacyrillic = 1141; - e.izhitsadblgravecyrillic = 1143; - e.j = 106; - e.jaarmenian = 1393; - e.jabengali = 2460; - e.jadeva = 2332; - e.jagujarati = 2716; - e.jagurmukhi = 2588; - e.jbopomofo = 12560; - e.jcaron = 496; - e.jcircle = 9433; - e.jcircumflex = 309; - e.jcrossedtail = 669; - e.jdotlessstroke = 607; - e.jecyrillic = 1112; - e.jeemarabic = 1580; - e.jeemfinalarabic = 65182; - e.jeeminitialarabic = 65183; - e.jeemmedialarabic = 65184; - e.jeharabic = 1688; - e.jehfinalarabic = 64395; - e.jhabengali = 2461; - e.jhadeva = 2333; - e.jhagujarati = 2717; - e.jhagurmukhi = 2589; - e.jheharmenian = 1403; - e.jis = 12292; - e.jmonospace = 65354; - e.jparen = 9381; - e.jsuperior = 690; - e.k = 107; - e.kabashkircyrillic = 1185; - e.kabengali = 2453; - e.kacute = 7729; - e.kacyrillic = 1082; - e.kadescendercyrillic = 1179; - e.kadeva = 2325; - e.kaf = 1499; - e.kafarabic = 1603; - e.kafdagesh = 64315; - e.kafdageshhebrew = 64315; - e.kaffinalarabic = 65242; - e.kafhebrew = 1499; - e.kafinitialarabic = 65243; - e.kafmedialarabic = 65244; - e.kafrafehebrew = 64333; - e.kagujarati = 2709; - e.kagurmukhi = 2581; - e.kahiragana = 12363; - e.kahookcyrillic = 1220; - e.kakatakana = 12459; - e.kakatakanahalfwidth = 65398; - e.kappa = 954; - e.kappasymbolgreek = 1008; - e.kapyeounmieumkorean = 12657; - e.kapyeounphieuphkorean = 12676; - e.kapyeounpieupkorean = 12664; - e.kapyeounssangpieupkorean = 12665; - e.karoriisquare = 13069; - e.kashidaautoarabic = 1600; - e.kashidaautonosidebearingarabic = 1600; - e.kasmallkatakana = 12533; - e.kasquare = 13188; - e.kasraarabic = 1616; - e.kasratanarabic = 1613; - e.kastrokecyrillic = 1183; - e.katahiraprolongmarkhalfwidth = 65392; - e.kaverticalstrokecyrillic = 1181; - e.kbopomofo = 12558; - e.kcalsquare = 13193; - e.kcaron = 489; - e.kcedilla = 311; - e.kcircle = 9434; - e.kcommaaccent = 311; - e.kdotbelow = 7731; - e.keharmenian = 1412; - e.kehiragana = 12369; - e.kekatakana = 12465; - e.kekatakanahalfwidth = 65401; - e.kenarmenian = 1391; - e.kesmallkatakana = 12534; - e.kgreenlandic = 312; - e.khabengali = 2454; - e.khacyrillic = 1093; - e.khadeva = 2326; - e.khagujarati = 2710; - e.khagurmukhi = 2582; - e.khaharabic = 1582; - e.khahfinalarabic = 65190; - e.khahinitialarabic = 65191; - e.khahmedialarabic = 65192; - e.kheicoptic = 999; - e.khhadeva = 2393; - e.khhagurmukhi = 2649; - e.khieukhacirclekorean = 12920; - e.khieukhaparenkorean = 12824; - e.khieukhcirclekorean = 12906; - e.khieukhkorean = 12619; - e.khieukhparenkorean = 12810; - e.khokhaithai = 3586; - e.khokhonthai = 3589; - e.khokhuatthai = 3587; - e.khokhwaithai = 3588; - e.khomutthai = 3675; - e.khook = 409; - e.khorakhangthai = 3590; - e.khzsquare = 13201; - e.kihiragana = 12365; - e.kikatakana = 12461; - e.kikatakanahalfwidth = 65399; - e.kiroguramusquare = 13077; - e.kiromeetorusquare = 13078; - e.kirosquare = 13076; - e.kiyeokacirclekorean = 12910; - e.kiyeokaparenkorean = 12814; - e.kiyeokcirclekorean = 12896; - e.kiyeokkorean = 12593; - e.kiyeokparenkorean = 12800; - e.kiyeoksioskorean = 12595; - e.kjecyrillic = 1116; - e.klinebelow = 7733; - e.klsquare = 13208; - e.kmcubedsquare = 13222; - e.kmonospace = 65355; - e.kmsquaredsquare = 13218; - e.kohiragana = 12371; - e.kohmsquare = 13248; - e.kokaithai = 3585; - e.kokatakana = 12467; - e.kokatakanahalfwidth = 65402; - e.kooposquare = 13086; - e.koppacyrillic = 1153; - e.koreanstandardsymbol = 12927; - e.koroniscmb = 835; - e.kparen = 9382; - e.kpasquare = 13226; - e.ksicyrillic = 1135; - e.ktsquare = 13263; - e.kturned = 670; - e.kuhiragana = 12367; - e.kukatakana = 12463; - e.kukatakanahalfwidth = 65400; - e.kvsquare = 13240; - e.kwsquare = 13246; - e.l = 108; - e.labengali = 2482; - e.lacute = 314; - e.ladeva = 2354; - e.lagujarati = 2738; - e.lagurmukhi = 2610; - e.lakkhangyaothai = 3653; - e.lamaleffinalarabic = 65276; - e.lamalefhamzaabovefinalarabic = 65272; - e.lamalefhamzaaboveisolatedarabic = 65271; - e.lamalefhamzabelowfinalarabic = 65274; - e.lamalefhamzabelowisolatedarabic = 65273; - e.lamalefisolatedarabic = 65275; - e.lamalefmaddaabovefinalarabic = 65270; - e.lamalefmaddaaboveisolatedarabic = 65269; - e.lamarabic = 1604; - e.lambda = 955; - e.lambdastroke = 411; - e.lamed = 1500; - e.lameddagesh = 64316; - e.lameddageshhebrew = 64316; - e.lamedhebrew = 1500; - e.lamfinalarabic = 65246; - e.lamhahinitialarabic = 64714; - e.laminitialarabic = 65247; - e.lamjeeminitialarabic = 64713; - e.lamkhahinitialarabic = 64715; - e.lamlamhehisolatedarabic = 65010; - e.lammedialarabic = 65248; - e.lammeemhahinitialarabic = 64904; - e.lammeeminitialarabic = 64716; - e.largecircle = 9711; - e.lbar = 410; - e.lbelt = 620; - e.lbopomofo = 12556; - e.lcaron = 318; - e.lcedilla = 316; - e.lcircle = 9435; - e.lcircumflexbelow = 7741; - e.lcommaaccent = 316; - e.ldot = 320; - e.ldotaccent = 320; - e.ldotbelow = 7735; - e.ldotbelowmacron = 7737; - e.leftangleabovecmb = 794; - e.lefttackbelowcmb = 792; - e.less = 60; - e.lessequal = 8804; - e.lessequalorgreater = 8922; - e.lessmonospace = 65308; - e.lessorequivalent = 8818; - e.lessorgreater = 8822; - e.lessoverequal = 8806; - e.lesssmall = 65124; - e.lezh = 622; - e.lfblock = 9612; - e.lhookretroflex = 621; - e.lira = 8356; - e.liwnarmenian = 1388; - e.lj = 457; - e.ljecyrillic = 1113; - e.ll = 63168; - e.lladeva = 2355; - e.llagujarati = 2739; - e.llinebelow = 7739; - e.llladeva = 2356; - e.llvocalicbengali = 2529; - e.llvocalicdeva = 2401; - e.llvocalicvowelsignbengali = 2531; - e.llvocalicvowelsigndeva = 2403; - e.lmiddletilde = 619; - e.lmonospace = 65356; - e.lmsquare = 13264; - e.lochulathai = 3628; - e.logicaland = 8743; - e.logicalnot = 172; - e.logicalnotreversed = 8976; - e.logicalor = 8744; - e.lolingthai = 3621; - e.longs = 383; - e.lowlinecenterline = 65102; - e.lowlinecmb = 818; - e.lowlinedashed = 65101; - e.lozenge = 9674; - e.lparen = 9383; - e.lslash = 322; - e.lsquare = 8467; - e.lsuperior = 63214; - e.ltshade = 9617; - e.luthai = 3622; - e.lvocalicbengali = 2444; - e.lvocalicdeva = 2316; - e.lvocalicvowelsignbengali = 2530; - e.lvocalicvowelsigndeva = 2402; - e.lxsquare = 13267; - e.m = 109; - e.mabengali = 2478; - e.macron = 175; - e.macronbelowcmb = 817; - e.macroncmb = 772; - e.macronlowmod = 717; - e.macronmonospace = 65507; - e.macute = 7743; - e.madeva = 2350; - e.magujarati = 2734; - e.magurmukhi = 2606; - e.mahapakhhebrew = 1444; - e.mahapakhlefthebrew = 1444; - e.mahiragana = 12414; - e.maichattawalowleftthai = 63637; - e.maichattawalowrightthai = 63636; - e.maichattawathai = 3659; - e.maichattawaupperleftthai = 63635; - e.maieklowleftthai = 63628; - e.maieklowrightthai = 63627; - e.maiekthai = 3656; - e.maiekupperleftthai = 63626; - e.maihanakatleftthai = 63620; - e.maihanakatthai = 3633; - e.maitaikhuleftthai = 63625; - e.maitaikhuthai = 3655; - e.maitholowleftthai = 63631; - e.maitholowrightthai = 63630; - e.maithothai = 3657; - e.maithoupperleftthai = 63629; - e.maitrilowleftthai = 63634; - e.maitrilowrightthai = 63633; - e.maitrithai = 3658; - e.maitriupperleftthai = 63632; - e.maiyamokthai = 3654; - e.makatakana = 12510; - e.makatakanahalfwidth = 65423; - e.male = 9794; - e.mansyonsquare = 13127; - e.maqafhebrew = 1470; - e.mars = 9794; - e.masoracirclehebrew = 1455; - e.masquare = 13187; - e.mbopomofo = 12551; - e.mbsquare = 13268; - e.mcircle = 9436; - e.mcubedsquare = 13221; - e.mdotaccent = 7745; - e.mdotbelow = 7747; - e.meemarabic = 1605; - e.meemfinalarabic = 65250; - e.meeminitialarabic = 65251; - e.meemmedialarabic = 65252; - e.meemmeeminitialarabic = 64721; - e.meemmeemisolatedarabic = 64584; - e.meetorusquare = 13133; - e.mehiragana = 12417; - e.meizierasquare = 13182; - e.mekatakana = 12513; - e.mekatakanahalfwidth = 65426; - e.mem = 1502; - e.memdagesh = 64318; - e.memdageshhebrew = 64318; - e.memhebrew = 1502; - e.menarmenian = 1396; - e.merkhahebrew = 1445; - e.merkhakefulahebrew = 1446; - e.merkhakefulalefthebrew = 1446; - e.merkhalefthebrew = 1445; - e.mhook = 625; - e.mhzsquare = 13202; - e.middledotkatakanahalfwidth = 65381; - e.middot = 183; - e.mieumacirclekorean = 12914; - e.mieumaparenkorean = 12818; - e.mieumcirclekorean = 12900; - e.mieumkorean = 12609; - e.mieumpansioskorean = 12656; - e.mieumparenkorean = 12804; - e.mieumpieupkorean = 12654; - e.mieumsioskorean = 12655; - e.mihiragana = 12415; - e.mikatakana = 12511; - e.mikatakanahalfwidth = 65424; - e.minus = 8722; - e.minusbelowcmb = 800; - e.minuscircle = 8854; - e.minusmod = 727; - e.minusplus = 8723; - e.minute = 8242; - e.miribaarusquare = 13130; - e.mirisquare = 13129; - e.mlonglegturned = 624; - e.mlsquare = 13206; - e.mmcubedsquare = 13219; - e.mmonospace = 65357; - e.mmsquaredsquare = 13215; - e.mohiragana = 12418; - e.mohmsquare = 13249; - e.mokatakana = 12514; - e.mokatakanahalfwidth = 65427; - e.molsquare = 13270; - e.momathai = 3617; - e.moverssquare = 13223; - e.moverssquaredsquare = 13224; - e.mparen = 9384; - e.mpasquare = 13227; - e.mssquare = 13235; - e.msuperior = 63215; - e.mturned = 623; - e.mu = 181; - e.mu1 = 181; - e.muasquare = 13186; - e.muchgreater = 8811; - e.muchless = 8810; - e.mufsquare = 13196; - e.mugreek = 956; - e.mugsquare = 13197; - e.muhiragana = 12416; - e.mukatakana = 12512; - e.mukatakanahalfwidth = 65425; - e.mulsquare = 13205; - e.multiply = 215; - e.mumsquare = 13211; - e.munahhebrew = 1443; - e.munahlefthebrew = 1443; - e.musicalnote = 9834; - e.musicalnotedbl = 9835; - e.musicflatsign = 9837; - e.musicsharpsign = 9839; - e.mussquare = 13234; - e.muvsquare = 13238; - e.muwsquare = 13244; - e.mvmegasquare = 13241; - e.mvsquare = 13239; - e.mwmegasquare = 13247; - e.mwsquare = 13245; - e.n = 110; - e.nabengali = 2472; - e.nabla = 8711; - e.nacute = 324; - e.nadeva = 2344; - e.nagujarati = 2728; - e.nagurmukhi = 2600; - e.nahiragana = 12394; - e.nakatakana = 12490; - e.nakatakanahalfwidth = 65413; - e.napostrophe = 329; - e.nasquare = 13185; - e.nbopomofo = 12555; - e.nbspace = 160; - e.ncaron = 328; - e.ncedilla = 326; - e.ncircle = 9437; - e.ncircumflexbelow = 7755; - e.ncommaaccent = 326; - e.ndotaccent = 7749; - e.ndotbelow = 7751; - e.nehiragana = 12397; - e.nekatakana = 12493; - e.nekatakanahalfwidth = 65416; - e.newsheqelsign = 8362; - e.nfsquare = 13195; - e.ngabengali = 2457; - e.ngadeva = 2329; - e.ngagujarati = 2713; - e.ngagurmukhi = 2585; - e.ngonguthai = 3591; - e.nhiragana = 12435; - e.nhookleft = 626; - e.nhookretroflex = 627; - e.nieunacirclekorean = 12911; - e.nieunaparenkorean = 12815; - e.nieuncieuckorean = 12597; - e.nieuncirclekorean = 12897; - e.nieunhieuhkorean = 12598; - e.nieunkorean = 12596; - e.nieunpansioskorean = 12648; - e.nieunparenkorean = 12801; - e.nieunsioskorean = 12647; - e.nieuntikeutkorean = 12646; - e.nihiragana = 12395; - e.nikatakana = 12491; - e.nikatakanahalfwidth = 65414; - e.nikhahitleftthai = 63641; - e.nikhahitthai = 3661; - e.nine = 57; - e.ninearabic = 1641; - e.ninebengali = 2543; - e.ninecircle = 9320; - e.ninecircleinversesansserif = 10130; - e.ninedeva = 2415; - e.ninegujarati = 2799; - e.ninegurmukhi = 2671; - e.ninehackarabic = 1641; - e.ninehangzhou = 12329; - e.nineideographicparen = 12840; - e.nineinferior = 8329; - e.ninemonospace = 65305; - e.nineoldstyle = 63289; - e.nineparen = 9340; - e.nineperiod = 9360; - e.ninepersian = 1785; - e.nineroman = 8568; - e.ninesuperior = 8313; - e.nineteencircle = 9330; - e.nineteenparen = 9350; - e.nineteenperiod = 9370; - e.ninethai = 3673; - e.nj = 460; - e.njecyrillic = 1114; - e.nkatakana = 12531; - e.nkatakanahalfwidth = 65437; - e.nlegrightlong = 414; - e.nlinebelow = 7753; - e.nmonospace = 65358; - e.nmsquare = 13210; - e.nnabengali = 2467; - e.nnadeva = 2339; - e.nnagujarati = 2723; - e.nnagurmukhi = 2595; - e.nnnadeva = 2345; - e.nohiragana = 12398; - e.nokatakana = 12494; - e.nokatakanahalfwidth = 65417; - e.nonbreakingspace = 160; - e.nonenthai = 3603; - e.nonuthai = 3609; - e.noonarabic = 1606; - e.noonfinalarabic = 65254; - e.noonghunnaarabic = 1722; - e.noonghunnafinalarabic = 64415; - e.nooninitialarabic = 65255; - e.noonjeeminitialarabic = 64722; - e.noonjeemisolatedarabic = 64587; - e.noonmedialarabic = 65256; - e.noonmeeminitialarabic = 64725; - e.noonmeemisolatedarabic = 64590; - e.noonnoonfinalarabic = 64653; - e.notcontains = 8716; - e.notelement = 8713; - e.notelementof = 8713; - e.notequal = 8800; - e.notgreater = 8815; - e.notgreaternorequal = 8817; - e.notgreaternorless = 8825; - e.notidentical = 8802; - e.notless = 8814; - e.notlessnorequal = 8816; - e.notparallel = 8742; - e.notprecedes = 8832; - e.notsubset = 8836; - e.notsucceeds = 8833; - e.notsuperset = 8837; - e.nowarmenian = 1398; - e.nparen = 9385; - e.nssquare = 13233; - e.nsuperior = 8319; - e.ntilde = 241; - e.nu = 957; - e.nuhiragana = 12396; - e.nukatakana = 12492; - e.nukatakanahalfwidth = 65415; - e.nuktabengali = 2492; - e.nuktadeva = 2364; - e.nuktagujarati = 2748; - e.nuktagurmukhi = 2620; - e.numbersign = 35; - e.numbersignmonospace = 65283; - e.numbersignsmall = 65119; - e.numeralsigngreek = 884; - e.numeralsignlowergreek = 885; - e.numero = 8470; - e.nun = 1504; - e.nundagesh = 64320; - e.nundageshhebrew = 64320; - e.nunhebrew = 1504; - e.nvsquare = 13237; - e.nwsquare = 13243; - e.nyabengali = 2462; - e.nyadeva = 2334; - e.nyagujarati = 2718; - e.nyagurmukhi = 2590; - e.o = 111; - e.oacute = 243; - e.oangthai = 3629; - e.obarred = 629; - e.obarredcyrillic = 1257; - e.obarreddieresiscyrillic = 1259; - e.obengali = 2451; - e.obopomofo = 12571; - e.obreve = 335; - e.ocandradeva = 2321; - e.ocandragujarati = 2705; - e.ocandravowelsigndeva = 2377; - e.ocandravowelsigngujarati = 2761; - e.ocaron = 466; - e.ocircle = 9438; - e.ocircumflex = 244; - e.ocircumflexacute = 7889; - e.ocircumflexdotbelow = 7897; - e.ocircumflexgrave = 7891; - e.ocircumflexhookabove = 7893; - e.ocircumflextilde = 7895; - e.ocyrillic = 1086; - e.odblacute = 337; - e.odblgrave = 525; - e.odeva = 2323; - e.odieresis = 246; - e.odieresiscyrillic = 1255; - e.odotbelow = 7885; - e.oe = 339; - e.oekorean = 12634; - e.ogonek = 731; - e.ogonekcmb = 808; - e.ograve = 242; - e.ogujarati = 2707; - e.oharmenian = 1413; - e.ohiragana = 12362; - e.ohookabove = 7887; - e.ohorn = 417; - e.ohornacute = 7899; - e.ohorndotbelow = 7907; - e.ohorngrave = 7901; - e.ohornhookabove = 7903; - e.ohorntilde = 7905; - e.ohungarumlaut = 337; - e.oi = 419; - e.oinvertedbreve = 527; - e.okatakana = 12458; - e.okatakanahalfwidth = 65397; - e.okorean = 12631; - e.olehebrew = 1451; - e.omacron = 333; - e.omacronacute = 7763; - e.omacrongrave = 7761; - e.omdeva = 2384; - e.omega = 969; - e.omega1 = 982; - e.omegacyrillic = 1121; - e.omegalatinclosed = 631; - e.omegaroundcyrillic = 1147; - e.omegatitlocyrillic = 1149; - e.omegatonos = 974; - e.omgujarati = 2768; - e.omicron = 959; - e.omicrontonos = 972; - e.omonospace = 65359; - e.one = 49; - e.onearabic = 1633; - e.onebengali = 2535; - e.onecircle = 9312; - e.onecircleinversesansserif = 10122; - e.onedeva = 2407; - e.onedotenleader = 8228; - e.oneeighth = 8539; - e.onefitted = 63196; - e.onegujarati = 2791; - e.onegurmukhi = 2663; - e.onehackarabic = 1633; - e.onehalf = 189; - e.onehangzhou = 12321; - e.oneideographicparen = 12832; - e.oneinferior = 8321; - e.onemonospace = 65297; - e.onenumeratorbengali = 2548; - e.oneoldstyle = 63281; - e.oneparen = 9332; - e.oneperiod = 9352; - e.onepersian = 1777; - e.onequarter = 188; - e.oneroman = 8560; - e.onesuperior = 185; - e.onethai = 3665; - e.onethird = 8531; - e.oogonek = 491; - e.oogonekmacron = 493; - e.oogurmukhi = 2579; - e.oomatragurmukhi = 2635; - e.oopen = 596; - e.oparen = 9386; - e.openbullet = 9702; - e.option = 8997; - e.ordfeminine = 170; - e.ordmasculine = 186; - e.orthogonal = 8735; - e.oshortdeva = 2322; - e.oshortvowelsigndeva = 2378; - e.oslash = 248; - e.oslashacute = 511; - e.osmallhiragana = 12361; - e.osmallkatakana = 12457; - e.osmallkatakanahalfwidth = 65387; - e.ostrokeacute = 511; - e.osuperior = 63216; - e.otcyrillic = 1151; - e.otilde = 245; - e.otildeacute = 7757; - e.otildedieresis = 7759; - e.oubopomofo = 12577; - e.overline = 8254; - e.overlinecenterline = 65098; - e.overlinecmb = 773; - e.overlinedashed = 65097; - e.overlinedblwavy = 65100; - e.overlinewavy = 65099; - e.overscore = 175; - e.ovowelsignbengali = 2507; - e.ovowelsigndeva = 2379; - e.ovowelsigngujarati = 2763; - e.p = 112; - e.paampssquare = 13184; - e.paasentosquare = 13099; - e.pabengali = 2474; - e.pacute = 7765; - e.padeva = 2346; - e.pagedown = 8671; - e.pageup = 8670; - e.pagujarati = 2730; - e.pagurmukhi = 2602; - e.pahiragana = 12401; - e.paiyannoithai = 3631; - e.pakatakana = 12497; - e.palatalizationcyrilliccmb = 1156; - e.palochkacyrillic = 1216; - e.pansioskorean = 12671; - e.paragraph = 182; - e.parallel = 8741; - e.parenleft = 40; - e.parenleftaltonearabic = 64830; - e.parenleftbt = 63725; - e.parenleftex = 63724; - e.parenleftinferior = 8333; - e.parenleftmonospace = 65288; - e.parenleftsmall = 65113; - e.parenleftsuperior = 8317; - e.parenlefttp = 63723; - e.parenleftvertical = 65077; - e.parenright = 41; - e.parenrightaltonearabic = 64831; - e.parenrightbt = 63736; - e.parenrightex = 63735; - e.parenrightinferior = 8334; - e.parenrightmonospace = 65289; - e.parenrightsmall = 65114; - e.parenrightsuperior = 8318; - e.parenrighttp = 63734; - e.parenrightvertical = 65078; - e.partialdiff = 8706; - e.paseqhebrew = 1472; - e.pashtahebrew = 1433; - e.pasquare = 13225; - e.patah = 1463; - e.patah11 = 1463; - e.patah1d = 1463; - e.patah2a = 1463; - e.patahhebrew = 1463; - e.patahnarrowhebrew = 1463; - e.patahquarterhebrew = 1463; - e.patahwidehebrew = 1463; - e.pazerhebrew = 1441; - e.pbopomofo = 12550; - e.pcircle = 9439; - e.pdotaccent = 7767; - e.pe = 1508; - e.pecyrillic = 1087; - e.pedagesh = 64324; - e.pedageshhebrew = 64324; - e.peezisquare = 13115; - e.pefinaldageshhebrew = 64323; - e.peharabic = 1662; - e.peharmenian = 1402; - e.pehebrew = 1508; - e.pehfinalarabic = 64343; - e.pehinitialarabic = 64344; - e.pehiragana = 12410; - e.pehmedialarabic = 64345; - e.pekatakana = 12506; - e.pemiddlehookcyrillic = 1191; - e.perafehebrew = 64334; - e.percent = 37; - e.percentarabic = 1642; - e.percentmonospace = 65285; - e.percentsmall = 65130; - e.period = 46; - e.periodarmenian = 1417; - e.periodcentered = 183; - e.periodhalfwidth = 65377; - e.periodinferior = 63207; - e.periodmonospace = 65294; - e.periodsmall = 65106; - e.periodsuperior = 63208; - e.perispomenigreekcmb = 834; - e.perpendicular = 8869; - e.perthousand = 8240; - e.peseta = 8359; - e.pfsquare = 13194; - e.phabengali = 2475; - e.phadeva = 2347; - e.phagujarati = 2731; - e.phagurmukhi = 2603; - e.phi = 966; - e.phi1 = 981; - e.phieuphacirclekorean = 12922; - e.phieuphaparenkorean = 12826; - e.phieuphcirclekorean = 12908; - e.phieuphkorean = 12621; - e.phieuphparenkorean = 12812; - e.philatin = 632; - e.phinthuthai = 3642; - e.phisymbolgreek = 981; - e.phook = 421; - e.phophanthai = 3614; - e.phophungthai = 3612; - e.phosamphaothai = 3616; - e.pi = 960; - e.pieupacirclekorean = 12915; - e.pieupaparenkorean = 12819; - e.pieupcieuckorean = 12662; - e.pieupcirclekorean = 12901; - e.pieupkiyeokkorean = 12658; - e.pieupkorean = 12610; - e.pieupparenkorean = 12805; - e.pieupsioskiyeokkorean = 12660; - e.pieupsioskorean = 12612; - e.pieupsiostikeutkorean = 12661; - e.pieupthieuthkorean = 12663; - e.pieuptikeutkorean = 12659; - e.pihiragana = 12404; - e.pikatakana = 12500; - e.pisymbolgreek = 982; - e.piwrarmenian = 1411; - e.plus = 43; - e.plusbelowcmb = 799; - e.pluscircle = 8853; - e.plusminus = 177; - e.plusmod = 726; - e.plusmonospace = 65291; - e.plussmall = 65122; - e.plussuperior = 8314; - e.pmonospace = 65360; - e.pmsquare = 13272; - e.pohiragana = 12413; - e.pointingindexdownwhite = 9759; - e.pointingindexleftwhite = 9756; - e.pointingindexrightwhite = 9758; - e.pointingindexupwhite = 9757; - e.pokatakana = 12509; - e.poplathai = 3611; - e.postalmark = 12306; - e.postalmarkface = 12320; - e.pparen = 9387; - e.precedes = 8826; - e.prescription = 8478; - e.primemod = 697; - e.primereversed = 8245; - e.product = 8719; - e.projective = 8965; - e.prolongedkana = 12540; - e.propellor = 8984; - e.propersubset = 8834; - e.propersuperset = 8835; - e.proportion = 8759; - e.proportional = 8733; - e.psi = 968; - e.psicyrillic = 1137; - e.psilipneumatacyrilliccmb = 1158; - e.pssquare = 13232; - e.puhiragana = 12407; - e.pukatakana = 12503; - e.pvsquare = 13236; - e.pwsquare = 13242; - e.q = 113; - e.qadeva = 2392; - e.qadmahebrew = 1448; - e.qafarabic = 1602; - e.qaffinalarabic = 65238; - e.qafinitialarabic = 65239; - e.qafmedialarabic = 65240; - e.qamats = 1464; - e.qamats10 = 1464; - e.qamats1a = 1464; - e.qamats1c = 1464; - e.qamats27 = 1464; - e.qamats29 = 1464; - e.qamats33 = 1464; - e.qamatsde = 1464; - e.qamatshebrew = 1464; - e.qamatsnarrowhebrew = 1464; - e.qamatsqatanhebrew = 1464; - e.qamatsqatannarrowhebrew = 1464; - e.qamatsqatanquarterhebrew = 1464; - e.qamatsqatanwidehebrew = 1464; - e.qamatsquarterhebrew = 1464; - e.qamatswidehebrew = 1464; - e.qarneyparahebrew = 1439; - e.qbopomofo = 12561; - e.qcircle = 9440; - e.qhook = 672; - e.qmonospace = 65361; - e.qof = 1511; - e.qofdagesh = 64327; - e.qofdageshhebrew = 64327; - e.qofhebrew = 1511; - e.qparen = 9388; - e.quarternote = 9833; - e.qubuts = 1467; - e.qubuts18 = 1467; - e.qubuts25 = 1467; - e.qubuts31 = 1467; - e.qubutshebrew = 1467; - e.qubutsnarrowhebrew = 1467; - e.qubutsquarterhebrew = 1467; - e.qubutswidehebrew = 1467; - e.question = 63; - e.questionarabic = 1567; - e.questionarmenian = 1374; - e.questiondown = 191; - e.questiondownsmall = 63423; - e.questiongreek = 894; - e.questionmonospace = 65311; - e.questionsmall = 63295; - e.quotedbl = 34; - e.quotedblbase = 8222; - e.quotedblleft = 8220; - e.quotedblmonospace = 65282; - e.quotedblprime = 12318; - e.quotedblprimereversed = 12317; - e.quotedblright = 8221; - e.quoteleft = 8216; - e.quoteleftreversed = 8219; - e.quotereversed = 8219; - e.quoteright = 8217; - e.quoterightn = 329; - e.quotesinglbase = 8218; - e.quotesingle = 39; - e.quotesinglemonospace = 65287; - e.r = 114; - e.raarmenian = 1404; - e.rabengali = 2480; - e.racute = 341; - e.radeva = 2352; - e.radical = 8730; - e.radicalex = 63717; - e.radoverssquare = 13230; - e.radoverssquaredsquare = 13231; - e.radsquare = 13229; - e.rafe = 1471; - e.rafehebrew = 1471; - e.ragujarati = 2736; - e.ragurmukhi = 2608; - e.rahiragana = 12425; - e.rakatakana = 12521; - e.rakatakanahalfwidth = 65431; - e.ralowerdiagonalbengali = 2545; - e.ramiddlediagonalbengali = 2544; - e.ramshorn = 612; - e.ratio = 8758; - e.rbopomofo = 12566; - e.rcaron = 345; - e.rcedilla = 343; - e.rcircle = 9441; - e.rcommaaccent = 343; - e.rdblgrave = 529; - e.rdotaccent = 7769; - e.rdotbelow = 7771; - e.rdotbelowmacron = 7773; - e.referencemark = 8251; - e.reflexsubset = 8838; - e.reflexsuperset = 8839; - e.registered = 174; - e.registersans = 63720; - e.registerserif = 63194; - e.reharabic = 1585; - e.reharmenian = 1408; - e.rehfinalarabic = 65198; - e.rehiragana = 12428; - e.rekatakana = 12524; - e.rekatakanahalfwidth = 65434; - e.resh = 1512; - e.reshdageshhebrew = 64328; - e.reshhebrew = 1512; - e.reversedtilde = 8765; - e.reviahebrew = 1431; - e.reviamugrashhebrew = 1431; - e.revlogicalnot = 8976; - e.rfishhook = 638; - e.rfishhookreversed = 639; - e.rhabengali = 2525; - e.rhadeva = 2397; - e.rho = 961; - e.rhook = 637; - e.rhookturned = 635; - e.rhookturnedsuperior = 693; - e.rhosymbolgreek = 1009; - e.rhotichookmod = 734; - e.rieulacirclekorean = 12913; - e.rieulaparenkorean = 12817; - e.rieulcirclekorean = 12899; - e.rieulhieuhkorean = 12608; - e.rieulkiyeokkorean = 12602; - e.rieulkiyeoksioskorean = 12649; - e.rieulkorean = 12601; - e.rieulmieumkorean = 12603; - e.rieulpansioskorean = 12652; - e.rieulparenkorean = 12803; - e.rieulphieuphkorean = 12607; - e.rieulpieupkorean = 12604; - e.rieulpieupsioskorean = 12651; - e.rieulsioskorean = 12605; - e.rieulthieuthkorean = 12606; - e.rieultikeutkorean = 12650; - e.rieulyeorinhieuhkorean = 12653; - e.rightangle = 8735; - e.righttackbelowcmb = 793; - e.righttriangle = 8895; - e.rihiragana = 12426; - e.rikatakana = 12522; - e.rikatakanahalfwidth = 65432; - e.ring = 730; - e.ringbelowcmb = 805; - e.ringcmb = 778; - e.ringhalfleft = 703; - e.ringhalfleftarmenian = 1369; - e.ringhalfleftbelowcmb = 796; - e.ringhalfleftcentered = 723; - e.ringhalfright = 702; - e.ringhalfrightbelowcmb = 825; - e.ringhalfrightcentered = 722; - e.rinvertedbreve = 531; - e.rittorusquare = 13137; - e.rlinebelow = 7775; - e.rlongleg = 636; - e.rlonglegturned = 634; - e.rmonospace = 65362; - e.rohiragana = 12429; - e.rokatakana = 12525; - e.rokatakanahalfwidth = 65435; - e.roruathai = 3619; - e.rparen = 9389; - e.rrabengali = 2524; - e.rradeva = 2353; - e.rragurmukhi = 2652; - e.rreharabic = 1681; - e.rrehfinalarabic = 64397; - e.rrvocalicbengali = 2528; - e.rrvocalicdeva = 2400; - e.rrvocalicgujarati = 2784; - e.rrvocalicvowelsignbengali = 2500; - e.rrvocalicvowelsigndeva = 2372; - e.rrvocalicvowelsigngujarati = 2756; - e.rsuperior = 63217; - e.rtblock = 9616; - e.rturned = 633; - e.rturnedsuperior = 692; - e.ruhiragana = 12427; - e.rukatakana = 12523; - e.rukatakanahalfwidth = 65433; - e.rupeemarkbengali = 2546; - e.rupeesignbengali = 2547; - e.rupiah = 63197; - e.ruthai = 3620; - e.rvocalicbengali = 2443; - e.rvocalicdeva = 2315; - e.rvocalicgujarati = 2699; - e.rvocalicvowelsignbengali = 2499; - e.rvocalicvowelsigndeva = 2371; - e.rvocalicvowelsigngujarati = 2755; - e.s = 115; - e.sabengali = 2488; - e.sacute = 347; - e.sacutedotaccent = 7781; - e.sadarabic = 1589; - e.sadeva = 2360; - e.sadfinalarabic = 65210; - e.sadinitialarabic = 65211; - e.sadmedialarabic = 65212; - e.sagujarati = 2744; - e.sagurmukhi = 2616; - e.sahiragana = 12373; - e.sakatakana = 12469; - e.sakatakanahalfwidth = 65403; - e.sallallahoualayhewasallamarabic = 65018; - e.samekh = 1505; - e.samekhdagesh = 64321; - e.samekhdageshhebrew = 64321; - e.samekhhebrew = 1505; - e.saraaathai = 3634; - e.saraaethai = 3649; - e.saraaimaimalaithai = 3652; - e.saraaimaimuanthai = 3651; - e.saraamthai = 3635; - e.saraathai = 3632; - e.saraethai = 3648; - e.saraiileftthai = 63622; - e.saraiithai = 3637; - e.saraileftthai = 63621; - e.saraithai = 3636; - e.saraothai = 3650; - e.saraueeleftthai = 63624; - e.saraueethai = 3639; - e.saraueleftthai = 63623; - e.sarauethai = 3638; - e.sarauthai = 3640; - e.sarauuthai = 3641; - e.sbopomofo = 12569; - e.scaron = 353; - e.scarondotaccent = 7783; - e.scedilla = 351; - e.schwa = 601; - e.schwacyrillic = 1241; - e.schwadieresiscyrillic = 1243; - e.schwahook = 602; - e.scircle = 9442; - e.scircumflex = 349; - e.scommaaccent = 537; - e.sdotaccent = 7777; - e.sdotbelow = 7779; - e.sdotbelowdotaccent = 7785; - e.seagullbelowcmb = 828; - e.second = 8243; - e.secondtonechinese = 714; - e.section = 167; - e.seenarabic = 1587; - e.seenfinalarabic = 65202; - e.seeninitialarabic = 65203; - e.seenmedialarabic = 65204; - e.segol = 1462; - e.segol13 = 1462; - e.segol1f = 1462; - e.segol2c = 1462; - e.segolhebrew = 1462; - e.segolnarrowhebrew = 1462; - e.segolquarterhebrew = 1462; - e.segoltahebrew = 1426; - e.segolwidehebrew = 1462; - e.seharmenian = 1405; - e.sehiragana = 12379; - e.sekatakana = 12475; - e.sekatakanahalfwidth = 65406; - e.semicolon = 59; - e.semicolonarabic = 1563; - e.semicolonmonospace = 65307; - e.semicolonsmall = 65108; - e.semivoicedmarkkana = 12444; - e.semivoicedmarkkanahalfwidth = 65439; - e.sentisquare = 13090; - e.sentosquare = 13091; - e.seven = 55; - e.sevenarabic = 1639; - e.sevenbengali = 2541; - e.sevencircle = 9318; - e.sevencircleinversesansserif = 10128; - e.sevendeva = 2413; - e.seveneighths = 8542; - e.sevengujarati = 2797; - e.sevengurmukhi = 2669; - e.sevenhackarabic = 1639; - e.sevenhangzhou = 12327; - e.sevenideographicparen = 12838; - e.seveninferior = 8327; - e.sevenmonospace = 65303; - e.sevenoldstyle = 63287; - e.sevenparen = 9338; - e.sevenperiod = 9358; - e.sevenpersian = 1783; - e.sevenroman = 8566; - e.sevensuperior = 8311; - e.seventeencircle = 9328; - e.seventeenparen = 9348; - e.seventeenperiod = 9368; - e.seventhai = 3671; - e.sfthyphen = 173; - e.shaarmenian = 1399; - e.shabengali = 2486; - e.shacyrillic = 1096; - e.shaddaarabic = 1617; - e.shaddadammaarabic = 64609; - e.shaddadammatanarabic = 64606; - e.shaddafathaarabic = 64608; - e.shaddakasraarabic = 64610; - e.shaddakasratanarabic = 64607; - e.shade = 9618; - e.shadedark = 9619; - e.shadelight = 9617; - e.shademedium = 9618; - e.shadeva = 2358; - e.shagujarati = 2742; - e.shagurmukhi = 2614; - e.shalshelethebrew = 1427; - e.shbopomofo = 12565; - e.shchacyrillic = 1097; - e.sheenarabic = 1588; - e.sheenfinalarabic = 65206; - e.sheeninitialarabic = 65207; - e.sheenmedialarabic = 65208; - e.sheicoptic = 995; - e.sheqel = 8362; - e.sheqelhebrew = 8362; - e.sheva = 1456; - e.sheva115 = 1456; - e.sheva15 = 1456; - e.sheva22 = 1456; - e.sheva2e = 1456; - e.shevahebrew = 1456; - e.shevanarrowhebrew = 1456; - e.shevaquarterhebrew = 1456; - e.shevawidehebrew = 1456; - e.shhacyrillic = 1211; - e.shimacoptic = 1005; - e.shin = 1513; - e.shindagesh = 64329; - e.shindageshhebrew = 64329; - e.shindageshshindot = 64300; - e.shindageshshindothebrew = 64300; - e.shindageshsindot = 64301; - e.shindageshsindothebrew = 64301; - e.shindothebrew = 1473; - e.shinhebrew = 1513; - e.shinshindot = 64298; - e.shinshindothebrew = 64298; - e.shinsindot = 64299; - e.shinsindothebrew = 64299; - e.shook = 642; - e.sigma = 963; - e.sigma1 = 962; - e.sigmafinal = 962; - e.sigmalunatesymbolgreek = 1010; - e.sihiragana = 12375; - e.sikatakana = 12471; - e.sikatakanahalfwidth = 65404; - e.siluqhebrew = 1469; - e.siluqlefthebrew = 1469; - e.similar = 8764; - e.sindothebrew = 1474; - e.siosacirclekorean = 12916; - e.siosaparenkorean = 12820; - e.sioscieuckorean = 12670; - e.sioscirclekorean = 12902; - e.sioskiyeokkorean = 12666; - e.sioskorean = 12613; - e.siosnieunkorean = 12667; - e.siosparenkorean = 12806; - e.siospieupkorean = 12669; - e.siostikeutkorean = 12668; - e.six = 54; - e.sixarabic = 1638; - e.sixbengali = 2540; - e.sixcircle = 9317; - e.sixcircleinversesansserif = 10127; - e.sixdeva = 2412; - e.sixgujarati = 2796; - e.sixgurmukhi = 2668; - e.sixhackarabic = 1638; - e.sixhangzhou = 12326; - e.sixideographicparen = 12837; - e.sixinferior = 8326; - e.sixmonospace = 65302; - e.sixoldstyle = 63286; - e.sixparen = 9337; - e.sixperiod = 9357; - e.sixpersian = 1782; - e.sixroman = 8565; - e.sixsuperior = 8310; - e.sixteencircle = 9327; - e.sixteencurrencydenominatorbengali = 2553; - e.sixteenparen = 9347; - e.sixteenperiod = 9367; - e.sixthai = 3670; - e.slash = 47; - e.slashmonospace = 65295; - e.slong = 383; - e.slongdotaccent = 7835; - e.smileface = 9786; - e.smonospace = 65363; - e.sofpasuqhebrew = 1475; - e.softhyphen = 173; - e.softsigncyrillic = 1100; - e.sohiragana = 12381; - e.sokatakana = 12477; - e.sokatakanahalfwidth = 65407; - e.soliduslongoverlaycmb = 824; - e.solidusshortoverlaycmb = 823; - e.sorusithai = 3625; - e.sosalathai = 3624; - e.sosothai = 3595; - e.sosuathai = 3626; - e.space = 32; - e.spacehackarabic = 32; - e.spade = 9824; - e.spadesuitblack = 9824; - e.spadesuitwhite = 9828; - e.sparen = 9390; - e.squarebelowcmb = 827; - e.squarecc = 13252; - e.squarecm = 13213; - e.squarediagonalcrosshatchfill = 9641; - e.squarehorizontalfill = 9636; - e.squarekg = 13199; - e.squarekm = 13214; - e.squarekmcapital = 13262; - e.squareln = 13265; - e.squarelog = 13266; - e.squaremg = 13198; - e.squaremil = 13269; - e.squaremm = 13212; - e.squaremsquared = 13217; - e.squareorthogonalcrosshatchfill = 9638; - e.squareupperlefttolowerrightfill = 9639; - e.squareupperrighttolowerleftfill = 9640; - e.squareverticalfill = 9637; - e.squarewhitewithsmallblack = 9635; - e.srsquare = 13275; - e.ssabengali = 2487; - e.ssadeva = 2359; - e.ssagujarati = 2743; - e.ssangcieuckorean = 12617; - e.ssanghieuhkorean = 12677; - e.ssangieungkorean = 12672; - e.ssangkiyeokkorean = 12594; - e.ssangnieunkorean = 12645; - e.ssangpieupkorean = 12611; - e.ssangsioskorean = 12614; - e.ssangtikeutkorean = 12600; - e.ssuperior = 63218; - e.sterling = 163; - e.sterlingmonospace = 65505; - e.strokelongoverlaycmb = 822; - e.strokeshortoverlaycmb = 821; - e.subset = 8834; - e.subsetnotequal = 8842; - e.subsetorequal = 8838; - e.succeeds = 8827; - e.suchthat = 8715; - e.suhiragana = 12377; - e.sukatakana = 12473; - e.sukatakanahalfwidth = 65405; - e.sukunarabic = 1618; - e.summation = 8721; - e.sun = 9788; - e.superset = 8835; - e.supersetnotequal = 8843; - e.supersetorequal = 8839; - e.svsquare = 13276; - e.syouwaerasquare = 13180; - e.t = 116; - e.tabengali = 2468; - e.tackdown = 8868; - e.tackleft = 8867; - e.tadeva = 2340; - e.tagujarati = 2724; - e.tagurmukhi = 2596; - e.taharabic = 1591; - e.tahfinalarabic = 65218; - e.tahinitialarabic = 65219; - e.tahiragana = 12383; - e.tahmedialarabic = 65220; - e.taisyouerasquare = 13181; - e.takatakana = 12479; - e.takatakanahalfwidth = 65408; - e.tatweelarabic = 1600; - e.tau = 964; - e.tav = 1514; - e.tavdages = 64330; - e.tavdagesh = 64330; - e.tavdageshhebrew = 64330; - e.tavhebrew = 1514; - e.tbar = 359; - e.tbopomofo = 12554; - e.tcaron = 357; - e.tccurl = 680; - e.tcedilla = 355; - e.tcheharabic = 1670; - e.tchehfinalarabic = 64379; - e.tchehinitialarabic = 64380; - e.tchehmedialarabic = 64381; - e.tcircle = 9443; - e.tcircumflexbelow = 7793; - e.tcommaaccent = 355; - e.tdieresis = 7831; - e.tdotaccent = 7787; - e.tdotbelow = 7789; - e.tecyrillic = 1090; - e.tedescendercyrillic = 1197; - e.teharabic = 1578; - e.tehfinalarabic = 65174; - e.tehhahinitialarabic = 64674; - e.tehhahisolatedarabic = 64524; - e.tehinitialarabic = 65175; - e.tehiragana = 12390; - e.tehjeeminitialarabic = 64673; - e.tehjeemisolatedarabic = 64523; - e.tehmarbutaarabic = 1577; - e.tehmarbutafinalarabic = 65172; - e.tehmedialarabic = 65176; - e.tehmeeminitialarabic = 64676; - e.tehmeemisolatedarabic = 64526; - e.tehnoonfinalarabic = 64627; - e.tekatakana = 12486; - e.tekatakanahalfwidth = 65411; - e.telephone = 8481; - e.telephoneblack = 9742; - e.telishagedolahebrew = 1440; - e.telishaqetanahebrew = 1449; - e.tencircle = 9321; - e.tenideographicparen = 12841; - e.tenparen = 9341; - e.tenperiod = 9361; - e.tenroman = 8569; - e.tesh = 679; - e.tet = 1496; - e.tetdagesh = 64312; - e.tetdageshhebrew = 64312; - e.tethebrew = 1496; - e.tetsecyrillic = 1205; - e.tevirhebrew = 1435; - e.tevirlefthebrew = 1435; - e.thabengali = 2469; - e.thadeva = 2341; - e.thagujarati = 2725; - e.thagurmukhi = 2597; - e.thalarabic = 1584; - e.thalfinalarabic = 65196; - e.thanthakhatlowleftthai = 63640; - e.thanthakhatlowrightthai = 63639; - e.thanthakhatthai = 3660; - e.thanthakhatupperleftthai = 63638; - e.theharabic = 1579; - e.thehfinalarabic = 65178; - e.thehinitialarabic = 65179; - e.thehmedialarabic = 65180; - e.thereexists = 8707; - e.therefore = 8756; - e.theta = 952; - e.theta1 = 977; - e.thetasymbolgreek = 977; - e.thieuthacirclekorean = 12921; - e.thieuthaparenkorean = 12825; - e.thieuthcirclekorean = 12907; - e.thieuthkorean = 12620; - e.thieuthparenkorean = 12811; - e.thirteencircle = 9324; - e.thirteenparen = 9344; - e.thirteenperiod = 9364; - e.thonangmonthothai = 3601; - e.thook = 429; - e.thophuthaothai = 3602; - e.thorn = 254; - e.thothahanthai = 3607; - e.thothanthai = 3600; - e.thothongthai = 3608; - e.thothungthai = 3606; - e.thousandcyrillic = 1154; - e.thousandsseparatorarabic = 1644; - e.thousandsseparatorpersian = 1644; - e.three = 51; - e.threearabic = 1635; - e.threebengali = 2537; - e.threecircle = 9314; - e.threecircleinversesansserif = 10124; - e.threedeva = 2409; - e.threeeighths = 8540; - e.threegujarati = 2793; - e.threegurmukhi = 2665; - e.threehackarabic = 1635; - e.threehangzhou = 12323; - e.threeideographicparen = 12834; - e.threeinferior = 8323; - e.threemonospace = 65299; - e.threenumeratorbengali = 2550; - e.threeoldstyle = 63283; - e.threeparen = 9334; - e.threeperiod = 9354; - e.threepersian = 1779; - e.threequarters = 190; - e.threequartersemdash = 63198; - e.threeroman = 8562; - e.threesuperior = 179; - e.threethai = 3667; - e.thzsquare = 13204; - e.tihiragana = 12385; - e.tikatakana = 12481; - e.tikatakanahalfwidth = 65409; - e.tikeutacirclekorean = 12912; - e.tikeutaparenkorean = 12816; - e.tikeutcirclekorean = 12898; - e.tikeutkorean = 12599; - e.tikeutparenkorean = 12802; - e.tilde = 732; - e.tildebelowcmb = 816; - e.tildecmb = 771; - e.tildecomb = 771; - e.tildedoublecmb = 864; - e.tildeoperator = 8764; - e.tildeoverlaycmb = 820; - e.tildeverticalcmb = 830; - e.timescircle = 8855; - e.tipehahebrew = 1430; - e.tipehalefthebrew = 1430; - e.tippigurmukhi = 2672; - e.titlocyrilliccmb = 1155; - e.tiwnarmenian = 1407; - e.tlinebelow = 7791; - e.tmonospace = 65364; - e.toarmenian = 1385; - e.tohiragana = 12392; - e.tokatakana = 12488; - e.tokatakanahalfwidth = 65412; - e.tonebarextrahighmod = 741; - e.tonebarextralowmod = 745; - e.tonebarhighmod = 742; - e.tonebarlowmod = 744; - e.tonebarmidmod = 743; - e.tonefive = 445; - e.tonesix = 389; - e.tonetwo = 424; - e.tonos = 900; - e.tonsquare = 13095; - e.topatakthai = 3599; - e.tortoiseshellbracketleft = 12308; - e.tortoiseshellbracketleftsmall = 65117; - e.tortoiseshellbracketleftvertical = 65081; - e.tortoiseshellbracketright = 12309; - e.tortoiseshellbracketrightsmall = 65118; - e.tortoiseshellbracketrightvertical = 65082; - e.totaothai = 3605; - e.tpalatalhook = 427; - e.tparen = 9391; - e.trademark = 8482; - e.trademarksans = 63722; - e.trademarkserif = 63195; - e.tretroflexhook = 648; - e.triagdn = 9660; - e.triaglf = 9668; - e.triagrt = 9658; - e.triagup = 9650; - e.ts = 678; - e.tsadi = 1510; - e.tsadidagesh = 64326; - e.tsadidageshhebrew = 64326; - e.tsadihebrew = 1510; - e.tsecyrillic = 1094; - e.tsere = 1461; - e.tsere12 = 1461; - e.tsere1e = 1461; - e.tsere2b = 1461; - e.tserehebrew = 1461; - e.tserenarrowhebrew = 1461; - e.tserequarterhebrew = 1461; - e.tserewidehebrew = 1461; - e.tshecyrillic = 1115; - e.tsuperior = 63219; - e.ttabengali = 2463; - e.ttadeva = 2335; - e.ttagujarati = 2719; - e.ttagurmukhi = 2591; - e.tteharabic = 1657; - e.ttehfinalarabic = 64359; - e.ttehinitialarabic = 64360; - e.ttehmedialarabic = 64361; - e.tthabengali = 2464; - e.tthadeva = 2336; - e.tthagujarati = 2720; - e.tthagurmukhi = 2592; - e.tturned = 647; - e.tuhiragana = 12388; - e.tukatakana = 12484; - e.tukatakanahalfwidth = 65410; - e.tusmallhiragana = 12387; - e.tusmallkatakana = 12483; - e.tusmallkatakanahalfwidth = 65391; - e.twelvecircle = 9323; - e.twelveparen = 9343; - e.twelveperiod = 9363; - e.twelveroman = 8571; - e.twentycircle = 9331; - e.twentyhangzhou = 21316; - e.twentyparen = 9351; - e.twentyperiod = 9371; - e.two = 50; - e.twoarabic = 1634; - e.twobengali = 2536; - e.twocircle = 9313; - e.twocircleinversesansserif = 10123; - e.twodeva = 2408; - e.twodotenleader = 8229; - e.twodotleader = 8229; - e.twodotleadervertical = 65072; - e.twogujarati = 2792; - e.twogurmukhi = 2664; - e.twohackarabic = 1634; - e.twohangzhou = 12322; - e.twoideographicparen = 12833; - e.twoinferior = 8322; - e.twomonospace = 65298; - e.twonumeratorbengali = 2549; - e.twooldstyle = 63282; - e.twoparen = 9333; - e.twoperiod = 9353; - e.twopersian = 1778; - e.tworoman = 8561; - e.twostroke = 443; - e.twosuperior = 178; - e.twothai = 3666; - e.twothirds = 8532; - e.u = 117; - e.uacute = 250; - e.ubar = 649; - e.ubengali = 2441; - e.ubopomofo = 12584; - e.ubreve = 365; - e.ucaron = 468; - e.ucircle = 9444; - e.ucircumflex = 251; - e.ucircumflexbelow = 7799; - e.ucyrillic = 1091; - e.udattadeva = 2385; - e.udblacute = 369; - e.udblgrave = 533; - e.udeva = 2313; - e.udieresis = 252; - e.udieresisacute = 472; - e.udieresisbelow = 7795; - e.udieresiscaron = 474; - e.udieresiscyrillic = 1265; - e.udieresisgrave = 476; - e.udieresismacron = 470; - e.udotbelow = 7909; - e.ugrave = 249; - e.ugujarati = 2697; - e.ugurmukhi = 2569; - e.uhiragana = 12358; - e.uhookabove = 7911; - e.uhorn = 432; - e.uhornacute = 7913; - e.uhorndotbelow = 7921; - e.uhorngrave = 7915; - e.uhornhookabove = 7917; - e.uhorntilde = 7919; - e.uhungarumlaut = 369; - e.uhungarumlautcyrillic = 1267; - e.uinvertedbreve = 535; - e.ukatakana = 12454; - e.ukatakanahalfwidth = 65395; - e.ukcyrillic = 1145; - e.ukorean = 12636; - e.umacron = 363; - e.umacroncyrillic = 1263; - e.umacrondieresis = 7803; - e.umatragurmukhi = 2625; - e.umonospace = 65365; - e.underscore = 95; - e.underscoredbl = 8215; - e.underscoremonospace = 65343; - e.underscorevertical = 65075; - e.underscorewavy = 65103; - e.union = 8746; - e.universal = 8704; - e.uogonek = 371; - e.uparen = 9392; - e.upblock = 9600; - e.upperdothebrew = 1476; - e.upsilon = 965; - e.upsilondieresis = 971; - e.upsilondieresistonos = 944; - e.upsilonlatin = 650; - e.upsilontonos = 973; - e.uptackbelowcmb = 797; - e.uptackmod = 724; - e.uragurmukhi = 2675; - e.uring = 367; - e.ushortcyrillic = 1118; - e.usmallhiragana = 12357; - e.usmallkatakana = 12453; - e.usmallkatakanahalfwidth = 65385; - e.ustraightcyrillic = 1199; - e.ustraightstrokecyrillic = 1201; - e.utilde = 361; - e.utildeacute = 7801; - e.utildebelow = 7797; - e.uubengali = 2442; - e.uudeva = 2314; - e.uugujarati = 2698; - e.uugurmukhi = 2570; - e.uumatragurmukhi = 2626; - e.uuvowelsignbengali = 2498; - e.uuvowelsigndeva = 2370; - e.uuvowelsigngujarati = 2754; - e.uvowelsignbengali = 2497; - e.uvowelsigndeva = 2369; - e.uvowelsigngujarati = 2753; - e.v = 118; - e.vadeva = 2357; - e.vagujarati = 2741; - e.vagurmukhi = 2613; - e.vakatakana = 12535; - e.vav = 1493; - e.vavdagesh = 64309; - e.vavdagesh65 = 64309; - e.vavdageshhebrew = 64309; - e.vavhebrew = 1493; - e.vavholam = 64331; - e.vavholamhebrew = 64331; - e.vavvavhebrew = 1520; - e.vavyodhebrew = 1521; - e.vcircle = 9445; - e.vdotbelow = 7807; - e.vecyrillic = 1074; - e.veharabic = 1700; - e.vehfinalarabic = 64363; - e.vehinitialarabic = 64364; - e.vehmedialarabic = 64365; - e.vekatakana = 12537; - e.venus = 9792; - e.verticalbar = 124; - e.verticallineabovecmb = 781; - e.verticallinebelowcmb = 809; - e.verticallinelowmod = 716; - e.verticallinemod = 712; - e.vewarmenian = 1406; - e.vhook = 651; - e.vikatakana = 12536; - e.viramabengali = 2509; - e.viramadeva = 2381; - e.viramagujarati = 2765; - e.visargabengali = 2435; - e.visargadeva = 2307; - e.visargagujarati = 2691; - e.vmonospace = 65366; - e.voarmenian = 1400; - e.voicediterationhiragana = 12446; - e.voicediterationkatakana = 12542; - e.voicedmarkkana = 12443; - e.voicedmarkkanahalfwidth = 65438; - e.vokatakana = 12538; - e.vparen = 9393; - e.vtilde = 7805; - e.vturned = 652; - e.vuhiragana = 12436; - e.vukatakana = 12532; - e.w = 119; - e.wacute = 7811; - e.waekorean = 12633; - e.wahiragana = 12431; - e.wakatakana = 12527; - e.wakatakanahalfwidth = 65436; - e.wakorean = 12632; - e.wasmallhiragana = 12430; - e.wasmallkatakana = 12526; - e.wattosquare = 13143; - e.wavedash = 12316; - e.wavyunderscorevertical = 65076; - e.wawarabic = 1608; - e.wawfinalarabic = 65262; - e.wawhamzaabovearabic = 1572; - e.wawhamzaabovefinalarabic = 65158; - e.wbsquare = 13277; - e.wcircle = 9446; - e.wcircumflex = 373; - e.wdieresis = 7813; - e.wdotaccent = 7815; - e.wdotbelow = 7817; - e.wehiragana = 12433; - e.weierstrass = 8472; - e.wekatakana = 12529; - e.wekorean = 12638; - e.weokorean = 12637; - e.wgrave = 7809; - e.whitebullet = 9702; - e.whitecircle = 9675; - e.whitecircleinverse = 9689; - e.whitecornerbracketleft = 12302; - e.whitecornerbracketleftvertical = 65091; - e.whitecornerbracketright = 12303; - e.whitecornerbracketrightvertical = 65092; - e.whitediamond = 9671; - e.whitediamondcontainingblacksmalldiamond = 9672; - e.whitedownpointingsmalltriangle = 9663; - e.whitedownpointingtriangle = 9661; - e.whiteleftpointingsmalltriangle = 9667; - e.whiteleftpointingtriangle = 9665; - e.whitelenticularbracketleft = 12310; - e.whitelenticularbracketright = 12311; - e.whiterightpointingsmalltriangle = 9657; - e.whiterightpointingtriangle = 9655; - e.whitesmallsquare = 9643; - e.whitesmilingface = 9786; - e.whitesquare = 9633; - e.whitestar = 9734; - e.whitetelephone = 9743; - e.whitetortoiseshellbracketleft = 12312; - e.whitetortoiseshellbracketright = 12313; - e.whiteuppointingsmalltriangle = 9653; - e.whiteuppointingtriangle = 9651; - e.wihiragana = 12432; - e.wikatakana = 12528; - e.wikorean = 12639; - e.wmonospace = 65367; - e.wohiragana = 12434; - e.wokatakana = 12530; - e.wokatakanahalfwidth = 65382; - e.won = 8361; - e.wonmonospace = 65510; - e.wowaenthai = 3623; - e.wparen = 9394; - e.wring = 7832; - e.wsuperior = 695; - e.wturned = 653; - e.wynn = 447; - e.x = 120; - e.xabovecmb = 829; - e.xbopomofo = 12562; - e.xcircle = 9447; - e.xdieresis = 7821; - e.xdotaccent = 7819; - e.xeharmenian = 1389; - e.xi = 958; - e.xmonospace = 65368; - e.xparen = 9395; - e.xsuperior = 739; - e.y = 121; - e.yaadosquare = 13134; - e.yabengali = 2479; - e.yacute = 253; - e.yadeva = 2351; - e.yaekorean = 12626; - e.yagujarati = 2735; - e.yagurmukhi = 2607; - e.yahiragana = 12420; - e.yakatakana = 12516; - e.yakatakanahalfwidth = 65428; - e.yakorean = 12625; - e.yamakkanthai = 3662; - e.yasmallhiragana = 12419; - e.yasmallkatakana = 12515; - e.yasmallkatakanahalfwidth = 65388; - e.yatcyrillic = 1123; - e.ycircle = 9448; - e.ycircumflex = 375; - e.ydieresis = 255; - e.ydotaccent = 7823; - e.ydotbelow = 7925; - e.yeharabic = 1610; - e.yehbarreearabic = 1746; - e.yehbarreefinalarabic = 64431; - e.yehfinalarabic = 65266; - e.yehhamzaabovearabic = 1574; - e.yehhamzaabovefinalarabic = 65162; - e.yehhamzaaboveinitialarabic = 65163; - e.yehhamzaabovemedialarabic = 65164; - e.yehinitialarabic = 65267; - e.yehmedialarabic = 65268; - e.yehmeeminitialarabic = 64733; - e.yehmeemisolatedarabic = 64600; - e.yehnoonfinalarabic = 64660; - e.yehthreedotsbelowarabic = 1745; - e.yekorean = 12630; - e.yen = 165; - e.yenmonospace = 65509; - e.yeokorean = 12629; - e.yeorinhieuhkorean = 12678; - e.yerahbenyomohebrew = 1450; - e.yerahbenyomolefthebrew = 1450; - e.yericyrillic = 1099; - e.yerudieresiscyrillic = 1273; - e.yesieungkorean = 12673; - e.yesieungpansioskorean = 12675; - e.yesieungsioskorean = 12674; - e.yetivhebrew = 1434; - e.ygrave = 7923; - e.yhook = 436; - e.yhookabove = 7927; - e.yiarmenian = 1397; - e.yicyrillic = 1111; - e.yikorean = 12642; - e.yinyang = 9775; - e.yiwnarmenian = 1410; - e.ymonospace = 65369; - e.yod = 1497; - e.yoddagesh = 64313; - e.yoddageshhebrew = 64313; - e.yodhebrew = 1497; - e.yodyodhebrew = 1522; - e.yodyodpatahhebrew = 64287; - e.yohiragana = 12424; - e.yoikorean = 12681; - e.yokatakana = 12520; - e.yokatakanahalfwidth = 65430; - e.yokorean = 12635; - e.yosmallhiragana = 12423; - e.yosmallkatakana = 12519; - e.yosmallkatakanahalfwidth = 65390; - e.yotgreek = 1011; - e.yoyaekorean = 12680; - e.yoyakorean = 12679; - e.yoyakthai = 3618; - e.yoyingthai = 3597; - e.yparen = 9396; - e.ypogegrammeni = 890; - e.ypogegrammenigreekcmb = 837; - e.yr = 422; - e.yring = 7833; - e.ysuperior = 696; - e.ytilde = 7929; - e.yturned = 654; - e.yuhiragana = 12422; - e.yuikorean = 12684; - e.yukatakana = 12518; - e.yukatakanahalfwidth = 65429; - e.yukorean = 12640; - e.yusbigcyrillic = 1131; - e.yusbigiotifiedcyrillic = 1133; - e.yuslittlecyrillic = 1127; - e.yuslittleiotifiedcyrillic = 1129; - e.yusmallhiragana = 12421; - e.yusmallkatakana = 12517; - e.yusmallkatakanahalfwidth = 65389; - e.yuyekorean = 12683; - e.yuyeokorean = 12682; - e.yyabengali = 2527; - e.yyadeva = 2399; - e.z = 122; - e.zaarmenian = 1382; - e.zacute = 378; - e.zadeva = 2395; - e.zagurmukhi = 2651; - e.zaharabic = 1592; - e.zahfinalarabic = 65222; - e.zahinitialarabic = 65223; - e.zahiragana = 12374; - e.zahmedialarabic = 65224; - e.zainarabic = 1586; - e.zainfinalarabic = 65200; - e.zakatakana = 12470; - e.zaqefgadolhebrew = 1429; - e.zaqefqatanhebrew = 1428; - e.zarqahebrew = 1432; - e.zayin = 1494; - e.zayindagesh = 64310; - e.zayindageshhebrew = 64310; - e.zayinhebrew = 1494; - e.zbopomofo = 12567; - e.zcaron = 382; - e.zcircle = 9449; - e.zcircumflex = 7825; - e.zcurl = 657; - e.zdot = 380; - e.zdotaccent = 380; - e.zdotbelow = 7827; - e.zecyrillic = 1079; - e.zedescendercyrillic = 1177; - e.zedieresiscyrillic = 1247; - e.zehiragana = 12380; - e.zekatakana = 12476; - e.zero = 48; - e.zeroarabic = 1632; - e.zerobengali = 2534; - e.zerodeva = 2406; - e.zerogujarati = 2790; - e.zerogurmukhi = 2662; - e.zerohackarabic = 1632; - e.zeroinferior = 8320; - e.zeromonospace = 65296; - e.zerooldstyle = 63280; - e.zeropersian = 1776; - e.zerosuperior = 8304; - e.zerothai = 3664; - e.zerowidthjoiner = 65279; - e.zerowidthnonjoiner = 8204; - e.zerowidthspace = 8203; - e.zeta = 950; - e.zhbopomofo = 12563; - e.zhearmenian = 1386; - e.zhebrevecyrillic = 1218; - e.zhecyrillic = 1078; - e.zhedescendercyrillic = 1175; - e.zhedieresiscyrillic = 1245; - e.zihiragana = 12376; - e.zikatakana = 12472; - e.zinorhebrew = 1454; - e.zlinebelow = 7829; - e.zmonospace = 65370; - e.zohiragana = 12382; - e.zokatakana = 12478; - e.zparen = 9397; - e.zretroflexhook = 656; - e.zstroke = 438; - e.zuhiragana = 12378; - e.zukatakana = 12474; - e['.notdef'] = 0; - e.angbracketleftbig = 9001; - e.angbracketleftBig = 9001; - e.angbracketleftbigg = 9001; - e.angbracketleftBigg = 9001; - e.angbracketrightBig = 9002; - e.angbracketrightbig = 9002; - e.angbracketrightBigg = 9002; - e.angbracketrightbigg = 9002; - e.arrowhookleft = 8618; - e.arrowhookright = 8617; - e.arrowlefttophalf = 8636; - e.arrowleftbothalf = 8637; - e.arrownortheast = 8599; - e.arrownorthwest = 8598; - e.arrowrighttophalf = 8640; - e.arrowrightbothalf = 8641; - e.arrowsoutheast = 8600; - e.arrowsouthwest = 8601; - e.backslashbig = 8726; - e.backslashBig = 8726; - e.backslashBigg = 8726; - e.backslashbigg = 8726; - e.bardbl = 8214; - e.bracehtipdownleft = 65079; - e.bracehtipdownright = 65079; - e.bracehtipupleft = 65080; - e.bracehtipupright = 65080; - e.braceleftBig = 123; - e.braceleftbig = 123; - e.braceleftbigg = 123; - e.braceleftBigg = 123; - e.bracerightBig = 125; - e.bracerightbig = 125; - e.bracerightbigg = 125; - e.bracerightBigg = 125; - e.bracketleftbig = 91; - e.bracketleftBig = 91; - e.bracketleftbigg = 91; - e.bracketleftBigg = 91; - e.bracketrightBig = 93; - e.bracketrightbig = 93; - e.bracketrightbigg = 93; - e.bracketrightBigg = 93; - e.ceilingleftbig = 8968; - e.ceilingleftBig = 8968; - e.ceilingleftBigg = 8968; - e.ceilingleftbigg = 8968; - e.ceilingrightbig = 8969; - e.ceilingrightBig = 8969; - e.ceilingrightbigg = 8969; - e.ceilingrightBigg = 8969; - e.circledotdisplay = 8857; - e.circledottext = 8857; - e.circlemultiplydisplay = 8855; - e.circlemultiplytext = 8855; - e.circleplusdisplay = 8853; - e.circleplustext = 8853; - e.contintegraldisplay = 8750; - e.contintegraltext = 8750; - e.coproductdisplay = 8720; - e.coproducttext = 8720; - e.floorleftBig = 8970; - e.floorleftbig = 8970; - e.floorleftbigg = 8970; - e.floorleftBigg = 8970; - e.floorrightbig = 8971; - e.floorrightBig = 8971; - e.floorrightBigg = 8971; - e.floorrightbigg = 8971; - e.hatwide = 770; - e.hatwider = 770; - e.hatwidest = 770; - e.intercal = 7488; - e.integraldisplay = 8747; - e.integraltext = 8747; - e.intersectiondisplay = 8898; - e.intersectiontext = 8898; - e.logicalanddisplay = 8743; - e.logicalandtext = 8743; - e.logicalordisplay = 8744; - e.logicalortext = 8744; - e.parenleftBig = 40; - e.parenleftbig = 40; - e.parenleftBigg = 40; - e.parenleftbigg = 40; - e.parenrightBig = 41; - e.parenrightbig = 41; - e.parenrightBigg = 41; - e.parenrightbigg = 41; - e.prime = 8242; - e.productdisplay = 8719; - e.producttext = 8719; - e.radicalbig = 8730; - e.radicalBig = 8730; - e.radicalBigg = 8730; - e.radicalbigg = 8730; - e.radicalbt = 8730; - e.radicaltp = 8730; - e.radicalvertex = 8730; - e.slashbig = 47; - e.slashBig = 47; - e.slashBigg = 47; - e.slashbigg = 47; - e.summationdisplay = 8721; - e.summationtext = 8721; - e.tildewide = 732; - e.tildewider = 732; - e.tildewidest = 732; - e.uniondisplay = 8899; - e.unionmultidisplay = 8846; - e.unionmultitext = 8846; - e.unionsqdisplay = 8852; - e.unionsqtext = 8852; - e.uniontext = 8899; - e.vextenddouble = 8741; - e.vextendsingle = 8739; - }), - n = (0, r.getLookupTableFactory)(function (e) { - e.space = 32; - e.a1 = 9985; - e.a2 = 9986; - e.a202 = 9987; - e.a3 = 9988; - e.a4 = 9742; - e.a5 = 9990; - e.a119 = 9991; - e.a118 = 9992; - e.a117 = 9993; - e.a11 = 9755; - e.a12 = 9758; - e.a13 = 9996; - e.a14 = 9997; - e.a15 = 9998; - e.a16 = 9999; - e.a105 = 1e4; - e.a17 = 10001; - e.a18 = 10002; - e.a19 = 10003; - e.a20 = 10004; - e.a21 = 10005; - e.a22 = 10006; - e.a23 = 10007; - e.a24 = 10008; - e.a25 = 10009; - e.a26 = 10010; - e.a27 = 10011; - e.a28 = 10012; - e.a6 = 10013; - e.a7 = 10014; - e.a8 = 10015; - e.a9 = 10016; - e.a10 = 10017; - e.a29 = 10018; - e.a30 = 10019; - e.a31 = 10020; - e.a32 = 10021; - e.a33 = 10022; - e.a34 = 10023; - e.a35 = 9733; - e.a36 = 10025; - e.a37 = 10026; - e.a38 = 10027; - e.a39 = 10028; - e.a40 = 10029; - e.a41 = 10030; - e.a42 = 10031; - e.a43 = 10032; - e.a44 = 10033; - e.a45 = 10034; - e.a46 = 10035; - e.a47 = 10036; - e.a48 = 10037; - e.a49 = 10038; - e.a50 = 10039; - e.a51 = 10040; - e.a52 = 10041; - e.a53 = 10042; - e.a54 = 10043; - e.a55 = 10044; - e.a56 = 10045; - e.a57 = 10046; - e.a58 = 10047; - e.a59 = 10048; - e.a60 = 10049; - e.a61 = 10050; - e.a62 = 10051; - e.a63 = 10052; - e.a64 = 10053; - e.a65 = 10054; - e.a66 = 10055; - e.a67 = 10056; - e.a68 = 10057; - e.a69 = 10058; - e.a70 = 10059; - e.a71 = 9679; - e.a72 = 10061; - e.a73 = 9632; - e.a74 = 10063; - e.a203 = 10064; - e.a75 = 10065; - e.a204 = 10066; - e.a76 = 9650; - e.a77 = 9660; - e.a78 = 9670; - e.a79 = 10070; - e.a81 = 9687; - e.a82 = 10072; - e.a83 = 10073; - e.a84 = 10074; - e.a97 = 10075; - e.a98 = 10076; - e.a99 = 10077; - e.a100 = 10078; - e.a101 = 10081; - e.a102 = 10082; - e.a103 = 10083; - e.a104 = 10084; - e.a106 = 10085; - e.a107 = 10086; - e.a108 = 10087; - e.a112 = 9827; - e.a111 = 9830; - e.a110 = 9829; - e.a109 = 9824; - e.a120 = 9312; - e.a121 = 9313; - e.a122 = 9314; - e.a123 = 9315; - e.a124 = 9316; - e.a125 = 9317; - e.a126 = 9318; - e.a127 = 9319; - e.a128 = 9320; - e.a129 = 9321; - e.a130 = 10102; - e.a131 = 10103; - e.a132 = 10104; - e.a133 = 10105; - e.a134 = 10106; - e.a135 = 10107; - e.a136 = 10108; - e.a137 = 10109; - e.a138 = 10110; - e.a139 = 10111; - e.a140 = 10112; - e.a141 = 10113; - e.a142 = 10114; - e.a143 = 10115; - e.a144 = 10116; - e.a145 = 10117; - e.a146 = 10118; - e.a147 = 10119; - e.a148 = 10120; - e.a149 = 10121; - e.a150 = 10122; - e.a151 = 10123; - e.a152 = 10124; - e.a153 = 10125; - e.a154 = 10126; - e.a155 = 10127; - e.a156 = 10128; - e.a157 = 10129; - e.a158 = 10130; - e.a159 = 10131; - e.a160 = 10132; - e.a161 = 8594; - e.a163 = 8596; - e.a164 = 8597; - e.a196 = 10136; - e.a165 = 10137; - e.a192 = 10138; - e.a166 = 10139; - e.a167 = 10140; - e.a168 = 10141; - e.a169 = 10142; - e.a170 = 10143; - e.a171 = 10144; - e.a172 = 10145; - e.a173 = 10146; - e.a162 = 10147; - e.a174 = 10148; - e.a175 = 10149; - e.a176 = 10150; - e.a177 = 10151; - e.a178 = 10152; - e.a179 = 10153; - e.a193 = 10154; - e.a180 = 10155; - e.a199 = 10156; - e.a181 = 10157; - e.a200 = 10158; - e.a182 = 10159; - e.a201 = 10161; - e.a183 = 10162; - e.a184 = 10163; - e.a197 = 10164; - e.a185 = 10165; - e.a194 = 10166; - e.a198 = 10167; - e.a186 = 10168; - e.a195 = 10169; - e.a187 = 10170; - e.a188 = 10171; - e.a189 = 10172; - e.a190 = 10173; - e.a191 = 10174; - e.a89 = 10088; - e.a90 = 10089; - e.a93 = 10090; - e.a94 = 10091; - e.a91 = 10092; - e.a92 = 10093; - e.a205 = 10094; - e.a85 = 10095; - e.a206 = 10096; - e.a86 = 10097; - e.a87 = 10098; - e.a88 = 10099; - e.a95 = 10100; - e.a96 = 10101; - e['.notdef'] = 0; - }); - }, - (e, t, a) => { - a.r(t); - a.d(t, { - clearUnicodeCaches: () => clearUnicodeCaches, - getCharUnicodeCategory: () => getCharUnicodeCategory, - getUnicodeForGlyph: () => getUnicodeForGlyph, - getUnicodeRangeFor: () => getUnicodeRangeFor, - mapSpecialUnicodeValues: () => mapSpecialUnicodeValues, - }); - const r = (0, a(3).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 - ? r()[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 = [ - [0, 127], - [128, 255], - [256, 383], - [384, 591], - [592, 687, 7424, 7551, 7552, 7615], - [688, 767, 42752, 42783], - [768, 879, 7616, 7679], - [880, 1023], - [11392, 11519], - [1024, 1279, 1280, 1327, 11744, 11775, 42560, 42655], - [1328, 1423], - [1424, 1535], - [42240, 42559], - [1536, 1791, 1872, 1919], - [1984, 2047], - [2304, 2431], - [2432, 2559], - [2560, 2687], - [2688, 2815], - [2816, 2943], - [2944, 3071], - [3072, 3199], - [3200, 3327], - [3328, 3455], - [3584, 3711], - [3712, 3839], - [4256, 4351, 11520, 11567], - [6912, 7039], - [4352, 4607], - [7680, 7935, 11360, 11391, 42784, 43007], - [7936, 8191], - [8192, 8303, 11776, 11903], - [8304, 8351], - [8352, 8399], - [8400, 8447], - [8448, 8527], - [8528, 8591], - [8592, 8703, 10224, 10239, 10496, 10623, 11008, 11263], - [8704, 8959, 10752, 11007, 10176, 10223, 10624, 10751], - [8960, 9215], - [9216, 9279], - [9280, 9311], - [9312, 9471], - [9472, 9599], - [9600, 9631], - [9632, 9727], - [9728, 9983], - [9984, 10175], - [12288, 12351], - [12352, 12447], - [12448, 12543, 12784, 12799], - [12544, 12591, 12704, 12735], - [12592, 12687], - [43072, 43135], - [12800, 13055], - [13056, 13311], - [44032, 55215], - [55296, 57343], - [67840, 67871], - [ - 19968, 40959, 11904, 12031, 12032, 12255, 12272, 12287, 13312, 19903, 131072, 173791, - 12688, 12703, - ], - [57344, 63743], - [12736, 12783, 63744, 64255, 194560, 195103], - [64256, 64335], - [64336, 65023], - [65056, 65071], - [65040, 65055], - [65104, 65135], - [65136, 65279], - [65280, 65519], - [65520, 65535], - [3840, 4095], - [1792, 1871], - [1920, 1983], - [3456, 3583], - [4096, 4255], - [4608, 4991, 4992, 5023, 11648, 11743], - [5024, 5119], - [5120, 5759], - [5760, 5791], - [5792, 5887], - [6016, 6143], - [6144, 6319], - [10240, 10495], - [40960, 42127], - [5888, 5919, 5920, 5951, 5952, 5983, 5984, 6015], - [66304, 66351], - [66352, 66383], - [66560, 66639], - [118784, 119039, 119040, 119295, 119296, 119375], - [119808, 120831], - [1044480, 1048573], - [65024, 65039, 917760, 917999], - [917504, 917631], - [6400, 6479], - [6480, 6527], - [6528, 6623], - [6656, 6687], - [11264, 11359], - [11568, 11647], - [19904, 19967], - [43008, 43055], - [65536, 65663, 65664, 65791, 65792, 65855], - [65856, 65935], - [66432, 66463], - [66464, 66527], - [66640, 66687], - [66688, 66735], - [67584, 67647], - [68096, 68191], - [119552, 119647], - [73728, 74751, 74752, 74879], - [119648, 119679], - [7040, 7103], - [7168, 7247], - [7248, 7295], - [43136, 43231], - [43264, 43311], - [43312, 43359], - [43520, 43615], - [65936, 65999], - [66e3, 66047], - [66208, 66271, 66176, 66207, 67872, 67903], - [127024, 127135, 126976, 127023], - ]; - function getUnicodeRangeFor(e, t = -1) { - if (-1 !== t) { - const a = i[t]; - for (let r = 0, i = a.length; r < i; r += 2) if (e >= a[r] && e <= a[r + 1]) return t; - } - for (let t = 0, a = i.length; t < a; t++) { - const a = i[t]; - for (let r = 0, i = a.length; r < i; r += 2) if (e >= a[r] && e <= a[r + 1]) return t; - } - return -1; - } - const n = new RegExp('^(\\s)|(\\p{Mn})|(\\p{Cf})$', 'u'), - s = new Map(); - function getCharUnicodeCategory(e) { - const t = s.get(e); - if (t) return t; - const a = e.match(n), - r = { - isWhitespace: !(!a || !a[1]), - isZeroWidthDiacritic: !(!a || !a[2]), - isInvisibleFormatMark: !(!a || !a[3]), - }; - s.set(e, r); - return r; - } - function clearUnicodeCaches() { - s.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, i.normalizeFontName)(e); - return n()[t]; - }; - t.getSymbolsFonts = - t.getSupplementalGlyphMapForCalibri = - t.getSupplementalGlyphMapForArialBlack = - t.getStdFontMap = - void 0; - var r = a(3), - i = a(38); - const n = (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 = n; - 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[179] = 8220; - e[180] = 8221; - e[181] = 8216; - e[182] = 8217; - e[200] = 193; - e[203] = 205; - e[207] = 211; - 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[5] = 192; - e[6] = 193; - e[9] = 196; - e[17] = 66; - e[18] = 67; - e[21] = 268; - e[24] = 68; - e[28] = 69; - e[29] = 200; - e[30] = 201; - e[32] = 282; - e[38] = 70; - e[39] = 71; - e[44] = 72; - e[47] = 73; - e[48] = 204; - e[49] = 205; - e[58] = 74; - e[60] = 75; - e[62] = 76; - e[68] = 77; - e[69] = 78; - e[75] = 79; - e[76] = 210; - e[80] = 214; - 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[109] = 220; - 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[259] = 224; - e[260] = 225; - e[263] = 228; - e[268] = 261; - e[271] = 98; - e[272] = 99; - e[273] = 263; - e[275] = 269; - e[282] = 100; - e[286] = 101; - e[287] = 232; - e[288] = 233; - e[290] = 283; - e[295] = 281; - e[296] = 102; - e[336] = 103; - e[346] = 104; - e[349] = 105; - e[350] = 236; - 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[382] = 242; - e[383] = 243; - e[386] = 246; - 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[442] = 252; - 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), - i = a(38), - n = a(2); - t.CFFFont = class CFFFont { - constructor(e, t) { - this.properties = t; - const a = new r.CFFParser(e, t, i.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, n.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, - { cidToGidMap: a, cMap: r } = t, - n = e.charset.charset; - let s, o; - if (t.composite) { - let t, i; - if (a && a.length > 0) { - t = Object.create(null); - for (let e = 0, r = a.length; e < r; e++) { - const r = a[e]; - void 0 !== r && (t[r] = e); - } - } - s = Object.create(null); - if (e.isCIDFont) - for (o = 0; o < n.length; o++) { - const e = n[o]; - i = r.charCodeOf(e); - t && void 0 !== t[i] && (i = t[i]); - s[i] = o; - } - else - for (o = 0; o < e.charStrings.count; o++) { - i = r.charCodeOf(o); - s[i] = o; - } - return s; - } - let c = e.encoding ? e.encoding.encoding : null; - t.isInternalFont && (c = t.defaultEncoding); - s = (0, i.type1FontGlyphMapping)(t, c, n); - return s; - } - hasGlyphId(e) { - return this.cff.hasGlyphId(e); - } - _createBuiltInEncoding() { - const { charset: e, encoding: t } = this.cff; - if (!e || !t) return; - const a = e.charset, - r = t.encoding, - i = []; - for (const e in r) { - const t = r[e]; - if (t >= 0) { - const r = a[t]; - r && (i[e] = r); - } - } - i.length > 0 && (this.properties.builtInEncoding = i); - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.FontRendererFactory = void 0; - var r = a(2), - i = a(35), - n = a(39), - s = a(37), - o = a(8); - 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 i = 1 === getUint16(e, t + 2) ? getUint32(e, t + 8) : getUint32(e, t + 16), - n = getUint16(e, t + i); - let s, o, c; - if (4 === n) { - getUint16(e, t + i + 2); - const a = getUint16(e, t + i + 6) >> 1; - o = t + i + 14; - s = []; - for (c = 0; c < a; c++, o += 2) s[c] = { end: getUint16(e, o) }; - o += 2; - for (c = 0; c < a; c++, o += 2) s[c].start = getUint16(e, o); - for (c = 0; c < a; c++, o += 2) s[c].idDelta = getUint16(e, o); - for (c = 0; c < a; c++, o += 2) { - let t = getUint16(e, o); - if (0 !== t) { - s[c].ids = []; - for (let a = 0, r = s[c].end - s[c].start + 1; a < r; a++) { - s[c].ids[a] = getUint16(e, o + t); - t += 2; - } - } - } - return s; - } - if (12 === n) { - const a = getUint32(e, t + i + 12); - o = t + i + 16; - s = []; - for (c = 0; c < a; c++) { - t = getUint32(e, o); - s.push({ start: t, end: getUint32(e, o + 4), idDelta: getUint32(e, o + 8) - t }); - o += 12; - } - return s; - } - throw new r.FormatError(`unsupported cmap: ${n}`); - } - function parseCff(e, t, a, r) { - const n = new i.CFFParser(new o.Stream(e, t, a - t), {}, r).parse(); - return { - glyphs: n.charStrings.objects, - subrs: - n.topDict.privateDict && - n.topDict.privateDict.subrsIndex && - n.topDict.privateDict.subrsIndex.objects, - gsubrs: n.globalSubrIndex && n.globalSubrIndex.objects, - isCFFCIDFont: n.isCIDFont, - fdSelect: n.fdSelect, - fdArray: n.fdArray, - }; - } - function lookupCmap(e, t) { - const a = t.codePointAt(0); - let r = 0, - i = 0, - n = e.length - 1; - for (; i < n; ) { - const t = (i + n + 1) >> 1; - a < e[t].start ? (n = t - 1) : (i = t); - } - e[i].start <= a && - a <= e[i].end && - (r = (e[i].idDelta + (e[i].ids ? e[i].ids[a - e[i].start] : a)) & 65535); - return { charCode: a, glyphId: r }; - } - function compileGlyf(e, t, a) { - function moveTo(e, a) { - t.push({ cmd: 'moveTo', args: [e, a] }); - } - function lineTo(e, a) { - t.push({ cmd: 'lineTo', args: [e, a] }); - } - function quadraticCurveTo(e, a, r, i) { - t.push({ cmd: 'quadraticCurveTo', args: [e, a, r, i] }); - } - let r = 0; - const i = getInt16(e, r); - let n, - s = 0, - o = 0; - r += 10; - if (i < 0) - do { - n = getUint16(e, r); - const i = getUint16(e, r + 2); - r += 4; - let c, l; - if (1 & n) { - if (2 & n) { - c = getInt16(e, r); - l = getInt16(e, r + 2); - } else { - c = getUint16(e, r); - l = getUint16(e, r + 2); - } - r += 4; - } else if (2 & n) { - c = getInt8(e, r++); - l = getInt8(e, r++); - } else { - c = e[r++]; - l = e[r++]; - } - if (2 & n) { - s = c; - o = l; - } else { - s = 0; - o = 0; - } - let h = 1, - u = 1, - d = 0, - f = 0; - if (8 & n) { - h = u = getFloat214(e, r); - r += 2; - } else if (64 & n) { - h = getFloat214(e, r); - u = getFloat214(e, r + 2); - r += 4; - } else if (128 & n) { - h = getFloat214(e, r); - d = getFloat214(e, r + 2); - f = getFloat214(e, r + 4); - u = getFloat214(e, r + 6); - r += 8; - } - const g = a.glyphs[i]; - if (g) { - t.push({ cmd: 'save' }, { cmd: 'transform', args: [h, d, f, u, s, o] }); - compileGlyf(g, t, a); - t.push({ cmd: 'restore' }); - } - } while (32 & n); - else { - const t = []; - let a, c; - for (a = 0; a < i; a++) { - t.push(getUint16(e, r)); - r += 2; - } - r += 2 + getUint16(e, r); - const l = t.at(-1) + 1, - h = []; - for (; h.length < l; ) { - n = e[r++]; - let t = 1; - 8 & n && (t += e[r++]); - for (; t-- > 0; ) h.push({ flags: n }); - } - for (a = 0; a < l; a++) { - switch (18 & h[a].flags) { - case 0: - s += getInt16(e, r); - r += 2; - break; - case 2: - s -= e[r++]; - break; - case 18: - s += e[r++]; - } - h[a].x = s; - } - for (a = 0; a < l; a++) { - switch (36 & h[a].flags) { - case 0: - o += getInt16(e, r); - r += 2; - break; - case 4: - o -= e[r++]; - break; - case 36: - o += e[r++]; - } - h[a].y = o; - } - let u = 0; - for (r = 0; r < i; r++) { - const e = t[r], - i = h.slice(u, e + 1); - if (1 & i[0].flags) i.push(i[0]); - else if (1 & i.at(-1).flags) i.unshift(i.at(-1)); - else { - const e = { - flags: 1, - x: (i[0].x + i.at(-1).x) / 2, - y: (i[0].y + i.at(-1).y) / 2, - }; - i.unshift(e); - i.push(e); - } - moveTo(i[0].x, i[0].y); - for (a = 1, c = i.length; a < c; a++) - if (1 & i[a].flags) lineTo(i[a].x, i[a].y); - else if (1 & i[a + 1].flags) { - quadraticCurveTo(i[a].x, i[a].y, i[a + 1].x, i[a + 1].y); - a++; - } else - quadraticCurveTo( - i[a].x, - i[a].y, - (i[a].x + i[a + 1].x) / 2, - (i[a].y + i[a + 1].y) / 2, - ); - u = e + 1; - } - } - } - function compileCharString(e, t, a, i) { - function moveTo(e, a) { - t.push({ cmd: 'moveTo', args: [e, a] }); - } - function lineTo(e, a) { - t.push({ cmd: 'lineTo', args: [e, a] }); - } - function bezierCurveTo(e, a, r, i, n, s) { - t.push({ cmd: 'bezierCurveTo', args: [e, a, r, i, n, s] }); - } - const n = []; - let o = 0, - c = 0, - l = 0; - !(function parse(e) { - let h = 0; - for (; h < e.length; ) { - let u, - d, - f, - g, - p, - m, - b, - y, - w, - S = !1, - x = e[h++]; - switch (x) { - case 1: - case 3: - case 18: - case 23: - l += n.length >> 1; - S = !0; - break; - case 4: - c += n.pop(); - moveTo(o, c); - S = !0; - break; - case 5: - for (; n.length > 0; ) { - o += n.shift(); - c += n.shift(); - lineTo(o, c); - } - break; - case 6: - for (; n.length > 0; ) { - o += n.shift(); - lineTo(o, c); - if (0 === n.length) break; - c += n.shift(); - lineTo(o, c); - } - break; - case 7: - for (; n.length > 0; ) { - c += n.shift(); - lineTo(o, c); - if (0 === n.length) break; - o += n.shift(); - lineTo(o, c); - } - break; - case 8: - for (; n.length > 0; ) { - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - } - break; - case 10: - y = n.pop(); - w = null; - if (a.isCFFCIDFont) { - const e = a.fdSelect.getFDIndex(i); - if (e >= 0 && e < a.fdArray.length) { - const t = a.fdArray[e]; - let r; - t.privateDict && - t.privateDict.subrsIndex && - (r = t.privateDict.subrsIndex.objects); - if (r) { - y += getSubroutineBias(r); - w = r[y]; - } - } else (0, r.warn)('Invalid fd index for glyph index.'); - } else w = a.subrs[y + a.subrsBias]; - w && parse(w); - break; - case 11: - return; - case 12: - x = e[h++]; - switch (x) { - case 34: - u = o + n.shift(); - d = u + n.shift(); - p = c + n.shift(); - o = d + n.shift(); - bezierCurveTo(u, c, d, p, o, p); - u = o + n.shift(); - d = u + n.shift(); - o = d + n.shift(); - bezierCurveTo(u, p, d, c, o, c); - break; - case 35: - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - n.pop(); - break; - case 36: - u = o + n.shift(); - p = c + n.shift(); - d = u + n.shift(); - m = p + n.shift(); - o = d + n.shift(); - bezierCurveTo(u, p, d, m, o, m); - u = o + n.shift(); - d = u + n.shift(); - b = m + n.shift(); - o = d + n.shift(); - bezierCurveTo(u, m, d, b, o, c); - break; - case 37: - const e = o, - t = c; - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d; - c = g; - Math.abs(o - e) > Math.abs(c - t) ? (o += n.shift()) : (c += n.shift()); - bezierCurveTo(u, f, d, g, o, c); - break; - default: - throw new r.FormatError(`unknown operator: 12 ${x}`); - } - break; - case 14: - if (n.length >= 4) { - const e = n.pop(), - r = n.pop(); - c = n.pop(); - o = n.pop(); - t.push({ cmd: 'save' }, { cmd: 'translate', args: [o, c] }); - let i = lookupCmap( - a.cmap, - String.fromCharCode(a.glyphNameMap[s.StandardEncoding[e]]), - ); - compileCharString(a.glyphs[i.glyphId], t, a, i.glyphId); - t.push({ cmd: 'restore' }); - i = lookupCmap( - a.cmap, - String.fromCharCode(a.glyphNameMap[s.StandardEncoding[r]]), - ); - compileCharString(a.glyphs[i.glyphId], t, a, i.glyphId); - } - return; - case 19: - case 20: - l += n.length >> 1; - h += (l + 7) >> 3; - S = !0; - break; - case 21: - c += n.pop(); - o += n.pop(); - moveTo(o, c); - S = !0; - break; - case 22: - o += n.pop(); - moveTo(o, c); - S = !0; - break; - case 24: - for (; n.length > 2; ) { - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - } - o += n.shift(); - c += n.shift(); - lineTo(o, c); - break; - case 25: - for (; n.length > 6; ) { - o += n.shift(); - c += n.shift(); - lineTo(o, c); - } - u = o + n.shift(); - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - break; - case 26: - n.length % 2 && (o += n.shift()); - for (; n.length > 0; ) { - u = o; - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d; - c = g + n.shift(); - bezierCurveTo(u, f, d, g, o, c); - } - break; - case 27: - n.length % 2 && (c += n.shift()); - for (; n.length > 0; ) { - u = o + n.shift(); - f = c; - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g; - bezierCurveTo(u, f, d, g, o, c); - } - break; - case 28: - n.push(((e[h] << 24) | (e[h + 1] << 16)) >> 16); - h += 2; - break; - case 29: - y = n.pop() + a.gsubrsBias; - w = a.gsubrs[y]; - w && parse(w); - break; - case 30: - for (; n.length > 0; ) { - u = o; - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + (1 === n.length ? n.shift() : 0); - bezierCurveTo(u, f, d, g, o, c); - if (0 === n.length) break; - u = o + n.shift(); - f = c; - d = u + n.shift(); - g = f + n.shift(); - c = g + n.shift(); - o = d + (1 === n.length ? n.shift() : 0); - bezierCurveTo(u, f, d, g, o, c); - } - break; - case 31: - for (; n.length > 0; ) { - u = o + n.shift(); - f = c; - d = u + n.shift(); - g = f + n.shift(); - c = g + n.shift(); - o = d + (1 === n.length ? n.shift() : 0); - bezierCurveTo(u, f, d, g, o, c); - if (0 === n.length) break; - u = o; - f = c + n.shift(); - d = u + n.shift(); - g = f + n.shift(); - o = d + n.shift(); - c = g + (1 === n.length ? n.shift() : 0); - bezierCurveTo(u, f, d, g, o, c); - } - break; - default: - if (x < 32) throw new r.FormatError(`unknown operator: ${x}`); - if (x < 247) n.push(x - 139); - else if (x < 251) n.push(256 * (x - 247) + e[h++] + 108); - else if (x < 255) n.push(256 * -(x - 251) - e[h++] - 108); - else { - n.push( - ((e[h] << 24) | (e[h + 1] << 16) | (e[h + 2] << 8) | e[h + 3]) / 65536, - ); - h += 4; - } - } - S && (n.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 && e < this.fdArray.length) { - a = this.fdArray[e].getByName('FontMatrix') || r.FONT_IDENTITY_MATRIX; - } else (0, r.warn)('Invalid fd index for glyph index.'); - } - const i = [ - { cmd: 'save' }, - { cmd: 'transform', args: a.slice() }, - { cmd: 'scale', args: ['size', '-size'] }, - ]; - this.compileGlyphImpl(e, i, t); - i.push({ cmd: 'restore' }); - return i; - } - compileGlyphImpl() { - (0, r.unreachable)('Children classes should implement this.'); - } - hasBuiltPath(e) { - const { charCode: t, glyphId: a } = lookupCmap(this.cmap, e); - return ( - void 0 !== this.compiledGlyphs[a] && void 0 !== this.compiledCharCodeToGlyphId[t] - ); - } - } - class TrueTypeCompiled extends CompiledFont { - constructor(e, t, a) { - super(a || [488e-6, 0, 0, 488e-6, 0, 0]); - this.glyphs = e; - this.cmap = t; - } - compileGlyphImpl(e, t) { - compileGlyf(e, t, this); - } - } - class Type2Compiled extends CompiledFont { - constructor(e, t, a, r) { - super(a || [0.001, 0, 0, 0.001, 0, 0]); - this.glyphs = e.glyphs; - this.gsubrs = e.gsubrs || []; - this.subrs = e.subrs || []; - this.cmap = t; - this.glyphNameMap = r || (0, n.getGlyphsUnicode)(); - this.gsubrsBias = getSubroutineBias(this.gsubrs); - this.subrsBias = getSubroutineBias(this.subrs); - this.isCFFCIDFont = e.isCFFCIDFont; - this.fdSelect = e.fdSelect; - this.fdArray = e.fdArray; - } - compileGlyphImpl(e, t, a) { - compileCharString(e, t, this, a); - } - } - t.FontRendererFactory = class FontRendererFactory { - static create(e, t) { - const a = new Uint8Array(e.data); - let i, n, s, o, c, l; - const h = getUint16(a, 4); - for (let e = 0, u = 12; e < h; e++, u += 16) { - const e = (0, r.bytesToString)(a.subarray(u, u + 4)), - h = getUint32(a, u + 8), - d = getUint32(a, u + 12); - switch (e) { - case 'cmap': - i = parseCmap(a, h); - break; - case 'glyf': - n = a.subarray(h, h + d); - break; - case 'loca': - s = a.subarray(h, h + d); - break; - case 'head': - l = getUint16(a, h + 18); - c = getUint16(a, h + 50); - break; - case 'CFF ': - o = parseCff(a, h, h + d, t); - } - } - if (n) { - const t = l ? [1 / l, 0, 0, 1 / l, 0, 0] : e.fontMatrix; - return new TrueTypeCompiled( - (function parseGlyfTable(e, t, a) { - let r, i; - if (a) { - r = 4; - i = getUint32; - } else { - r = 2; - i = (e, t) => 2 * getUint16(e, t); - } - const n = []; - let s = i(t, 0); - for (let a = r; a < t.length; a += r) { - const r = i(t, a); - n.push(e.subarray(s, r)); - s = r; - } - return n; - })(n, s, c), - i, - t, - ); - } - return new Type2Compiled(o, i, e.fontMatrix, e.glyphNameMap); - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.getMetrics = t.getFontBasicMetrics = void 0; - var r = a(3); - const i = (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 = i; - const n = (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 = n; - }, - (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 i = new DataView(a.buffer, a.byteOffset, a.byteLength), - n = new DataView(e.buffer, e.byteOffset, e.byteLength), - s = t ? 4 : 2; - let o = t ? i.getUint32(0) : 2 * i.getUint16(0), - c = 0; - for (let e = 0; e < r; e++) { - c += s; - const e = t ? i.getUint32(c) : 2 * i.getUint16(c); - if (e === o) { - this.glyphs.push(new Glyph({})); - continue; - } - const a = Glyph.parse(o, n); - this.glyphs.push(a); - o = e; - } - } - getSize() { - return this.glyphs.reduce((e, t) => e + ((t.getSize() + 3) & -4), 0); - } - write() { - const e = this.getSize(), - t = new DataView(new ArrayBuffer(e)), - a = e > 131070, - r = a ? 4 : 2, - i = new DataView(new ArrayBuffer((this.glyphs.length + 1) * r)); - a ? i.setUint32(0, 0) : i.setUint16(0, 0); - let n = 0, - s = 0; - for (const e of this.glyphs) { - n += e.write(n, t); - n = (n + 3) & -4; - s += r; - a ? i.setUint32(s, n) : i.setUint16(s, n >> 1); - } - return { - isLocationLong: a, - loca: new Uint8Array(i.buffer), - glyf: new Uint8Array(t.buffer), - }; - } - scale(e) { - for (let t = 0, a = this.glyphs.length; t < a; t++) this.glyphs[t].scale(e[t]); - } - }; - class Glyph { - constructor({ header: e = null, simple: t = null, composites: a = null }) { - this.header = e; - this.simple = t; - this.composites = a; - } - static parse(e, t) { - const [a, r] = GlyphHeader.parse(e, t); - e += a; - if (r.numberOfContours < 0) { - const a = []; - for (;;) { - const [r, i] = CompositeGlyph.parse(e, t); - e += r; - a.push(i); - if (!(32 & i.flags)) break; - } - return new Glyph({ header: r, composites: a }); - } - const i = SimpleGlyph.parse(e, t, r.numberOfContours); - return new Glyph({ header: r, simple: i }); - } - getSize() { - if (!this.header) return 0; - const e = this.simple - ? this.simple.getSize() - : this.composites.reduce((e, t) => e + 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: i }) { - this.numberOfContours = e; - this.xMin = t; - this.yMin = a; - this.xMax = r; - this.yMax = i; - } - 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 i = 0; i < a; i++) { - const a = t.getUint16(e); - e += 2; - r.push(a); - } - const i = r[a - 1] + 1, - n = t.getUint16(e); - e += 2; - const s = new Uint8Array(t).slice(e, e + n); - e += n; - const o = []; - for (let a = 0; a < i; e++, a++) { - let r = t.getUint8(e); - o.push(r); - if (8 & r) { - const i = t.getUint8(++e); - r ^= 8; - for (let e = 0; e < i; e++) o.push(r); - a += i; - } - } - const c = []; - let l = [], - h = [], - u = []; - const d = []; - let f = 0, - g = 0; - for (let a = 0; a < i; a++) { - const i = o[a]; - if (2 & i) { - const a = t.getUint8(e++); - g += 16 & i ? a : -a; - l.push(g); - } else if (16 & i) l.push(g); - else { - g += t.getInt16(e); - e += 2; - l.push(g); - } - if (r[f] === a) { - f++; - c.push(l); - l = []; - } - } - g = 0; - f = 0; - for (let a = 0; a < i; a++) { - const i = o[a]; - if (4 & i) { - const a = t.getUint8(e++); - g += 32 & i ? a : -a; - h.push(g); - } else if (32 & i) h.push(g); - else { - g += t.getInt16(e); - e += 2; - h.push(g); - } - u.push((1 & i) | (64 & i)); - if (r[f] === a) { - l = c[f]; - f++; - d.push(new Contour({ flags: u, xCoordinates: l, yCoordinates: h })); - h = []; - u = []; - } - } - return new SimpleGlyph({ contours: d, instructions: s }); - } - getSize() { - let e = 2 * this.contours.length + 2 + this.instructions.length, - t = 0, - a = 0; - for (const r of this.contours) { - e += r.flags.length; - for (let i = 0, n = r.xCoordinates.length; i < n; i++) { - const n = r.xCoordinates[i], - s = r.yCoordinates[i]; - let o = Math.abs(n - t); - o > 255 ? (e += 2) : o > 0 && (e += 1); - t = n; - o = Math.abs(s - a); - o > 255 ? (e += 2) : o > 0 && (e += 1); - a = s; - } - } - return e; - } - write(e, t) { - const a = e, - r = [], - i = [], - n = []; - let s = 0, - o = 0; - for (const a of this.contours) { - for (let e = 0, t = a.xCoordinates.length; e < t; e++) { - let t = a.flags[e]; - const c = a.xCoordinates[e]; - let l = c - s; - if (0 === l) { - t |= 16; - r.push(0); - } else { - const e = Math.abs(l); - if (e <= 255) { - t |= l >= 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; - i.push(0); - } else { - const e = Math.abs(l); - if (e <= 255) { - t |= l >= 0 ? 36 : 4; - i.push(e); - } else i.push(l); - } - o = h; - n.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 n) t.setUint8(e++, a); - for (let a = 0, i = r.length; a < i; a++) { - const i = r[a], - s = n[a]; - if (2 & s) t.setUint8(e++, i); - else if (!(16 & s)) { - t.setInt16(e, i); - e += 2; - } - } - for (let a = 0, r = i.length; a < r; a++) { - const r = i[a], - s = n[a]; - if (4 & s) t.setUint8(e++, r); - else if (!(32 & s)) { - t.setInt16(e, r); - e += 2; - } - } - return e - a; - } - scale(e, t) { - for (const a of this.contours) - if (0 !== a.xCoordinates.length) - for (let r = 0, i = a.xCoordinates.length; r < i; r++) - a.xCoordinates[r] = Math.round(e + (a.xCoordinates[r] - e) * t); - } - } - class CompositeGlyph { - constructor({ - flags: e, - glyphIndex: t, - argument1: a, - argument2: r, - transf: i, - instructions: n, - }) { - this.flags = e; - this.glyphIndex = t; - this.argument1 = a; - this.argument2 = r; - this.transf = i; - this.instructions = n; - } - static parse(e, t) { - const a = e, - r = []; - let i = t.getUint16(e); - const n = t.getUint16(e + 2); - e += 4; - let s, o; - if (1 & i) { - if (2 & i) { - s = t.getInt16(e); - o = t.getInt16(e + 2); - } else { - s = t.getUint16(e); - o = t.getUint16(e + 2); - } - e += 4; - i ^= 1; - } else { - if (2 & i) { - s = t.getInt8(e); - o = t.getInt8(e + 1); - } else { - s = t.getUint8(e); - o = t.getUint8(e + 1); - } - e += 2; - } - if (8 & i) { - r.push(t.getUint16(e)); - e += 2; - } else if (64 & i) { - r.push(t.getUint16(e), t.getUint16(e + 2)); - e += 4; - } else if (128 & i) { - r.push(t.getUint16(e), t.getUint16(e + 2), t.getUint16(e + 4), t.getUint16(e + 6)); - e += 8; - } - let c = null; - if (256 & i) { - const a = t.getUint16(e); - e += 2; - c = new Uint8Array(t).slice(e, e + a); - e += a; - } - return [ - e - a, - new CompositeGlyph({ - flags: i, - glyphIndex: n, - argument1: s, - argument2: o, - transf: r, - instructions: c, - }), - ]; - } - getSize() { - let e = 4 + 2 * this.transf.length; - 256 & this.flags && (e += 2 + this.instructions.length); - e += 2; - 2 & this.flags - ? (this.argument1 >= -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(3), - i = 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, i = a.length; r < i; r++) e[t++] = 255 & a.charCodeAt(r); - else for (const r of a) e[t++] = 255 & r; - } - class OpenTypeFileBuilder { - constructor(e) { - this.sfnt = e; - this.tables = Object.create(null); - } - static getSearchParams(e, t) { - let a = 1, - r = 0; - for (; (a ^ e) > a; ) { - a <<= 1; - r++; - } - const i = a * t; - return { range: i, entry: r, rangeShift: t * e - i }; - } - toArray() { - let e = this.sfnt; - const t = this.tables, - a = Object.keys(t); - a.sort(); - const n = a.length; - let s, - o, - c, - l, - h, - u = 12 + 16 * n; - const d = [u]; - for (s = 0; s < n; s++) { - l = t[a[s]]; - u += ((l.length + 3) & -4) >>> 0; - d.push(u); - } - const f = new Uint8Array(u); - for (s = 0; s < n; s++) { - l = t[a[s]]; - writeData(f, d[s], l); - } - 'true' === e && (e = (0, i.string32)(65536)); - f[0] = 255 & e.charCodeAt(0); - f[1] = 255 & e.charCodeAt(1); - f[2] = 255 & e.charCodeAt(2); - f[3] = 255 & e.charCodeAt(3); - writeInt16(f, 4, n); - const g = OpenTypeFileBuilder.getSearchParams(n, 16); - writeInt16(f, 6, g.range); - writeInt16(f, 8, g.entry); - writeInt16(f, 10, g.rangeShift); - u = 12; - for (s = 0; s < n; s++) { - h = a[s]; - f[u] = 255 & h.charCodeAt(0); - f[u + 1] = 255 & h.charCodeAt(1); - f[u + 2] = 255 & h.charCodeAt(2); - f[u + 3] = 255 & h.charCodeAt(3); - let e = 0; - for (o = d[s], c = d[s + 1]; o < c; o += 4) { - e = (e + (0, r.readUint32)(f, o)) >>> 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), - i = a(2), - n = a(38), - s = a(3), - o = a(8), - c = a(49); - function findBlock(e, t, a) { - const r = e.length, - i = t.length, - n = r - i; - let o = a, - c = !1; - for (; o < n; ) { - let a = 0; - for (; a < i && e[o + a] === t[a]; ) a++; - if (a >= i) { - o += a; - for (; o < r && (0, s.isWhiteSpace)(e[o]); ) o++; - c = !0; - break; - } - o++; - } - return { found: c, length: o }; - } - t.Type1Font = class Type1Font { - constructor(e, t, a) { - let r = a.length1, - s = a.length2, - l = t.peekBytes(6); - const h = 128 === l[0] && 1 === l[1]; - if (h) { - t.skip(6); - r = (l[5] << 24) | (l[4] << 16) | (l[3] << 8) | l[2]; - } - const u = (function getHeaderBlock(e, t) { - const a = [101, 101, 120, 101, 99], - r = e.pos; - let n, s, c, l; - try { - n = e.getBytes(t); - s = n.length; - } catch (e) {} - if (s === t) { - c = findBlock(n, a, t - 2 * a.length); - if (c.found && c.length === t) return { stream: new o.Stream(n), length: t }; - } - (0, i.warn)('Invalid "Length1" property in Type1 font -- trying to recover.'); - e.pos = r; - for (;;) { - c = findBlock(e.peekBytes(2048), a, 0); - if (0 === c.length) break; - e.pos += c.length; - if (c.found) { - l = e.pos - r; - break; - } - } - e.pos = r; - if (l) return { stream: new o.Stream(e.getBytes(l)), length: l }; - (0, i.warn)('Unable to recover "Length1" property in Type1 font -- using as is.'); - return { stream: new o.Stream(e.getBytes(t)), length: t }; - })(t, r); - new c.Type1Parser(u.stream, !1, n.SEAC_ANALYSIS_ENABLED).extractFontHeader(a); - if (h) { - l = t.getBytes(6); - s = (l[5] << 24) | (l[4] << 16) | (l[3] << 8) | l[2]; - } - const d = (function getEexecBlock(e, t) { - const a = e.getBytes(); - if (0 === a.length) - throw new i.FormatError('getEexecBlock - no font program found.'); - return { stream: new o.Stream(a), length: a.length }; - })(t), - f = new c.Type1Parser(d.stream, !0, n.SEAC_ANALYSIS_ENABLED).extractFontProgram(a); - for (const e in f.properties) a[e] = f.properties[e]; - const g = f.charstrings, - p = this.getType2Charstrings(g), - m = this.getType2Subrs(f.subrs); - this.charstrings = g; - this.data = this.wrap(e, p, this.charstrings, m, a); - this.seacs = this.getSeacs(f.charstrings); - } - get numGlyphs() { - return this.charstrings.length + 1; - } - getCharset() { - const e = ['.notdef']; - for (const { glyphName: t } of this.charstrings) e.push(t); - return e; - } - getGlyphMapping(e) { - const t = this.charstrings; - if (e.composite) { - const a = Object.create(null); - for (let r = 0, i = t.length; r < i; r++) { - a[e.cMap.charCodeOf(r)] = r + 1; - } - return a; - } - const a = ['.notdef']; - let r, i; - for (i = 0; i < t.length; i++) a.push(t[i].glyphName); - const s = e.builtInEncoding; - if (s) { - r = Object.create(null); - for (const e in s) { - i = a.indexOf(s[e]); - i >= 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; a < r; a++) { - const r = e[a]; - r.seac && (t[a + 1] = r.seac); - } - return t; - } - getType2Charstrings(e) { - const t = []; - for (const a of e) t.push(a.charstring); - return t; - } - getType2Subrs(e) { - let t = 0; - const a = e.length; - t = a < 1133 ? 107 : a < 33769 ? 1131 : 32768; - const r = []; - let i; - for (i = 0; i < t; i++) r.push([11]); - for (i = 0; i < a; i++) r.push(e[i]); - return r; - } - wrap(e, t, a, i, n) { - const s = new r.CFF(); - s.header = new r.CFFHeader(1, 0, 4, 4); - s.names = [e]; - const o = new r.CFFTopDict(); - o.setByName('version', 391); - o.setByName('Notice', 392); - o.setByName('FullName', 393); - o.setByName('FamilyName', 394); - o.setByName('Weight', 395); - o.setByName('Encoding', null); - o.setByName('FontMatrix', n.fontMatrix); - o.setByName('FontBBox', n.bbox); - o.setByName('charset', null); - o.setByName('CharStrings', null); - o.setByName('Private', null); - s.topDict = o; - const c = new r.CFFStrings(); - c.add('Version 0.11'); - c.add('See original notice'); - c.add(e); - c.add(e); - c.add('Medium'); - s.strings = c; - s.globalSubrIndex = new r.CFFIndex(); - const l = t.length, - h = ['.notdef']; - let u, d; - for (u = 0; u < l; u++) { - const e = a[u].glyphName; - -1 === r.CFFStandardStrings.indexOf(e) && c.add(e); - h.push(e); - } - s.charset = new r.CFFCharset(!1, 0, h); - const f = new r.CFFIndex(); - f.add([139, 14]); - for (u = 0; u < l; u++) f.add(t[u]); - s.charStrings = f; - const g = new r.CFFPrivateDict(); - g.setByName('Subrs', null); - const p = [ - 'BlueValues', - 'OtherBlues', - 'FamilyBlues', - 'FamilyOtherBlues', - 'StemSnapH', - 'StemSnapV', - 'BlueShift', - 'BlueFuzz', - 'BlueScale', - 'LanguageGroup', - 'ExpansionFactor', - 'ForceBold', - 'StdHW', - 'StdVW', - ]; - for (u = 0, d = p.length; u < d; u++) { - const e = p[u]; - if (!(e in n.privateData)) continue; - const t = n.privateData[e]; - if (Array.isArray(t)) for (let e = t.length - 1; e > 0; e--) t[e] -= t[e - 1]; - g.setByName(e, t); - } - s.topDict.privateDict = g; - const m = new r.CFFIndex(); - for (u = 0, d = i.length; u < d; u++) m.add(i[u]); - g.subrsIndex = m; - return new r.CFFCompiler(s).compile(); - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Type1Parser = void 0; - var r = a(37), - i = a(3), - n = a(8), - 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 i, - n, - y, - w = !1; - for (let S = 0; S < r; S++) { - let r = e[S]; - if (r < 32) { - 12 === r && (r = (r << 8) + e[++S]); - switch (r) { - case 1: - case 3: - case 9: - case 3072: - case 3073: - case 3074: - case 3105: - this.stack = []; - break; - case 4: - if (this.flexing) { - if (this.stack.length < 1) { - w = !0; - break; - } - const e = this.stack.pop(); - this.stack.push(0, e); - break; - } - w = this.executeCommand(1, o); - break; - case 5: - w = this.executeCommand(2, c); - break; - case 6: - w = this.executeCommand(1, l); - break; - case 7: - w = this.executeCommand(1, h); - break; - case 8: - w = this.executeCommand(6, u); - break; - case 10: - if (this.stack.length < 1) { - w = !0; - break; - } - y = this.stack.pop(); - if (!t[y]) { - w = !0; - break; - } - w = this.convert(t[y], t, a); - break; - case 11: - return w; - case 13: - if (this.stack.length < 2) { - w = !0; - break; - } - i = this.stack.pop(); - n = this.stack.pop(); - this.lsb = n; - this.width = i; - this.stack.push(i, n); - w = this.executeCommand(2, p); - break; - case 14: - this.output.push(f[0]); - break; - case 21: - if (this.flexing) break; - w = this.executeCommand(2, g); - break; - case 22: - if (this.flexing) { - this.stack.push(0); - break; - } - w = this.executeCommand(1, p); - break; - case 30: - w = this.executeCommand(4, m); - break; - case 31: - w = this.executeCommand(4, b); - break; - case 3078: - if (a) { - const e = this.stack.at(-5); - this.seac = this.stack.splice(-4, 4); - this.seac[0] += this.lsb - e; - w = this.executeCommand(0, f); - } else w = this.executeCommand(4, f); - break; - case 3079: - if (this.stack.length < 4) { - w = !0; - break; - } - this.stack.pop(); - i = this.stack.pop(); - const e = this.stack.pop(); - n = this.stack.pop(); - this.lsb = n; - this.width = i; - this.stack.push(i, n, e); - w = this.executeCommand(3, g); - break; - case 3084: - if (this.stack.length < 2) { - w = !0; - break; - } - const S = this.stack.pop(), - x = this.stack.pop(); - this.stack.push(x / S); - break; - case 3088: - if (this.stack.length < 2) { - w = !0; - break; - } - y = this.stack.pop(); - const C = this.stack.pop(); - if (0 === y && 3 === C) { - const e = this.stack.splice(-17, 17); - this.stack.push( - e[2] + e[0], - e[3] + e[1], - e[4], - e[5], - e[6], - e[7], - e[8], - e[9], - e[10], - e[11], - e[12], - e[13], - e[14], - ); - w = this.executeCommand(13, d, !0); - this.flexing = !1; - this.stack.push(e[15], e[16]); - } else 1 === y && 0 === C && (this.flexing = !0); - break; - case 3089: - break; - default: - (0, s.warn)('Unknown type 1 charstring command of "' + r + '"'); - } - if (w) break; - } else { - r <= 246 - ? (r -= 139) - : (r = - r <= 250 - ? 256 * (r - 247) + e[++S] + 108 - : r <= 254 - ? -256 * (r - 251) - e[++S] - 108 - : ((255 & e[++S]) << 24) | - ((255 & e[++S]) << 16) | - ((255 & e[++S]) << 8) | - ((255 & e[++S]) << 0)); - this.stack.push(r); - } - } - return w; - } - executeCommand(e, t, a) { - const r = this.stack.length; - if (e > r) return !0; - const i = r - e; - for (let e = i; e < r; e++) { - let t = this.stack[e]; - if (Number.isInteger(t)) this.output.push(28, (t >> 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(i, 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, - i, - n = 0 | t; - for (r = 0; r < a; r++) n = (52845 * (e[r] + n) + 22719) & 65535; - const s = e.length - a, - o = new Uint8Array(s); - for (r = a, i = 0; i < s; r++, i++) { - const t = e[r]; - o[i] = t ^ (n >> 8); - n = (52845 * (t + n) + 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, i.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 n.Stream( - a - ? decrypt(t, 55665, 4) - : (function decryptAscii(e, t, a) { - let r = 0 | t; - const i = e.length, - n = new Uint8Array(i >>> 1); - let s, o; - for (s = 0, o = 0; s < i; s++) { - const t = e[s]; - if (!isHexDigit(t)) continue; - s++; - let a; - for (; s < i && !isHexDigit((a = e[s])); ) s++; - if (s < i) { - const e = parseInt(String.fromCharCode(t, a), 16); - n[o++] = e ^ (r >> 8); - r = (52845 * (e + r) + 22719) & 65535; - } - } - return n.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, i.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, i.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 = [], - i = Object.create(null); - i.lenIV = 4; - const n = { subrs: [], charstrings: [], properties: { privateData: i } }; - 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 = n.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 = n.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': - n.properties.privateData[s] = this.readNumberArray(); - break; - case 'StdHW': - case 'StdVW': - n.properties.privateData[s] = this.readNumberArray()[0]; - break; - case 'BlueShift': - case 'lenIV': - case 'BlueFuzz': - case 'BlueScale': - case 'LanguageGroup': - n.properties.privateData[s] = this.readNumber(); - break; - case 'ExpansionFactor': - n.properties.privateData[s] = this.readNumber() || 0.06; - break; - case 'ForceBold': - n.properties.privateData[s] = this.readBoolean(); - } - } - for (const { encoded: t, glyph: i } of r) { - const r = new Type1CharString(), - s = r.convert(t, a, this.seacAnalysisEnabled); - let o = r.output; - s && (o = [14]); - const c = { glyphName: i, charstring: o, width: r.width, lsb: r.lsb, seac: r.seac }; - '.notdef' === i ? n.charstrings.unshift(c) : n.charstrings.push(c); - if (e.builtInEncoding) { - const t = e.builtInEncoding.indexOf(i); - t > -1 && - void 0 === e.widths[t] && - t >= e.firstChar && - t <= e.lastChar && - (e.widths[t] = r.width); - } - } - return n; - } - 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 i = this.getToken(); - let n; - if (/^\d+$/.test(i)) { - n = []; - const e = 0 | parseInt(i, 10); - this.getToken(); - for (let a = 0; a < e; a++) { - t = this.getToken(); - for (; 'dup' !== t && 'def' !== t; ) { - t = this.getToken(); - if (null === t) return; - } - if ('def' === t) break; - const e = this.readInt(); - this.getToken(); - const a = this.getToken(); - n[e] = a; - this.getToken(); - } - } else n = (0, r.getEncoding)(i); - e.builtInEncoding = n; - break; - case 'FontBBox': - const s = this.readNumberArray(); - e.ascent = Math.max(s[3], s[1]); - e.descent = Math.min(s[1], s[3]); - e.ascentScaled = !0; - } - } - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Pattern = void 0; - t.getTilingPatternIR = function getTilingPatternIR(e, t, a) { - const i = t.getArray('Matrix'), - n = r.Util.normalizeRect(t.getArray('BBox')), - s = t.get('XStep'), - o = t.get('YStep'), - c = t.get('PaintType'), - l = t.get('TilingType'); - if (n[2] - n[0] == 0 || n[3] - n[1] == 0) - throw new r.FormatError(`Invalid getTilingPatternIR /BBox array: [${n}].`); - return ['TilingPattern', a, e, i, n, s, o, c, l]; - }; - var r = a(2), - i = a(5), - n = a(12), - s = a(3); - 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, n, f) { - const g = e instanceof i.BaseStream ? e.dict : e, - p = g.get('ShadingType'); - try { - switch (p) { - case o: - case c: - return new RadialAxialShading(g, t, a, n, f); - case l: - case h: - case u: - case d: - return new MeshShading(e, t, a, n, f); - default: - throw new r.FormatError('Unsupported ShadingType: ' + p); - } - } catch (e) { - if (e instanceof s.MissingDataException) throw e; - (0, r.warn)(e); - return new DummyShading(); - } - } - }; - class BaseShading { - static 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, i, s) { - super(); - this.coordsArr = e.getArray('Coords'); - this.shadingType = e.get('ShadingType'); - const o = n.ColorSpace.parse({ - cs: e.getRaw('CS') || e.getRaw('ColorSpace'), - xref: t, - resources: a, - pdfFunctionFactory: i, - 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, i, n, s] = this.coordsArr, - o = Math.hypot(e - i, t - n); - a <= s + o && s <= a + o && (0, r.warn)('Unsupported radial gradient.'); - } - this.extendStart = d; - this.extendEnd = f; - const g = e.getRaw('Function'), - p = i.createFromArray(g), - m = (u - h) / 840, - 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, - x = 0; - w[0] = h; - p(w, 0, y, 0); - let C = o.getRgb(y, 0); - const k = r.Util.makeHexColor(C[0], C[1], C[2]); - b.push([0, k]); - let v = 1; - w[0] = h + m; - p(w, 0, y, 0); - let F = o.getRgb(y, 0), - O = F[0] - C[0] + 1, - T = F[1] - C[1] + 1, - M = F[2] - C[2] + 1, - E = F[0] - C[0] - 1, - D = F[1] - C[1] - 1, - N = F[2] - C[2] - 1; - for (let e = 2; e < 840; e++) { - w[0] = h + e * m; - p(w, 0, y, 0); - S = o.getRgb(y, 0); - const t = e - x; - O = Math.min(O, (S[0] - C[0] + 1) / t); - T = Math.min(T, (S[1] - C[1] + 1) / t); - M = Math.min(M, (S[2] - C[2] + 1) / t); - E = Math.max(E, (S[0] - C[0] - 1) / t); - D = Math.max(D, (S[1] - C[1] - 1) / t); - N = Math.max(N, (S[2] - C[2] - 1) / t); - if (!(E <= O && D <= T && N <= M)) { - const e = r.Util.makeHexColor(F[0], F[1], F[2]); - b.push([v / 840, e]); - O = S[0] - F[0] + 1; - T = S[1] - F[1] + 1; - M = S[2] - F[2] + 1; - E = S[0] - F[0] - 1; - D = S[1] - F[1] - 1; - N = S[2] - F[2] - 1; - x = v; - C = F; - } - v = e; - F = S; - } - const R = r.Util.makeHexColor(F[0], F[1], F[2]); - b.push([1, R]); - let L = 'transparent'; - if (e.has('Background')) { - S = o.getRgb(e.get('Background'), 0); - L = r.Util.makeHexColor(S[0], S[1], S[2]); - } - if (!d) { - b.unshift([0, L]); - b[1][0] += BaseShading.SMALL_NUMBER; - } - if (!f) { - b.at(-1)[0] -= BaseShading.SMALL_NUMBER; - b.push([1, L]); - } - this.colorStops = b; - } - getIR() { - const e = this.coordsArr, - t = this.shadingType; - let a, i, n, s, l; - if (t === o) { - i = [e[0], e[1]]; - n = [e[2], e[3]]; - s = null; - l = null; - a = 'axial'; - } else if (t === c) { - i = [e[0], e[1]]; - n = [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, i, n, 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.pos < this.stream.end; - if (this.bufferLength > 0) 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) - 1); - return ((t << (8 - a)) | ((255 & e) >> a)) >>> 0; - } - if (8 === e && 0 === a) return this.stream.getByte(); - for (; a < e; ) { - t = (t << 8) | this.stream.getByte(); - a += 8; - } - a -= e; - this.bufferLength = a; - this.buffer = t & ((1 << a) - 1); - return t >> 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, - i = e < 32 ? 1 / ((1 << e) - 1) : 2.3283064365386963e-10; - return [t * i * (r[1] - r[0]) + r[0], a * i * (r[3] - r[2]) + r[2]]; - } - readComponents() { - const e = this.context.numComps, - t = this.context.bitsPerComponent, - a = t < 32 ? 1 / ((1 << t) - 1) : 2.3283064365386963e-10, - r = this.context.decode, - i = this.tmpCompsBuf; - for (let n = 0, s = 4; n < e; n++, s += 2) { - const e = this.readBits(t); - i[n] = e * a * (r[s + 1] - r[s]) + r[s]; - } - const n = this.tmpCsCompsBuf; - this.context.colorFn && this.context.colorFn(i, 0, n, 0); - return this.context.colorSpace.getRgb(n, 0); - } - } - const f = (function getBClosure() { - const e = Object.create(null); - return function (t) { - return (e[t] ||= (function buildB(e) { - const t = []; - for (let a = 0; a <= e; a++) { - const r = a / e, - i = 1 - r; - t.push(new Float32Array([i * i * i, 3 * r * i * i, 3 * r * r * i, r * r * r])); - } - return t; - })(t)); - }; - })(); - class MeshShading extends BaseShading { - static MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - static MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - static TRIANGLE_DENSITY = 20; - constructor(e, t, a, s, o) { - super(); - if (!(e instanceof i.BaseStream)) - throw new r.FormatError('Mesh data is not a stream'); - const c = e.dict; - this.shadingType = c.get('ShadingType'); - const f = c.getArray('BBox'); - Array.isArray(f) && 4 === f.length - ? (this.bbox = r.Util.normalizeRect(f)) - : (this.bbox = null); - const g = n.ColorSpace.parse({ - cs: c.getRaw('CS') || c.getRaw('ColorSpace'), - xref: t, - resources: a, - pdfFunctionFactory: s, - localColorSpaceCache: o, - }); - this.background = c.has('Background') ? g.getRgb(c.get('Background'), 0) : null; - const p = c.getRaw('Function'), - m = p ? s.createFromArray(p) : null; - this.coords = []; - this.colors = []; - this.figures = []; - const b = { - bitsPerCoordinate: c.get('BitsPerCoordinate'), - bitsPerComponent: c.get('BitsPerComponent'), - bitsPerFlag: c.get('BitsPerFlag'), - decode: c.getArray('Decode'), - colorFn: m, - colorSpace: g, - numComps: m ? 1 : g.numComps, - }, - y = new MeshStreamReader(e, b); - let w = !1; - switch (this.shadingType) { - case l: - this._decodeType4Shading(y); - break; - case h: - const e = 0 | c.get('VerticesPerRow'); - if (e < 2) throw new r.FormatError('Invalid VerticesPerRow'); - this._decodeType5Shading(y, e); - break; - case u: - this._decodeType6Shading(y); - w = !0; - break; - case d: - this._decodeType7Shading(y); - w = !0; - break; - default: - (0, r.unreachable)('Unsupported mesh type.'); - } - if (w) { - this._updateBounds(); - for (let e = 0, t = this.figures.length; e < t; e++) this._buildFigureFromPatch(e); - } - this._updateBounds(); - this._packData(); - } - _decodeType4Shading(e) { - const t = this.coords, - a = this.colors, - i = [], - n = []; - let s = 0; - for (; e.hasData; ) { - const o = e.readFlag(), - c = e.readCoordinate(), - l = e.readComponents(); - if (0 === s) { - if (!(0 <= o && o <= 2)) throw new r.FormatError('Unknown type4 flag'); - switch (o) { - case 0: - s = 3; - break; - case 1: - n.push(n.at(-2), n.at(-1)); - s = 1; - break; - case 2: - n.push(n.at(-3), n.at(-1)); - s = 1; - } - i.push(o); - } - n.push(t.length); - t.push(c); - a.push(l); - s--; - e.align(); - } - this.figures.push({ - type: 'triangles', - coords: new Int32Array(n), - colors: new Int32Array(n), - }); - } - _decodeType5Shading(e, t) { - const a = this.coords, - r = this.colors, - i = []; - for (; e.hasData; ) { - const t = e.readCoordinate(), - n = e.readComponents(); - i.push(a.length); - a.push(t); - r.push(n); - } - this.figures.push({ - type: 'lattice', - coords: new Int32Array(i), - colors: new Int32Array(i), - verticesPerRow: t, - }); - } - _decodeType6Shading(e) { - const t = this.coords, - a = this.colors, - i = new Int32Array(16), - n = new Int32Array(4); - for (; e.hasData; ) { - const s = e.readFlag(); - if (!(0 <= s && s <= 3)) throw new r.FormatError('Unknown type6 flag'); - const o = t.length; - for (let a = 0, r = 0 !== s ? 8 : 12; a < r; a++) t.push(e.readCoordinate()); - const c = a.length; - for (let t = 0, r = 0 !== s ? 2 : 4; t < r; t++) a.push(e.readComponents()); - let l, h, u, d; - switch (s) { - case 0: - i[12] = o + 3; - i[13] = o + 4; - i[14] = o + 5; - i[15] = o + 6; - i[8] = o + 2; - i[11] = o + 7; - i[4] = o + 1; - i[7] = o + 8; - i[0] = o; - i[1] = o + 11; - i[2] = o + 10; - i[3] = o + 9; - n[2] = c + 1; - n[3] = c + 2; - n[0] = c; - n[1] = c + 3; - break; - case 1: - l = i[12]; - h = i[13]; - u = i[14]; - d = i[15]; - i[12] = d; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = u; - i[11] = o + 3; - i[4] = h; - i[7] = o + 4; - i[0] = l; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - l = n[2]; - h = n[3]; - n[2] = h; - n[3] = c; - n[0] = l; - n[1] = c + 1; - break; - case 2: - l = i[15]; - h = i[11]; - i[12] = i[3]; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = i[7]; - i[11] = o + 3; - i[4] = h; - i[7] = o + 4; - i[0] = l; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - l = n[3]; - n[2] = n[1]; - n[3] = c; - n[0] = l; - n[1] = c + 1; - break; - case 3: - i[12] = i[0]; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = i[1]; - i[11] = o + 3; - i[4] = i[2]; - i[7] = o + 4; - i[0] = i[3]; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - n[2] = n[0]; - n[3] = c; - n[0] = n[1]; - n[1] = c + 1; - } - i[5] = t.length; - t.push([ - (-4 * t[i[0]][0] - - t[i[15]][0] + - 6 * (t[i[4]][0] + t[i[1]][0]) - - 2 * (t[i[12]][0] + t[i[3]][0]) + - 3 * (t[i[13]][0] + t[i[7]][0])) / - 9, - (-4 * t[i[0]][1] - - t[i[15]][1] + - 6 * (t[i[4]][1] + t[i[1]][1]) - - 2 * (t[i[12]][1] + t[i[3]][1]) + - 3 * (t[i[13]][1] + t[i[7]][1])) / - 9, - ]); - i[6] = t.length; - t.push([ - (-4 * t[i[3]][0] - - t[i[12]][0] + - 6 * (t[i[2]][0] + t[i[7]][0]) - - 2 * (t[i[0]][0] + t[i[15]][0]) + - 3 * (t[i[4]][0] + t[i[14]][0])) / - 9, - (-4 * t[i[3]][1] - - t[i[12]][1] + - 6 * (t[i[2]][1] + t[i[7]][1]) - - 2 * (t[i[0]][1] + t[i[15]][1]) + - 3 * (t[i[4]][1] + t[i[14]][1])) / - 9, - ]); - i[9] = t.length; - t.push([ - (-4 * t[i[12]][0] - - t[i[3]][0] + - 6 * (t[i[8]][0] + t[i[13]][0]) - - 2 * (t[i[0]][0] + t[i[15]][0]) + - 3 * (t[i[11]][0] + t[i[1]][0])) / - 9, - (-4 * t[i[12]][1] - - t[i[3]][1] + - 6 * (t[i[8]][1] + t[i[13]][1]) - - 2 * (t[i[0]][1] + t[i[15]][1]) + - 3 * (t[i[11]][1] + t[i[1]][1])) / - 9, - ]); - i[10] = t.length; - t.push([ - (-4 * t[i[15]][0] - - t[i[0]][0] + - 6 * (t[i[11]][0] + t[i[14]][0]) - - 2 * (t[i[12]][0] + t[i[3]][0]) + - 3 * (t[i[2]][0] + t[i[8]][0])) / - 9, - (-4 * t[i[15]][1] - - t[i[0]][1] + - 6 * (t[i[11]][1] + t[i[14]][1]) - - 2 * (t[i[12]][1] + t[i[3]][1]) + - 3 * (t[i[2]][1] + t[i[8]][1])) / - 9, - ]); - this.figures.push({ - type: 'patch', - coords: new Int32Array(i), - colors: new Int32Array(n), - }); - } - } - _decodeType7Shading(e) { - const t = this.coords, - a = this.colors, - i = new Int32Array(16), - n = new Int32Array(4); - for (; e.hasData; ) { - const s = e.readFlag(); - if (!(0 <= s && s <= 3)) throw new r.FormatError('Unknown type7 flag'); - const o = t.length; - for (let a = 0, r = 0 !== s ? 12 : 16; a < r; a++) t.push(e.readCoordinate()); - const c = a.length; - for (let t = 0, r = 0 !== s ? 2 : 4; t < r; t++) a.push(e.readComponents()); - let l, h, u, d; - switch (s) { - case 0: - i[12] = o + 3; - i[13] = o + 4; - i[14] = o + 5; - i[15] = o + 6; - i[8] = o + 2; - i[9] = o + 13; - i[10] = o + 14; - i[11] = o + 7; - i[4] = o + 1; - i[5] = o + 12; - i[6] = o + 15; - i[7] = o + 8; - i[0] = o; - i[1] = o + 11; - i[2] = o + 10; - i[3] = o + 9; - n[2] = c + 1; - n[3] = c + 2; - n[0] = c; - n[1] = c + 3; - break; - case 1: - l = i[12]; - h = i[13]; - u = i[14]; - d = i[15]; - i[12] = d; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = u; - i[9] = o + 9; - i[10] = o + 10; - i[11] = o + 3; - i[4] = h; - i[5] = o + 8; - i[6] = o + 11; - i[7] = o + 4; - i[0] = l; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - l = n[2]; - h = n[3]; - n[2] = h; - n[3] = c; - n[0] = l; - n[1] = c + 1; - break; - case 2: - l = i[15]; - h = i[11]; - i[12] = i[3]; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = i[7]; - i[9] = o + 9; - i[10] = o + 10; - i[11] = o + 3; - i[4] = h; - i[5] = o + 8; - i[6] = o + 11; - i[7] = o + 4; - i[0] = l; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - l = n[3]; - n[2] = n[1]; - n[3] = c; - n[0] = l; - n[1] = c + 1; - break; - case 3: - i[12] = i[0]; - i[13] = o + 0; - i[14] = o + 1; - i[15] = o + 2; - i[8] = i[1]; - i[9] = o + 9; - i[10] = o + 10; - i[11] = o + 3; - i[4] = i[2]; - i[5] = o + 8; - i[6] = o + 11; - i[7] = o + 4; - i[0] = i[3]; - i[1] = o + 7; - i[2] = o + 6; - i[3] = o + 5; - n[2] = n[0]; - n[3] = c; - n[0] = n[1]; - n[1] = c + 1; - } - this.figures.push({ - type: 'patch', - coords: new Int32Array(i), - colors: new Int32Array(n), - }); - } - } - _buildFigureFromPatch(e) { - const t = this.figures[e]; - (0, r.assert)('patch' === t.type, 'Unexpected patch mesh figure'); - const a = this.coords, - i = this.colors, - n = t.coords, - s = t.colors, - o = Math.min(a[n[0]][0], a[n[3]][0], a[n[12]][0], a[n[15]][0]), - c = Math.min(a[n[0]][1], a[n[3]][1], a[n[12]][1], a[n[15]][1]), - l = Math.max(a[n[0]][0], a[n[3]][0], a[n[12]][0], a[n[15]][0]), - h = Math.max(a[n[0]][1], a[n[3]][1], a[n[12]][1], a[n[15]][1]); - let u = Math.ceil( - ((l - o) * MeshShading.TRIANGLE_DENSITY) / (this.bounds[2] - this.bounds[0]), - ); - u = Math.max( - MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, u), - ); - let d = Math.ceil( - ((h - c) * MeshShading.TRIANGLE_DENSITY) / (this.bounds[3] - this.bounds[1]), - ); - d = Math.max( - MeshShading.MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MeshShading.MAX_SPLIT_PATCH_CHUNKS_AMOUNT, d), - ); - const g = u + 1, - p = new Int32Array((d + 1) * g), - m = new Int32Array((d + 1) * g); - let b = 0; - const y = new Uint8Array(3), - w = new Uint8Array(3), - S = i[s[0]], - x = i[s[1]], - C = i[s[2]], - k = i[s[3]], - v = f(d), - F = f(u); - for (let e = 0; e <= d; e++) { - y[0] = ((S[0] * (d - e) + C[0] * e) / d) | 0; - y[1] = ((S[1] * (d - e) + C[1] * e) / d) | 0; - y[2] = ((S[2] * (d - e) + C[2] * e) / d) | 0; - w[0] = ((x[0] * (d - e) + k[0] * e) / d) | 0; - w[1] = ((x[1] * (d - e) + k[1] * e) / d) | 0; - w[2] = ((x[2] * (d - e) + k[2] * e) / d) | 0; - for (let t = 0; t <= u; t++, b++) { - if (!((0 !== e && e !== d) || (0 !== t && t !== u))) continue; - let r = 0, - s = 0, - o = 0; - for (let i = 0; i <= 3; i++) - for (let c = 0; c <= 3; c++, o++) { - const l = v[e][i] * F[t][c]; - r += a[n[o]][0] * l; - s += a[n[o]][1] * l; - } - p[b] = a.length; - a.push([r, s]); - m[b] = i.length; - const c = new Uint8Array(3); - c[0] = ((y[0] * (u - t) + w[0] * t) / u) | 0; - c[1] = ((y[1] * (u - t) + w[1] * t) / u) | 0; - c[2] = ((y[2] * (u - t) + w[2] * t) / u) | 0; - i.push(c); - } - } - p[0] = n[0]; - m[0] = s[0]; - p[u] = n[3]; - m[u] = s[1]; - p[g * d] = n[12]; - m[g * d] = s[2]; - p[g * d + u] = n[15]; - m[g * d + u] = s[3]; - this.figures[e] = { type: 'lattice', coords: p, colors: m, verticesPerRow: g }; - } - _updateBounds() { - let e = this.coords[0][0], - t = this.coords[0][1], - a = e, - r = t; - for (let i = 1, n = this.coords.length; i < n; i++) { - const n = this.coords[i][0], - s = this.coords[i][1]; - e = e > n ? n : e; - t = t > s ? s : t; - a = a < n ? n : a; - r = r < s ? s : r; - } - this.bounds = [e, t, a, r]; - } - _packData() { - let e, t, a, r; - const i = this.coords, - n = new Float32Array(2 * i.length); - for (e = 0, a = 0, t = i.length; e < t; e++) { - const t = i[e]; - n[a++] = t[0]; - n[a++] = t[1]; - } - this.coords = n; - const s = this.colors, - o = new Uint8Array(3 * s.length); - for (e = 0, a = 0, t = s.length; e < t; e++) { - const t = s[e]; - o[a++] = t[0]; - o[a++] = t[1]; - o[a++] = t[2]; - } - this.colors = o; - const c = this.figures; - for (e = 0, t = c.length; e < t; e++) { - const t = c[e], - i = t.coords, - n = t.colors; - for (a = 0, r = i.length; a < r; a++) { - i[a] *= 2; - n[a] *= 3; - } - } - } - getIR() { - return [ - 'Mesh', - this.shadingType, - this.coords, - this.colors, - this.figures, - this.bounds, - this.bbox, - this.background, - ]; - } - } - class DummyShading extends BaseShading { - getIR() { - return ['Dummy']; - } - } - }, - (e, t, 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: i } = t; - let n; - n = i ? a.map((e, t) => e * i[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(n[t]); - o += 1; - } else { - o = e; - s = [n[t]]; - c.push(e, s); - } - return c; - })(e), - a = new i.Dict(null); - a.set('BaseFont', i.Name.get(e)); - a.set('Type', i.Name.get('Font')); - a.set('Subtype', i.Name.get('CIDFontType2')); - a.set('Encoding', i.Name.get('Identity-H')); - a.set('CIDToGIDMap', i.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 i.Dict(null); - a.set('FontDescriptor', r); - const n = new i.Dict(null); - n.set('Ordering', 'Identity'); - n.set('Registry', 'Adobe'); - n.set('Supplement', 0); - a.set('CIDSystemInfo', n); - return a; - }; - t.getXfaFontName = getXfaFontName; - var r = a(52), - i = a(4), - n = a(53), - s = a(54), - o = a(55), - c = a(56), - l = a(3), - 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: n.HelveticaRegularFactors, - baseWidths: s.LiberationSansRegularWidths, - baseMapping: s.LiberationSansRegularMapping, - metrics: n.HelveticaRegularMetrics, - }; - e['Helvetica-Bold'] = { - name: 'LiberationSans-Bold', - factors: n.HelveticaBoldFactors, - baseWidths: s.LiberationSansBoldWidths, - baseMapping: s.LiberationSansBoldMapping, - metrics: n.HelveticaBoldMetrics, - }; - e['Helvetica-Italic'] = { - name: 'LiberationSans-Italic', - factors: n.HelveticaItalicFactors, - baseWidths: s.LiberationSansItalicWidths, - baseMapping: s.LiberationSansItalicMapping, - metrics: n.HelveticaItalicMetrics, - }; - e['Helvetica-BoldItalic'] = { - name: 'LiberationSans-BoldItalic', - factors: n.HelveticaBoldItalicFactors, - baseWidths: s.LiberationSansBoldItalicWidths, - baseMapping: s.LiberationSansBoldItalicMapping, - metrics: n.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, 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, - ]; - t.CalibriBoldMetrics = { lineHeight: 1.2207, lineGap: 0.2207 }; - t.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, - ]; - t.CalibriBoldItalicMetrics = { lineHeight: 1.2207, lineGap: 0.2207 }; - t.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, - ]; - t.CalibriItalicMetrics = { lineHeight: 1.2207, lineGap: 0.2207 }; - t.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, - ]; - t.CalibriRegularMetrics = { lineHeight: 1.2207, lineGap: 0.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 = [ - 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, - ]; - t.HelveticaBoldMetrics = { lineHeight: 1.2, lineGap: 0.2 }; - t.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, - ]; - t.HelveticaBoldItalicMetrics = { lineHeight: 1.35, lineGap: 0.2 }; - t.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, - ]; - t.HelveticaItalicMetrics = { lineHeight: 1.35, lineGap: 0.2 }; - t.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, - ]; - t.HelveticaRegularMetrics = { lineHeight: 1.2, lineGap: 0.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, 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, - ]; - t.MyriadProBoldMetrics = { lineHeight: 1.2, lineGap: 0.2 }; - t.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, - ]; - t.MyriadProBoldItalicMetrics = { lineHeight: 1.2, lineGap: 0.2 }; - t.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, - ]; - t.MyriadProItalicMetrics = { lineHeight: 1.2, lineGap: 0.2 }; - t.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, - ]; - t.MyriadProRegularMetrics = { lineHeight: 1.2, lineGap: 0.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, 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, - ]; - t.SegoeuiBoldMetrics = { lineHeight: 1.33008, lineGap: 0 }; - t.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, - ]; - t.SegoeuiBoldItalicMetrics = { lineHeight: 1.33008, lineGap: 0 }; - t.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, - ]; - t.SegoeuiItalicMetrics = { lineHeight: 1.33008, lineGap: 0 }; - t.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, - ]; - 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 (e instanceof r.Dict) t = e; - else { - if (!(e instanceof s.BaseStream)) return !1; - t = e.dict; - } - return t.has('FunctionType'); - }; - var r = a(4), - i = a(2), - n = a(58), - s = a(5), - 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, i.shadow)(this, '_localFunctionCache', new o.LocalFunctionCache()); - } - }; - function toNumberArray(e) { - if (!Array.isArray(e)) return null; - const t = e.length; - for (let a = 0; a < t; a++) - if ('number' != typeof e[a]) { - const a = new Array(t); - for (let r = 0; r < t; r++) a[r] = +e[r]; - return a; - } - return e; - } - class PDFFunction { - static getSampleArray(e, t, a, r) { - let i, - n, - s = 1; - for (i = 0, n = e.length; i < n; i++) s *= e[i]; - s *= t; - const o = new Array(s); - let c = 0, - l = 0; - const h = 1 / (2 ** a - 1), - u = r.getBytes((s * a + 7) / 8); - let d = 0; - for (i = 0; i < s; i++) { - for (; c < a; ) { - l <<= 8; - l |= u[d++]; - c += 8; - } - c -= a; - o[i] = (l >> c) * h; - l &= (1 << c) - 1; - } - return o; - } - static parse({ xref: e, isEvalSupported: t, fn: a }) { - const r = a.dict || a; - switch (r.get('FunctionType')) { - case 0: - return this.constructSampled({ xref: e, isEvalSupported: t, fn: a, dict: r }); - case 1: - break; - case 2: - return this.constructInterpolated({ xref: e, isEvalSupported: t, dict: r }); - case 3: - return this.constructStiched({ xref: e, isEvalSupported: t, dict: r }); - case 4: - return this.constructPostScript({ xref: e, isEvalSupported: t, fn: a, dict: r }); - } - throw new i.FormatError('Unknown type of function'); - } - static parseArray({ xref: e, isEvalSupported: t, fnObj: a }) { - if (!Array.isArray(a)) return this.parse({ xref: e, isEvalSupported: t, fn: a }); - const r = []; - for (const i of a) - r.push(this.parse({ xref: e, isEvalSupported: t, fn: e.fetchIfRef(i) })); - return function (e, t, a, i) { - for (let n = 0, s = r.length; n < s; n++) r[n](e, t, a, i + n); - }; - } - static constructSampled({ xref: e, isEvalSupported: t, fn: a, dict: r }) { - function toMultiArray(e) { - const t = e.length, - a = []; - let r = 0; - for (let i = 0; i < t; i += 2) a[r++] = [e[i], e[i + 1]]; - return a; - } - function interpolate(e, t, a, r, i) { - return r + ((i - r) / (a - t)) * (e - t); - } - let n = toNumberArray(r.getArray('Domain')), - s = toNumberArray(r.getArray('Range')); - if (!n || !s) throw new i.FormatError('No domain or range'); - const o = n.length / 2, - c = s.length / 2; - n = toMultiArray(n); - s = toMultiArray(s); - const l = toNumberArray(r.getArray('Size')), - h = r.get('BitsPerSample'), - u = r.get('Order') || 1; - 1 !== u && (0, i.info)('No support for cubic spline interpolation: ' + u); - let d = toNumberArray(r.getArray('Encode')); - if (d) d = toMultiArray(d); - else { - d = []; - for (let e = 0; e < o; ++e) d.push([0, l[e] - 1]); - } - let f = toNumberArray(r.getArray('Decode')); - f = f ? toMultiArray(f) : s; - const g = this.getSampleArray(l, c, h, a); - return function constructSampledFn(e, t, a, r) { - const i = 1 << o, - h = new Float64Array(i), - u = new Uint32Array(i); - let p, m; - for (m = 0; m < i; m++) h[m] = 1; - let b = c, - y = 1; - for (p = 0; p < o; ++p) { - const a = n[p][0], - r = n[p][1]; - let s = interpolate(Math.min(Math.max(e[t + p], a), r), a, r, d[p][0], d[p][1]); - const o = l[p]; - s = Math.min(Math.max(s, 0), o - 1); - const c = s < o - 1 ? Math.floor(s) : s - 1, - f = c + 1 - s, - g = s - c, - w = c * b, - S = w + b; - for (m = 0; m < i; m++) - if (m & y) { - h[m] *= g; - u[m] += S; - } else { - h[m] *= f; - u[m] += w; - } - b *= o; - y <<= 1; - } - for (m = 0; m < c; ++m) { - let e = 0; - for (p = 0; p < i; p++) e += g[u[p] + m] * h[p]; - e = interpolate(e, 0, 1, f[m][0], f[m][1]); - a[r + m] = Math.min(Math.max(e, s[m][0]), s[m][1]); - } - }; - } - static constructInterpolated({ xref: e, isEvalSupported: t, dict: a }) { - const r = toNumberArray(a.getArray('C0')) || [0], - i = toNumberArray(a.getArray('C1')) || [1], - n = a.get('N'), - s = []; - for (let e = 0, t = r.length; e < t; ++e) s.push(i[e] - r[e]); - const o = s.length; - return function constructInterpolatedFn(e, t, a, i) { - const c = 1 === n ? e[t] : e[t] ** n; - for (let e = 0; e < o; ++e) a[i + e] = r[e] + c * s[e]; - }; - } - static constructStiched({ xref: e, isEvalSupported: t, dict: a }) { - const r = toNumberArray(a.getArray('Domain')); - if (!r) throw new i.FormatError('No domain'); - if (1 !== r.length / 2) throw new i.FormatError('Bad domain for stiched function'); - const n = []; - for (const r of a.get('Functions')) - n.push(this.parse({ xref: e, isEvalSupported: t, fn: e.fetchIfRef(r) })); - const s = toNumberArray(a.getArray('Bounds')), - o = toNumberArray(a.getArray('Encode')), - c = new Float32Array(1); - return function constructStichedFn(e, t, a, i) { - const l = (function constructStichedFromIRClip(e, t, a) { - e > a ? (e = a) : e < t && (e = t); - return e; - })(e[t], r[0], r[1]), - h = s.length; - let u; - for (u = 0; u < h && !(l < s[u]); ++u); - let d = r[0]; - u > 0 && (d = s[u - 1]); - let f = r[1]; - u < s.length && (f = s[u]); - const g = o[2 * u], - p = o[2 * u + 1]; - c[0] = d === f ? g : g + ((l - d) * (p - g)) / (f - d); - n[u](c, 0, a, i); - }; - } - static constructPostScript({ xref: e, isEvalSupported: t, fn: a, dict: r }) { - const s = toNumberArray(r.getArray('Domain')), - o = toNumberArray(r.getArray('Range')); - if (!s) throw new i.FormatError('No domain.'); - if (!o) throw new i.FormatError('No range.'); - const c = new n.PostScriptLexer(a), - l = new n.PostScriptParser(c).parse(); - if (t && i.FeatureTest.isEvalSupported) { - const e = new PostScriptCompiler().compile(l, s, o); - if (e) return new Function('src', 'srcOffset', 'dest', 'destOffset', e); - } - (0, i.info)('Unable to compile PS function'); - const h = o.length >> 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 i, - n, - s = ''; - const c = p; - for (i = 0; i < u; i++) { - n = e[t + i]; - c[i] = n; - s += n + '_'; - } - const l = f[s]; - if (void 0 !== l) { - a.set(l, r); - return; - } - const m = new Float32Array(h), - b = d.execute(c), - y = b.length - h; - for (i = 0; i < h; i++) { - n = b[y + i]; - let e = o[2 * i]; - if (n < e) n = e; - else { - e = o[2 * i + 1]; - n > e && (n = e); - } - m[i] = n; - } - if (g > 0) { - g--; - f[s] = m; - } - a.set(m, r); - }; - } - } - class PostScriptStack { - static MAX_STACK_SIZE = 100; - constructor(e) { - this.stack = e ? Array.from(e) : []; - } - 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, - i = a.length - 1, - n = r + (t - Math.floor(t / e) * e); - for (let e = r, t = i; e < t; e++, t--) { - const r = a[e]; - a[e] = a[t]; - a[t] = r; - } - for (let e = r, t = n - 1; e < t; e++, t--) { - const r = a[e]; - a[e] = a[t]; - a[t] = r; - } - for (let e = n, t = i; e < t; e++, t--) { - const r = a[e]; - a[e] = a[t]; - a[t] = r; - } - } - } - class PostScriptEvaluator { - constructor(e) { - this.operators = e; - } - execute(e) { - const t = new PostScriptStack(e); - let a = 0; - const r = this.operators, - n = r.length; - let s, o, c; - for (; a < n; ) { - s = r[a++]; - if ('number' != typeof s) - switch (s) { - case 'jz': - c = t.pop(); - o = t.pop(); - o || (a = c); - break; - case 'j': - o = t.pop(); - a = o; - break; - case 'abs': - o = t.pop(); - t.push(Math.abs(o)); - break; - case 'add': - c = t.pop(); - o = t.pop(); - t.push(o + c); - break; - case 'and': - c = t.pop(); - o = t.pop(); - 'boolean' == typeof o && 'boolean' == typeof c - ? t.push(o && c) - : t.push(o & c); - break; - case 'atan': - c = t.pop(); - o = t.pop(); - o = (Math.atan2(o, c) / Math.PI) * 180; - o < 0 && (o += 360); - t.push(o); - break; - case 'bitshift': - c = t.pop(); - o = t.pop(); - o > 0 ? t.push(o << c) : 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 % 360) / 180) * Math.PI)); - 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 < c); - break; - case 'mod': - c = t.pop(); - o = t.pop(); - t.push(o % c); - break; - case 'mul': - c = t.pop(); - o = t.pop(); - t.push(o * c); - break; - case 'ne': - c = t.pop(); - o = t.pop(); - t.push(o !== c); - break; - case 'neg': - o = t.pop(); - t.push(-o); - break; - case 'not': - o = t.pop(); - 'boolean' == typeof o ? t.push(!o) : t.push(~o); - break; - case 'or': - c = t.pop(); - o = t.pop(); - 'boolean' == typeof o && 'boolean' == typeof c - ? t.push(o || c) - : t.push(o | c); - break; - case 'pop': - t.pop(); - break; - case 'roll': - c = t.pop(); - o = t.pop(); - t.roll(o, c); - break; - case 'round': - o = t.pop(); - t.push(Math.round(o)); - break; - case 'sin': - o = t.pop(); - t.push(Math.sin(((o % 360) / 180) * Math.PI)); - break; - case 'sqrt': - o = t.pop(); - t.push(Math.sqrt(o)); - break; - case 'sub': - c = t.pop(); - o = t.pop(); - t.push(o - c); - break; - case 'true': - t.push(!0); - break; - case 'truncate': - o = t.pop(); - o = o < 0 ? Math.ceil(o) : Math.floor(o); - t.push(o); - break; - case 'xor': - c = t.pop(); - o = t.pop(); - 'boolean' == typeof o && 'boolean' == typeof c - ? t.push(o !== c) - : t.push(o ^ c); - break; - default: - throw new i.FormatError(`Unknown operator ${s}`); - } - else t.push(s); - } - return t.stack; - } - } - t.PostScriptEvaluator = PostScriptEvaluator; - class AstNode { - constructor(e) { - this.type = e; - } - visit(e) { - (0, i.unreachable)('abstract method'); - } - } - class AstArgument extends AstNode { - constructor(e, t, a) { - super('args'); - this.index = e; - this.min = t; - this.max = a; - } - visit(e) { - e.visitArgument(this); - } - } - class AstLiteral extends AstNode { - constructor(e) { - super('literal'); - this.number = e; - this.min = e; - this.max = e; - } - visit(e) { - e.visitLiteral(this); - } - } - class AstBinaryOperation extends AstNode { - constructor(e, t, a, r, i) { - super('binary'); - this.op = e; - this.arg1 = t; - this.arg2 = a; - this.min = r; - this.max = i; - } - visit(e) { - e.visitBinaryOperation(this); - } - } - class AstMin extends AstNode { - constructor(e, t) { - super('max'); - this.arg = e; - this.min = e.min; - this.max = t; - } - visit(e) { - e.visitMin(this); - } - } - class AstVariable extends AstNode { - constructor(e, t, a) { - super('var'); - this.index = e; - this.min = t; - this.max = a; - } - visit(e) { - e.visitVariable(this); - } - } - class AstVariableDefinition extends AstNode { - constructor(e, t) { - super('definition'); - this.variable = e; - this.arg = t; - } - visit(e) { - e.visitVariableDefinition(this); - } - } - class ExpressionBuilderVisitor { - constructor() { - this.parts = []; - } - visitArgument(e) { - this.parts.push( - 'Math.max(', - e.min, - ', Math.min(', - e.max, - ', src[srcOffset + ', - e.index, - ']))', - ); - } - visitVariable(e) { - this.parts.push('v', e.index); - } - visitLiteral(e) { - this.parts.push(e.number); - } - visitBinaryOperation(e) { - this.parts.push('('); - e.arg1.visit(this); - this.parts.push(' ', e.op, ' '); - e.arg2.visit(this); - this.parts.push(')'); - } - visitVariableDefinition(e) { - this.parts.push('var '); - e.variable.visit(this); - this.parts.push(' = '); - e.arg.visit(this); - this.parts.push(';'); - } - visitMin(e) { - this.parts.push('Math.min('); - e.arg.visit(this); - this.parts.push(', ', e.max, ')'); - } - toString() { - return this.parts.join(''); - } - } - function buildAddOperation(e, t) { - return 'literal' === t.type && 0 === t.number - ? e - : 'literal' === e.type && 0 === e.number - ? t - : 'literal' === t.type && 'literal' === e.type - ? new AstLiteral(e.number + t.number) - : new AstBinaryOperation('+', e, t, e.min + t.min, e.max + t.max); - } - function buildMulOperation(e, t) { - if ('literal' === t.type) { - if (0 === t.number) return new AstLiteral(0); - if (1 === t.number) return e; - if ('literal' === e.type) return new AstLiteral(e.number * t.number); - } - if ('literal' === e.type) { - if (0 === e.number) return new AstLiteral(0); - if (1 === e.number) return t; - } - const a = Math.min(e.min * t.min, e.min * t.max, e.max * t.min, e.max * t.max), - r = Math.max(e.min * t.min, e.min * t.max, e.max * t.min, e.max * t.max); - return new AstBinaryOperation('*', e, t, a, r); - } - function buildSubOperation(e, t) { - if ('literal' === t.type) { - if (0 === t.number) return e; - if ('literal' === e.type) return new AstLiteral(e.number - t.number); - } - return 'binary' === t.type && - '-' === t.op && - 'literal' === e.type && - 1 === e.number && - 'literal' === t.arg1.type && - 1 === t.arg1.number - ? t.arg2 - : new AstBinaryOperation('-', e, t, e.min - t.max, e.max - t.min); - } - function buildMinOperation(e, t) { - return e.min >= t ? new AstLiteral(t) : e.max <= t ? e : new AstMin(e, t); - } - class PostScriptCompiler { - compile(e, t, a) { - const r = [], - i = [], - n = t.length >> 1, - s = a.length >> 1; - let o, - c, - l, - h, - u, - d, - f, - g, - p = 0; - for (let e = 0; e < n; e++) r.push(new AstArgument(e, t[2 * e], t[2 * e + 1])); - for (let t = 0, a = e.length; t < a; t++) { - g = e[t]; - if ('number' != typeof g) - switch (g) { - case 'add': - if (r.length < 2) return null; - h = r.pop(); - l = r.pop(); - r.push(buildAddOperation(l, h)); - break; - case 'cvr': - if (r.length < 1) return null; - break; - case 'mul': - if (r.length < 2) return null; - h = r.pop(); - l = r.pop(); - r.push(buildMulOperation(l, h)); - break; - case 'sub': - if (r.length < 2) return null; - h = r.pop(); - l = r.pop(); - r.push(buildSubOperation(l, h)); - break; - case 'exch': - if (r.length < 2) return null; - u = r.pop(); - d = r.pop(); - r.push(u, d); - break; - case 'pop': - if (r.length < 1) return null; - r.pop(); - break; - case 'index': - if (r.length < 1) return null; - l = r.pop(); - if ('literal' !== l.type) return null; - o = l.number; - if (o < 0 || !Number.isInteger(o) || r.length < o) return null; - u = r[r.length - o - 1]; - if ('literal' === u.type || 'var' === u.type) { - r.push(u); - break; - } - f = new AstVariable(p++, u.min, u.max); - r[r.length - o - 1] = f; - r.push(f); - i.push(new AstVariableDefinition(f, u)); - break; - case 'dup': - if (r.length < 1) return null; - if ( - 'number' == typeof e[t + 1] && - 'gt' === e[t + 2] && - e[t + 3] === t + 7 && - 'jz' === e[t + 4] && - 'pop' === e[t + 5] && - e[t + 6] === e[t + 1] - ) { - l = r.pop(); - r.push(buildMinOperation(l, e[t + 1])); - t += 6; - break; - } - u = r.at(-1); - if ('literal' === u.type || 'var' === u.type) { - r.push(u); - break; - } - f = new AstVariable(p++, u.min, u.max); - r[r.length - 1] = f; - r.push(f); - i.push(new AstVariableDefinition(f, u)); - break; - case 'roll': - if (r.length < 2) return null; - h = r.pop(); - l = r.pop(); - if ('literal' !== h.type || 'literal' !== l.type) return null; - c = h.number; - o = l.number; - if (o <= 0 || !Number.isInteger(o) || !Number.isInteger(c) || r.length < o) - return null; - c = ((c % o) + o) % o; - if (0 === c) break; - r.push(...r.splice(r.length - o, o - c)); - break; - default: - return null; - } - else r.push(new AstLiteral(g)); - } - if (r.length !== s) return null; - const m = []; - for (const e of i) { - const t = new ExpressionBuilderVisitor(); - e.visit(t); - m.push(t.toString()); - } - for (let e = 0, t = r.length; e < t; e++) { - const t = r[e], - i = new ExpressionBuilderVisitor(); - t.visit(i); - const n = a[2 * e], - s = a[2 * e + 1], - o = [i.toString()]; - if (n > t.min) { - o.unshift('Math.max(', n, ', '); - o.push(')'); - } - if (s < t.max) { - o.unshift('Math.min(', s, ', '); - o.push(')'); - } - o.unshift('dest[destOffset + ', e, '] = '); - o.push(';'); - m.push(o.join('')); - } - return m.join('\n'); - } - } - t.PostScriptCompiler = PostScriptCompiler; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.PostScriptParser = t.PostScriptLexer = void 0; - var r = a(2), - i = a(4), - n = a(3); - 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) { - return (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 i.EOF; - if (e) (10 !== t && 13 !== t) || (e = !1); - else if (37 === t) e = !0; - else if (!(0, n.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.RegionalImageCache = - t.LocalTilingPatternCache = - t.LocalImageCache = - t.LocalGStateCache = - t.LocalFunctionCache = - t.LocalColorSpaceCache = - t.GlobalImageCache = - void 0; - var r = a(2), - i = a(4); - 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 i.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); - } - }; - t.RegionalImageCache = class RegionalImageCache extends BaseLocalCache { - constructor(e) { - super({ onlyRefs: !0 }); - } - set(e = null, t, a) { - if (!t) throw new Error('RegionalImageCache.set - expected "ref" argument.'); - this._imageCache.has(t) || this._imageCache.put(t, a); - } - }; - class GlobalImageCache { - static NUM_PAGES_THRESHOLD = 2; - static MIN_IMAGES_TO_CACHE = 10; - static MAX_BYTE_SIZE = 5 * r.MAX_IMAGE_SIZE_TO_CACHE; - constructor() { - this._refCache = new i.RefSetCache(); - this._imageCache = new i.RefSetCache(); - } - get _byteSize() { - let e = 0; - for (const t of this._imageCache) e += t.byteSize; - return e; - } - get _cacheLimitReached() { - return ( - !(this._imageCache.size < GlobalImageCache.MIN_IMAGES_TO_CACHE) && - !(this._byteSize < GlobalImageCache.MAX_BYTE_SIZE) - ); - } - shouldCache(e, t) { - let a = this._refCache.get(e); - if (!a) { - a = new Set(); - this._refCache.put(e, a); - } - a.add(t); - return ( - !(a.size < GlobalImageCache.NUM_PAGES_THRESHOLD) && - !(!this._imageCache.has(e) && this._cacheLimitReached) - ); - } - addByteSize(e, t) { - const a = this._imageCache.get(e); - a && (a.byteSize || (a.byteSize = t)); - } - getData(e, t) { - const a = this._refCache.get(e); - if (!a) return null; - if (a.size < GlobalImageCache.NUM_PAGES_THRESHOLD) return null; - const r = this._imageCache.get(e); - if (!r) return null; - a.add(t); - return r; - } - setData(e, t) { - if (!this._refCache.has(e)) - throw new Error( - 'GlobalImageCache.setData - expected "shouldCache" to have been called.', - ); - this._imageCache.has(e) || - (this._cacheLimitReached - ? (0, r.warn)('GlobalImageCache.setData - cache limit reached.') - : this._imageCache.put(e, t)); - } - clear(e = !1) { - e || this._refCache.clear(); - this._imageCache.clear(); - } - } - t.GlobalImageCache = GlobalImageCache; - }, - (e, t, a) => { - 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; h < l; ++h) { - s[h] = e.charAt(h); - const t = e.charCodeAt(h); - let a = 'L'; - if (t <= 255) a = i[t]; - else if (1424 <= t && t <= 1524) a = 'R'; - else if (1536 <= t && t <= 1791) { - a = n[255 & t]; - a || (0, r.warn)('Bidi: invalid Unicode character ' + t.toString(16)); - } else - ((1792 <= t && t <= 2220) || - (64336 <= t && t <= 65023) || - (65136 <= t && t <= 65279)) && - (a = 'AL'); - ('R' !== a && 'AL' !== a && 'AN' !== a) || d++; - o[h] = a; - } - if (0 === d) { - c = !0; - return createBidiText(e, c); - } - if (-1 === t) - if (d / l < 0.3 && l > 4) { - c = !0; - t = 0; - } else { - c = !1; - t = 1; - } - const f = []; - for (h = 0; h < l; ++h) f[h] = t; - const g = isOdd(t) ? 'R' : 'L', - p = g, - m = p; - let b, - y = p; - for (h = 0; h < l; ++h) 'NSM' === o[h] ? (o[h] = y) : (y = o[h]); - y = p; - for (h = 0; h < l; ++h) { - b = o[h]; - 'EN' === b - ? (o[h] = 'AL' === y ? 'AN' : 'EN') - : ('R' !== b && 'L' !== b && 'AL' !== b) || (y = b); - } - for (h = 0; h < l; ++h) { - b = o[h]; - 'AL' === b && (o[h] = 'R'); - } - for (h = 1; h < l - 1; ++h) { - 'ES' === o[h] && 'EN' === o[h - 1] && 'EN' === o[h + 1] && (o[h] = 'EN'); - 'CS' !== o[h] || - ('EN' !== o[h - 1] && 'AN' !== o[h - 1]) || - o[h + 1] !== o[h - 1] || - (o[h] = o[h - 1]); - } - for (h = 0; h < l; ++h) - if ('EN' === o[h]) { - for (let e = h - 1; e >= 0 && 'ET' === o[e]; --e) o[e] = 'EN'; - for (let e = h + 1; e < l && 'ET' === o[e]; ++e) o[e] = 'EN'; - } - for (h = 0; h < l; ++h) { - b = o[h]; - ('WS' !== b && 'ES' !== b && 'ET' !== b && 'CS' !== b) || (o[h] = 'ON'); - } - y = p; - for (h = 0; h < l; ++h) { - b = o[h]; - 'EN' === b ? (o[h] = 'L' === y ? 'L' : 'EN') : ('R' !== b && 'L' !== b) || (y = b); - } - for (h = 0; h < l; ++h) - if ('ON' === o[h]) { - const e = findUnequal(o, h + 1, 'ON'); - let t = p; - h > 0 && (t = o[h - 1]); - let a = m; - e + 1 < l && (a = o[e + 1]); - 'L' !== t && (t = 'R'); - 'L' !== a && (a = 'R'); - t === a && setValues(o, h, e, t); - h = e - 1; - } - for (h = 0; h < l; ++h) 'ON' === o[h] && (o[h] = g); - for (h = 0; h < l; ++h) { - b = o[h]; - isEven(f[h]) - ? 'R' === b - ? (f[h] += 1) - : ('AN' !== b && 'EN' !== b) || (f[h] += 2) - : ('L' !== b && 'AN' !== b && 'EN' !== b) || (f[h] += 1); - } - let w, - S = -1, - x = 99; - for (h = 0, u = f.length; h < u; ++h) { - w = f[h]; - S < w && (S = w); - x > w && isOdd(w) && (x = w); - } - for (w = S; w >= x; --w) { - let e = -1; - for (h = 0, u = f.length; h < u; ++h) - if (f[h] < w) { - if (e >= 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 < u; ++h) { - const e = s[h]; - ('<' !== e && '>' !== e) || (s[h] = ''); - } - return createBidiText(s.join(''), c); - }; - var r = a(2); - const i = [ - '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', - ], - n = [ - '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, i; - for (r = t, i = e.length; r < i; ++r) if (e[r] !== a) return r; - return r; - } - function setValues(e, t, a, r) { - for (let i = t; i < a; ++i) e[i] = r; - } - function reverseValues(e, t, a) { - for (let r = t, i = a - 1; r < i; ++r, --i) { - const t = e[r]; - e[r] = e[i]; - e[i] = t; - } - } - function createBidiText(e, t, a = !1) { - let r = 'ltr'; - a ? (r = 'ttb') : t || (r = 'rtl'); - return { str: e, dir: r }; - } - const s = [], - o = []; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.ImageResizer = void 0; - var r = a(2); - class ImageResizer { - constructor(e, t) { - this._imgData = e; - this._isMask = t; - } - static needsToBeResized(e, t) { - if (e <= this._goodSquareLength && t <= this._goodSquareLength) return !1; - const { MAX_DIM: a } = this; - if (e > a || t > a) return !0; - const r = e * t; - if (this._hasMaxArea) return r > this.MAX_AREA; - if (r < this._goodSquareLength ** 2) return !1; - if (this._areGoodDims(e, t)) { - this._goodSquareLength = Math.max( - this._goodSquareLength, - Math.floor(Math.sqrt(e * t)), - ); - return !1; - } - this._goodSquareLength = this._guessMax(this._goodSquareLength, a, 128, 0); - return r > (this.MAX_AREA = this._goodSquareLength ** 2); - } - static get MAX_DIM() { - return (0, r.shadow)(this, 'MAX_DIM', this._guessMax(2048, 65537, 0, 1)); - } - static get MAX_AREA() { - this._hasMaxArea = !0; - return (0, r.shadow)( - this, - 'MAX_AREA', - this._guessMax(ImageResizer._goodSquareLength, this.MAX_DIM, 128, 0) ** 2, - ); - } - static set MAX_AREA(e) { - if (e >= 0) { - this._hasMaxArea = !0; - (0, r.shadow)(this, 'MAX_AREA', e); - } - } - static setMaxArea(e) { - this._hasMaxArea || (this.MAX_AREA = e >> 2); - } - static _areGoodDims(e, t) { - try { - const a = new OffscreenCanvas(e, t), - r = a.getContext('2d'); - r.fillRect(0, 0, 1, 1); - const i = r.getImageData(0, 0, 1, 1).data[3]; - a.width = a.height = 1; - return 0 !== i; - } catch (e) { - return !1; - } - } - static _guessMax(e, t, a, r) { - for (; e + a + 1 < t; ) { - const a = Math.floor((e + t) / 2), - i = r || a; - this._areGoodDims(a, i) ? (e = a) : (t = a); - } - return e; - } - static async createImage(e, t = !1) { - return new ImageResizer(e, t)._createImage(); - } - async _createImage() { - const e = this._encodeBMP(), - t = new Blob([e.buffer], { type: 'image/bmp' }), - a = createImageBitmap(t), - { MAX_AREA: r, MAX_DIM: i } = ImageResizer, - { _imgData: n } = this, - { width: s, height: o } = n, - c = Math.max(s / i, o / i, Math.sqrt((s * o) / r)), - l = Math.max(c, 2), - h = Math.round(10 * (c + 1.25)) / 10 / l, - u = Math.floor(Math.log2(h)), - d = new Array(u + 2).fill(2); - d[0] = l; - d.splice(-1, 1, h / (1 << u)); - let f = s, - g = o, - p = await a; - for (const e of d) { - const t = f, - a = g; - f = Math.floor(f / e) - 1; - g = Math.floor(g / e) - 1; - const r = new OffscreenCanvas(f, g); - r.getContext('2d').drawImage(p, 0, 0, t, a, 0, 0, f, g); - p = r.transferToImageBitmap(); - } - n.data = null; - n.bitmap = p; - n.width = f; - n.height = g; - return n; - } - _encodeBMP() { - const { width: e, height: t, kind: a } = this._imgData; - let i, - n = this._imgData.data, - s = new Uint8Array(0), - o = s, - c = 0; - switch (a) { - case r.ImageKind.GRAYSCALE_1BPP: { - i = 1; - s = new Uint8Array( - this._isMask - ? [255, 255, 255, 255, 0, 0, 0, 0] - : [0, 0, 0, 0, 255, 255, 255, 255], - ); - const a = (e + 7) >> 3, - r = (a + 3) & -4; - if (a !== r) { - const e = new Uint8Array(r * t); - let i = 0; - for (let s = 0, o = t * a; s < o; s += a, i += r) - e.set(n.subarray(s, s + a), i); - n = e; - } - break; - } - case r.ImageKind.RGB_24BPP: - i = 24; - if (3 & e) { - const a = 3 * e, - r = (a + 3) & -4, - i = r - a, - s = new Uint8Array(r * t); - let o = 0; - for (let e = 0, r = t * a; e < r; e += a) { - const t = n.subarray(e, e + a); - for (let e = 0; e < a; e += 3) { - s[o++] = t[e + 2]; - s[o++] = t[e + 1]; - s[o++] = t[e]; - } - o += i; - } - n = s; - } else - for (let e = 0, t = n.length; e < t; e += 3) { - const t = n[e]; - n[e] = n[e + 2]; - n[e + 2] = t; - } - break; - case r.ImageKind.RGBA_32BPP: - i = 32; - c = 3; - o = new Uint8Array(68); - const a = new DataView(o.buffer); - if (r.FeatureTest.isLittleEndian) { - a.setUint32(0, 255, !0); - a.setUint32(4, 65280, !0); - a.setUint32(8, 16711680, !0); - a.setUint32(12, 4278190080, !0); - } else { - a.setUint32(0, 4278190080, !0); - a.setUint32(4, 16711680, !0); - a.setUint32(8, 65280, !0); - a.setUint32(12, 255, !0); - } - break; - default: - throw new Error('invalid format'); - } - let l = 0; - const h = 40 + o.length, - u = 14 + h + s.length + n.length, - d = new Uint8Array(u), - f = new DataView(d.buffer); - f.setUint16(l, 19778, !0); - l += 2; - f.setUint32(l, u, !0); - l += 4; - f.setUint32(l, 0, !0); - l += 4; - f.setUint32(l, 14 + h + s.length, !0); - l += 4; - f.setUint32(l, h, !0); - l += 4; - f.setInt32(l, e, !0); - l += 4; - f.setInt32(l, -t, !0); - l += 4; - f.setUint16(l, 1, !0); - l += 2; - f.setUint16(l, i, !0); - l += 2; - f.setUint32(l, c, !0); - l += 4; - f.setUint32(l, 0, !0); - l += 4; - f.setInt32(l, 0, !0); - l += 4; - f.setInt32(l, 0, !0); - l += 4; - f.setUint32(l, s.length / 4, !0); - l += 4; - f.setUint32(l, 0, !0); - l += 4; - d.set(o, l); - l += o.length; - d.set(s, l); - l += s.length; - d.set(n, l); - return d; - } - } - t.ImageResizer = ImageResizer; - ImageResizer._goodSquareLength = 2048; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.MurmurHash3_64 = void 0; - var r = a(2); - const i = 3285377520, - n = 4294901760, - s = 65535; - t.MurmurHash3_64 = class MurmurHash3_64 { - constructor(e) { - this.h1 = e ? 4294967295 & e : i; - this.h2 = e ? 4294967295 & e : i; - } - update(e) { - let t, a; - if ('string' == typeof e) { - t = new Uint8Array(2 * e.length); - a = 0; - for (let r = 0, i = e.length; r < i; r++) { - const i = e.charCodeAt(r); - if (i <= 255) t[a++] = i; - else { - t[a++] = i >>> 8; - t[a++] = 255 & i; - } - } - } 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 i = a >> 2, - o = a - 4 * i, - c = new Uint32Array(t.buffer, 0, i); - 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 < i; e++) - if (1 & e) { - l = c[e]; - l = ((l * f) & n) | ((l * p) & s); - l = (l << 15) | (l >>> 17); - l = ((l * g) & n) | ((l * m) & s); - u ^= l; - u = (u << 13) | (u >>> 19); - u = 5 * u + 3864292196; - } else { - h = c[e]; - h = ((h * f) & n) | ((h * p) & s); - h = (h << 15) | (h >>> 17); - h = ((h * g) & n) | ((h * m) & s); - d ^= h; - d = (d << 13) | (d >>> 19); - d = 5 * d + 3864292196; - } - l = 0; - switch (o) { - case 3: - l ^= t[4 * i + 2] << 16; - case 2: - l ^= t[4 * i + 1] << 8; - case 1: - l ^= t[4 * i]; - l = ((l * f) & n) | ((l * p) & s); - l = (l << 15) | (l >>> 17); - l = ((l * g) & n) | ((l * m) & s); - 1 & i ? (u ^= l) : (d ^= l); - } - this.h1 = u; - this.h2 = d; - } - hexdigest() { - let e = this.h1, - t = this.h2; - e ^= t >>> 1; - e = ((3981806797 * e) & n) | ((36045 * e) & s); - t = ((4283543511 * t) & n) | (((2950163797 * ((t << 16) | (e >>> 16))) & n) >>> 16); - e ^= t >>> 1; - e = ((444984403 * e) & n) | ((60499 * e) & s); - t = ((3301882366 * t) & n) | (((3120437893 * ((t << 16) | (e >>> 16))) & n) >>> 16); - e ^= t >>> 1; - return ( - (e >>> 0).toString(16).padStart(8, '0') + (t >>> 0).toString(16).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, i) { - let n = e; - for (let e = 0, a = t.length - 1; e < a; e++) { - const a = t[e]; - n = n[a] ||= []; - } - n[t.at(-1)] = { checkFn: a, iterateFn: r, processFn: i }; - } - const i = []; - addState( - i, - [r.OPS.save, r.OPS.transform, r.OPS.paintInlineImageXObject, r.OPS.restore], - null, - function iterateInlineImageGroup(e, t) { - const a = e.fnArray, - i = (t - (e.iCurr - 3)) % 4; - switch (i) { - case 0: - return a[t] === r.OPS.save; - case 1: - return a[t] === r.OPS.transform; - case 2: - return a[t] === r.OPS.paintInlineImageXObject; - case 3: - return a[t] === r.OPS.restore; - } - throw new Error(`iterateInlineImageGroup - invalid pos: ${i}`); - }, - function foundInlineImageGroup(e, t) { - const a = e.fnArray, - i = e.argsArray, - n = e.iCurr, - s = n - 3, - o = n - 2, - c = n - 1, - l = Math.min(Math.floor((t - s) / 4), 200); - if (l < 10) return t - ((t - s) % 4); - let h = 0; - const u = []; - let d = 0, - f = 1, - g = 1; - for (let e = 0; e < l; e++) { - const t = i[o + (e << 2)], - a = i[c + (e << 2)][0]; - if (f + a.width > 1e3) { - 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 < l; e++) { - const t = i[c + (e << 2)][0].data, - a = u[e].w << 2; - let r = 0, - n = (u[e].x + u[e].y * p) << 2; - b.set(t.subarray(0, a), n - y); - for (let i = 0, s = u[e].h; i < s; i++) { - b.set(t.subarray(r, r + a), n); - r += a; - n += y; - } - b.set(t.subarray(r - a, r), n); - for (; n >= 0; ) { - t[n - 4] = t[n]; - t[n - 3] = t[n + 1]; - t[n - 2] = t[n + 2]; - t[n - 1] = t[n + 3]; - t[n + a] = t[n + a - 4]; - t[n + a + 1] = t[n + a - 3]; - t[n + a + 2] = t[n + a - 2]; - t[n + a + 3] = t[n + a - 1]; - n -= y; - } - } - const w = { width: p, height: m }; - if (e.isOffscreenCanvasSupported) { - const e = new OffscreenCanvas(p, m); - e.getContext('2d').putImageData( - new ImageData(new Uint8ClampedArray(b.buffer), p, m), - 0, - 0, - ); - w.bitmap = e.transferToImageBitmap(); - w.data = null; - } else { - w.kind = r.ImageKind.RGBA_32BPP; - w.data = b; - } - a.splice(s, 4 * l, r.OPS.paintInlineImageXObjectGroup); - i.splice(s, 4 * l, [w, u]); - return s + 1; - }, - ); - addState( - i, - [r.OPS.save, r.OPS.transform, r.OPS.paintImageMaskXObject, r.OPS.restore], - null, - function iterateImageMaskGroup(e, t) { - const a = e.fnArray, - i = (t - (e.iCurr - 3)) % 4; - switch (i) { - 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: ${i}`); - }, - function foundImageMaskGroup(e, t) { - const a = e.fnArray, - i = e.argsArray, - n = e.iCurr, - s = n - 3, - o = n - 2, - c = n - 1; - let l = Math.floor((t - s) / 4); - if (l < 10) return t - ((t - s) % 4); - let h, - u, - d = !1; - const f = i[c][0], - g = i[o][0], - p = i[o][1], - m = i[o][2], - b = i[o][3]; - if (p === m) { - d = !0; - h = o + 4; - let e = c + 4; - for (let t = 1; t < l; t++, h += 4, e += 4) { - u = i[h]; - if (i[e][0] !== f || u[0] !== g || u[1] !== p || u[2] !== m || u[3] !== b) { - t < 10 ? (d = !1) : (l = t); - break; - } - } - } - if (d) { - l = Math.min(l, 1e3); - const e = new Float32Array(2 * l); - h = o; - for (let t = 0; t < l; t++, h += 4) { - u = i[h]; - e[t << 1] = u[4]; - e[1 + (t << 1)] = u[5]; - } - a.splice(s, 4 * l, r.OPS.paintImageMaskXObjectRepeat); - i.splice(s, 4 * l, [f, g, p, m, b, e]); - } else { - l = Math.min(l, 100); - const e = []; - for (let t = 0; t < l; t++) { - u = i[o + (t << 2)]; - const a = i[c + (t << 2)][0]; - e.push({ - data: a.data, - width: a.width, - height: a.height, - interpolate: a.interpolate, - count: a.count, - transform: u, - }); - } - a.splice(s, 4 * l, r.OPS.paintImageMaskXObjectGroup); - i.splice(s, 4 * l, [e]); - } - return s + 1; - }, - ); - addState( - i, - [r.OPS.save, r.OPS.transform, r.OPS.paintImageXObject, r.OPS.restore], - function (e) { - const t = e.argsArray, - a = e.iCurr - 2; - return 0 === t[a][1] && 0 === t[a][2]; - }, - function iterateImageGroup(e, t) { - const a = e.fnArray, - i = e.argsArray, - n = (t - (e.iCurr - 3)) % 4; - switch (n) { - case 0: - return a[t] === r.OPS.save; - case 1: - if (a[t] !== r.OPS.transform) return !1; - const n = e.iCurr - 2, - s = i[n][0], - o = i[n][3]; - return i[t][0] === s && 0 === i[t][1] && 0 === i[t][2] && i[t][3] === o; - case 2: - if (a[t] !== r.OPS.paintImageXObject) return !1; - const c = i[e.iCurr - 1][0]; - return i[t][0] === c; - case 3: - return a[t] === r.OPS.restore; - } - throw new Error(`iterateImageGroup - invalid pos: ${n}`); - }, - function (e, t) { - const a = e.fnArray, - i = e.argsArray, - n = e.iCurr, - s = n - 3, - o = n - 2, - c = i[n - 1][0], - l = i[o][0], - h = i[o][3], - u = Math.min(Math.floor((t - s) / 4), 1e3); - if (u < 3) return t - ((t - s) % 4); - const d = new Float32Array(2 * u); - let f = o; - for (let e = 0; e < u; e++, f += 4) { - const t = i[f]; - d[e << 1] = t[4]; - d[1 + (e << 1)] = t[5]; - } - const g = [c, l, h, d]; - a.splice(s, 4 * u, r.OPS.paintImageXObjectRepeat); - i.splice(s, 4 * u, g); - return s + 1; - }, - ); - addState( - i, - [r.OPS.beginText, r.OPS.setFont, r.OPS.setTextMatrix, r.OPS.showText, r.OPS.endText], - null, - function iterateShowTextGroup(e, t) { - const a = e.fnArray, - i = e.argsArray, - n = (t - (e.iCurr - 4)) % 5; - switch (n) { - case 0: - return a[t] === r.OPS.beginText; - case 1: - return a[t] === r.OPS.setFont; - case 2: - return a[t] === r.OPS.setTextMatrix; - case 3: - if (a[t] !== r.OPS.showText) return !1; - const n = e.iCurr - 3, - s = i[n][0], - o = i[n][1]; - return i[t][0] === s && i[t][1] === o; - case 4: - return a[t] === r.OPS.endText; - } - throw new Error(`iterateShowTextGroup - invalid pos: ${n}`); - }, - function (e, t) { - const a = e.fnArray, - r = e.argsArray, - i = e.iCurr, - n = i - 4, - s = i - 3, - o = i - 2, - c = i - 1, - l = i, - h = r[s][0], - u = r[s][1]; - let d = Math.min(Math.floor((t - n) / 5), 1e3); - if (d < 3) return t - ((t - n) % 5); - let f = n; - if ( - n >= 4 && - a[n - 4] === a[s] && - a[n - 3] === a[o] && - a[n - 2] === a[c] && - a[n - 1] === a[l] && - r[n - 4][0] === h && - r[n - 4][1] === u - ) { - d++; - f -= 5; - } - let g = f + 4; - for (let e = 1; e < d; e++) { - a.splice(g, 3); - r.splice(g, 3); - g += 2; - } - return g + 1; - }, - ); - class NullOptimizer { - constructor(e) { - this.queue = e; - } - _optimize() {} - push(e, t) { - this.queue.fnArray.push(e); - this.queue.argsArray.push(t); - this._optimize(); - } - flush() {} - reset() {} - } - class QueueOptimizer extends NullOptimizer { - constructor(e) { - super(e); - this.state = null; - this.context = { - iCurr: 0, - fnArray: e.fnArray, - argsArray: e.argsArray, - isOffscreenCanvasSupported: !1, - }; - this.match = null; - this.lastProcessed = 0; - } - set isOffscreenCanvasSupported(e) { - this.context.isOffscreenCanvasSupported = e; - } - _optimize() { - const e = this.queue.fnArray; - let t = this.lastProcessed, - a = e.length, - r = this.state, - n = this.match; - if (!r && !n && t + 1 === a && !i[e[t]]) { - this.lastProcessed = a; - return; - } - const s = this.context; - for (; t < a; ) { - if (n) { - if ((0, n.iterateFn)(s, t)) { - t++; - continue; - } - t = (0, n.processFn)(s, t + 1); - a = e.length; - n = null; - r = null; - if (t >= a) break; - } - r = (r || i)[e[t]]; - if (r && !Array.isArray(r)) { - s.iCurr = t; - t++; - if (!r.checkFn || (0, r.checkFn)(s)) { - n = r; - r = null; - } else r = null; - } else t++; - } - this.state = r; - this.match = n; - 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 CHUNK_SIZE = 1e3; - static 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(); - } - set isOffscreenCanvasSupported(e) { - this.optimizer.isOffscreenCanvasSupported = e; - } - 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 < a; t++) this.addOp(e.fnArray[t], e.argsArray[t]); - } else (0, r.warn)('addOpList - ignoring invalid "opList" parameter.'); - } - getIR() { - return { fnArray: this.fnArray, argsArray: this.argsArray, length: this.length }; - } - get _transfers() { - const e = [], - { fnArray: t, argsArray: a, length: i } = this; - for (let n = 0; n < i; n++) - switch (t[n]) { - case r.OPS.paintInlineImageXObject: - case r.OPS.paintInlineImageXObjectGroup: - case r.OPS.paintImageMaskXObject: - const t = a[n][0]; - !t.cached && - t.data && - t.data.buffer instanceof ArrayBuffer && - e.push(t.data.buffer); - } - return e; - } - flush(e = !1, t = null) { - this.optimizer.flush(); - const a = this.length; - this._totalLength += a; - this._streamSink.enqueue( - { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: e, - separateAnnots: t, - length: a, - }, - 1, - this._transfers, - ); - this.dependencies.clear(); - this.fnArray.length = 0; - this.argsArray.length = 0; - this.weight = 0; - this.optimizer.reset(); - } - } - t.OperatorList = OperatorList; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.PDFImage = void 0; - var r = a(2), - i = a(28), - n = a(5), - s = a(12), - o = a(18), - c = a(61), - l = a(26), - h = a(30), - u = a(4); - 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, i, n) { - const s = i * n; - let o; - o = t <= 8 ? new Uint8Array(s) : t <= 16 ? new Uint16Array(s) : new Uint32Array(s); - const c = a / i, - l = r / n; - let h, - u, - d, - f, - g = 0; - const p = new Uint16Array(i), - m = a; - for (h = 0; h < i; h++) p[h] = Math.floor(h * c); - for (h = 0; h < n; h++) { - d = Math.floor(h * l) * m; - for (u = 0; u < i; u++) { - f = d + p[u]; - o[g++] = e[f]; - } - } - return o; - } - class PDFImage { - constructor({ - xref: e, - res: t, - image: a, - isInline: i = !1, - smask: o = null, - mask: c = null, - isMask: l = !1, - pdfFunctionFactory: d, - localColorSpaceCache: f, - }) { - this.image = a; - const g = a.dict, - p = g.get('F', 'Filter'); - let m; - if (p instanceof u.Name) m = p.name; - else if (Array.isArray(p)) { - const t = e.fetchIfRef(p[0]); - t instanceof u.Name && (m = t.name); - } - switch (m) { - case 'JPXDecode': - const e = new h.JpxImage(); - e.parseImageProperties(a.stream); - a.stream.reset(); - a.width = e.width; - a.height = e.height; - a.bitsPerComponent = e.bitsPerComponent; - a.numComps = e.componentsCount; - break; - case 'JBIG2Decode': - a.bitsPerComponent = 1; - a.numComps = 1; - } - let b = g.get('W', 'Width'), - y = g.get('H', 'Height'); - if ( - Number.isInteger(a.width) && - a.width > 0 && - 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 n = g.getRaw('CS') || g.getRaw('ColorSpace'); - if (!n) { - (0, r.info)('JPX images (which do not require color spaces)'); - switch (a.numComps) { - case 1: - n = u.Name.get('DeviceGray'); - break; - case 3: - n = u.Name.get('DeviceRGB'); - break; - case 4: - n = u.Name.get('DeviceCMYK'); - break; - default: - throw new Error( - `JPX images with ${a.numComps} color components not supported.`, - ); - } - } - this.colorSpace = s.ColorSpace.parse({ - cs: n, - xref: e, - resources: i ? 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)) || - (l && !s.ColorSpace.isDefaultDecode(this.decode, 1))) - ) { - this.needsDecode = !0; - const e = (1 << w) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - const t = this.colorSpace && 'Indexed' === this.colorSpace.name; - for (let a = 0, r = 0; a < this.decode.length; a += 2, ++r) { - const i = this.decode[a], - n = this.decode[a + 1]; - this.decodeCoefficients[r] = t ? (n - i) / e : n - i; - this.decodeAddends[r] = t ? i : e * i; - } - } - if (o) - this.smask = new PDFImage({ - xref: e, - res: t, - image: o, - isInline: i, - pdfFunctionFactory: d, - localColorSpaceCache: f, - }); - else if (c) - if (c instanceof n.BaseStream) { - c.dict.get('IM', 'ImageMask') - ? (this.mask = new PDFImage({ - xref: e, - res: t, - image: c, - isInline: i, - isMask: !0, - pdfFunctionFactory: d, - localColorSpaceCache: f, - })) - : (0, r.warn)('Ignoring /Mask in image without /ImageMask.'); - } else this.mask = c; - } - static async buildImage({ - xref: e, - res: t, - image: a, - isInline: i = !1, - pdfFunctionFactory: s, - localColorSpaceCache: o, - }) { - const c = a; - let l = null, - h = null; - const u = a.dict.get('SMask'), - d = a.dict.get('Mask'); - u - ? u instanceof n.BaseStream - ? (l = u) - : (0, r.warn)('Unsupported /SMask format.') - : d && - (d instanceof n.BaseStream || Array.isArray(d) - ? (h = d) - : (0, r.warn)('Unsupported /Mask format.')); - return new PDFImage({ - xref: e, - res: t, - image: c, - isInline: i, - smask: l, - mask: h, - pdfFunctionFactory: s, - localColorSpaceCache: o, - }); - } - static createRawMask({ - imgArray: e, - width: t, - height: a, - imageIsFromDecodeStream: r, - inverseDecode: i, - interpolate: n, - }) { - const s = ((t + 7) >> 3) * a, - o = e.byteLength; - let c, l; - if (!r || (i && !(s === o))) - if (i) { - c = new Uint8Array(s); - c.set(e); - c.fill(255, o); - } else c = new Uint8Array(e); - else c = e; - if (i) for (l = 0; l < o; l++) c[l] ^= 255; - return { data: c, width: t, height: a, interpolate: n }; - } - static async createMask({ - imgArray: e, - width: t, - height: a, - imageIsFromDecodeStream: n, - inverseDecode: s, - interpolate: o, - isOffscreenCanvasSupported: l = !1, - }) { - const h = 1 === t && 1 === a && s === (0 === e.length || !!(128 & e[0])); - if (h) return { isSingleOpaquePixel: h }; - if (l) { - if (c.ImageResizer.needsToBeResized(t, a)) { - const n = new Uint8ClampedArray(t * a * 4); - (0, i.convertBlackAndWhiteToRGBA)({ - src: e, - dest: n, - width: t, - height: a, - nonBlackColor: 0, - inverseDecode: s, - }); - return c.ImageResizer.createImage({ - kind: r.ImageKind.RGBA_32BPP, - data: n, - width: t, - height: a, - interpolate: o, - }); - } - const n = new OffscreenCanvas(t, a), - l = n.getContext('2d'), - h = l.createImageData(t, a); - (0, i.convertBlackAndWhiteToRGBA)({ - src: e, - dest: h.data, - width: t, - height: a, - nonBlackColor: 0, - inverseDecode: s, - }); - l.putImageData(h, 0, 0); - return { - data: null, - width: t, - height: a, - interpolate: o, - bitmap: n.transferToImageBitmap(), - }; - } - return this.createRawMask({ - imgArray: e, - width: t, - height: a, - inverseDecode: s, - imageIsFromDecodeStream: n, - interpolate: o, - }); - } - get drawWidth() { - return Math.max( - this.width, - (this.smask && this.smask.width) || 0, - (this.mask && this.mask.width) || 0, - ); - } - get drawHeight() { - return Math.max( - this.height, - (this.smask && this.smask.height) || 0, - (this.mask && this.mask.height) || 0, - ); - } - decodeBuffer(e) { - const t = this.bpc, - a = this.numComps, - r = this.decodeAddends, - i = this.decodeCoefficients, - n = (1 << t) - 1; - let s, o; - if (1 === t) { - for (s = 0, o = e.length; s < o; s++) e[s] = +!e[s]; - return; - } - let c = 0; - for (s = 0, o = this.width * this.height; s < o; s++) - for (let t = 0; t < a; t++) { - e[c] = decodeAndClamp(e[c], r[t], i[t], n); - c++; - } - } - getComponents(e) { - const t = this.bpc; - if (8 === t) return e; - const a = this.width, - r = this.height, - i = this.numComps, - n = a * r * i; - let s, - o = 0; - s = t <= 8 ? new Uint8Array(n) : t <= 16 ? new Uint16Array(n) : new Uint32Array(n); - const c = a * i, - l = (1 << t) - 1; - let h, - u, - d = 0; - if (1 === t) { - let t, a, i; - for (let n = 0; n < r; n++) { - a = d + (-8 & c); - i = d + c; - for (; d < a; ) { - u = e[o++]; - s[d] = (u >> 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 < i) { - u = e[o++]; - t = 128; - for (; d < i; ) { - s[d++] = +!!(u & t); - t >>= 1; - } - } - } - } else { - let a = 0; - u = 0; - for (d = 0, h = n; d < h; ++d) { - if (d % c == 0) { - u = 0; - a = 0; - } - for (; a < t; ) { - u = (u << 8) | e[o++]; - a += 8; - } - const r = a - t; - let i = u >> r; - i < 0 ? (i = 0) : i > l && (i = l); - s[d] = i; - u &= (1 << r) - 1; - a = r; - } - } - return s; - } - fillOpacity(e, t, a, i, n) { - const s = this.smask, - o = this.mask; - let c, l, h, u, d, f; - if (s) { - l = s.width; - h = s.height; - c = new Uint8ClampedArray(l * h); - s.fillGrayBuffer(c); - (l === t && h === a) || (c = resizeImageMask(c, s.bpc, l, h, t, a)); - } else if (o) - if (o instanceof PDFImage) { - l = o.width; - h = o.height; - c = new Uint8ClampedArray(l * h); - o.numComps = 1; - o.fillGrayBuffer(c); - for (u = 0, d = l * h; u < d; ++u) c[u] = 255 - c[u]; - (l === t && h === a) || (c = resizeImageMask(c, o.bpc, l, h, t, a)); - } else { - if (!Array.isArray(o)) throw new r.FormatError('Unknown mask format.'); - { - c = new Uint8ClampedArray(t * a); - const e = this.numComps; - for (u = 0, d = t * a; u < d; ++u) { - let t = 0; - const a = u * e; - for (f = 0; f < e; ++f) { - const e = n[a + f], - r = 2 * f; - if (e < o[r] || e > o[r + 1]) { - t = 255; - break; - } - } - c[u] = t; - } - } - } - if (c) for (u = 0, f = 3, d = t * i; u < d; ++u, f += 4) e[f] = c[u]; - else for (u = 0, f = 3, d = t * i; u < d; ++u, f += 4) e[f] = 255; - } - undoPreblend(e, t, a) { - const r = this.smask && this.smask.matte; - if (!r) return; - const i = this.colorSpace.getRgb(r, 0), - n = i[0], - s = i[1], - o = i[2], - c = t * a * 4; - for (let t = 0; t < c; t += 4) { - const a = e[t + 3]; - if (0 === a) { - e[t] = 255; - e[t + 1] = 255; - e[t + 2] = 255; - continue; - } - const r = 255 / a; - e[t] = (e[t] - n) * r + n; - e[t + 1] = (e[t + 1] - s) * r + s; - e[t + 2] = (e[t + 2] - o) * r + o; - } - } - async createImageData(e = !1, t = !1) { - const a = this.drawWidth, - i = this.drawHeight, - n = { width: a, height: i, interpolate: this.interpolate, kind: 0, data: null }, - s = this.numComps, - o = this.width, - h = this.height, - u = this.bpc, - d = (o * s * u + 7) >> 3, - f = t && c.ImageResizer.needsToBeResized(a, i); - if (!e) { - let e; - 'DeviceGray' === this.colorSpace.name && 1 === u - ? (e = r.ImageKind.GRAYSCALE_1BPP) - : 'DeviceRGB' !== this.colorSpace.name || - 8 !== u || - this.needsDecode || - (e = r.ImageKind.RGB_24BPP); - if (e && !this.smask && !this.mask && a === o && i === h) { - const s = this.getImageBytes(h * d, {}); - if (t) - return f - ? c.ImageResizer.createImage( - { data: s, kind: e, width: a, height: i, interpolate: this.interpolate }, - this.needsDecode, - ) - : this.createBitmap(e, o, h, s); - n.kind = e; - n.data = s; - 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 < a; e++) t[e] ^= 255; - } - return n; - } - if ( - this.image instanceof l.JpegStream && - !this.smask && - !this.mask && - !this.needsDecode - ) { - let e = h * d; - if (t && !f) { - let t = !1; - switch (this.colorSpace.name) { - case 'DeviceGray': - e *= 4; - t = !0; - break; - case 'DeviceRGB': - e = (e / 3) * 4; - t = !0; - break; - case 'DeviceCMYK': - t = !0; - } - if (t) { - const t = this.getImageBytes(e, { - drawWidth: a, - drawHeight: i, - forceRGBA: !0, - }); - return this.createBitmap(r.ImageKind.RGBA_32BPP, a, i, t); - } - } else - switch (this.colorSpace.name) { - case 'DeviceGray': - e *= 3; - case 'DeviceRGB': - case 'DeviceCMYK': - n.kind = r.ImageKind.RGB_24BPP; - n.data = this.getImageBytes(e, { - drawWidth: a, - drawHeight: i, - forceRGB: !0, - }); - return f ? c.ImageResizer.createImage(n) : n; - } - } - } - const g = this.getImageBytes(h * d, { internal: !0 }), - p = 0 | (((g.length / d) * i) / h), - m = this.getComponents(g); - let b, y, w, S, x, C; - if (t && !f) { - w = new OffscreenCanvas(a, i); - S = w.getContext('2d'); - x = S.createImageData(a, i); - C = x.data; - } - n.kind = r.ImageKind.RGBA_32BPP; - if (e || this.smask || this.mask) { - (t && !f) || (C = new Uint8ClampedArray(a * i * 4)); - b = 1; - y = !0; - this.fillOpacity(C, a, i, p, m); - } else { - if (!t || f) { - n.kind = r.ImageKind.RGB_24BPP; - C = new Uint8ClampedArray(a * i * 3); - b = 0; - } else { - new Uint32Array(C.buffer).fill(r.FeatureTest.isLittleEndian ? 4278190080 : 255); - b = 1; - } - y = !1; - } - this.needsDecode && this.decodeBuffer(m); - this.colorSpace.fillRgb(C, o, h, a, i, p, u, m, b); - y && this.undoPreblend(C, a, p); - if (t && !f) { - S.putImageData(x, 0, 0); - return { - data: null, - width: a, - height: i, - bitmap: w.transferToImageBitmap(), - interpolate: this.interpolate, - }; - } - n.data = C; - return f ? c.ImageResizer.createImage(n) : n; - } - fillGrayBuffer(e) { - const t = this.numComps; - if (1 !== t) throw new r.FormatError(`Reading gray scale from a color image: ${t}`); - const a = this.width, - i = this.height, - n = this.bpc, - s = (a * t * n + 7) >> 3, - o = this.getImageBytes(i * s, { internal: !0 }), - c = this.getComponents(o); - let l, h; - if (1 === n) { - h = a * i; - if (this.needsDecode) for (l = 0; l < h; ++l) e[l] = (c[l] - 1) & 255; - else for (l = 0; l < h; ++l) e[l] = 255 & -c[l]; - return; - } - this.needsDecode && this.decodeBuffer(c); - h = a * i; - const u = 255 / ((1 << n) - 1); - for (l = 0; l < h; ++l) e[l] = u * c[l]; - } - createBitmap(e, t, a, n) { - const s = new OffscreenCanvas(t, a), - o = s.getContext('2d'); - let c; - if (e === r.ImageKind.RGBA_32BPP) c = new ImageData(n, t, a); - else { - c = o.createImageData(t, a); - (0, i.convertToRGBA)({ - kind: e, - src: n, - dest: new Uint32Array(c.data.buffer), - width: t, - height: a, - inverseDecode: this.needsDecode, - }); - } - o.putImageData(c, 0, 0); - return { - data: null, - width: t, - height: a, - bitmap: s.transferToImageBitmap(), - interpolate: this.interpolate, - }; - } - getImageBytes( - e, - { - drawWidth: t, - drawHeight: a, - forceRGBA: i = !1, - forceRGB: n = !1, - internal: s = !1, - }, - ) { - this.image.reset(); - this.image.drawWidth = t || this.width; - this.image.drawHeight = a || this.height; - this.image.forceRGBA = !!i; - this.image.forceRGB = !!n; - const c = this.image.getBytes(e); - if (s || this.image instanceof o.DecodeStream) return c; - (0, r.assert)( - c instanceof Uint8Array, - 'PDFImage.getImageBytes: Unsupported "imageBytes" type.', - ); - return new Uint8Array(c); - } - } - t.PDFImage = PDFImage; - }, - (e, t, a) => { - 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, - needAppearances: d, - acroFormRef: f = null, - acroForm: g = null, - xfaData: p = null, - }) { - !(function updateAcroform({ - xref: e, - acroForm: t, - acroFormRef: a, - hasXfa: n, - hasXfaDatasetsEntry: s, - xfaDatasetsRef: o, - needAppearances: c, - newRefs: l, - }) { - !n || s || o || (0, r.warn)('XFA - Cannot save it'); - if (!(c || (n && o))) return; - const h = new i.Dict(e); - for (const e of t.getKeys()) h.set(e, t.getRaw(e)); - if (n && !s) { - const e = t.get('XFA').slice(); - e.splice(2, 0, 'datasets'); - e.splice(3, 0, o); - h.set('XFA', e); - } - c && h.set('NeedAppearances', !0); - const u = e.encrypt; - let d = null; - u && (d = u.createCipherTransform(a.num, a.gen)); - const f = []; - writeObject(a, h, f, d); - l.push({ ref: a, data: f.join('') }); - })({ - xref: o, - acroForm: g, - acroFormRef: f, - hasXfa: l, - hasXfaDatasetsEntry: u, - xfaDatasetsRef: h, - needAppearances: d, - newRefs: a, - }); - l && - (function updateXFA({ xfaData: e, xfaDatasetsRef: t, newRefs: a, xref: i }) { - 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: i } = e; - if (!t) continue; - const o = (0, n.parseXFAPath)(t); - let c = a.documentElement.searchNode(o, 0); - !c && o.length > 1 && (c = a.documentElement.searchNode([o.at(-1)], 0)); - c - ? Array.isArray(i) - ? (c.childNodes = i.map((e) => new s.SimpleDOMNode('value', e))) - : (c.childNodes = [new s.SimpleDOMNode('#text', i)]) - : (0, r.warn)(`Node not found for path: ${t}`); - } - const i = []; - a.documentElement.dump(i); - return i.join(''); - })(i.fetchIfRef(t).getString(), a); - } - const o = i.encrypt; - if (o) { - e = o.createCipherTransform(t.num, t.gen).encryptString(e); - } - const c = - `${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n` + - e + - '\nendstream\nendobj\n'; - a.push({ ref: t, data: c }); - })({ xfaData: p, xfaDatasetsRef: h, newRefs: a, xref: o }); - const m = new i.Dict(null), - b = t.newRef; - let y, w; - const S = e.at(-1); - if (10 === S || 13 === S) { - y = []; - w = e.length; - } else { - y = ['\n']; - w = e.length + 1; - } - m.set('Size', b.num + 1); - m.set('Prev', t.startXRef); - m.set('Type', i.Name.get('XRef')); - null !== t.rootRef && m.set('Root', t.rootRef); - null !== t.infoRef && m.set('Info', t.infoRef); - null !== t.encryptRef && m.set('Encrypt', t.encryptRef); - a.push({ ref: b, data: '' }); - a = a.sort((e, t) => e.ref.num - t.ref.num); - const x = [[0, 1, 65535]], - C = [0, 1]; - let k = 0; - for (const { ref: e, data: t } of a) { - k = Math.max(k, w); - x.push([1, w, Math.min(e.gen, 65535)]); - w += t.length; - C.push(e.num, 1); - y.push(t); - } - m.set('Index', C); - if (Array.isArray(t.fileIds) && t.fileIds.length > 0) { - const e = (function computeMD5(e, t) { - const a = Math.floor(Date.now() / 1e3), - i = t.filename || '', - n = [a.toString(), i, e.toString()]; - let s = n.reduce((e, t) => e + t.length, 0); - for (const e of Object.values(t.info)) { - n.push(e); - s += e.length; - } - const o = new Uint8Array(s); - let l = 0; - for (const e of n) { - writeString(e, l, o); - l += e.length; - } - return (0, r.bytesToString)((0, c.calculateMD5)(o)); - })(w, t); - m.set('ID', [t.fileIds[0], e]); - } - const v = [1, Math.ceil(Math.log2(k) / 8), 2], - F = (v[0] + v[1] + v[2]) * x.length; - m.set('W', v); - m.set('Length', F); - y.push(`${b.num} ${b.gen} obj\n`); - writeDict(m, y, null); - y.push(' stream\n'); - const O = y.reduce((e, t) => e + t.length, 0), - T = `\nendstream\nendobj\nstartxref\n${w}\n%%EOF\n`, - M = new Uint8Array(e.length + O + F + T.length); - M.set(e); - let E = e.length; - for (const e of y) { - writeString(e, E, M); - E += e.length; - } - for (const [e, t, a] of x) { - E = writeInt(e, v[0], E, M); - E = writeInt(t, v[1], E, M); - E = writeInt(a, v[2], E, M); - } - writeString(T, E, M); - return M; - }; - t.writeDict = writeDict; - t.writeObject = writeObject; - var r = a(2), - i = a(4), - n = a(3), - s = a(66), - o = a(5), - c = a(67); - function writeObject(e, t, a, r) { - a.push(`${e.num} ${e.gen} obj\n`); - t instanceof i.Dict - ? writeDict(t, a, r) - : t instanceof o.BaseStream && writeStream(t, a, r); - a.push('\nendobj\n'); - } - function writeDict(e, t, a) { - t.push('<<'); - for (const r of e.getKeys()) { - t.push(` /${(0, n.escapePDFName)(r)} `); - writeValue(e.getRaw(r), t, a); - } - t.push('>>'); - } - function writeStream(e, t, a) { - let r = e.getString(); - null !== a && (r = a.encryptString(r)); - e.dict.set('Length', r.length); - writeDict(e.dict, t, a); - t.push(' stream\n', r, '\nendstream'); - } - function writeValue(e, t, a) { - if (e instanceof i.Name) t.push(`/${(0, n.escapePDFName)(e.name)}`); - else if (e instanceof i.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 i of e) { - r ? (r = !1) : t.push(' '); - writeValue(i, t, a); - } - t.push(']'); - })(e, t, a); - else if ('string' == typeof e) { - null !== a && (e = a.encryptString(e)); - t.push(`(${(0, n.escapeString)(e)})`); - } else - 'number' == typeof e - ? t.push((0, n.numberToString)(e)) - : 'boolean' == typeof e - ? t.push(e.toString()) - : e instanceof i.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 i = t + a - 1; i > a - 1; i--) { - r[i] = 255 & e; - e >>= 8; - } - return a + t; - } - function writeString(e, t, a) { - for (let r = 0, i = e.length; r < i; r++) a[t + r] = 255 & e.charCodeAt(r); - } - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.XMLParserErrorCode = t.XMLParserBase = t.SimpleXMLParser = t.SimpleDOMNode = void 0; - var r = a(3); - const i = { - NoError: 0, - EndOfDocument: -1, - UnterminatedCdat: -2, - UnterminatedXmlDeclaration: -3, - UnterminatedDoctypeDeclaration: -4, - UnterminatedComment: -5, - MalformedElement: -6, - OutOfMemory: -7, - UnterminatedAttributeValue: -8, - UnterminatedElement: -9, - ElementNeverBegun: -10, - }; - t.XMLParserErrorCode = i; - function isWhitespace(e, t) { - const a = e[t]; - return ' ' === a || '\n' === a || '\r' === a || '\t' === a; - } - class XMLParserBase { - _resolveEntities(e) { - return e.replaceAll(/&([^;]+);/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.length && isWhitespace(e, r); ) ++r; - } - for (; r < e.length && !isWhitespace(e, r) && '>' !== e[r] && '/' !== e[r]; ) ++r; - const i = e.substring(t, r); - skipWs(); - for (; r < e.length && '>' !== e[r] && '/' !== e[r] && '?' !== e[r]; ) { - skipWs(); - let t = '', - i = ''; - for (; r < e.length && !isWhitespace(e, r) && '=' !== e[r]; ) { - t += e[r]; - ++r; - } - skipWs(); - if ('=' !== e[r]) return null; - ++r; - skipWs(); - const n = e[r]; - if ('"' !== n && "'" !== n) return null; - const s = e.indexOf(n, ++r); - if (s < 0) return null; - i = e.substring(r, s); - a.push({ name: t, value: this._resolveEntities(i) }); - r = s + 1; - skipWs(); - } - return { name: i, attributes: a, parsed: r - t }; - } - _parseProcessingInstruction(e, t) { - let a = t; - for ( - ; - a < e.length && !isWhitespace(e, a) && '>' !== e[a] && '?' !== e[a] && '/' !== e[a]; - - ) - ++a; - const r = e.substring(t, a); - !(function skipWs() { - for (; a < e.length && isWhitespace(e, a); ) ++a; - })(); - const i = a; - for (; a < e.length && ('?' !== e[a] || '>' !== e[a + 1]); ) ++a; - return { name: r, value: e.substring(i, a), parsed: a - t }; - } - parseXml(e) { - let t = 0; - for (; t < e.length; ) { - let a = t; - if ('<' === e[t]) { - ++a; - let t; - switch (e[a]) { - case '/': - ++a; - t = e.indexOf('>', a); - if (t < 0) { - this.onError(i.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(i.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(i.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(i.UnterminatedCdat); - return; - } - this.onCdata(e.substring(a + 8, t)); - a = t + 3; - } else { - if ('DOCTYPE' !== e.substring(a + 1, a + 8)) { - this.onError(i.MalformedElement); - return; - } - { - const r = e.indexOf('[', a + 8); - let n = !1; - t = e.indexOf('>', a + 8); - if (t < 0) { - this.onError(i.UnterminatedDoctypeDeclaration); - return; - } - if (r > 0 && t > r) { - t = e.indexOf(']>', a + 8); - if (t < 0) { - this.onError(i.UnterminatedDoctypeDeclaration); - return; - } - n = !0; - } - const s = e.substring(a + 8, t + (n ? 1 : 0)); - this.onDoctype(s); - a = t + (n ? 2 : 1); - } - } - break; - default: - const n = this._parseContent(e, a); - if (null === n) { - this.onError(i.MalformedElement); - return; - } - let s = !1; - if ('/>' === e.substring(a + n.parsed, a + n.parsed + 2)) s = !0; - else if ('>' !== e.substring(a + n.parsed, a + n.parsed + 1)) { - this.onError(i.UnterminatedElement); - return; - } - this.onBeginElement(n.name, n.attributes, s); - a += n.parsed + (s ? 2 : 1); - } - } else { - for (; a < e.length && '<' !== e[a]; ) a++; - const r = e.substring(t, a); - this.onText(this._resolveEntities(r)); - } - t = a; - } - } - onResolveEntity(e) { - return `&${e};`; - } - onPi(e, t) {} - onComment(e) {} - onCdata(e) {} - onDoctype(e) {} - onText(e) {} - onBeginElement(e, t, a) {} - onEndElement(e) {} - onError(e) {} - } - t.XMLParserBase = XMLParserBase; - class SimpleDOMNode { - constructor(e, t) { - this.nodeName = e; - this.nodeValue = t; - Object.defineProperty(this, 'parentNode', { value: null, writable: !0 }); - } - get firstChild() { - return this.childNodes && this.childNodes[0]; - } - get nextSibling() { - const e = this.parentNode.childNodes; - if (!e) return; - const t = e.indexOf(this); - return -1 !== t ? e[t + 1] : void 0; - } - get textContent() { - return this.childNodes - ? this.childNodes - .map(function (e) { - return e.textContent; - }) - .join('') - : this.nodeValue || ''; - } - get children() { - return this.childNodes || []; - } - hasChildNodes() { - return this.childNodes && this.childNodes.length > 0; - } - searchNode(e, t) { - if (t >= e.length) return this; - const a = e[t], - r = []; - let i = this; - for (;;) { - if (a.name === i.nodeName) { - if (0 !== a.pos) { - if (0 === r.length) return null; - { - const [n] = r.pop(); - let s = 0; - for (const r of n.childNodes) - if (a.name === r.nodeName) { - if (s === a.pos) return r.searchNode(e, t + 1); - s++; - } - return i.searchNode(e, t + 1); - } - } - { - const a = i.searchNode(e, t + 1); - if (null !== a) return a; - } - } - if (i.childNodes && 0 !== i.childNodes.length) { - r.push([i, 0]); - i = i.childNodes[0]; - } else { - if (0 === r.length) return null; - for (; 0 !== r.length; ) { - const [e, t] = r.pop(), - a = t + 1; - if (a < e.childNodes.length) { - r.push([e, a]); - i = e.childNodes[a]; - break; - } - } - if (0 === r.length) return null; - } - } - } - dump(e) { - if ('#text' !== this.nodeName) { - e.push(`<${this.nodeName}`); - if (this.attributes) - for (const t of this.attributes) - e.push(` ${t.name}="${(0, r.encodeToXmlString)(t.value)}"`); - if (this.hasChildNodes()) { - e.push('>'); - 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 = i.NoError; - this._hasAttributes = e; - this._lowerCaseName = t; - } - parseFromString(e) { - this._currentFragment = []; - this._stack = []; - this._errorCode = i.NoError; - this.parseXml(e); - if (this._errorCode !== i.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 < a; t++) if (!isWhitespace(e, t)) return !1; - return !0; - })(e) - ) - return; - const t = new SimpleDOMNode('#text', e); - this._currentFragment.push(t); - } - onCdata(e) { - const t = new SimpleDOMNode('#text', e); - this._currentFragment.push(t); - } - onBeginElement(e, t, a) { - this._lowerCaseName && (e = e.toLowerCase()); - const r = new SimpleDOMNode(e); - r.childNodes = []; - this._hasAttributes && (r.attributes = t); - this._currentFragment.push(r); - if (!a) { - this._stack.push(this._currentFragment); - this._currentFragment = r.childNodes; - } - } - onEndElement(e) { - this._currentFragment = this._stack.pop() || []; - const t = this._currentFragment.at(-1); - if (!t) return null; - for (const e of t.childNodes) e.parentNode = t; - return t; - } - onError(e) { - this._errorCode = e; - } - }; - }, - (e, t, a) => { - 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), - i = a(4), - n = 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, i = 0; r < 256; ++r) { - const n = t[r]; - i = (i + n + e[r % a]) & 255; - t[r] = t[i]; - t[i] = n; - } - this.s = t; - } - encryptBlock(e) { - let t = this.a, - a = this.b; - const r = this.s, - i = e.length, - n = new Uint8Array(i); - for (let s = 0; s < i; ++s) { - t = (t + 1) & 255; - const i = r[t]; - a = (a + i) & 255; - const o = r[a]; - r[t] = o; - r[a] = i; - n[s] = e[s] ^ r[(i + o) & 255]; - } - this.a = t; - this.b = a; - return n; - } - decryptBlock(e) { - return this.encryptBlock(e); - } - encrypt(e) { - return this.encryptBlock(e); - } - } - t.ARCFourCipher = ARCFourCipher; - const s = (function calculateMD5Closure() { - const e = 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, - ]), - t = 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, - ]); - return function hash(a, r, i) { - let n = 1732584193, - s = -271733879, - o = -1732584194, - c = 271733878; - const l = (i + 72) & -64, - h = new Uint8Array(l); - let u, d; - for (u = 0; u < i; ++u) h[u] = a[r++]; - h[u++] = 128; - const f = l - 8; - for (; u < f; ) h[u++] = 0; - h[u++] = (i << 3) & 255; - h[u++] = (i >> 5) & 255; - h[u++] = (i >> 13) & 255; - h[u++] = (i >> 21) & 255; - h[u++] = (i >>> 29) & 255; - h[u++] = 0; - h[u++] = 0; - h[u++] = 0; - const g = new Int32Array(16); - for (u = 0; u < l; ) { - for (d = 0; d < 16; ++d, u += 4) - g[d] = h[u] | (h[u + 1] << 8) | (h[u + 2] << 16) | (h[u + 3] << 24); - let a, - r, - i = n, - l = s, - f = o, - p = c; - for (d = 0; d < 64; ++d) { - if (d < 16) { - a = (l & f) | (~l & p); - r = d; - } else if (d < 32) { - a = (p & l) | (~p & f); - r = (5 * d + 1) & 15; - } else if (d < 48) { - a = l ^ f ^ p; - r = (3 * d + 5) & 15; - } else { - a = f ^ (l | ~p); - r = (7 * d) & 15; - } - const n = p, - s = (i + a + t[d] + g[r]) | 0, - o = e[d]; - p = f; - f = l; - l = (l + ((s << o) | (s >>> (32 - o)))) | 0; - i = n; - } - n = (n + i) | 0; - s = (s + l) | 0; - o = (o + f) | 0; - c = (c + p) | 0; - } - return new Uint8Array([ - 255 & n, - (n >> 8) & 255, - (n >> 16) & 255, - (n >>> 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 << (e - 32); - this.low = 0; - } else { - this.high = (this.high << e) | (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 i = 1779033703, - n = 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 < r; ++g) f[g] = t[a++]; - f[g++] = 128; - const m = d - 8; - for (; g < m; ) f[g++] = 0; - f[g++] = 0; - f[g++] = 0; - f[g++] = 0; - f[g++] = (r >>> 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 < d; ) { - for (p = 0; p < 16; ++p) { - b[p] = (f[g] << 24) | (f[g + 1] << 16) | (f[g + 2] << 8) | f[g + 3]; - g += 4; - } - for (p = 16; p < 64; ++p) - b[p] = - ((rotr((y = b[p - 2]), 17) ^ rotr(y, 19) ^ (y >>> 10)) + - b[p - 7] + - littleSigma(b[p - 15]) + - b[p - 16]) | - 0; - let t, - a, - r = i, - d = n, - m = s, - w = o, - S = c, - x = l, - C = h, - k = u; - for (p = 0; p < 64; ++p) { - t = k + sigmaPrime(S) + ch(S, x, C) + e[p] + b[p]; - a = sigma(r) + maj(r, d, m); - k = C; - C = x; - x = S; - S = (w + t) | 0; - w = m; - m = d; - d = r; - r = (t + a) | 0; - } - i = (i + r) | 0; - n = (n + d) | 0; - s = (s + m) | 0; - o = (o + w) | 0; - c = (c + S) | 0; - l = (l + x) | 0; - h = (h + C) | 0; - u = (u + k) | 0; - } - var y; - return new Uint8Array([ - (i >> 24) & 255, - (i >> 16) & 255, - (i >> 8) & 255, - 255 & i, - (n >> 24) & 255, - (n >> 16) & 255, - (n >> 8) & 255, - 255 & n, - (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, i) { - e.assign(t); - e.and(a); - i.assign(t); - i.not(); - i.and(r); - e.xor(i); - } - function maj(e, t, a, r, i) { - e.assign(t); - e.and(a); - i.assign(t); - i.and(r); - e.xor(i); - i.assign(a); - i.and(r); - e.xor(i); - } - 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, i = !1) { - let n, s, o, c, l, h, u, d; - if (i) { - n = 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 { - n = 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 < r; ++p) g[p] = t[a++]; - g[p++] = 128; - const b = f - 16; - for (; p < b; ) g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = 0; - g[p++] = (r >>> 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), - C = new Word64(0, 0), - k = 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 < f; ) { - for (m = 0; m < 16; ++m) { - y[m].high = (g[p] << 24) | (g[p + 1] << 16) | (g[p + 2] << 8) | g[p + 3]; - y[m].low = (g[p + 4] << 24) | (g[p + 5] << 16) | (g[p + 6] << 8) | g[p + 7]; - p += 8; - } - for (m = 16; m < 80; ++m) { - N = y[m]; - littleSigmaPrime(N, y[m - 2], D); - N.add(y[m - 7]); - littleSigma(E, y[m - 15], D); - N.add(E); - N.add(y[m - 16]); - } - w.assign(n); - S.assign(s); - x.assign(o); - C.assign(c); - k.assign(l); - v.assign(h); - F.assign(u); - O.assign(d); - for (m = 0; m < 80; ++m) { - T.assign(O); - sigmaPrime(E, k, D); - T.add(E); - ch(E, k, v, F, D); - T.add(E); - T.add(e[m]); - T.add(y[m]); - sigma(M, w, D); - maj(E, w, S, x, D); - M.add(E); - N = O; - O = F; - F = v; - v = k; - C.add(T); - k = C; - C = x; - x = S; - S = w; - N.assign(T); - N.add(M); - w = N; - } - n.add(w); - s.add(S); - o.add(x); - c.add(C); - l.add(k); - h.add(v); - u.add(F); - d.add(O); - } - if (i) { - R = new Uint8Array(48); - n.copyTo(R, 0); - s.copyTo(R, 8); - o.copyTo(R, 16); - c.copyTo(R, 24); - l.copyTo(R, 32); - h.copyTo(R, 40); - } else { - R = new Uint8Array(64); - n.copyTo(R, 0); - s.copyTo(R, 8); - o.copyTo(R, 16); - c.copyTo(R, 24); - l.copyTo(R, 32); - h.copyTo(R, 40); - u.copyTo(R, 48); - d.copyTo(R, 56); - } - return R; - }; - })(); - t.calculateSHA512 = c; - function calculateSHA384(e, t, a) { - return c(e, t, a, !0); - } - class NullCipher { - decryptBlock(e) { - return e; - } - encrypt(e) { - return e; - } - } - class AESBaseCipher { - constructor() { - this.constructor === AESBaseCipher && - (0, r.unreachable)('Cannot initialize AESBaseCipher.'); - this._s = new Uint8Array([ - 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, - 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, - 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, - 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, - 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, - 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, - 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, - 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, - 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, - 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, - 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, - 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, - 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, - 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22, - ]); - this._inv_s = new Uint8Array([ - 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, - 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, - 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, - 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, - 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, - 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, - 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, - 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, - 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, - 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, - 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, - 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, - 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, - 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, - 12, 125, - ]); - this._mix = new Uint32Array([ - 0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, - 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, - 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, - 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, - 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, - 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, - 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, - 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, - 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, - 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, - 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, - 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, - 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, - 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, - 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, - 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, - 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, - 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, - 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, - 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, - 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, - 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, - 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, - 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, - 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, - 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, - 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, - 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, - 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, - 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, - 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, - 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, - 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, - 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, - 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, - 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, - 2438237621, 2203032232, 2370213795, - ]); - this._mixCol = new Uint8Array(256); - for (let e = 0; e < 256; e++) this._mixCol[e] = e < 128 ? e << 1 : (e << 1) ^ 27; - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - _expandKey(e) { - (0, r.unreachable)('Cannot call `_expandKey` on the base class'); - } - _decrypt(e, t) { - let a, r, i; - const n = new Uint8Array(16); - n.set(e); - for (let e = 0, a = this._keySize; e < 16; ++e, ++a) n[e] ^= t[a]; - for (let e = this._cyclesOfRepetition - 1; e >= 1; --e) { - a = n[13]; - n[13] = n[9]; - n[9] = n[5]; - n[5] = n[1]; - n[1] = a; - a = n[14]; - r = n[10]; - n[14] = n[6]; - n[10] = n[2]; - n[6] = a; - n[2] = r; - a = n[15]; - r = n[11]; - i = n[7]; - n[15] = n[3]; - n[11] = a; - n[7] = r; - n[3] = i; - for (let e = 0; e < 16; ++e) n[e] = this._inv_s[n[e]]; - for (let a = 0, r = 16 * e; a < 16; ++a, ++r) n[a] ^= t[r]; - for (let e = 0; e < 16; e += 4) { - const t = this._mix[n[e]], - r = this._mix[n[e + 1]], - i = this._mix[n[e + 2]], - s = this._mix[n[e + 3]]; - a = t ^ (r >>> 8) ^ (r << 24) ^ (i >>> 16) ^ (i << 16) ^ (s >>> 24) ^ (s << 8); - n[e] = (a >>> 24) & 255; - n[e + 1] = (a >> 16) & 255; - n[e + 2] = (a >> 8) & 255; - n[e + 3] = 255 & a; - } - } - a = n[13]; - n[13] = n[9]; - n[9] = n[5]; - n[5] = n[1]; - n[1] = a; - a = n[14]; - r = n[10]; - n[14] = n[6]; - n[10] = n[2]; - n[6] = a; - n[2] = r; - a = n[15]; - r = n[11]; - i = n[7]; - n[15] = n[3]; - n[11] = a; - n[7] = r; - n[3] = i; - for (let e = 0; e < 16; ++e) { - n[e] = this._inv_s[n[e]]; - n[e] ^= t[e]; - } - return n; - } - _encrypt(e, t) { - const a = this._s; - let r, i, n; - const s = new Uint8Array(16); - s.set(e); - for (let e = 0; e < 16; ++e) s[e] ^= t[e]; - for (let e = 1; e < this._cyclesOfRepetition; e++) { - for (let e = 0; e < 16; ++e) s[e] = a[s[e]]; - n = s[1]; - s[1] = s[5]; - s[5] = s[9]; - s[9] = s[13]; - s[13] = n; - n = s[2]; - i = s[6]; - s[2] = s[10]; - s[6] = s[14]; - s[10] = n; - s[14] = i; - n = s[3]; - i = s[7]; - r = s[11]; - s[3] = s[15]; - s[7] = n; - s[11] = i; - s[15] = r; - for (let e = 0; e < 16; e += 4) { - const t = s[e + 0], - a = s[e + 1], - i = s[e + 2], - n = s[e + 3]; - r = t ^ a ^ i ^ n; - s[e + 0] ^= r ^ this._mixCol[t ^ a]; - s[e + 1] ^= r ^ this._mixCol[a ^ i]; - s[e + 2] ^= r ^ this._mixCol[i ^ n]; - s[e + 3] ^= r ^ this._mixCol[n ^ t]; - } - for (let a = 0, r = 16 * e; a < 16; ++a, ++r) s[a] ^= t[r]; - } - for (let e = 0; e < 16; ++e) s[e] = a[s[e]]; - n = s[1]; - s[1] = s[5]; - s[5] = s[9]; - s[9] = s[13]; - s[13] = n; - n = s[2]; - i = s[6]; - s[2] = s[10]; - s[6] = s[14]; - s[10] = n; - s[14] = i; - n = s[3]; - i = s[7]; - r = s[11]; - s[3] = s[15]; - s[7] = n; - s[11] = i; - s[15] = r; - for (let e = 0, a = this._keySize; e < 16; ++e, ++a) s[e] ^= t[a]; - return s; - } - _decryptBlock2(e, t) { - const a = e.length; - let r = this.buffer, - i = this.bufferPosition; - const n = []; - let s = this.iv; - for (let t = 0; t < a; ++t) { - r[i] = e[t]; - ++i; - if (i < 16) continue; - const a = this._decrypt(r, this._key); - for (let e = 0; e < 16; ++e) a[e] ^= s[e]; - s = r; - n.push(a); - r = new Uint8Array(16); - i = 0; - } - this.buffer = r; - this.bufferLength = i; - this.iv = s; - if (0 === n.length) return new Uint8Array(0); - let o = 16 * n.length; - if (t) { - const e = n.at(-1); - let t = e[15]; - if (t <= 16) { - for (let a = 15, r = 16 - t; a >= r; --a) - if (e[a] !== t) { - t = 0; - break; - } - o -= t; - n[n.length - 1] = e.subarray(0, 16 - t); - } - } - const c = new Uint8Array(o); - for (let e = 0, t = 0, a = n.length; e < a; ++e, t += 16) c.set(n[e], t); - return c; - } - decryptBlock(e, t, a = null) { - const r = e.length, - i = this.buffer; - let n = this.bufferPosition; - if (a) this.iv = a; - else { - for (let t = 0; n < 16 && t < r; ++t, ++n) i[n] = e[t]; - if (n < 16) { - this.bufferLength = n; - return new Uint8Array(0); - } - this.iv = i; - e = e.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - this.decryptBlock = this._decryptBlock2; - return this.decryptBlock(e, t); - } - encrypt(e, t) { - const a = e.length; - let r = this.buffer, - i = this.bufferPosition; - const n = []; - t || (t = new Uint8Array(16)); - for (let s = 0; s < a; ++s) { - r[i] = e[s]; - ++i; - if (i < 16) continue; - for (let e = 0; e < 16; ++e) r[e] ^= t[e]; - const a = this._encrypt(r, this._key); - t = a; - n.push(a); - r = new Uint8Array(16); - i = 0; - } - this.buffer = r; - this.bufferLength = i; - this.iv = t; - if (0 === n.length) return new Uint8Array(0); - const s = 16 * n.length, - o = new Uint8Array(s); - for (let e = 0, t = 0, a = n.length; e < a; ++e, t += 16) o.set(n[e], t); - return o; - } - } - class AES128Cipher extends AESBaseCipher { - constructor(e) { - super(); - this._cyclesOfRepetition = 10; - this._keySize = 160; - this._rcon = new Uint8Array([ - 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, - 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145, 57, 114, 228, 211, 189, 97, - 194, 159, 37, 74, 148, 51, 102, 204, 131, 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, - 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, - 212, 179, 125, 250, 239, 197, 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, - 148, 51, 102, 204, 131, 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, - 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, - 239, 197, 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, 204, 131, - 29, 58, 116, 232, 203, 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, - 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145, 57, 114, - 228, 211, 189, 97, 194, 159, 37, 74, 148, 51, 102, 204, 131, 29, 58, 116, 232, 203, - 141, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, - 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145, 57, 114, 228, 211, 189, 97, - 194, 159, 37, 74, 148, 51, 102, 204, 131, 29, 58, 116, 232, 203, 141, - ]); - this._key = this._expandKey(e); - } - _expandKey(e) { - const t = this._s, - a = this._rcon, - r = new Uint8Array(176); - r.set(e); - for (let e = 16, i = 1; e < 176; ++i) { - let n = r[e - 3], - s = r[e - 2], - o = r[e - 1], - c = r[e - 4]; - n = t[n]; - s = t[s]; - o = t[o]; - c = t[c]; - n ^= a[i]; - for (let t = 0; t < 4; ++t) { - r[e] = n ^= r[e - 16]; - e++; - r[e] = s ^= r[e - 16]; - e++; - r[e] = o ^= r[e - 16]; - e++; - r[e] = c ^= r[e - 16]; - e++; - } - } - return r; - } - } - t.AES128Cipher = AES128Cipher; - class AES256Cipher extends AESBaseCipher { - constructor(e) { - super(); - this._cyclesOfRepetition = 14; - this._keySize = 224; - this._key = this._expandKey(e); - } - _expandKey(e) { - const t = this._s, - a = new Uint8Array(240); - a.set(e); - let r, - i, - n, - s, - o = 1; - for (let e = 32, c = 1; e < 240; ++c) { - if (e % 32 == 16) { - r = t[r]; - i = t[i]; - n = t[n]; - s = t[s]; - } else if (e % 32 == 0) { - r = a[e - 3]; - i = a[e - 2]; - n = a[e - 1]; - s = a[e - 4]; - r = t[r]; - i = t[i]; - n = t[n]; - s = t[s]; - r ^= o; - (o <<= 1) >= 256 && (o = 255 & (27 ^ o)); - } - for (let t = 0; t < 4; ++t) { - a[e] = r ^= a[e - 32]; - e++; - a[e] = i ^= a[e - 32]; - e++; - a[e] = n ^= a[e - 32]; - e++; - a[e] = s ^= a[e - 32]; - e++; - } - } - return a; - } - } - t.AES256Cipher = AES256Cipher; - class PDF17 { - checkOwnerPassword(e, t, a, i) { - const n = new Uint8Array(e.length + 56); - n.set(e, 0); - n.set(t, e.length); - n.set(a, e.length + t.length); - const s = o(n, 0, n.length); - return (0, r.isArrayEqual)(s, i); - } - checkUserPassword(e, t, a) { - const i = new Uint8Array(e.length + 8); - i.set(e, 0); - i.set(t, e.length); - const n = o(i, 0, i.length); - return (0, r.isArrayEqual)(n, a); - } - getOwnerKey(e, t, a, r) { - const i = new Uint8Array(e.length + 56); - i.set(e, 0); - i.set(t, e.length); - i.set(a, e.length + t.length); - const n = o(i, 0, i.length); - return new AES256Cipher(n).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 i = o(r, 0, r.length); - return new AES256Cipher(i).decryptBlock(a, !1, new Uint8Array(16)); - } - } - t.PDF17 = PDF17; - class PDF20 { - _hash(e, t, a) { - let r = o(t, 0, t.length).subarray(0, 32), - i = [0], - n = 0; - for (; n < 64 || i.at(-1) > n - 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); - i = new AES128Cipher(r.subarray(0, 16)).encrypt(h, r.subarray(16, 32)); - const u = i.slice(0, 16).reduce((e, t) => e + t, 0) % 3; - 0 === u - ? (r = o(i, 0, i.length)) - : 1 === u - ? (r = calculateSHA384(i, 0, i.length)) - : 2 === u && (r = c(i, 0, i.length)); - n++; - } - return r.subarray(0, 32); - } - checkOwnerPassword(e, t, a, i) { - const n = new Uint8Array(e.length + 56); - n.set(e, 0); - n.set(t, e.length); - n.set(a, e.length + t.length); - const s = this._hash(e, n, a); - return (0, r.isArrayEqual)(s, i); - } - checkUserPassword(e, t, a) { - const i = new Uint8Array(e.length + 8); - i.set(e, 0); - i.set(t, e.length); - const n = this._hash(e, i, []); - return (0, r.isArrayEqual)(n, a); - } - getOwnerKey(e, t, a, r) { - const i = new Uint8Array(e.length + 56); - i.set(e, 0); - i.set(t, e.length); - i.set(a, e.length + t.length); - const n = this._hash(e, i, a); - return new AES256Cipher(n).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 i = this._hash(e, r, []); - return new AES256Cipher(i).decryptBlock(a, !1, new Uint8Array(16)); - } - } - t.PDF20 = PDF20; - class CipherTransform { - constructor(e, t) { - this.StringCipherConstructor = e; - this.StreamCipherConstructor = t; - } - createStream(e, t) { - const a = new this.StreamCipherConstructor(); - return new n.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 i = new Uint8Array(16); - if ('undefined' != typeof crypto) crypto.getRandomValues(i); - else for (let e = 0; e < 16; e++) i[e] = Math.floor(256 * Math.random()); - let n = (0, r.stringToBytes)(e); - n = t.encrypt(n, i); - const s = new Uint8Array(16 + n.length); - s.set(i); - s.set(n, 16); - return (0, r.bytesToString)(s); - } - let a = (0, r.stringToBytes)(e); - a = t.encrypt(a); - return (0, r.bytesToString)(a); - } - } - const l = (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, i, n, 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 < f; ++g) u[g] = a[g]; - } - d = 0; - for (; g < 32; ) u[g++] = e[d++]; - for (d = 0, f = r.length; d < f; ++d) u[g++] = r[d]; - u[g++] = 255 & n; - u[g++] = (n >> 8) & 255; - u[g++] = (n >> 16) & 255; - u[g++] = (n >>> 24) & 255; - for (d = 0, f = t.length; d < f; ++d) u[g++] = t[d]; - if (o >= 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 < f; ++d) u[g++] = t[d]; - y = new ARCFourCipher(b); - w = y.encryptBlock(s(u, 0, g)); - f = b.length; - const a = new Uint8Array(f); - for (d = 1; d <= 19; ++d) { - for (let e = 0; e < f; ++e) a[e] = b[e] ^ d; - y = new ARCFourCipher(a); - w = y.encryptBlock(w); - } - for (d = 0, f = w.length; d < f; ++d) if (i[d] !== w[d]) return null; - } else { - y = new ARCFourCipher(b); - w = y.encryptBlock(e); - for (d = 0, f = w.length; d < f; ++d) if (i[d] !== w[d]) return null; - } - return b; - } - const t = i.Name.get('Identity'); - function buildObjectKey(e, t, a, r = !1) { - const i = new Uint8Array(a.length + 9), - n = a.length; - let o; - for (o = 0; o < n; ++o) i[o] = a[o]; - i[o++] = 255 & e; - i[o++] = (e >> 8) & 255; - i[o++] = (e >> 16) & 255; - i[o++] = 255 & t; - i[o++] = (t >> 8) & 255; - if (r) { - i[o++] = 115; - i[o++] = 65; - i[o++] = 108; - i[o++] = 84; - } - return s(i, 0, o).subarray(0, Math.min(a.length + 5, 16)); - } - function buildCipherConstructor(e, t, a, n, s) { - if (!(t instanceof i.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, n, s, !1)); - }; - if ('AESV2' === c.name) - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher(buildObjectKey(a, n, 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, n, o) { - const c = a.get('Filter'); - if (!(0, i.isName)(c, 'Standard')) - throw new r.FormatError('unknown encryption method'); - this.filterName = c.name; - this.dict = a; - const l = a.get('V'); - if (!Number.isInteger(l) || (1 !== l && 2 !== l && 4 !== l && 5 !== l)) - throw new r.FormatError('unsupported encryption algorithm'); - this.algorithm = l; - let h = a.get('Length'); - if (!h) - if (l <= 3) h = 40; - else { - const e = a.get('CF'), - t = a.get('StmF'); - if (e instanceof i.Dict && t instanceof i.Name) { - e.suppressEncryption = !0; - const a = e.get(t.name); - h = (a && a.get('Length')) || 128; - h < 40 && (h <<= 3); - } - } - if (!Number.isInteger(h) || h < 40 || h % 8 != 0) - throw new r.FormatError('invalid key length'); - const u = (0, r.stringToBytes)(a.get('O')), - d = (0, r.stringToBytes)(a.get('U')), - f = u.subarray(0, 32), - g = d.subarray(0, 32), - p = a.get('P'), - m = a.get('R'), - b = (4 === l || 5 === l) && !1 !== a.get('EncryptMetadata'); - this.encryptMetadata = b; - const y = (0, r.stringToBytes)(n); - let w, S; - if (o) { - if (6 === m) - try { - o = (0, r.utf8StringToString)(o); - } catch (e) { - (0, r.warn)( - 'CipherTransformFactory: Unable to convert UTF8 encoded password.', - ); - } - w = (0, r.stringToBytes)(o); - } - if (5 !== l) S = prepareKeyData(y, w, f, g, p, m, h, b); - else { - const e = u.subarray(32, 40), - t = u.subarray(40, 48), - i = d.subarray(0, 48), - n = d.subarray(32, 40), - s = d.subarray(40, 48), - o = (0, r.stringToBytes)(a.get('OE')), - c = (0, r.stringToBytes)(a.get('UE')); - (0, r.stringToBytes)(a.get('Perms')); - S = (function createEncryptionKey20(e, t, a, r, i, n, s, o, c, l, h, u) { - if (t) { - const e = Math.min(127, t.length); - t = t.subarray(0, e); - } else t = []; - let d; - d = 6 === e ? new PDF20() : new PDF17(); - return d.checkUserPassword(t, o, s) - ? d.getUserKey(t, c, h) - : t.length && d.checkOwnerPassword(t, r, n, a) - ? d.getOwnerKey(t, i, n, l) - : null; - })(m, w, f, e, t, i, g, n, s, o, c); - } - if (!S && !o) - throw new r.PasswordException( - 'No password given', - r.PasswordResponses.NEED_PASSWORD, - ); - if (!S && o) { - const t = (function decodeUserPassword(t, a, r, i) { - const n = new Uint8Array(32); - let o = 0; - const c = Math.min(32, t.length); - for (; o < c; ++o) n[o] = t[o]; - let l = 0; - for (; o < 32; ) n[o++] = e[l++]; - let h = s(n, 0, o); - const u = i >> 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 < u; ++t) e[t] = h[t] ^ l; - d = new ARCFourCipher(e); - f = d.encryptBlock(f); - } - } else { - d = new ARCFourCipher(h.subarray(0, u)); - f = d.encryptBlock(a); - } - return f; - })(w, f, m, h); - S = prepareKeyData(y, t, f, g, p, m, h, b); - } - if (!S) - throw new r.PasswordException( - 'Incorrect Password', - r.PasswordResponses.INCORRECT_PASSWORD, - ); - this.encryptionKey = S; - if (l >= 4) { - const e = a.get('CF'); - e instanceof i.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 = l; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.DecryptStream = void 0; - var r = a(18); - 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); - const a = this.bufferLength, - r = a + e.length; - this.ensureBuffer(r).set(e, a); - this.bufferLength = r; - } - } - t.DecryptStream = DecryptStream; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Catalog = void 0; - var r = a(3), - i = a(2), - n = a(4), - s = a(70), - o = a(5), - c = a(71), - l = a(12), - h = a(72), - u = a(59), - d = a(73), - f = a(74); - function fetchDestination(e) { - e instanceof n.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 n.Dict)) - throw new i.FormatError('Catalog object is not a dictionary.'); - this.toplevelPagesDict; - this._actualNumPages = null; - this.fontCache = new n.RefSetCache(); - this.builtInCMapCache = new Map(); - this.standardFontDataCache = new Map(); - this.globalImageCache = new u.GlobalImageCache(); - this.pageKidsCountCache = new n.RefSetCache(); - this.pageIndexCache = new n.RefSetCache(); - this.nonBlendModesSet = new n.RefSet(); - } - get version() { - const e = this._catDict.get('Version'); - if (e instanceof n.Name) { - if (r.PDF_VERSION_REGEXP.test(e.name)) - return (0, i.shadow)(this, 'version', e.name); - (0, i.warn)(`Invalid PDF catalog version: ${e.name}`); - } - return (0, i.shadow)(this, 'version', null); - } - get lang() { - const e = this._catDict.get('Lang'); - return (0, i.shadow)( - this, - 'lang', - 'string' == typeof e ? (0, i.stringToPDFString)(e) : null, - ); - } - get needsRendering() { - const e = this._catDict.get('NeedsRendering'); - return (0, i.shadow)(this, 'needsRendering', 'boolean' == typeof e && e); - } - get collection() { - let e = null; - try { - const t = this._catDict.get('Collection'); - t instanceof n.Dict && t.size > 0 && (e = t); - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.info)('Cannot fetch Collection entry; assuming no collection is present.'); - } - return (0, i.shadow)(this, 'collection', e); - } - get acroForm() { - let e = null; - try { - const t = this._catDict.get('AcroForm'); - t instanceof n.Dict && t.size > 0 && (e = t); - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.info)('Cannot fetch AcroForm entry; assuming no forms are present.'); - } - return (0, i.shadow)(this, 'acroForm', e); - } - get acroFormRef() { - const e = this._catDict.getRaw('AcroForm'); - return (0, i.shadow)(this, 'acroFormRef', e instanceof n.Ref ? e : null); - } - get metadata() { - const e = this._catDict.getRaw('Metadata'); - if (!(e instanceof n.Ref)) return (0, i.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 n.Dict) { - const e = r.dict.get('Type'), - a = r.dict.get('Subtype'); - if ((0, n.isName)(e, 'Metadata') && (0, n.isName)(a, 'XML')) { - const e = (0, i.stringToUTF8String)(r.getString()); - e && (t = new d.MetadataParser(e).serializable); - } - } - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.info)(`Skipping invalid Metadata: "${e}".`); - } - return (0, i.shadow)(this, 'metadata', t); - } - get markInfo() { - let e = null; - try { - e = this._readMarkInfo(); - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.warn)('Unable to read mark info.'); - } - return (0, i.shadow)(this, 'markInfo', e); - } - _readMarkInfo() { - const e = this._catDict.get('MarkInfo'); - if (!(e instanceof n.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, i.warn)('Unable read to structTreeRoot info.'); - } - return (0, i.shadow)(this, 'structTreeRoot', e); - } - _readStructTreeRoot() { - const e = this._catDict.get('StructTreeRoot'); - if (!(e instanceof n.Dict)) return null; - const t = new f.StructTreeRoot(e); - t.init(); - return t; - } - get toplevelPagesDict() { - const e = this._catDict.get('Pages'); - if (!(e instanceof n.Dict)) - throw new i.FormatError('Invalid top-level pages dictionary.'); - return (0, i.shadow)(this, 'toplevelPagesDict', e); - } - get documentOutline() { - let e = null; - try { - e = this._readDocumentOutline(); - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.warn)('Unable to read document outline.'); - } - return (0, i.shadow)(this, 'documentOutline', e); - } - _readDocumentOutline() { - let e = this._catDict.get('Outlines'); - if (!(e instanceof n.Dict)) return null; - e = e.getRaw('First'); - if (!(e instanceof n.Ref)) return null; - const t = { items: [] }, - a = [{ obj: e, parent: t }], - r = new n.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 i.FormatError('Invalid outline item encountered.'); - const h = { url: null, dest: null, action: null }; - Catalog.parseDestDictionary({ - destDict: c, - resultObj: h, - docBaseUrl: this.pdfManager.docBaseUrl, - docAttachments: this.attachments, - }); - 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 = { - action: h.action, - attachment: h.attachment, - dest: h.dest, - url: h.url, - unsafeUrl: h.unsafeUrl, - newWindow: h.newWindow, - setOCGState: h.setOCGState, - title: (0, i.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 n.Ref && !r.has(e)) { - a.push({ obj: e, parent: m }); - r.put(e); - } - e = c.getRaw('Next'); - if (e instanceof n.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, i.warn)('Unable to read permissions.'); - } - return (0, i.shadow)(this, 'permissions', e); - } - _readPermissions() { - const e = this.xref.trailer.get('Encrypt'); - if (!(e instanceof n.Dict)) return null; - let t = e.get('P'); - if ('number' != typeof t) return null; - t += 2 ** 32; - const a = []; - for (const e in i.PermissionFlag) { - const r = i.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, i.shadow)(this, 'optionalContentConfig', null); - const a = t.get('D'); - if (!a) return (0, i.shadow)(this, 'optionalContentConfig', null); - const r = t.get('OCGs'); - if (!Array.isArray(r)) return (0, i.shadow)(this, 'optionalContentConfig', null); - const s = [], - o = []; - for (const e of r) { - if (!(e instanceof n.Ref)) continue; - o.push(e); - const t = this.xref.fetchIfRef(e); - s.push({ - id: e.toString(), - name: - 'string' == typeof t.get('Name') - ? (0, i.stringToPDFString)(t.get('Name')) - : null, - intent: - 'string' == typeof t.get('Intent') - ? (0, i.stringToPDFString)(t.get('Intent')) - : null, - }); - } - e = this._readOptionalContentConfig(a, o); - e.groups = s; - } catch (e) { - if (e instanceof r.MissingDataException) throw e; - (0, i.warn)(`Unable to read optional content config: ${e}`); - } - return (0, i.shadow)(this, 'optionalContentConfig', e); - } - _readOptionalContentConfig(e, t) { - function parseOnOff(e) { - const a = []; - if (Array.isArray(e)) - for (const r of e) r instanceof n.Ref && t.includes(r) && a.push(r.toString()); - return a; - } - function parseOrder(e, a = 0) { - if (!Array.isArray(e)) return null; - const i = []; - for (const s of e) { - if (s instanceof n.Ref && t.includes(s)) { - r.put(s); - i.push(s.toString()); - continue; - } - const e = parseNestedOrder(s, a); - e && i.push(e); - } - if (a > 0) return i; - const s = []; - for (const e of t) r.has(e) || s.push(e.toString()); - s.length && i.push({ name: null, order: s }); - return i; - } - function parseNestedOrder(e, t) { - if (++t > s) { - (0, i.warn)('parseNestedOrder - reached MAX_NESTED_LEVELS.'); - return null; - } - const r = a.fetchIfRef(e); - if (!Array.isArray(r)) return null; - const n = a.fetchIfRef(r[0]); - if ('string' != typeof n) return null; - const o = parseOrder(r.slice(1), t); - return o && o.length ? { name: (0, i.stringToPDFString)(n), order: o } : null; - } - const a = this.xref, - r = new n.RefSet(), - s = 10; - return { - name: - 'string' == typeof e.get('Name') ? (0, i.stringToPDFString)(e.get('Name')) : null, - creator: - 'string' == typeof e.get('Creator') - ? (0, i.stringToPDFString)(e.get('Creator')) - : null, - baseState: e.get('BaseState') instanceof n.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 i.FormatError( - 'Page count in top-level pages dictionary is not an integer.', - ); - return (0, i.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, i.stringToPDFString)(a)] = e); - } - else - e instanceof n.Dict && - e.forEach(function (e, a) { - const r = fetchDestination(a); - r && (t[e] = r); - }); - return (0, i.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, i.warn)(`Found "${e}" at an incorrect position in the NameTree.`); - return r; - } - } else if (t instanceof n.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, i.warn)('Unable to read page labels.'); - } - return (0, i.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 < s; e++) { - const s = c.get(e); - if (void 0 !== s) { - if (!(s instanceof n.Dict)) - throw new i.FormatError('PageLabel is not a dictionary.'); - if (s.has('Type') && !(0, n.isName)(s.get('Type'), 'PageLabel')) - throw new i.FormatError('Invalid type in PageLabel dictionary.'); - if (s.has('S')) { - const e = s.get('S'); - if (!(e instanceof n.Name)) - throw new i.FormatError('Invalid style in PageLabel dictionary.'); - a = e.name; - } else a = null; - if (s.has('P')) { - const e = s.get('P'); - if ('string' != typeof e) - throw new i.FormatError('Invalid prefix in PageLabel dictionary.'); - o = (0, i.stringToPDFString)(e); - } else o = ''; - if (s.has('St')) { - const e = s.get('St'); - if (!(Number.isInteger(e) && e >= 1)) - throw new i.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 = 'a' === a ? 97 : 65, - n = h - 1; - l = String.fromCharCode(t + (n % e)).repeat(Math.floor(n / e) + 1); - break; - default: - if (a) throw new i.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 n.Name) - switch (e.name) { - case 'SinglePage': - case 'OneColumn': - case 'TwoColumnLeft': - case 'TwoColumnRight': - case 'TwoPageLeft': - case 'TwoPageRight': - t = e.name; - } - return (0, i.shadow)(this, 'pageLayout', t); - } - get pageMode() { - const e = this._catDict.get('PageMode'); - let t = 'UseNone'; - if (e instanceof n.Name) - switch (e.name) { - case 'UseNone': - case 'UseOutlines': - case 'UseThumbs': - case 'FullScreen': - case 'UseOC': - case 'UseAttachments': - t = e.name; - } - return (0, i.shadow)(this, 'pageMode', t); - } - get viewerPreferences() { - const e = this._catDict.get('ViewerPreferences'); - if (!(e instanceof n.Dict)) return (0, i.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 n.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 n.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 n.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 n.Name) - switch (r.name) { - case 'None': - case 'AppDefault': - s = r.name; - break; - default: - s = 'AppDefault'; - } - break; - case 'Duplex': - if (r instanceof n.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, i.warn)(`Ignoring non-standard key in ViewerPreferences: ${a}.`); - continue; - } - if (void 0 !== s) { - t || (t = Object.create(null)); - t[a] = s; - } else (0, i.warn)(`Bad value, for key "${a}", in ViewerPreferences: ${r}.`); - } - return (0, i.shadow)(this, 'viewerPreferences', t); - } - get openAction() { - const e = this._catDict.get('OpenAction'), - t = Object.create(null); - if (e instanceof n.Dict) { - const a = new n.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, i.shadow)(this, 'openAction', (0, i.objectSize)(t) > 0 ? t : null); - } - get attachments() { - const e = this._catDict.get('Names'); - let t = null; - if (e instanceof n.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, i.stringToPDFString)(e)] = a.serializable; - } - } - return (0, i.shadow)(this, 'attachments', t); - } - get xfaImages() { - const e = this._catDict.get('Names'); - let t = null; - if (e instanceof n.Dict && e.has('XFAImages')) { - const a = new s.NameTree(e.getRaw('XFAImages'), this.xref); - for (const [e, r] of a.getAll()) { - t || (t = new n.Dict(this.xref)); - t.set((0, i.stringToPDFString)(e), r); - } - } - return (0, i.shadow)(this, 'xfaImages', t); - } - _collectJavaScript() { - const e = this._catDict.get('Names'); - let t = null; - function appendIfJavaScriptDict(e, a) { - if (!(a instanceof n.Dict)) return; - if (!(0, n.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; - r = (0, i.stringToPDFString)(r).replaceAll('\0', ''); - (t ||= new Map()).set(e, r); - } - if (e instanceof n.Dict && e.has('JavaScript')) { - const t = new s.NameTree(e.getRaw('JavaScript'), this.xref); - for (const [e, a] of t.getAll()) - appendIfJavaScriptDict((0, i.stringToPDFString)(e), a); - } - const a = this._catDict.get('OpenAction'); - a && appendIfJavaScriptDict('OpenAction', a); - return t; - } - get javaScript() { - const e = this._collectJavaScript(); - return (0, i.shadow)(this, 'javaScript', e ? [...e.values()] : null); - } - get jsActions() { - const e = this._collectJavaScript(); - let t = (0, r.collectActions)(this.xref, this._catDict, i.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, i.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 n.RefSet(), - r = this._catDict.getRaw('Pages'); - r instanceof n.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 n.Ref) { - const h = o.get(r); - if (h >= 0 && l + h <= e) { - l += h; - continue; - } - if (a.has(r)) throw new i.FormatError('Pages tree contains circular reference.'); - a.put(r); - const u = await s.fetchAsync(r); - if (u instanceof n.Dict) { - let t = u.getRaw('Type'); - t instanceof n.Ref && (t = await s.fetchAsync(t)); - if ((0, n.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 n.Dict)) - throw new i.FormatError( - 'Page dictionary kid reference points to wrong type of object.', - ); - const { objId: h } = r; - let u = r.getRaw('Count'); - u instanceof n.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 n.Ref && (d = await s.fetchAsync(d)); - if (!Array.isArray(d)) { - let t = r.getRaw('Type'); - t instanceof n.Ref && (t = await s.fetchAsync(t)); - if ((0, n.isName)(t, 'Page') || !r.has('Kids')) { - if (l === e) return [r, null]; - l++; - continue; - } - throw new i.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 { ignoreErrors: t } = this.pdfManager.evaluatorOptions, - a = [{ currentNode: this.toplevelPagesDict, posInKids: 0 }], - s = new n.RefSet(), - o = this._catDict.getRaw('Pages'); - o instanceof n.Ref && s.put(o); - const c = new Map(), - l = this.xref, - h = this.pageIndexCache; - let u = 0; - function addPageDict(e, t) { - t && !h.has(t) && h.put(t, u); - c.set(u++, [e, t]); - } - function addPageError(a) { - if (a instanceof r.XRefEntryException && !e) throw a; - if (e && t && 0 === u) { - (0, i.warn)(`getAllPageDicts - Skipping invalid first page: "${a}".`); - a = n.Dict.empty; - } - c.set(u++, [a, null]); - } - for (; a.length > 0; ) { - const e = a.at(-1), - { currentNode: t, posInKids: r } = e; - let o = t.getRaw('Kids'); - if (o instanceof n.Ref) - try { - o = await l.fetchAsync(o); - } catch (e) { - addPageError(e); - break; - } - if (!Array.isArray(o)) { - addPageError(new i.FormatError('Page dictionary kids object is not an array.')); - break; - } - if (r >= o.length) { - a.pop(); - continue; - } - const c = o[r]; - let h; - if (c instanceof n.Ref) { - if (s.has(c)) { - addPageError(new i.FormatError('Pages tree contains circular reference.')); - break; - } - s.put(c); - try { - h = await l.fetchAsync(c); - } catch (e) { - addPageError(e); - break; - } - } else h = c; - if (!(h instanceof n.Dict)) { - addPageError( - new i.FormatError( - 'Page dictionary kid reference points to wrong type of object.', - ), - ); - break; - } - let u = h.getRaw('Type'); - if (u instanceof n.Ref) - try { - u = await l.fetchAsync(u); - } catch (e) { - addPageError(e); - break; - } - (0, n.isName)(u, 'Page') || !h.has('Kids') - ? addPageDict(h, c instanceof n.Ref ? c : null) - : a.push({ currentNode: h, posInKids: 0 }); - e.posInKids++; - } - return c; - } - 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, n.isRefsEqual)(t, e) && - !(0, n.isDict)(a, 'Page') && - !(a instanceof n.Dict && !a.has('Type') && a.has('Contents')) - ) - throw new i.FormatError( - 'The reference does not point to a /Page dictionary.', - ); - if (!a) return null; - if (!(a instanceof n.Dict)) - throw new i.FormatError('Node must be a dictionary.'); - r = a.getRaw('Parent'); - return a.getAsync('Parent'); - }) - .then(function (e) { - if (!e) return null; - if (!(e instanceof n.Dict)) - throw new i.FormatError('Parent must be a dictionary.'); - return e.getAsync('Kids'); - }) - .then(function (e) { - if (!e) return null; - const o = []; - let c = !1; - for (const r of e) { - if (!(r instanceof n.Ref)) - throw new i.FormatError('Kid must be a reference.'); - if ((0, n.isRefsEqual)(r, t)) { - c = !0; - break; - } - o.push( - a.fetchAsync(r).then(function (e) { - if (!(e instanceof n.Dict)) - throw new i.FormatError('Kid node must be a dictionary.'); - e.has('Count') ? (s += e.get('Count')) : s++; - }), - ); - } - if (!c) throw new i.FormatError("Kid reference not found in parent's kids."); - return Promise.all(o).then(function () { - return [s, r]; - }); - }); - })(t).then((t) => { - if (!t) { - this.pageIndexCache.put(e, r); - return r; - } - const [a, i] = t; - r += a; - return next(i); - }); - return next(e); - } - get baseUrl() { - const e = this._catDict.get('URI'); - if (e instanceof n.Dict) { - const t = e.get('Base'); - if ('string' == typeof t) { - const e = (0, i.createValidAbsoluteUrl)(t, null, { tryConvertEncoding: !0 }); - if (e) return (0, i.shadow)(this, 'baseUrl', e.href); - } - } - return (0, i.shadow)(this, 'baseUrl', null); - } - static parseDestDictionary(e) { - const t = e.destDict; - if (!(t instanceof n.Dict)) { - (0, i.warn)('parseDestDictionary: `destDict` must be a dictionary.'); - return; - } - const a = e.resultObj; - if ('object' != typeof a) { - (0, i.warn)('parseDestDictionary: `resultObj` must be an object.'); - return; - } - const s = e.docBaseUrl || null, - c = e.docAttachments || null; - let l, - h, - u = t.get('A'); - if (!(u instanceof n.Dict)) - if (t.has('Dest')) u = t.get('Dest'); - else { - u = t.get('AA'); - u instanceof n.Dict && - (u.has('D') ? (u = u.get('D')) : u.has('U') && (u = u.get('U'))); - } - if (u instanceof n.Dict) { - const e = u.get('S'); - if (!(e instanceof n.Name)) { - (0, i.warn)('parseDestDictionary: Invalid type in Action dictionary.'); - return; - } - const t = e.name; - switch (t) { - case 'ResetForm': - const e = u.get('Flags'), - s = 0 == (1 & ('number' == typeof e ? e : 0)), - d = [], - f = []; - for (const e of u.get('Fields') || []) - e instanceof n.Ref - ? f.push(e.toString()) - : 'string' == typeof e && d.push((0, i.stringToPDFString)(e)); - a.resetForm = { fields: d, refs: f, include: s }; - break; - case 'URI': - l = u.get('URI'); - l instanceof n.Name && (l = '/' + l.name); - break; - case 'GoTo': - h = u.get('D'); - break; - case 'Launch': - case 'GoToR': - const g = u.get('F'); - g instanceof n.Dict - ? (l = g.get('F') || null) - : 'string' == typeof g && (l = g); - let p = u.get('D'); - if (p) { - p instanceof n.Name && (p = p.name); - if ('string' == typeof l) { - const e = l.split('#')[0]; - 'string' == typeof p - ? (l = e + '#' + p) - : Array.isArray(p) && (l = e + '#' + JSON.stringify(p)); - } - } - const m = u.get('NewWindow'); - 'boolean' == typeof m && (a.newWindow = m); - break; - case 'GoToE': - const b = u.get('T'); - let y; - if (c && b instanceof n.Dict) { - const e = b.get('R'), - t = b.get('N'); - (0, n.isName)(e, 'C') && - 'string' == typeof t && - (y = c[(0, i.stringToPDFString)(t)]); - } - y - ? (a.attachment = y) - : (0, i.warn)('parseDestDictionary - unimplemented "GoToE" action.'); - break; - case 'Named': - const w = u.get('N'); - w instanceof n.Name && (a.action = w.name); - break; - case 'SetOCGState': - const S = u.get('State'), - x = u.get('PreserveRB'); - if (!Array.isArray(S) || 0 === S.length) break; - const C = []; - for (const e of S) - if (e instanceof n.Name) - switch (e.name) { - case 'ON': - case 'OFF': - case 'Toggle': - C.push(e.name); - } - else e instanceof n.Ref && C.push(e.toString()); - if (C.length !== S.length) break; - a.setOCGState = { state: C, preserveRB: 'boolean' != typeof x || x }; - break; - case 'JavaScript': - const k = u.get('JS'); - let v; - k instanceof o.BaseStream - ? (v = k.getString()) - : 'string' == typeof k && (v = k); - const F = v && (0, r.recoverJsURL)((0, i.stringToPDFString)(v)); - if (F) { - l = F.url; - a.newWindow = F.newWindow; - break; - } - default: - if ('JavaScript' === t || 'SubmitForm' === t) break; - (0, i.warn)(`parseDestDictionary - unsupported action: "${t}".`); - } - } else t.has('Dest') && (h = t.get('Dest')); - if ('string' == typeof l) { - const e = (0, i.createValidAbsoluteUrl)(l, s, { - addDefaultProtocol: !0, - tryConvertEncoding: !0, - }); - e && (a.url = e.href); - a.unsafeUrl = l; - } - if (h) { - h instanceof n.Name && (h = h.name); - 'string' == typeof h - ? (a.dest = (0, i.stringToPDFString)(h)) - : Array.isArray(h) && (a.dest = h); - } - } - } - t.Catalog = Catalog; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.NumberTree = t.NameTree = void 0; - var r = a(4), - i = a(2); - class NameOrNumberTree { - constructor(e, t, a) { - this.constructor === NameOrNumberTree && - (0, i.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 n = [this.root]; - for (; n.length > 0; ) { - const s = t.fetchIfRef(n.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 i.FormatError(`Duplicate entry in "${this._type}" tree.`); - n.push(t); - a.put(t); - } - continue; - } - const o = s.get(this._type); - if (Array.isArray(o)) - for (let a = 0, r = o.length; a < r; a += 2) - e.set(t.fetchIfRef(o[a]), t.fetchIfRef(o[a + 1])); - } - return e; - } - get(e) { - if (!this.root) return null; - const t = this.xref; - let a = t.fetchIfRef(this.root), - r = 0; - for (; a.has('Kids'); ) { - if (++r > 10) { - (0, i.warn)(`Search depth limit reached for "${this._type}" tree.`); - return null; - } - const n = a.get('Kids'); - if (!Array.isArray(n)) return null; - let s = 0, - o = n.length - 1; - for (; s <= o; ) { - const r = (s + o) >> 1, - i = t.fetchIfRef(n[r]), - c = i.get('Limits'); - if (e < t.fetchIfRef(c[0])) o = r - 1; - else { - if (!(e > t.fetchIfRef(c[1]))) { - a = i; - break; - } - s = r + 1; - } - } - if (s > o) return null; - } - const n = a.get(this._type); - if (Array.isArray(n)) { - let a = 0, - r = n.length - 2; - for (; a <= r; ) { - const i = (a + r) >> 1, - s = i + (1 & i), - o = t.fetchIfRef(n[s]); - if (e < o) r = s - 2; - else { - if (!(e > o)) return t.fetchIfRef(n[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, i.clearUnicodeCaches)(); - }; - var r = a(4), - i = a(40); - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.FileSpec = void 0; - var r = a(2), - i = a(5), - n = a(4); - 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 n.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) - .replaceAll('\\\\', '\\') - .replaceAll('\\/', '/') - .replaceAll('\\', '/'); - } - 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 i.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(/^[^<]+/, '').replaceAll(/>\\376\\377([^<]+)/g, function (e, t) { - const a = t - .replaceAll(/\\([0-3])([0-7])([0-7])/g, function (e, t, a, r) { - return String.fromCharCode(64 * t + 8 * a + 1 * r); - }) - .replaceAll(/&(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 < t; e += 2) { - const t = 256 * a.charCodeAt(e) + a.charCodeAt(e + 1); - t >= 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(4), - i = a(2), - n = 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 i = a.getRaw('Pg'); - i instanceof r.Ref && (e = i.toString()); - const n = a.get('Type') instanceof r.Name ? a.get('Type').name : null; - return 'MCR' === n - ? 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' === n - ? 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: i = null, - }) { - this.type = e; - this.dict = t; - this.mcid = a; - this.pageObjId = r; - this.refObjId = i; - 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 n.NumberTree(e, this.rootDict.xref).get(t); - if (!Array.isArray(a)) return; - const i = new Map(); - for (const e of a) e instanceof r.Ref && this.addNode(this.rootDict.xref.fetch(e), i); - } - addNode(e, t, a = 0) { - if (a > 40) { - (0, i.warn)('StructTree MAX_DEPTH reached.'); - return null; - } - if (t.has(e)) return t.get(e); - const n = new StructElementNode(this, e); - t.set(e, n); - const s = e.get('P'); - if (!s || (0, r.isName)(s.get('Type'), 'StructTreeRoot')) { - this.addTopLevelNode(e, n) || t.delete(e); - return n; - } - const o = this.addNode(s, t, a + 1); - if (!o) return n; - let c = !1; - for (const t of o.kids) - if (t.type === l && t.dict === e) { - t.parentNode = n; - c = !0; - } - c || t.delete(e); - return n; - } - 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 i = !1; - for (let r = 0; r < a.length; r++) { - const n = a[r]; - if (n && n.toString() === e.objId) { - this.nodes[r] = t; - i = !0; - } - } - return i; - } - get serializable() { - function nodeToSerializable(e, t, a = 0) { - if (a > 40) { - (0, i.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 n = e.dict.get('Alt'); - 'string' == typeof n && (r.alt = (0, i.stringToPDFString)(n)); - const h = e.dict.get('Lang'); - 'string' == typeof h && (r.lang = (0, i.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(4), - i = a(5), - n = a(3), - s = a(2); - function addChildren(e, t) { - if (e instanceof r.Dict) e = e.getRawValues(); - else if (e instanceof i.BaseStream) e = e.dict.getRawValues(); - else if (!Array.isArray(e)) return; - for (const n of e) - ((a = n) instanceof r.Ref || - a instanceof r.Dict || - a instanceof i.BaseStream || - Array.isArray(a)) && - t.push(n); - 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 (const r of e) { - const e = t.getRaw(r); - void 0 !== e && a.push(e); - } - return this._walk(a); - } - async _walk(e) { - const t = [], - a = []; - for (; e.length; ) { - let o = e.pop(); - if (o instanceof r.Ref) { - if (this.refSet.has(o)) continue; - try { - this.refSet.put(o); - o = this.xref.fetch(o); - } catch (e) { - if (!(e instanceof n.MissingDataException)) { - (0, s.warn)(`ObjectLoader._walk - requesting all data: "${e}".`); - this.refSet = null; - const { manager: t } = this.xref.stream; - return t.requestAllChunks(); - } - t.push(o); - a.push({ begin: e.begin, end: e.end }); - } - } - if (o instanceof i.BaseStream) { - const e = o.getBaseStreams(); - if (e) { - let r = !1; - for (const t of e) - if (!t.isDataLoaded) { - r = !0; - a.push({ begin: t.start, end: t.end }); - } - r && t.push(o); - } - } - addChildren(o, e); - } - if (a.length) { - await this.xref.stream.manager.requestRanges(a); - for (const e of t) e instanceof r.Ref && this.refSet.remove(e); - return this._walk(t); - } - this.refSet = null; - } - }; - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.XFAFactory = void 0; - var r = a(77), - i = a(81), - n = 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 i.Binder(this.root); - this.form = t.bind(); - this.dataHandler = new n.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: i } = a, - { attributes: n } = i; - if (n) { - n.class && (n.class = n.class.filter((e) => !e.startsWith('xfa'))); - n.dir = 'auto'; - } - return { html: i, 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), - i = a(2), - n = a(3), - 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 C = Symbol(); - t.$flushHTML = C; - const k = Symbol(); - t.$getAttributeIt = k; - 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 _ = Symbol(); - t.$getNextPage = _; - const $ = Symbol(); - t.$getSubformParent = $; - const j = Symbol(); - t.$getParent = j; - 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 J = Symbol(); - t.$isDescendent = J; - const Y = Symbol(); - t.$isNsAgnostic = Y; - 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 ie = Symbol('nodeName'); - t.$nodeName = ie; - const ne = Symbol(); - t.$nsAttributes = ne; - 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 Ce = Symbol(); - t.$toString = Ce; - const ke = Symbol(); - t.$toStyle = ke; - const ve = Symbol('uid'); - t.$uid = ve; - const Fe = Symbol(), - Oe = Symbol(), - Ie = Symbol(), - Te = Symbol('_children'), - Me = Symbol(), - Pe = Symbol(), - Ee = Symbol(), - De = Symbol(), - Be = Symbol(), - Ne = Symbol(), - Re = Symbol(), - Le = Symbol(), - _e = Symbol(), - $e = Symbol('parent'), - je = 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[ie] = t; - this[Re] = a; - this[$e] = null; - this[Te] = []; - this[ve] = `${t}${He++}`; - this[X] = null; - } - [se](e) { - if (!this[Re] || !this[oe](e)) return !1; - const t = e[ie], - 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, i.warn)(`XFA - node "${this[ie]}"${r} has already enough "${t}"!`); - return !1; - } - [oe](e) { - return this.hasOwnProperty(e[ie]) && e[re] === this[re]; - } - [Y]() { - 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[Te].push(e); - !e[X] && this[X] && (e[X] = this[X]); - } - [de](e) { - const t = this[Te].indexOf(e); - this[Te].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[Te].indexOf(e); - } - [W](e, t) { - t[$e] = this; - this[Te].splice(e, 0, t); - !t[X] && this[X] && (t[X] = this[X]); - } - [ee]() { - return !this.name; - } - [ae]() { - return ''; - } - [Se]() { - return 0 === this[Te].length ? this[b] : this[Te].map((e) => e[Se]()).join(''); - } - get [Ie]() { - 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, i.shadow)(this, Ie, e._attributes); - } - [J](e) { - let t = this; - for (; t; ) { - if (t === e) return !0; - t = t[j](); - } - return !1; - } - [j]() { - return this[$e]; - } - [$]() { - return this[j](); - } - [R](e = null) { - return e ? this[e] : this[Te]; - } - [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; - } - [ke]() { - 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[ie])) { - const e = this[F](), - t = a[Ae](e); - t.success || (this[S].failingNode = a); - yield t; - } - } - [C]() { - 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)); - } - [Ne](e) { - const t = this[Ie], - a = this[Ue]; - return [...e].filter((e) => t.has(e) && !a.has(e)); - } - [ge](e, t = new Set()) { - for (const a of this[Te]) a[je](e, t); - } - [je](e, t) { - const a = this[Be](e, t); - a ? this[Fe](a, e, t) : this[ge](e, t); - } - [Be](e, t) { - const { use: a, usehref: r } = this; - if (!a && !r) return null; - let n = null, - s = null, - c = null, - l = a; - if (r) { - l = r; - r.startsWith('#som(') && r.endsWith(')') - ? (s = r.slice(5, -1)) - : r.startsWith('.#som(') && r.endsWith(')') - ? (s = r.slice(6, -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) n = e.get(c); - else { - n = (0, o.searchNode)(e.get(fe), this, s, !0, !1); - n && (n = n[0]); - } - if (!n) { - (0, i.warn)(`XFA - Invalid prototype reference: ${l}.`); - return null; - } - if (n[ie] !== this[ie]) { - (0, i.warn)(`XFA - Incompatible prototype: ${n[ie]} !== ${this[ie]}.`); - return null; - } - if (t.has(n)) { - (0, i.warn)('XFA - Cycle detected in prototypes use.'); - return null; - } - t.add(n); - const h = n[Be](e, t); - h && n[Fe](h, e, t); - n[ge](e, t); - t.delete(n); - return n; - } - [Fe](e, t, a) { - if (a.has(e)) { - (0, i.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[Ne](e[Ue])) { - this[t] = e[t]; - this[Ue] && this[Ue].add(t); - } - for (const r of Object.getOwnPropertyNames(this)) { - if (this[Ie].has(r)) continue; - const i = this[r], - n = e[r]; - if (i instanceof XFAObjectArray) { - for (const e of i[Te]) e[je](t, a); - for (let r = i[Te].length, s = n[Te].length; r < s; r++) { - const n = e[Te][r][p](); - if (!i.push(n)) break; - n[$e] = this; - this[Te].push(n); - n[je](t, a); - } - } else if (null === i) { - if (null !== n) { - const e = n[p](); - e[$e] = this; - this[r] = e; - this[Te].push(e); - e[je](t, a); - } - } else { - i[ge](t, a); - n && i[Fe](n, t, a); - } - } - } - static [Me](e) { - return Array.isArray(e) - ? e.map((e) => XFAObject[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, i.shadow)(e, t, this[t]); - } - e[ve] = `${e[ie]}${He++}`; - e[Te] = []; - for (const t of Object.getOwnPropertyNames(this)) { - if (this[Ie].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[Te]) { - const a = t[ie], - r = t[p](); - e[Te].push(r); - r[$e] = e; - null === e[a] ? (e[a] = r) : e[a][Te].push(r); - } - return e; - } - [R](e = null) { - return e ? this[Te].filter((t) => t[ie] === e) : this[Te]; - } - [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[Te]) { - a[ie] === e && (yield a); - a.name === e && (yield a); - (t || a[ee]()) && (yield* a[M](e, t, !1)); - } - a && this[Ie].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[Te] = []; - } - push(e) { - if (this[Te].length <= this[Le]) { - this[Te].push(e); - return !0; - } - (0, i.warn)(`XFA - node "${e[ie]}" accepts no more than ${this[Le]} children`); - return !1; - } - isEmpty() { - return 0 === this[Te].length; - } - dump() { - return 1 === this[Te].length ? this[Te][0][w]() : this[Te].map((e) => e[w]()); - } - [p]() { - const e = new XFAObjectArray(this[Le]); - e[Te] = this[Te].map((e) => e[p]()); - return e; - } - get children() { - return this[Te]; - } - clear() { - this[Te].length = 0; - } - } - t.XFAObjectArray = XFAObjectArray; - class XFAAttribute { - constructor(e, t, a) { - this[$e] = e; - this[ie] = t; - this[b] = a; - this[m] = !1; - this[ve] = 'attribute' + He++; - } - [j]() { - return this[$e]; - } - [K]() { - return !0; - } - [E]() { - return this[b].trim(); - } - [ye](e) { - e = e.value || ''; - this[b] = e.toString(); - } - [Se]() { - return this[b]; - } - [J](e) { - return this[$e] === e || this[$e][J](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(ne)) { - const e = a[ne].xfa.dataNode; - void 0 !== e && - ('dataGroup' === e ? (this[Pe] = !1) : 'dataValue' === e && (this[Pe] = !0)); - } - } - this[m] = !1; - } - [Ce](e) { - const t = this[ie]; - if ('#text' === t) { - e.push((0, n.encodeToXmlString)(this[b])); - return; - } - const a = (0, i.utf8StringToString)(t), - r = this[re] === qe ? 'xfa:' : ''; - e.push(`<${r}${a}`); - for (const [t, a] of this[Oe].entries()) { - const r = (0, i.utf8StringToString)(t); - e.push(` ${r}="${(0, n.encodeToXmlString)(a[b])}"`); - } - null !== this[Pe] && - (this[Pe] - ? e.push(' xfa:dataNode="dataValue"') - : e.push(' xfa:dataNode="dataGroup"')); - if (this[b] || 0 !== this[Te].length) { - e.push('>'); - if (this[b]) - 'string' == typeof this[b] - ? e.push((0, n.encodeToXmlString)(this[b])) - : this[b][Ce](e); - else for (const t of this[Te]) t[Ce](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[Te].length > 0) { - const e = new XmlObject(this[re], '#text'); - this[h](e); - e[b] = this[b]; - delete this[b]; - } - } - [Ae]() { - return '#text' === this[ie] - ? r.HTMLResult.success({ name: '#text', value: this[b] }) - : r.HTMLResult.EMPTY; - } - [R](e = null) { - return e ? this[Te].filter((t) => t[ie] === e) : this[Te]; - } - [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[Te]) { - a[ie] === e && (yield a); - t && (yield* a[M](e, t)); - } - } - *[k](e, t) { - const a = this[Oe].get(e); - !a || (t && a[m]) || (yield a); - for (const a of this[Te]) yield* a[k](e, t); - } - *[N](e, t, a) { - for (const r of this[Te]) { - r[ie] !== e || (a && r[m]) || (yield r); - t && (yield* r[N](e, t, a)); - } - } - [K]() { - return null === this[Pe] - ? 0 === this[Te].length || this[Te][0][re] === s.NamespaceIds.xhtml.id - : this[Pe]; - } - [E]() { - return null === this[Pe] - ? 0 === this[Te].length - ? this[b].trim() - : this[Te][0][re] === s.NamespaceIds.xhtml.id - ? this[Te][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[ie]; - t.children = []; - for (const a of this[Te]) 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[_e] = a; - } - [x]() { - this[b] = (0, r.getKeyword)({ - data: this[b], - defaultValue: this[_e][0], - validate: (e) => this[_e].includes(e), - }); - } - [d](e) { - super[d](e); - delete this[_e]; - } - }; - 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, i, n, s] = a; - return { x: r, y: i, width: n, height: s }; - }; - t.getColor = function getColor(e, t = [0, 0, 0]) { - let [a, r, i] = t; - if (!e) return { r: a, g: r, b: i }; - const n = e - .trim() - .split(/\s*,\s*/) - .map((e) => Math.min(Math.max(0, parseInt(e.trim(), 10)), 255)) - .map((e) => (isNaN(e) ? 0 : e)); - if (n.length < 3) return { r: a, g: r, b: i }; - [a, r, i] = n; - return { r: a, g: r, b: i }; - }; - 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, -1); - return e; - }; - var r = a(2); - const i = { - pt: (e) => e, - cm: (e) => (e / 2.54) * 72, - mm: (e) => (e / 25.4) * 72, - in: (e) => 72 * e, - px: (e) => e, - }, - n = /([+-]?\d+\.?\d*)(.*)/; - function getKeyword({ data: e, defaultValue: t, validate: a }) { - return e && a((e = e.trim())) ? e : t; - } - function getMeasurement(e, t = '0') { - t ||= '0'; - if (!e) return getMeasurement(t); - const a = e.trim().match(n); - 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 = i[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 i = parseExpression(a); - if (!i) return null; - if (i.some((e) => e.operator === c.dotDot)) return null; - const s = l.get(i[0].name); - let o = 0; - if (s) { - e = s(e, t); - o = 1; - } else e = t || e; - for (let t = i.length; o < t; o++) { - const { name: t, operator: a, index: s } = i[o]; - if (!isFinite(s)) { - i[o].index = 0; - return createNodes(e, i.slice(o)); - } - let l; - switch (a) { - case c.dot: - l = e[r.$getChildrenByName](t, !1); - break; - case c.dotDot: - l = e[r.$getChildrenByName](t, !0); - break; - case c.dotHash: - l = e[r.$getChildrenByClass](t); - l = l instanceof r.XFAObjectArray ? l.children : [l]; - } - if (0 === l.length) return createNodes(e, i.slice(o)); - if (!(s < l.length)) { - i[o].index = s - l.length; - return createNodes(e, i.slice(o)); - } - { - const t = l[s]; - if (!(t instanceof r.XFAObject)) { - (0, n.warn)('XFA - Cannot create a node.'); - return null; - } - e = t; - } - } - return null; - }; - t.searchNode = function searchNode(e, t, a, i = !0, n = !0) { - const s = parseExpression(a, i); - if (!s) return null; - const o = l.get(s[0].name); - let u, - d = 0; - if (o) { - u = !0; - e = [o(e, t)]; - d = 1; - } else { - u = null === t; - e = [t || e]; - } - for (let a = s.length; d < a; d++) { - const { name: a, cacheName: i, operator: o, index: l } = s[d], - f = []; - for (const t of e) { - if (!(t instanceof r.XFAObject)) continue; - let e, s; - if (n) { - s = h.get(t); - if (!s) { - s = new Map(); - h.set(t, s); - } - e = s.get(i); - } - if (!e) { - switch (o) { - case c.dot: - e = t[r.$getChildrenByName](a, !1); - break; - case c.dotDot: - e = t[r.$getChildrenByName](a, !0); - break; - case c.dotHash: - e = t[r.$getChildrenByClass](a); - e = e instanceof r.XFAObjectArray ? e.children : [e]; - } - n && s.set(i, e); - } - e.length > 0 && f.push(e); - } - if (0 !== f.length || u || 0 !== d) - e = isFinite(l) ? f.filter((e) => l < e.length).map((e) => e[l]) : f.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), - i = a(79), - n = a(2); - const s = /^[^.[]+/, - o = /^[^\]]+/, - c = { dot: 0, dotDot: 1, dotHash: 2, dotBracket: 3, dotParen: 4 }, - l = 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], - ]), - h = new WeakMap(), - u = i.NamespaceIds.datasets.id; - function parseExpression(e, t, a = !0) { - let r = e.match(s); - if (!r) return null; - let [i] = r; - const l = [ - { name: i, cacheName: '.' + i, index: 0, js: null, formCalc: null, operator: c.dot }, - ]; - let h = i.length; - for (; h < e.length; ) { - const d = h; - if ('[' === e.charAt(h++)) { - r = e.slice(h).match(o); - if (!r) { - (0, n.warn)('XFA - Invalid index in SOM expression'); - return null; - } - l.at(-1).index = '*' === (u = (u = r[0]).trim()) ? 1 / 0 : parseInt(u, 10) || 0; - h += r[0].length + 1; - continue; - } - let f; - switch (e.charAt(h)) { - case '.': - if (!t) return null; - h++; - f = c.dotDot; - break; - case '#': - h++; - f = c.dotHash; - break; - case '[': - if (a) { - (0, n.warn)( - 'XFA - SOM expression contains a FormCalc subexpression which is not supported for now.', - ); - return null; - } - f = c.dotBracket; - break; - case '(': - if (a) { - (0, n.warn)( - 'XFA - SOM expression contains a JavaScript subexpression which is not supported for now.', - ); - return null; - } - f = c.dotParen; - break; - default: - f = c.dot; - } - r = e.slice(h).match(s); - if (!r) break; - [i] = r; - h += i.length; - l.push({ - name: i, - cacheName: e.slice(d, h), - operator: f, - index: 0, - js: null, - formCalc: null, - }); - } - var u; - return l; - } - function createNodes(e, t) { - let a = null; - for (const { name: i, index: n } of t) { - for (let t = 0, s = isFinite(n) ? n : 0; t <= s; t++) { - const t = e[r.$namespaceId] === u ? -1 : e[r.$namespaceId]; - a = new r.XmlObject(t, i); - e[r.$appendChild](a); - } - e = a; - } - return a; - } - }, - (e, t, a) => { - Object.defineProperty(t, '__esModule', { value: !0 }); - t.Binder = void 0; - var r = a(77), - i = a(82), - n = a(80), - s = a(79), - o = a(2); - const c = s.NamespaceIds.datasets.id; - function createText(e) { - const t = new i.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 i.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, i) { - if (!e) return null; - let n, o; - for (let i = 0; i < 3; i++) { - n = a[r.$getRealChildrenByNameIt](e, !1, !0); - for (;;) { - o = n.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 (!i) return null; - n = this.data[r.$getRealChildrenByNameIt](e, !0, !1); - o = n.next().value; - if (o) return o; - n = this.data[r.$getAttributeIt](e, !0); - o = n.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, n.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, n.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 i.SetProperty || f instanceof i.SetProperty) { - (0, o.warn)( - 'XFA - Invalid target: cannot be a setProperty or one of its properties.', - ); - continue; - } - if (d instanceof i.BindItems || f instanceof i.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 i.Items({}), - s = new i.Items({}); - e[r.$appendChild](a); - e.items.push(a); - e[r.$appendChild](s); - e.items.push(s); - for (const { ref: i, labelRef: c, valueRef: l, connection: h } of e.bindItems - .children) { - if (h) continue; - if (!i) continue; - const e = (0, n.searchNode)(this.root, t, i, !1, !1); - if (e) - for (const t of e) { - if (!t[r.$isDescendent](this.datasets)) { - (0, o.warn)(`XFA - Invalid ref (${i}): must be a datasets child.`); - continue; - } - const e = (0, n.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, n.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: ${i}.`); - } - } - _bindOccurrences(e, t, a) { - let i; - if (t.length > 1) { - i = e[r.$clone](); - i[r.$removeChild](i.occur); - i.occur = null; - } - this._bindValue(e, t[0], a); - this._setProperties(e, t[0]); - this._bindItems(e, t[0]); - if (1 === t.length) return; - const n = e[r.$getParent](), - s = e[r.$nodeName], - o = n[r.$indexOf](e); - for (let e = 1, c = t.length; e < c; e++) { - const c = t[e], - l = i[r.$clone](); - n[s].push(l); - n[r.$insertAt](o + e, l); - this._bindValue(l, c, a); - this._setProperties(l, c); - this._bindItems(l, c); - } - } - _createOccurrences(e) { - if (!this.emptyMerge) return; - const { occur: t } = e; - if (!t || t.initial <= 1) return; - const a = e[r.$getParent](), - i = e[r.$nodeName]; - if (!(a[i] instanceof r.XFAObjectArray)) return; - let n; - n = e.name - ? a[i].children.filter((t) => t.name === e.name).length - : a[i].children.length; - const s = a[r.$indexOf](e) + 1, - o = t.initial - n; - if (o) { - const t = e[r.$clone](); - t[r.$removeChild](t.occur); - t.occur = null; - a[i].push(t); - a[r.$insertAt](s, t); - for (let e = 1; e < o; e++) { - const n = t[r.$clone](); - a[i].push(n); - a[r.$insertAt](s + e, n); - } - } - } - _getOccurInfo(e) { - const { name: t, occur: a } = e; - if (!a || !t) return [1, 1]; - const r = -1 === a.max ? 1 / 0 : a.max; - return [a.min, r]; - } - _setAndBind(e, t) { - this._setProperties(e, t); - this._bindItems(e, t); - this._bindElement(e, t); - } - _bindElement(e, t) { - const a = []; - this._createOccurrences(e); - for (const i of e[r.$getChildren]()) { - if (i[r.$data]) continue; - if (void 0 === this._mergeMode && 'subform' === i[r.$nodeName]) { - this._mergeMode = 'consumeData' === i.mergeMode; - const e = t[r.$getChildren](); - if (e.length > 0) this._bindOccurrences(i, [e[0]], null); - else if (this.emptyMerge) { - const e = t[r.$namespaceId] === c ? -1 : t[r.$namespaceId], - a = (i[r.$data] = new r.XmlObject(e, i.name || 'root')); - t[r.$appendChild](a); - this._bindElement(i, a); - } - continue; - } - if (!i[r.$isBindable]()) continue; - let e = !1, - s = null, - l = null, - h = null; - if (i.bind) { - switch (i.bind.match) { - case 'none': - this._setAndBind(i, t); - continue; - case 'global': - e = !0; - break; - case 'dataRef': - if (!i.bind.ref) { - (0, o.warn)(`XFA - ref is empty in node ${i[r.$nodeName]}.`); - this._setAndBind(i, t); - continue; - } - l = i.bind.ref; - } - i.bind.picture && (s = i.bind.picture[r.$content]); - } - const [u, d] = this._getOccurInfo(i); - if (l) { - h = (0, n.searchNode)(this.root, t, l, !0, !1); - if (null === h) { - h = (0, n.createDataNode)(this.data, t, l); - if (!h) continue; - this._isConsumeData() && (h[r.$consumed] = !0); - this._setAndBind(i, 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 (!i.name) { - this._setAndBind(i, t); - continue; - } - if (this._isConsumeData()) { - const a = []; - for (; a.length < d; ) { - const n = this._findDataByNameToConsume( - i.name, - i[r.$hasSettableValue](), - t, - e, - ); - if (!n) break; - n[r.$consumed] = !0; - a.push(n); - } - h = a.length > 0 ? a : null; - } else { - h = t[r.$getRealChildrenByNameIt](i.name, !1, this.emptyMerge).next().value; - if (!h) { - if (0 === u) { - a.push(i); - continue; - } - const e = t[r.$namespaceId] === c ? -1 : t[r.$namespaceId]; - h = i[r.$data] = new r.XmlObject(e, i.name); - this.emptyMerge && (h[r.$consumed] = !0); - t[r.$appendChild](h); - this._setAndBind(i, h); - continue; - } - this.emptyMerge && (h[r.$consumed] = !0); - h = [h]; - } - } - h ? this._bindOccurrences(i, h, s) : u > 0 ? this._setAndBind(i, t) : a.push(i); - } - 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), - i = a(79), - n = a(83), - s = a(84), - o = a(78), - c = a(2), - l = a(85), - h = a(3), - u = a(80); - const d = i.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 i = a[r.$searchNode](t.ref, e); - if (!i) return; - e = i[0]; - } - } - function applyAssist(e, t) { - const a = e.assist; - if (a) { - const e = a[r.$toHTML](); - e && (t.title = e); - const i = a.role.match(g); - if (i) { - const e = 'heading', - a = i[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: i, currentContentArea: n } = t[r.$extra]; - if ('pageArea' === e.targetType) { - a instanceof PageArea || (a = null); - if (e.startNew) { - e[r.$extra].target = a || i; - return !0; - } - if (a && a !== i) { - 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(n), - r = e.indexOf(a); - -1 !== t && t < r && (c = null); - o = r - 1; - } else o = i.contentArea.children.indexOf(n); - else { - if (!a || a === n) return !1; - o = s.contentArea.children.indexOf(a) - 1; - c = s === i ? null : s; - } - e[r.$extra].target = c; - e[r.$extra].index = o; - return !0; - } - function handleOverflow(e, t, a) { - const i = e[r.$getTemplateRoot](), - n = i[r.$extra].noLayoutFailure, - s = t[r.$getSubformParent]; - t[r.$getSubformParent] = () => e; - i[r.$extra].noLayoutFailure = !0; - const o = t[r.$toHTML](a); - e[r.$addHTML](o.html, o.bbox); - i[r.$extra].noLayoutFailure = n; - 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 i; - const n = { xmlns: f, style: { width: '100%', height: '100%', overflow: 'visible' } }; - if (360 === this.sweepAngle) - i = { - 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)), - ]; - i = { - 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(n, { viewBox: '0 0 100 100', preserveAspectRatio: 'none' }); - } - const c = { name: 'svg', children: [i], attributes: n }; - 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, i, n, s] = t; - this[r.$extra].width = Math.max(this[r.$extra].width, a + n); - this[r.$extra].height = Math.max(this[r.$extra].height, i + 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 i = []; - this[r.$extra] = { children: i, width: 0, height: 0, availableSpace: e }; - const n = this[r.$childrenToHTML]({ - filter: new Set(['area', 'draw', 'field', 'exclGroup', 'subform', 'subformSet']), - include: !0, - }); - if (!n.success) { - if (n.isBreak()) return n; - 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: i }, - 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 i = (0, s.fixURL)(t.url); - i && - a.children.push({ - name: 'a', - attributes: { - id: 'link' + this[r.$uid], - href: i, - 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 i = []; - 'string' == typeof t ? i.push({ name: '#text', value: t }) : i.push(t); - const n = (0, s.toStyle)(this, 'font', 'margin', 'visibility'); - switch (this.placement) { - case 'left': - case 'right': - this.reserve > 0 && (n.width = (0, s.measureToString)(this.reserve)); - break; - case 'top': - case 'bottom': - this.reserve > 0 && (n.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: n, class: ['xfaCaption'] }, - children: i, - }); - } - } - 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 i, n, 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]; - i = 'radio'; - n = 'xfaRadio'; - p = (f[r.$data] && f[r.$data][r.$uid]) || f[r.$uid]; - } else { - i = 'checkbox'; - n = 'xfaCheckbox'; - p = (l[r.$data] && l[r.$data][r.$uid]) || l[r.$uid]; - } - const m = { - name: 'input', - attributes: { - class: [n], - style: t, - fieldId: g, - dataId: p, - type: i, - 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](), - i = { fontSize: `calc(${(a.font && a.font.size) || 10}px * var(--scale-factor))` }, - n = []; - 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; e < t; e++) { - const t = { - name: 'option', - attributes: { value: c[e] || o[e], style: i }, - value: o[e], - }; - c[e] === h && (t.attributes.selected = l = !0); - n.push(t); - } - l || - n.splice(0, 0, { - name: 'option', - attributes: { hidden: !0, selected: !0 }, - value: ' ', - }); - } - const c = { - class: ['xfaSelect'], - fieldId: a[r.$uid], - dataId: (a[r.$data] && a[r.$data][r.$uid]) || a[r.$uid], - style: t, - 'aria-label': ariaLabel(a), - 'aria-required': !1, - }; - if (isRequired(a)) { - c['aria-required'] = !0; - c.required = !0; - } - 'multiSelect' === this.open && (c.multiple = !0); - return o.HTMLResult.success({ - name: 'label', - attributes: { class: ['xfaLabel'] }, - children: [{ name: 'select', children: n, attributes: c }], - }); - } - } - class Color extends r.XFAObject { - constructor(e) { - super(d, 'color', !0); - this.cSpace = (0, o.getStringOption)(e.cSpace, ['SRGB']); - this.id = e.id || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - this.value = e.value ? (0, o.getColor)(e.value) : ''; - this.extras = null; - } - [r.$hasSettableValue]() { - return !1; - } - [r.$toStyle]() { - return this.value - ? c.Util.makeHexColor(this.value.r, this.value.g, this.value.b) - : null; - } - } - class Comb extends r.XFAObject { - constructor(e) { - super(d, 'comb'); - this.id = e.id || ''; - this.numberOfCells = (0, o.getInteger)({ - data: e.numberOfCells, - defaultValue: 0, - validate: (e) => e >= 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](), - i = { - 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)) { - i.attributes['aria-required'] = !0; - i.attributes.required = !0; - } - return o.HTMLResult.success({ - name: 'label', - attributes: { class: ['xfaLabel'] }, - children: [i], - }); - } - } - 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: i, h: c, isBroken: l } = (0, s.layoutNode)(this, e); - if (i && '' === this.w) { - if (l && this[r.$getSubformParent]()[r.$isThereMoreWidth]()) { - this[r.$popPara](); - return o.HTMLResult.FAILURE; - } - this.w = i; - } - c && '' === this.h && (this.h = c); - setFirstUnsplittable(this); - if (!(0, n.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] === i.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, n.flushHTML)(this); - } - [r.$addHTML](e, t) { - (0, n.addHTML)(this, e, t); - } - [r.$getAvailableSpace]() { - return (0, n.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 i = this[r.$isSplittable](); - i || setFirstUnsplittable(this); - if (!(0, n.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].attempt < f; this[r.$extra].attempt++) { - d && 1 === this[r.$extra].attempt && (this[r.$extra].numberInLine = 0); - const e = this[r.$childrenToHTML]({ filter: c, include: !0 }); - if (e.success) break; - if (e.isBreak()) { - this[r.$popPara](); - return e; - } - if ( - d && - 0 === this[r.$extra].attempt && - 0 === this[r.$extra].numberInLine && - !this[r.$getTemplateRoot]()[r.$extra].noLayoutFailure - ) { - this[r.$extra].attempt = f; - break; - } - } - this[r.$popPara](); - i || unsetFirstUnsplittable(this); - if (this[r.$extra].attempt === f) { - i || delete this[r.$extra]; - return o.HTMLResult.FAILURE; - } - let g = 0, - p = 0; - if (this.margin) { - g = this.margin.leftInset + this.margin.rightInset; - p = this.margin.topInset + this.margin.bottomInset; - } - const m = Math.max(this[r.$extra].width + g, this.w || 0), - b = Math.max(this[r.$extra].height + p, this.h || 0), - y = [this.x, this.y, m, b]; - '' === this.w && (l.width = (0, s.measureToString)(m)); - '' === this.h && (l.height = (0, s.measureToString)(b)); - const w = { name: 'div', attributes: a, children: t }; - applyAssist(this, a); - delete this[r.$extra]; - return o.HTMLResult.success((0, s.createWrapper)(this, w), y); - } - } - class Execute extends r.XFAObject { - constructor(e) { - super(d, 'execute'); - this.connection = e.connection || ''; - this.executeType = (0, o.getStringOption)(e.executeType, ['import', 'remerge']); - this.id = e.id || ''; - this.runAt = (0, o.getStringOption)(e.runAt, ['client', 'both', 'server']); - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class Extras extends r.XFAObject { - constructor(e) { - super(d, 'extras', !0); - this.id = e.id || ''; - this.name = e.name || ''; - 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.extras = 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 Field extends r.XFAObject { - constructor(e) { - super(d, 'field', !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.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, - i = 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, - i = 0, - n = 0; - if (this.ui.checkButton) i = n = this.ui.checkButton.size; - else { - const { w: t, h: a } = (0, s.layoutNode)(this, e); - if (null !== t) { - i = t; - n = a; - } else n = (0, l.getMetrics)(this.font, !0).lineNoGap; - } - u = getBorderDims(this.ui[r.$getExtra]()); - i += u.w; - n += 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 += i; - break; - case 'top': - case 'bottom': - a += n; - } - } else { - t = i; - a = n; - } - if (t && '' === this.w) { - t += c; - this.w = Math.min( - this.maxW <= 0 ? 1 / 0 : this.maxW, - this.minW + 1 < t ? t : this.minW, - ); - } - if (a && '' === this.h) { - a += h; - this.h = Math.min( - this.maxH <= 0 ? 1 / 0 : this.maxH, - this.minH + 1 < a ? a : this.minH, - ); - } - } - this[r.$popPara](); - (0, s.fixDimensions)(this); - setFirstUnsplittable(this); - if (!(0, n.checkDimensions)(this, e)) { - this.w = a; - this.h = i; - this[r.$popPara](); - return o.HTMLResult.FAILURE; - } - unsetFirstUnsplittable(this); - const d = (0, s.toStyle)( - this, - 'font', - 'dimensions', - 'position', - 'rotate', - 'anchorType', - 'presence', - 'margin', - 'hAlign', - ); - (0, s.setMinMaxDimensions)(this, d); - const f = ['xfaField']; - this.font && f.push('xfaFont'); - (0, s.isPrintOnly)(this) && f.push('xfaPrintOnly'); - const g = { style: d, id: this[r.$uid], class: f }; - if (d.margin) { - d.padding = d.margin; - delete d.margin; - } - (0, s.setAccess)(this, f); - this.name && (g.xfaName = this.name); - const p = [], - m = { name: 'div', attributes: g, children: p }; - applyAssist(this, g); - const b = this.border ? this.border[r.$toStyle]() : null, - y = (0, s.computeBbox)(this, m, e), - w = this.ui[r.$toHTML]().html; - if (!w) { - Object.assign(d, b); - return o.HTMLResult.success((0, s.createWrapper)(this, m), y); - } - this[r.$tabIndex] && - (w.children && w.children[0] - ? (w.children[0].attributes.tabindex = this[r.$tabIndex]) - : (w.attributes.tabindex = this[r.$tabIndex])); - w.attributes.style || (w.attributes.style = Object.create(null)); - let S = null; - if (this.ui.button) { - 1 === w.children.length && ([S] = w.children.splice(0, 1)); - Object.assign(w.attributes.style, b); - } else Object.assign(d, b); - p.push(w); - if (this.value) - if (this.ui.imageEdit) w.children.push(this.value[r.$toHTML]().html); - else if (!this.ui.button) { - let e = ''; - if (this.value.exData) e = this.value.exData[r.$text](); - else if (this.value.text) e = this.value.text[r.$getExtra](); - else { - const t = this.value[r.$toHTML]().html; - null !== t && (e = t.children[0].value); - } - this.ui.textEdit && - this.value.text && - this.value.text.maxChars && - (w.children[0].attributes.maxLength = this.value.text.maxChars); - if (e) { - if (this.ui.numericEdit) { - e = parseFloat(e); - e = isNaN(e) ? '' : e.toString(); - } - 'textarea' === w.children[0].name - ? (w.children[0].attributes.textContent = e) - : (w.children[0].attributes.value = e); - } - } - if (!this.ui.imageEdit && w.children && w.children[0] && this.h) { - u = u || getBorderDims(this.ui[r.$getExtra]()); - let t = 0; - if (this.caption && ['top', 'bottom'].includes(this.caption.placement)) { - t = this.caption.reserve; - t <= 0 && (t = this.caption[r.$getExtra](e).h); - const a = this.h - t - h - u.h; - w.children[0].attributes.style.height = (0, s.measureToString)(a); - } else w.children[0].attributes.style.height = '100%'; - } - S && w.children.push(S); - if (!t) { - w.attributes.class && w.attributes.class.push('xfaLeft'); - this.w = a; - this.h = i; - return o.HTMLResult.success((0, s.createWrapper)(this, m), y); - } - if (this.ui.button) { - d.padding && delete d.padding; - 'div' === t.name && (t.name = 'span'); - w.children.push(t); - return o.HTMLResult.success(m, y); - } - this.ui.checkButton && (t.attributes.class[0] = 'xfaCaptionForCheckButton'); - w.attributes.class || (w.attributes.class = []); - w.children.splice(0, 0, t); - switch (this.caption.placement) { - case 'left': - case 'inline': - w.attributes.class.push('xfaLeft'); - break; - case 'right': - w.attributes.class.push('xfaRight'); - break; - case 'top': - w.attributes.class.push('xfaTop'); - break; - case 'bottom': - w.attributes.class.push('xfaBottom'); - } - this.w = a; - this.h = i; - return o.HTMLResult.success((0, s.createWrapper)(this, m), y); - } - } - t.Field = Field; - class Fill extends r.XFAObject { - constructor(e) { - super(d, 'fill', !0); - this.id = e.id || ''; - this.presence = (0, o.getStringOption)(e.presence, [ - 'visible', - 'hidden', - 'inactive', - 'invisible', - ]); - this.use = e.use || ''; - this.usehref = e.usehref || ''; - this.color = null; - this.extras = null; - this.linear = null; - this.pattern = null; - this.radial = null; - this.solid = null; - this.stipple = null; - } - [r.$toStyle]() { - const e = this[r.$getParent](), - t = e[r.$getParent]()[r.$getParent](), - a = Object.create(null); - let i = 'color', - n = i; - if (e instanceof Border) { - i = 'background-color'; - n = 'background'; - t instanceof Ui && (a.backgroundColor = 'white'); - } - if (e instanceof Rectangle || e instanceof Arc) { - i = n = 'fill'; - a.fill = 'white'; - } - for (const e of Object.getOwnPropertyNames(this)) { - if ('extras' === e || 'color' === e) continue; - const t = this[e]; - if (!(t instanceof r.XFAObject)) continue; - const s = t[r.$toStyle](this.color); - s && (a[s.startsWith('#') ? i : n] = s); - return a; - } - if (this.color && this.color.value) { - const e = this.color[r.$toStyle](); - a[e.startsWith('#') ? i : n] = e; - } - return a; - } - } - class Filter extends r.XFAObject { - constructor(e) { - super(d, 'filter', !0); - this.addRevocationInfo = (0, o.getStringOption)(e.addRevocationInfo, [ - '', - 'required', - 'optional', - 'none', - ]); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - this.version = (0, o.getInteger)({ - data: this.version, - defaultValue: 5, - validate: (e) => e >= 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)(0.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 i = this[r.$getParent](); - return o.HTMLResult.success({ - name: 'img', - attributes: { - class: ['xfaImage'], - style: a, - src: URL.createObjectURL(t), - alt: i ? ariaLabel(i[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](), - i = Object.create(null), - n = 'visible' === t.presence ? t.thickness : 0; - i.strokeWidth = (0, s.measureToString)(n); - i.stroke = a.color; - let c, - l, - h, - u, - d = '100%', - g = '100%'; - if (e.w <= n) { - [c, l, h, u] = ['50%', 0, '50%', '100%']; - d = i.strokeWidth; - } else if (e.h <= n) { - [c, l, h, u] = [0, '50%', '100%', '50%']; - g = i.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: i } }, - ], - 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](), - i = { - 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)) { - i.attributes['aria-required'] = !0; - i.attributes.required = !0; - } - return o.HTMLResult.success({ - name: 'label', - attributes: { class: ['xfaLabel'] }, - children: [i], - }); - } - } - 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 < this.min && (this.max = this.min); - '' === this.initial && (this.initial = e instanceof Template ? 1 : this.min); - } - } - class Oid extends r.StringObject { - constructor(e) { - super(d, 'oid'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class Oids extends r.XFAObject { - constructor(e) { - super(d, 'oids', !0); - this.id = e.id || ''; - this.type = (0, o.getStringOption)(e.type, ['optional', 'required']); - this.use = e.use || ''; - this.usehref = e.usehref || ''; - this.oid = new r.XFAObjectArray(); - } - } - class Overflow extends r.XFAObject { - constructor(e) { - super(d, 'overflow'); - this.id = e.id || ''; - this.leader = e.leader || ''; - this.target = e.target || ''; - this.trailer = e.trailer || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - [r.$getExtra]() { - if (!this[r.$extra]) { - const e = this[r.$getParent](), - t = this[r.$getTemplateRoot](), - a = t[r.$searchNode](this.target, e), - i = t[r.$searchNode](this.leader, e), - n = t[r.$searchNode](this.trailer, e); - this[r.$extra] = { - target: (a && a[0]) || null, - leader: (i && i[0]) || null, - trailer: (n && n[0]) || null, - addLeader: !1, - addTrailer: !1, - }; - } - return this[r.$extra]; - } - } - class PageArea extends r.XFAObject { - constructor(e) { - super(d, 'pageArea', !0); - this.blankOrNotBlank = (0, o.getStringOption)(e.blankOrNotBlank, [ - 'any', - 'blank', - 'notBlank', - ]); - this.id = e.id || ''; - this.initialNumber = (0, o.getInteger)({ - data: e.initialNumber, - defaultValue: 1, - validate: (e) => !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].numberOfUse < this.occur.max - ); - } - [r.$cleanPage]() { - delete this[r.$extra]; - } - [r.$getNextPage]() { - this[r.$extra] || (this[r.$extra] = { numberOfUse: 0 }); - const e = this[r.$getParent](); - if ('orderedOccurrence' === e.relation && this[r.$isUsable]()) { - this[r.$extra].numberOfUse += 1; - return this; - } - return e[r.$getNextPage](); - } - [r.$getAvailableSpace]() { - return this[r.$extra].space || { width: 0, height: 0 }; - } - [r.$toHTML]() { - this[r.$extra] || (this[r.$extra] = { numberOfUse: 1 }); - const e = []; - this[r.$extra].children = e; - const t = Object.create(null); - if (this.medium && this.medium.short && this.medium.long) { - t.width = (0, s.measureToString)(this.medium.short); - t.height = (0, s.measureToString)(this.medium.long); - this[r.$extra].space = { width: this.medium.short, height: this.medium.long }; - if ('landscape' === this.medium.orientation) { - const e = t.width; - t.width = t.height; - t.height = e; - this[r.$extra].space = { width: this.medium.long, height: this.medium.short }; - } - } else (0, c.warn)('XFA - No medium specified in pageArea: please file a bug.'); - this[r.$childrenToHTML]({ - filter: new Set(['area', 'draw', 'field', 'subform']), - include: !0, - }); - this[r.$childrenToHTML]({ filter: new Set(['contentArea']), include: !0 }); - return o.HTMLResult.success({ - name: 'div', - children: e, - attributes: { class: ['xfaPage'], id: this[r.$uid], style: t, xfaName: this.name }, - }); - } - } - class PageSet extends r.XFAObject { - constructor(e) { - super(d, 'pageSet', !0); - this.duplexImposition = (0, o.getStringOption)(e.duplexImposition, [ - 'longEdge', - 'shortEdge', - ]); - this.id = e.id || ''; - this.name = e.name || ''; - this.relation = (0, o.getStringOption)(e.relation, [ - 'orderedOccurrence', - 'duplexPaginated', - 'simplexPaginated', - ]); - this.relevant = (0, o.getRelevant)(e.relevant); - this.use = e.use || ''; - this.usehref = e.usehref || ''; - this.extras = null; - this.occur = null; - this.pageArea = new r.XFAObjectArray(); - this.pageSet = new r.XFAObjectArray(); - } - [r.$cleanPage]() { - for (const e of this.pageArea.children) e[r.$cleanPage](); - for (const e of this.pageSet.children) e[r.$cleanPage](); - } - [r.$isUsable]() { - return ( - !this.occur || -1 === this.occur.max || this[r.$extra].numberOfUse < this.occur.max - ); - } - [r.$getNextPage]() { - this[r.$extra] || - (this[r.$extra] = { numberOfUse: 1, pageIndex: -1, pageSetIndex: -1 }); - if ('orderedOccurrence' === this.relation) { - if (this[r.$extra].pageIndex + 1 < this.pageArea.children.length) { - this[r.$extra].pageIndex += 1; - return this.pageArea.children[this[r.$extra].pageIndex][r.$getNextPage](); - } - if (this[r.$extra].pageSetIndex + 1 < this.pageSet.children.length) { - this[r.$extra].pageSetIndex += 1; - return this.pageSet.children[this[r.$extra].pageSetIndex][r.$getNextPage](); - } - if (this[r.$isUsable]()) { - this[r.$extra].numberOfUse += 1; - this[r.$extra].pageIndex = -1; - this[r.$extra].pageSetIndex = -1; - return this[r.$getNextPage](); - } - const e = this[r.$getParent](); - if (e instanceof PageSet) return e[r.$getNextPage](); - this[r.$cleanPage](); - return this[r.$getNextPage](); - } - const e = this[r.$getTemplateRoot]()[r.$extra].pageNumber, - t = e % 2 == 0 ? 'even' : 'odd', - a = 0 === e ? 'first' : 'rest'; - let i = this.pageArea.children.find((e) => e.oddOrEven === t && e.pagePosition === a); - if (i) return i; - i = this.pageArea.children.find((e) => 'any' === e.oddOrEven && e.pagePosition === a); - if (i) return i; - i = this.pageArea.children.find( - (e) => 'any' === e.oddOrEven && 'any' === e.pagePosition, - ); - return i || 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', - i = `${e},${e} 5px,${t} 5px,${t} 10px`; - switch (this.type) { - case 'crossHatch': - return `${a}(to top,${i}) ${a}(to right,${i})`; - case 'crossDiagonal': - return `${a}(45deg,${i}) ${a}(-45deg,${i})`; - case 'diagonalLeft': - return `${a}(45deg,${i})`; - case 'diagonalRight': - return `${a}(-45deg,${i})`; - case 'horizontal': - return `${a}(to top,${i})`; - case 'vertical': - return `${a}(to right,${i})`; - } - 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 i = (this.corner.children.length ? this.corner.children[0] : new Corner({}))[ - r.$toStyle - ](), - n = { - name: 'svg', - children: [ - { - name: 'rect', - attributes: { - xmlns: f, - width: '100%', - height: '100%', - x: 0, - y: 0, - rx: i.radius, - ry: i.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: [n], - }); - n.attributes.style.position = 'absolute'; - return o.HTMLResult.success(n); - } - } - 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, n.flushHTML)(this); - } - [r.$addHTML](e, t) { - (0, n.addHTML)(this, e, t); - } - [r.$getAvailableSpace]() { - return (0, n.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 i = this[r.$getTemplateRoot](), - l = i[r.$extra].noLayoutFailure, - h = this[r.$isSplittable](); - h || setFirstUnsplittable(this); - if (!(0, n.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 < m; this[r.$extra].attempt++) { - p && 1 === this[r.$extra].attempt && (this[r.$extra].numberInLine = 0); - const e = this[r.$childrenToHTML]({ filter: u, include: !0 }); - if (e.success) break; - if (e.isBreak()) { - this[r.$popPara](); - return e; - } - if ( - p && - 0 === this[r.$extra].attempt && - 0 === this[r.$extra].numberInLine && - !i[r.$extra].noLayoutFailure - ) { - this[r.$extra].attempt = m; - break; - } - } - this[r.$popPara](); - h || unsetFirstUnsplittable(this); - i[r.$extra].noLayoutFailure = l; - if (this[r.$extra].attempt === m) { - this.overflow && - (this[r.$getTemplateRoot]()[r.$extra].overflowNode = this.overflow); - h || delete this[r.$extra]; - return o.HTMLResult.FAILURE; - } - if (this.overflow) { - const t = this.overflow[r.$getExtra](); - if (t.addTrailer) { - t.addTrailer = !1; - handleOverflow(this, t.trailer, e); - } - } - let b = 0, - y = 0; - if (this.margin) { - b = this.margin.leftInset + this.margin.rightInset; - y = this.margin.topInset + this.margin.bottomInset; - } - const w = Math.max(this[r.$extra].width + b, this.w || 0), - S = Math.max(this[r.$extra].height + y, this.h || 0), - x = [this.x, this.y, w, S]; - '' === this.w && (d.width = (0, s.measureToString)(w)); - '' === this.h && (d.height = (0, s.measureToString)(S)); - if (('0px' === d.width || '0px' === d.height) && 0 === t.length) - return o.HTMLResult.EMPTY; - const C = { name: 'div', attributes: a, children: t }; - applyAssist(this, a); - const k = o.HTMLResult.success((0, s.createWrapper)(this, C), x); - if (this.breakAfter.children.length >= 1) { - const e = this.breakAfter.children[0]; - if (handleBreak(e)) { - this[r.$extra].afterBreakAfter = k; - return o.HTMLResult.breakNode(e); - } - } - delete this[r.$extra]; - return k; - } - } - 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 i = null, - n = null, - s = null; - if (e.breakBefore.children.length >= 1) { - n = e.breakBefore.children[0]; - s = n.target; - } else if ( - e.subform.children.length >= 1 && - e.subform.children[0].breakBefore.children.length >= 1 - ) { - n = e.subform.children[0].breakBefore.children[0]; - s = n.target; - } else if (e.break && e.break.beforeTarget) { - n = e.break; - s = n.beforeTarget; - } else if ( - e.subform.children.length >= 1 && - e.subform.children[0].break && - e.subform.children[0].break.beforeTarget - ) { - n = e.subform.children[0].break; - s = n.beforeTarget; - } - if (n) { - const e = this[r.$searchNode](s, n[r.$getParent]()); - if (e instanceof PageArea) { - i = e; - n[r.$extra] = {}; - } - } - i || (i = t[0]); - i[r.$extra] = { numberOfUse: 1 }; - const l = i[r.$getParent](); - l[r.$extra] = { - numberOfUse: 1, - pageIndex: l.pageArea.children.indexOf(i), - 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 = i; - const t = i[r.$toHTML]().html; - a.children.push(t); - if (u) { - this[r.$extra].noLayoutFailure = !0; - t.children.push(u[r.$toHTML](i[r.$extra].space).html); - u = null; - } - if (d) { - this[r.$extra].noLayoutFailure = !0; - t.children.push(d[r.$toHTML](i[r.$extra].space).html); - d = null; - } - const n = i.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 ||= !!a.children && 0 !== a.children.length; - s[t].children.push(a); - } - }; - for (let t = p, i = n.length; t < i; t++) { - const i = (this[r.$extra].currentContentArea = n[t]), - o = { width: i.w, height: i.h }; - p = 0; - if (u) { - s[t].children.push(u[r.$toHTML](o).html); - u = null; - } - if (d) { - s[t].children.push(d[r.$toHTML](o).html); - d = null; - } - const c = e[r.$toHTML](o); - if (c.success) { - if (c.html) { - f ||= !!c.html.children && 0 !== c.html.children.length; - s[t].children.push(c.html); - } else !f && a.children.length > 1 && 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](), - i = a.target; - a.addLeader = null !== a.leader; - a.addTrailer = null !== a.trailer; - flush(t); - const s = t; - t = 1 / 0; - if (i instanceof PageArea) h = i; - else if (i instanceof ContentArea) { - const e = n.indexOf(i); - if (-1 !== e) e > s ? (t = e - 1) : (p = e); - else { - h = i[r.$getParent](); - p = h.contentArea.children.indexOf(i); - } - } - } else flush(t); - } - this[r.$extra].pageNumber += 1; - h && (h[r.$isUsable]() ? (h[r.$extra].numberOfUse += 1) : (h = null)); - i = h || i[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] === i.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].replaceAll('\r\n', '\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 i = this[r.$getParent]()[r.$getParent](); - '' === this.multiLine && (this.multiLine = i instanceof Draw ? 1 : 0); - a = - 1 === this.multiLine - ? { - name: 'textarea', - attributes: { - dataId: (i[r.$data] && i[r.$data][r.$uid]) || i[r.$uid], - fieldId: i[r.$uid], - class: ['xfaTextfield'], - style: t, - 'aria-label': ariaLabel(i), - 'aria-required': !1, - }, - } - : { - name: 'input', - attributes: { - type: 'text', - dataId: (i[r.$data] && i[r.$data][r.$uid]) || i[r.$uid], - fieldId: i[r.$uid], - class: ['xfaTextfield'], - style: t, - 'aria-label': ariaLabel(i), - 'aria-required': !1, - }, - }; - if (isRequired(i)) { - 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 [i.$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 n = e[r.$extra], - s = n.availableSpace, - [o, c, l, h] = a; - switch (e.layout) { - case 'position': - n.width = Math.max(n.width, o + l); - n.height = Math.max(n.height, c + h); - n.children.push(t); - break; - case 'lr-tb': - case 'rl-tb': - if (!n.line || 1 === n.attempt) { - n.line = createLine(e, []); - n.children.push(n.line); - n.numberInLine = 0; - } - n.numberInLine += 1; - n.line.children.push(t); - if (0 === n.attempt) { - n.currentWidth += l; - n.height = Math.max(n.height, n.prevHeight + h); - } else { - n.currentWidth = l; - n.prevHeight = n.height; - n.height += h; - n.attempt = 0; - } - n.width = Math.max(n.width, n.currentWidth); - break; - case 'rl-row': - case 'row': { - n.children.push(t); - n.width += l; - n.height = Math.max(n.height, h); - const e = (0, i.measureToString)(n.height); - for (const t of n.children) t.attributes.style.height = e; - break; - } - case 'table': - case 'tb': - n.width = Math.min(s.width, Math.max(n.width, l)); - n.height += h; - n.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](), - i = (a[r.$extra] && a[r.$extra].attempt) || 0, - [, n, s, o] = (function getTransformedBBox(e) { - let t, - a, - r = '' === e.w ? NaN : e.w, - i = '' === e.h ? NaN : e.h, - [n, s] = [0, 0]; - switch (e.anchorType || '') { - case 'bottomCenter': - [n, s] = [r / 2, i]; - break; - case 'bottomLeft': - [n, s] = [0, i]; - break; - case 'bottomRight': - [n, s] = [r, i]; - break; - case 'middleCenter': - [n, s] = [r / 2, i / 2]; - break; - case 'middleLeft': - [n, s] = [0, i / 2]; - break; - case 'middleRight': - [n, s] = [r, i / 2]; - break; - case 'topCenter': - [n, s] = [r / 2, 0]; - break; - case 'topRight': - [n, s] = [r, 0]; - } - switch (e.rotate || 0) { - case 0: - [t, a] = [-n, -s]; - break; - case 90: - [t, a] = [-s, n]; - [r, i] = [i, -r]; - break; - case 180: - [t, a] = [n, s]; - [r, i] = [-r, -i]; - break; - case 270: - [t, a] = [s, -n]; - [r, i] = [-i, r]; - } - return [ - e.x + t + Math.min(0, r), - e.y + a + Math.min(0, i), - Math.abs(r), - Math.abs(i), - ]; - })(e); - switch (a.layout) { - case 'lr-tb': - case 'rl-tb': - return 0 === i - ? 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 + n - t.height) <= 2) return !0; - return o + n > e[r.$getTemplateRoot]()[r.$extra].currentContentArea.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, - i = 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 - i - e[r.$extra].currentWidth, - height: t.height - a - e[r.$extra].prevHeight, - } - : { width: t.width - i, 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 - i, - }; - case 'table': - case 'tb': - return { width: t.width - i, height: t.height - a - e[r.$extra].height }; - default: - return t; - } - }; - var r = a(77), - i = 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 i; - if ('' !== e.w && '' !== e.h) i = [e.x, e.y, e.w, e.h]; - else { - if (!a) return null; - let n = e.w; - if ('' === n) { - if (0 === e.maxW) { - const t = e[r.$getSubformParent](); - n = 'position' === t.layout && '' !== t.w ? 0 : e.minW; - } else n = Math.min(e.maxW, a.width); - t.attributes.style.width = measureToString(n); - } - 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); - } - i = [e.x, e.y, n, s]; - } - return i; - }; - t.createWrapper = function createWrapper(e, t) { - const { attributes: a } = t, - { style: i } = a, - n = { - 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 !== i[e]) { - g.attributes.style[e] = i[e]; - delete i[e]; - } - n.children.push(g, t); - } else n.children.push(t); - for (const e of [ - 'background', - 'backgroundClip', - 'top', - 'left', - 'width', - 'height', - 'minWidth', - 'minHeight', - 'maxWidth', - 'maxHeight', - 'transform', - 'transformOrigin', - 'visibility', - ]) - if (void 0 !== i[e]) { - n.attributes.style[e] = i[e]; - delete i[e]; - } - 'absolute' === i.position - ? (n.attributes.style.position = 'absolute') - : (n.attributes.style.position = 'relative'); - delete i.position; - if (i.alignSelf) { - n.attributes.style.alignSelf = i.alignSelf; - delete i.alignSelf; - } - return n; - }; - t.fixDimensions = function fixDimensions(e) { - const t = e[r.$getSubformParent](); - if (t.layout && t.layout.includes('row')) { - const a = t[r.$extra], - i = e.colSpan; - let n; - n = - -1 === i - ? a.columnWidths.slice(a.currentColumn).reduce((e, t) => e + t, 0) - : a.columnWidths - .slice(a.currentColumn, a.currentColumn + i) - .reduce((e, t) => e + t, 0); - isNaN(n) || (e.w = n); - } - 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, n.getMeasurement)(e.textIndent, '0px'); - if (t >= 0) return; - const a = - 'padding' + - ('left' == ('right' === e.textAlign ? 'right' : 'left') ? 'Left' : 'Right'), - r = (0, n.getMeasurement)(e[a], '0px'); - e[a] = r - t + 'px'; - }; - t.fixURL = function fixURL(e) { - const t = (0, i.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, - i = null, - n = !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); - i = t.width; - a = t.height; - n = t.isBroken; - } else { - const t = e.value[r.$text](); - if (t) { - const e = layoutText(t, h, l, c, d, u); - i = e.width; - a = e.height; - n = e.isBroken; - } - } - null === i || e.w || (i += s); - null === a || e.h || (a += o); - } - return { w: i, h: a, isBroken: n }; - }; - 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 i = (0, n.stripQuotes)(e.typeface); - r.fontFamily = `"${i}"`; - const o = a.find(i); - if (o) { - const { fontFamily: a } = o.regular.cssFontInfo; - a !== i && (r.fontFamily = `"${a}"`); - const n = getCurrentPara(t); - if (n && '' !== n.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 i = getCurrentPara(e); - if (i) { - const e = a.attributes.style; - e.display = 'flex'; - e.flexDirection = 'column'; - switch (i.vAlign) { - case 'top': - e.justifyContent = 'start'; - break; - case 'bottom': - e.justifyContent = 'end'; - break; - case 'middle': - e.justifyContent = 'center'; - } - const t = i[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 n of t) { - const t = e[n]; - if (null !== t) - if (c.hasOwnProperty(n)) c[n](e, a); - else if (t instanceof r.XFAObject) { - const e = t[r.$toStyle](); - e - ? Object.assign(a, e) - : (0, i.warn)(`(DEBUG) - XFA - style for ${n} not implemented yet`); - } - } - return a; - }; - var r = a(77), - i = a(2), - n = 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 i = e.w; - const n = e.h; - if (a.layout && a.layout.includes('row')) { - const t = a[r.$extra], - n = e.colSpan; - let s; - if (-1 === n) { - s = t.columnWidths.slice(t.currentColumn).reduce((e, t) => e + t, 0); - t.currentColumn = 0; - } else { - s = t.columnWidths - .slice(t.currentColumn, t.currentColumn + n) - .reduce((e, t) => e + t, 0); - t.currentColumn = (t.currentColumn + e.colSpan) % t.columnWidths.length; - } - isNaN(s) || (i = e.w = s); - } - t.width = '' !== i ? measureToString(i) : 'auto'; - t.height = '' !== n ? measureToString(n) : '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, i, n, s) { - const c = new o.TextMeasure(t, a, i, n); - '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, i.stripQuotes)(e.typeface), - n = e[r.$globalData].fontFinder.find(t); - a = selectFont(e, n); - } - if (!a) return { lineHeight: 12, lineGap: 2, lineNoGap: 10 }; - const n = e.size || 10, - s = a.lineHeight ? Math.max(t ? 0 : 1.2, a.lineHeight) : 1.2, - o = void 0 === a.lineGap ? 0.2 : a.lineGap; - return { lineHeight: s * n, lineGap: o * n, lineNoGap: Math.max(1, s - o) * n }; - }; - t.selectFont = selectFont; - var r = a(77), - i = a(78), - n = 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 i = ''; - const n = parseFloat(t.fontWeight); - 0 !== parseFloat(t.italicAngle) - ? (i = n >= 700 ? 'bolditalic' : 'italic') - : n >= 700 && (i = 'bold'); - if (!i) { - (e.name.includes('Bold') || (e.psName && e.psName.includes('Bold'))) && - (i = 'bold'); - (e.name.includes('Italic') || - e.name.endsWith('It') || - (e.psName && (e.psName.includes('Italic') || e.psName.endsWith('It')))) && - (i += 'italic'); - } - i || (i = 'regular'); - r[i] = 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 i = e.replaceAll(r, ''); - a = this.fonts.get(i); - if (a) { - this.cache.set(e, a); - return a; - } - i = i.toLowerCase(); - const s = []; - for (const [e, t] of this.fonts.entries()) - e.replaceAll(r, '').toLowerCase().startsWith(i) && s.push(t); - if (0 === s.length) - for (const [, e] of this.fonts.entries()) - e.regular.name && - e.regular.name.replaceAll(r, '').toLowerCase().startsWith(i) && - s.push(e); - if (0 === s.length) { - i = i.replaceAll(/psmt|mt/gi, ''); - for (const [e, t] of this.fonts.entries()) - e.replaceAll(r, '').toLowerCase().startsWith(i) && s.push(t); - } - if (0 === s.length) - for (const e of this.fonts.values()) - e.regular.name && - e.regular.name.replaceAll(r, '').toLowerCase().startsWith(i) && - s.push(e); - if (s.length >= 1) { - 1 !== s.length && - t && - (0, n.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, n.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, i) { - this.lineHeight = a; - this.paraMargin = t || { top: 0, bottom: 0, left: 0, right: 0 }; - if (!e) { - [this.pdfFont, this.xfaFont] = this.defaultFont(i); - return; - } - this.xfaFont = { - typeface: e.typeface, - posture: e.posture, - weight: e.weight, - size: e.size, - letterSpacing: e.letterSpacing, - }; - const n = i.find(e.typeface); - if (n) { - this.pdfFont = (0, r.selectFont)(e, n); - this.pdfFont || ([this.pdfFont, this.xfaFont] = this.defaultFont(i)); - } else [this.pdfFont, this.xfaFont] = this.defaultFont(i); - } - 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 i = new FontInfo(e, t, a || r.lineHeight, this.fontFinder); - i.pdfFont || (i.pdfFont = r.pdfFont); - this.stack.push(i); - } - 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, - i = t.pdfFont, - n = i.lineHeight || 1.2, - s = t.lineHeight || Math.max(1.2, n) * a, - o = n - (void 0 === i.lineGap ? 0.2 : i.lineGap), - c = Math.max(1, o) * a, - l = a / 1e3, - h = i.defaultWidth || i.charsToGlyphs(' ')[0].width; - for (const t of e.split(/[\u2029\n]/)) { - const e = i.encodeString(t).join(''), - a = i.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, - i = 0, - n = 0, - s = 0, - o = !1, - c = !0; - for (let l = 0, h = this.glyphs.length; l < h; l++) { - const [h, u, d, f, g] = this.glyphs[l], - p = ' ' === f, - m = c ? d : u; - if (g) { - r = Math.max(r, n); - n = 0; - i += s; - s = m; - t = -1; - a = 0; - c = !1; - } else if (p) - if (n + h > e) { - r = Math.max(r, n); - n = 0; - i += s; - s = m; - t = -1; - a = 0; - o = !0; - c = !1; - } else { - s = Math.max(m, s); - a = n; - n += h; - t = l; - } - else if (n + h > e) { - i += s; - s = m; - if (-1 !== t) { - l = t; - r = Math.max(r, a); - n = 0; - t = -1; - a = 0; - } else { - r = Math.max(r, n); - n = h; - } - o = !0; - c = !1; - } else { - n += h; - s = Math.max(m, s); - } - } - r = Math.max(r, n); - i += s + this.extraHeight; - return { width: 1.02 * r, height: i, 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), - [i, n] = a; - if (i + 1 === n.length) { - t.pop(); - continue; - } - const s = n[++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), - i = a(66), - n = a(89), - s = a(2); - class XFAParser extends i.XMLParserBase { - constructor(e = null, t = !1) { - super(); - this._builder = new n.Builder(e); - this._stack = []; - this._globalData = { usedTypefaces: new Set() }; - this._ids = new Map(); - this._current = this._builder.buildRoot(this._ids); - this._errorCode = i.XMLParserErrorCode.NoError; - this._whiteRegex = /^\s+$/; - this._nbsps = /\xa0+/g; - this._richText = t; - } - parse(e) { - this.parseXml(e); - if (this._errorCode === i.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, - i = null; - const n = 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(6); - i || (i = []); - i.push({ prefix: e, value: c }); - } else { - const e = o.indexOf(':'); - if (-1 === e) n[o] = c; - else { - let t = n[r.$nsAttributes]; - t || (t = n[r.$nsAttributes] = Object.create(null)); - const [a, i] = [o.slice(0, e), o.slice(e + 1)]; - (t[a] ||= Object.create(null))[i] = c; - } - } - return [a, i, n]; - } - _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 [i, n, s] = this._mkAttributes(t, e), - [o, c] = this._getNameAndPrefix(e, this._builder.isNsAgnostic()), - l = this._builder.build({ - nsPrefix: c, - name: o, - attributes: s, - namespace: i, - prefixes: n, - }); - 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), - i = a(77), - n = a(90), - s = a(82), - o = a(99), - c = a(2); - class Root extends i.XFAObject { - constructor(e) { - super(-1, 'root', Object.create(null)); - this.element = null; - this[i.$ids] = e; - } - [i.$onChild](e) { - this.element = e; - return !0; - } - [i.$finalize]() { - super[i.$finalize](); - if (this.element.template instanceof s.Template) { - this[i.$ids].set(i.$root, this.element); - this.element.template[i.$resolvePrototypes](this[i.$ids]); - this.element.template[i.$ids] = this[i.$ids]; - } - } - } - class Empty extends i.XFAObject { - constructor() { - super(-1, '', Object.create(null)); - } - [i.$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(i.$nsAttributes)) { - const e = n.NamespaceSetUp.datasets, - t = a[i.$nsAttributes]; - let r = null; - for (const [a, i] of Object.entries(t)) { - if (this._getNamespaceToUse(a) === e) { - r = { xfa: i }; - break; - } - } - r ? (a[i.$nsAttributes] = r) : delete a[i.$nsAttributes]; - } - const l = this._getNamespaceToUse(e), - h = (l && l[r.$buildXFAObject](t, a)) || new Empty(); - h[i.$isNsAgnostic]() && this._nsAgnosticLevel++; - (c || o || h[i.$isNsAgnostic]()) && - (h[i.$cleanup] = { - hasNamespace: c, - prefixes: o, - nsAgnostic: h[i.$isNsAgnostic](), - }); - return h; - } - isNsAgnostic() { - return this._nsAgnosticLevel > 0; - } - _searchNamespace(e) { - let t = this._namespaces.get(e); - if (t) return t; - for (const [a, { check: i }] of Object.entries(r.NamespaceIds)) - if (i(e)) { - t = n.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), - i = a(92), - n = 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: i.ConnectionSetNamespace, - datasets: n.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), - i = a(77), - n = a(78), - s = a(2); - const o = r.NamespaceIds.config.id; - class Acrobat extends i.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 i.XFAObjectArray(); - } - } - class Acrobat7 extends i.XFAObject { - constructor(e) { - super(o, 'acrobat7', !0); - this.dynamicRender = null; - } - } - class ADBE_JSConsole extends i.OptionObject { - constructor(e) { - super(o, 'ADBE_JSConsole', ['delegate', 'Enable', 'Disable']); - } - } - class ADBE_JSDebugger extends i.OptionObject { - constructor(e) { - super(o, 'ADBE_JSDebugger', ['delegate', 'Enable', 'Disable']); - } - } - class AddSilentPrint extends i.Option01 { - constructor(e) { - super(o, 'addSilentPrint'); - } - } - class AddViewerPreferences extends i.Option01 { - constructor(e) { - super(o, 'addViewerPreferences'); - } - } - class AdjustData extends i.Option10 { - constructor(e) { - super(o, 'adjustData'); - } - } - class AdobeExtensionLevel extends i.IntegerObject { - constructor(e) { - super(o, 'adobeExtensionLevel', 0, (e) => e >= 1 && e <= 8); - } - } - class Agent extends i.XFAObject { - constructor(e) { - super(o, 'agent', !0); - this.name = e.name ? e.name.trim() : ''; - this.common = new i.XFAObjectArray(); - } - } - class AlwaysEmbed extends i.ContentObject { - constructor(e) { - super(o, 'alwaysEmbed'); - } - } - class Amd extends i.StringObject { - constructor(e) { - super(o, 'amd'); - } - } - class Area extends i.XFAObject { - constructor(e) { - super(o, 'area'); - this.level = (0, n.getInteger)({ - data: e.level, - defaultValue: 0, - validate: (e) => e >= 1 && e <= 3, - }); - this.name = (0, n.getStringOption)(e.name, [ - '', - 'barcode', - 'coreinit', - 'deviceDriver', - 'font', - 'general', - 'layout', - 'merge', - 'script', - 'signature', - 'sourceSet', - 'templateCache', - ]); - } - } - class Attributes extends i.OptionObject { - constructor(e) { - super(o, 'attributes', ['preserve', 'delegate', 'ignore']); - } - } - class AutoSave extends i.OptionObject { - constructor(e) { - super(o, 'autoSave', ['disabled', 'enabled']); - } - } - class Base extends i.StringObject { - constructor(e) { - super(o, 'base'); - } - } - class BatchOutput extends i.XFAObject { - constructor(e) { - super(o, 'batchOutput'); - this.format = (0, n.getStringOption)(e.format, [ - 'none', - 'concat', - 'zip', - 'zipCompress', - ]); - } - } - class BehaviorOverride extends i.ContentObject { - constructor(e) { - super(o, 'behaviorOverride'); - } - [i.$finalize]() { - this[i.$content] = new Map( - this[i.$content] - .trim() - .split(/\s+/) - .filter((e) => e.includes(':')) - .map((e) => e.split(':', 2)), - ); - } - } - class Cache extends i.XFAObject { - constructor(e) { - super(o, 'cache', !0); - this.templateCache = null; - } - } - class Change extends i.Option01 { - constructor(e) { - super(o, 'change'); - } - } - class Common extends i.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 i.XFAObjectArray(); - } - } - class Compress extends i.XFAObject { - constructor(e) { - super(o, 'compress'); - this.scope = (0, n.getStringOption)(e.scope, ['imageOnly', 'document']); - } - } - class CompressLogicalStructure extends i.Option01 { - constructor(e) { - super(o, 'compressLogicalStructure'); - } - } - class CompressObjectStream extends i.Option10 { - constructor(e) { - super(o, 'compressObjectStream'); - } - } - class Compression extends i.XFAObject { - constructor(e) { - super(o, 'compression', !0); - this.compressLogicalStructure = null; - this.compressObjectStream = null; - this.level = null; - this.type = null; - } - } - class Config extends i.XFAObject { - constructor(e) { - super(o, 'config', !0); - this.acrobat = null; - this.present = null; - this.trace = null; - this.agent = new i.XFAObjectArray(); - } - } - class Conformance extends i.OptionObject { - constructor(e) { - super(o, 'conformance', ['A', 'B']); - } - } - class ContentCopy extends i.Option01 { - constructor(e) { - super(o, 'contentCopy'); - } - } - class Copies extends i.IntegerObject { - constructor(e) { - super(o, 'copies', 1, (e) => e >= 1); - } - } - class Creator extends i.StringObject { - constructor(e) { - super(o, 'creator'); - } - } - class CurrentPage extends i.IntegerObject { - constructor(e) { - super(o, 'currentPage', 0, (e) => e >= 0); - } - } - class Data extends i.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 i.XFAObjectArray(); - this.transform = new i.XFAObjectArray(); - } - } - class Debug extends i.XFAObject { - constructor(e) { - super(o, 'debug', !0); - this.uri = null; - } - } - class DefaultTypeface extends i.ContentObject { - constructor(e) { - super(o, 'defaultTypeface'); - this.writingScript = (0, n.getStringOption)(e.writingScript, [ - '*', - 'Arabic', - 'Cyrillic', - 'EastEuropeanRoman', - 'Greek', - 'Hebrew', - 'Japanese', - 'Korean', - 'Roman', - 'SimplifiedChinese', - 'Thai', - 'TraditionalChinese', - 'Vietnamese', - ]); - } - } - class Destination extends i.OptionObject { - constructor(e) { - super(o, 'destination', ['pdf', 'pcl', 'ps', 'webClient', 'zpl']); - } - } - class DocumentAssembly extends i.Option01 { - constructor(e) { - super(o, 'documentAssembly'); - } - } - class Driver extends i.XFAObject { - constructor(e) { - super(o, 'driver', !0); - this.name = e.name ? e.name.trim() : ''; - this.fontInfo = null; - this.xdc = null; - } - } - class DuplexOption extends i.OptionObject { - constructor(e) { - super(o, 'duplexOption', ['simplex', 'duplexFlipLongEdge', 'duplexFlipShortEdge']); - } - } - class DynamicRender extends i.OptionObject { - constructor(e) { - super(o, 'dynamicRender', ['forbidden', 'required']); - } - } - class Embed extends i.Option01 { - constructor(e) { - super(o, 'embed'); - } - } - class Encrypt extends i.Option01 { - constructor(e) { - super(o, 'encrypt'); - } - } - class Encryption extends i.XFAObject { - constructor(e) { - super(o, 'encryption', !0); - this.encrypt = null; - this.encryptionLevel = null; - this.permissions = null; - } - } - class EncryptionLevel extends i.OptionObject { - constructor(e) { - super(o, 'encryptionLevel', ['40bit', '128bit']); - } - } - class Enforce extends i.StringObject { - constructor(e) { - super(o, 'enforce'); - } - } - class Equate extends i.XFAObject { - constructor(e) { - super(o, 'equate'); - this.force = (0, n.getInteger)({ - data: e.force, - defaultValue: 1, - validate: (e) => 0 === e, - }); - this.from = e.from || ''; - this.to = e.to || ''; - } - } - class EquateRange extends i.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 i.ContentObject { - constructor(e) { - super(o, 'exclude'); - } - [i.$finalize]() { - this[i.$content] = this[i.$content] - .trim() - .split(/\s+/) - .filter( - (e) => - e && - [ - 'calculate', - 'close', - 'enter', - 'exit', - 'initialize', - 'ready', - 'validate', - ].includes(e), - ); - } - } - class ExcludeNS extends i.StringObject { - constructor(e) { - super(o, 'excludeNS'); - } - } - class FlipLabel extends i.OptionObject { - constructor(e) { - super(o, 'flipLabel', ['usePrinterSetting', 'on', 'off']); - } - } - class FontInfo extends i.XFAObject { - constructor(e) { - super(o, 'fontInfo', !0); - this.embed = null; - this.map = null; - this.subsetBelow = null; - this.alwaysEmbed = new i.XFAObjectArray(); - this.defaultTypeface = new i.XFAObjectArray(); - this.neverEmbed = new i.XFAObjectArray(); - } - } - class FormFieldFilling extends i.Option01 { - constructor(e) { - super(o, 'formFieldFilling'); - } - } - class GroupParent extends i.StringObject { - constructor(e) { - super(o, 'groupParent'); - } - } - class IfEmpty extends i.OptionObject { - constructor(e) { - super(o, 'ifEmpty', ['dataValue', 'dataGroup', 'ignore', 'remove']); - } - } - class IncludeXDPContent extends i.StringObject { - constructor(e) { - super(o, 'includeXDPContent'); - } - } - class IncrementalLoad extends i.OptionObject { - constructor(e) { - super(o, 'incrementalLoad', ['none', 'forwardOnly']); - } - } - class IncrementalMerge extends i.Option01 { - constructor(e) { - super(o, 'incrementalMerge'); - } - } - class Interactive extends i.Option01 { - constructor(e) { - super(o, 'interactive'); - } - } - class Jog extends i.OptionObject { - constructor(e) { - super(o, 'jog', ['usePrinterSetting', 'none', 'pageSet']); - } - } - class LabelPrinter extends i.XFAObject { - constructor(e) { - super(o, 'labelPrinter', !0); - this.name = (0, n.getStringOption)(e.name, ['zpl', 'dpl', 'ipl', 'tcpl']); - this.batchOutput = null; - this.flipLabel = null; - this.fontInfo = null; - this.xdc = null; - } - } - class Layout extends i.OptionObject { - constructor(e) { - super(o, 'layout', ['paginate', 'panel']); - } - } - class Level extends i.IntegerObject { - constructor(e) { - super(o, 'level', 0, (e) => e > 0); - } - } - class Linearized extends i.Option01 { - constructor(e) { - super(o, 'linearized'); - } - } - class Locale extends i.StringObject { - constructor(e) { - super(o, 'locale'); - } - } - class LocaleSet extends i.StringObject { - constructor(e) { - super(o, 'localeSet'); - } - } - class Log extends i.XFAObject { - constructor(e) { - super(o, 'log', !0); - this.mode = null; - this.threshold = null; - this.to = null; - this.uri = null; - } - } - class MapElement extends i.XFAObject { - constructor(e) { - super(o, 'map', !0); - this.equate = new i.XFAObjectArray(); - this.equateRange = new i.XFAObjectArray(); - } - } - class MediumInfo extends i.XFAObject { - constructor(e) { - super(o, 'mediumInfo', !0); - this.map = null; - } - } - class Message extends i.XFAObject { - constructor(e) { - super(o, 'message', !0); - this.msgId = null; - this.severity = null; - } - } - class Messaging extends i.XFAObject { - constructor(e) { - super(o, 'messaging', !0); - this.message = new i.XFAObjectArray(); - } - } - class Mode extends i.OptionObject { - constructor(e) { - super(o, 'mode', ['append', 'overwrite']); - } - } - class ModifyAnnots extends i.Option01 { - constructor(e) { - super(o, 'modifyAnnots'); - } - } - class MsgId extends i.IntegerObject { - constructor(e) { - super(o, 'msgId', 1, (e) => e >= 1); - } - } - class NameAttr extends i.StringObject { - constructor(e) { - super(o, 'nameAttr'); - } - } - class NeverEmbed extends i.ContentObject { - constructor(e) { - super(o, 'neverEmbed'); - } - } - class NumberOfCopies extends i.IntegerObject { - constructor(e) { - super(o, 'numberOfCopies', null, (e) => e >= 2 && e <= 5); - } - } - class OpenAction extends i.XFAObject { - constructor(e) { - super(o, 'openAction', !0); - this.destination = null; - } - } - class Output extends i.XFAObject { - constructor(e) { - super(o, 'output', !0); - this.to = null; - this.type = null; - this.uri = null; - } - } - class OutputBin extends i.StringObject { - constructor(e) { - super(o, 'outputBin'); - } - } - class OutputXSL extends i.XFAObject { - constructor(e) { - super(o, 'outputXSL', !0); - this.uri = null; - } - } - class Overprint extends i.OptionObject { - constructor(e) { - super(o, 'overprint', ['none', 'both', 'draw', 'field']); - } - } - class Packets extends i.StringObject { - constructor(e) { - super(o, 'packets'); - } - [i.$finalize]() { - '*' !== this[i.$content] && - (this[i.$content] = this[i.$content] - .trim() - .split(/\s+/) - .filter((e) => ['config', 'datasets', 'template', 'xfdf', 'xslt'].includes(e))); - } - } - class PageOffset extends i.XFAObject { - constructor(e) { - super(o, 'pageOffset'); - this.x = (0, n.getInteger)({ - data: e.x, - defaultValue: 'useXDCSetting', - validate: (e) => !0, - }); - this.y = (0, n.getInteger)({ - data: e.y, - defaultValue: 'useXDCSetting', - validate: (e) => !0, - }); - } - } - class PageRange extends i.StringObject { - constructor(e) { - super(o, 'pageRange'); - } - [i.$finalize]() { - const e = this[i.$content] - .trim() - .split(/\s+/) - .map((e) => parseInt(e, 10)), - t = []; - for (let a = 0, r = e.length; a < r; a += 2) t.push(e.slice(a, a + 2)); - this[i.$content] = t; - } - } - class Pagination extends i.OptionObject { - constructor(e) { - super(o, 'pagination', ['simplex', 'duplexShortEdge', 'duplexLongEdge']); - } - } - class PaginationOverride extends i.OptionObject { - constructor(e) { - super(o, 'paginationOverride', [ - 'none', - 'forceDuplex', - 'forceDuplexLongEdge', - 'forceDuplexShortEdge', - 'forceSimplex', - ]); - } - } - class Part extends i.IntegerObject { - constructor(e) { - super(o, 'part', 1, (e) => !1); - } - } - class Pcl extends i.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 i.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 i.XFAObject { - constructor(e) { - super(o, 'pdfa', !0); - this.amd = null; - this.conformance = null; - this.includeXDPContent = null; - this.part = null; - } - } - class Permissions extends i.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 i.Option01 { - constructor(e) { - super(o, 'pickTrayByPDFSize'); - } - } - class Picture extends i.StringObject { - constructor(e) { - super(o, 'picture'); - } - } - class PlaintextMetadata extends i.Option01 { - constructor(e) { - super(o, 'plaintextMetadata'); - } - } - class Presence extends i.OptionObject { - constructor(e) { - super(o, 'presence', [ - 'preserve', - 'dissolve', - 'dissolveStructure', - 'ignore', - 'remove', - ]); - } - } - class Present extends i.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 i.XFAObjectArray(); - this.labelPrinter = new i.XFAObjectArray(); - this.pcl = new i.XFAObjectArray(); - this.pdf = new i.XFAObjectArray(); - this.ps = new i.XFAObjectArray(); - this.submitUrl = new i.XFAObjectArray(); - this.webClient = new i.XFAObjectArray(); - this.zpl = new i.XFAObjectArray(); - } - } - class Print extends i.Option01 { - constructor(e) { - super(o, 'print'); - } - } - class PrintHighQuality extends i.Option01 { - constructor(e) { - super(o, 'printHighQuality'); - } - } - class PrintScaling extends i.OptionObject { - constructor(e) { - super(o, 'printScaling', ['appdefault', 'noScaling']); - } - } - class PrinterName extends i.StringObject { - constructor(e) { - super(o, 'printerName'); - } - } - class Producer extends i.StringObject { - constructor(e) { - super(o, 'producer'); - } - } - class Ps extends i.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 i.ContentObject { - constructor(e) { - super(o, 'range'); - } - [i.$finalize]() { - this[i.$content] = this[i.$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 i.ContentObject { - constructor(e) { - super(o, 'record'); - } - [i.$finalize]() { - this[i.$content] = this[i.$content].trim(); - const e = parseInt(this[i.$content], 10); - !isNaN(e) && e >= 0 && (this[i.$content] = e); - } - } - class Relevant extends i.ContentObject { - constructor(e) { - super(o, 'relevant'); - } - [i.$finalize]() { - this[i.$content] = this[i.$content].trim().split(/\s+/); - } - } - class Rename extends i.ContentObject { - constructor(e) { - super(o, 'rename'); - } - [i.$finalize]() { - this[i.$content] = this[i.$content].trim(); - (this[i.$content].toLowerCase().startsWith('xml') || - new RegExp('[\\p{L}_][\\p{L}\\d._\\p{M}-]*', 'u').test(this[i.$content])) && - (0, s.warn)('XFA - Rename: invalid XFA name'); - } - } - class RenderPolicy extends i.OptionObject { - constructor(e) { - super(o, 'renderPolicy', ['server', 'client']); - } - } - class RunScripts extends i.OptionObject { - constructor(e) { - super(o, 'runScripts', ['both', 'client', 'none', 'server']); - } - } - class Script extends i.XFAObject { - constructor(e) { - super(o, 'script', !0); - this.currentPage = null; - this.exclude = null; - this.runScripts = null; - } - } - class ScriptModel extends i.OptionObject { - constructor(e) { - super(o, 'scriptModel', ['XFA', 'none']); - } - } - class Severity extends i.OptionObject { - constructor(e) { - super(o, 'severity', ['ignore', 'error', 'information', 'trace', 'warning']); - } - } - class SilentPrint extends i.XFAObject { - constructor(e) { - super(o, 'silentPrint', !0); - this.addSilentPrint = null; - this.printerName = null; - } - } - class Staple extends i.XFAObject { - constructor(e) { - super(o, 'staple'); - this.mode = (0, n.getStringOption)(e.mode, ['usePrinterSetting', 'on', 'off']); - } - } - class StartNode extends i.StringObject { - constructor(e) { - super(o, 'startNode'); - } - } - class StartPage extends i.IntegerObject { - constructor(e) { - super(o, 'startPage', 0, (e) => !0); - } - } - class SubmitFormat extends i.OptionObject { - constructor(e) { - super(o, 'submitFormat', ['html', 'delegate', 'fdf', 'xml', 'pdf']); - } - } - class SubmitUrl extends i.StringObject { - constructor(e) { - super(o, 'submitUrl'); - } - } - class SubsetBelow extends i.IntegerObject { - constructor(e) { - super(o, 'subsetBelow', 100, (e) => e >= 0 && e <= 100); - } - } - class SuppressBanner extends i.Option01 { - constructor(e) { - super(o, 'suppressBanner'); - } - } - class Tagged extends i.Option01 { - constructor(e) { - super(o, 'tagged'); - } - } - class Template extends i.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 i.OptionObject { - constructor(e) { - super(o, 'threshold', ['trace', 'error', 'information', 'warning']); - } - } - class To extends i.OptionObject { - constructor(e) { - super(o, 'to', ['null', 'memory', 'stderr', 'stdout', 'system', 'uri']); - } - } - class TemplateCache extends i.XFAObject { - constructor(e) { - super(o, 'templateCache'); - this.maxEntries = (0, n.getInteger)({ - data: e.maxEntries, - defaultValue: 5, - validate: (e) => e >= 0, - }); - } - } - class Trace extends i.XFAObject { - constructor(e) { - super(o, 'trace', !0); - this.area = new i.XFAObjectArray(); - } - } - class Transform extends i.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 i.OptionObject { - constructor(e) { - super(o, 'type', [ - 'none', - 'ascii85', - 'asciiHex', - 'ccittfax', - 'flate', - 'lzw', - 'runLength', - 'native', - 'xdp', - 'mergedXDP', - ]); - } - } - class Uri extends i.StringObject { - constructor(e) { - super(o, 'uri'); - } - } - class Validate extends i.OptionObject { - constructor(e) { - super(o, 'validate', ['preSubmit', 'prePrint', 'preExecute', 'preSave']); - } - } - class ValidateApprovalSignatures extends i.ContentObject { - constructor(e) { - super(o, 'validateApprovalSignatures'); - } - [i.$finalize]() { - this[i.$content] = this[i.$content] - .trim() - .split(/\s+/) - .filter((e) => ['docReady', 'postSign'].includes(e)); - } - } - class ValidationMessaging extends i.OptionObject { - constructor(e) { - super(o, 'validationMessaging', [ - 'allMessagesIndividually', - 'allMessagesTogether', - 'firstMessageOnly', - 'noMessages', - ]); - } - } - class Version extends i.OptionObject { - constructor(e) { - super(o, 'version', ['1.7', '1.6', '1.5', '1.4', '1.3', '1.2']); - } - } - class VersionControl extends i.XFAObject { - constructor(e) { - super(o, 'VersionControl'); - this.outputBelow = (0, n.getStringOption)(e.outputBelow, ['warn', 'error', 'update']); - this.sourceAbove = (0, n.getStringOption)(e.sourceAbove, ['warn', 'error']); - this.sourceBelow = (0, n.getStringOption)(e.sourceBelow, ['update', 'maintain']); - } - } - class ViewerPreferences extends i.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 i.XFAObject { - constructor(e) { - super(o, 'webClient', !0); - this.name = e.name ? e.name.trim() : ''; - this.fontInfo = null; - this.xdc = null; - } - } - class Whitespace extends i.OptionObject { - constructor(e) { - super(o, 'whitespace', ['preserve', 'ltrim', 'normalize', 'rtrim', 'trim']); - } - } - class Window extends i.ContentObject { - constructor(e) { - super(o, 'window'); - } - [i.$finalize]() { - const e = this[i.$content] - .trim() - .split(/\s*,\s*/, 2) - .map((e) => parseInt(e, 10)); - if (e.some((e) => isNaN(e))) this[i.$content] = [0, 0]; - else { - 1 === e.length && e.push(e[0]); - this[i.$content] = e; - } - } - } - class Xdc extends i.XFAObject { - constructor(e) { - super(o, 'xdc', !0); - this.uri = new i.XFAObjectArray(); - this.xsl = new i.XFAObjectArray(); - } - } - class Xdp extends i.XFAObject { - constructor(e) { - super(o, 'xdp', !0); - this.packets = null; - } - } - class Xsl extends i.XFAObject { - constructor(e) { - super(o, 'xsl', !0); - this.debug = null; - this.uri = null; - } - } - class Zpl extends i.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), - i = a(77); - const n = r.NamespaceIds.connectionSet.id; - class ConnectionSet extends i.XFAObject { - constructor(e) { - super(n, 'connectionSet', !0); - this.wsdlConnection = new i.XFAObjectArray(); - this.xmlConnection = new i.XFAObjectArray(); - this.xsdConnection = new i.XFAObjectArray(); - } - } - class EffectiveInputPolicy extends i.XFAObject { - constructor(e) { - super(n, 'effectiveInputPolicy'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class EffectiveOutputPolicy extends i.XFAObject { - constructor(e) { - super(n, 'effectiveOutputPolicy'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class Operation extends i.StringObject { - constructor(e) { - super(n, '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 i.StringObject { - constructor(e) { - super(n, 'rootElement'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class SoapAction extends i.StringObject { - constructor(e) { - super(n, 'soapAction'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class SoapAddress extends i.StringObject { - constructor(e) { - super(n, 'soapAddress'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class Uri extends i.StringObject { - constructor(e) { - super(n, 'uri'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class WsdlAddress extends i.StringObject { - constructor(e) { - super(n, 'wsdlAddress'); - this.id = e.id || ''; - this.name = e.name || ''; - this.use = e.use || ''; - this.usehref = e.usehref || ''; - } - } - class WsdlConnection extends i.XFAObject { - constructor(e) { - super(n, '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 i.XFAObject { - constructor(e) { - super(n, 'xmlConnection', !0); - this.dataDescription = e.dataDescription || ''; - this.name = e.name || ''; - this.uri = null; - } - } - class XsdConnection extends i.XFAObject { - constructor(e) { - super(n, '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), - i = a(79); - const n = i.NamespaceIds.datasets.id; - class Data extends r.XmlObject { - constructor(e) { - super(n, 'data', e); - } - [r.$isNsAgnostic]() { - return !0; - } - } - class Datasets extends r.XFAObject { - constructor(e) { - super(n, 'datasets', !0); - this.data = null; - this.Signature = null; - } - [r.$onChild](e) { - const t = e[r.$nodeName]; - (('data' === t && e[r.$namespaceId] === n) || - ('Signature' === t && e[r.$namespaceId] === i.NamespaceIds.signature.id)) && - (this[t] = e); - this[r.$appendChild](e); - } - } - class DatasetsNamespace { - static [i.$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), - i = a(77), - n = a(78); - const s = r.NamespaceIds.localeSet.id; - class CalendarSymbols extends i.XFAObject { - constructor(e) { - super(s, 'calendarSymbols', !0); - this.name = 'gregorian'; - this.dayNames = new i.XFAObjectArray(2); - this.eraNames = null; - this.meridiemNames = null; - this.monthNames = new i.XFAObjectArray(2); - } - } - class CurrencySymbol extends i.StringObject { - constructor(e) { - super(s, 'currencySymbol'); - this.name = (0, n.getStringOption)(e.name, ['symbol', 'isoname', 'decimal']); - } - } - class CurrencySymbols extends i.XFAObject { - constructor(e) { - super(s, 'currencySymbols', !0); - this.currencySymbol = new i.XFAObjectArray(3); - } - } - class DatePattern extends i.StringObject { - constructor(e) { - super(s, 'datePattern'); - this.name = (0, n.getStringOption)(e.name, ['full', 'long', 'med', 'short']); - } - } - class DatePatterns extends i.XFAObject { - constructor(e) { - super(s, 'datePatterns', !0); - this.datePattern = new i.XFAObjectArray(4); - } - } - class DateTimeSymbols extends i.ContentObject { - constructor(e) { - super(s, 'dateTimeSymbols'); - } - } - class Day extends i.StringObject { - constructor(e) { - super(s, 'day'); - } - } - class DayNames extends i.XFAObject { - constructor(e) { - super(s, 'dayNames', !0); - this.abbr = (0, n.getInteger)({ - data: e.abbr, - defaultValue: 0, - validate: (e) => 1 === e, - }); - this.day = new i.XFAObjectArray(7); - } - } - class Era extends i.StringObject { - constructor(e) { - super(s, 'era'); - } - } - class EraNames extends i.XFAObject { - constructor(e) { - super(s, 'eraNames', !0); - this.era = new i.XFAObjectArray(2); - } - } - class Locale extends i.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 i.XFAObject { - constructor(e) { - super(s, 'localeSet', !0); - this.locale = new i.XFAObjectArray(); - } - } - class Meridiem extends i.StringObject { - constructor(e) { - super(s, 'meridiem'); - } - } - class MeridiemNames extends i.XFAObject { - constructor(e) { - super(s, 'meridiemNames', !0); - this.meridiem = new i.XFAObjectArray(2); - } - } - class Month extends i.StringObject { - constructor(e) { - super(s, 'month'); - } - } - class MonthNames extends i.XFAObject { - constructor(e) { - super(s, 'monthNames', !0); - this.abbr = (0, n.getInteger)({ - data: e.abbr, - defaultValue: 0, - validate: (e) => 1 === e, - }); - this.month = new i.XFAObjectArray(12); - } - } - class NumberPattern extends i.StringObject { - constructor(e) { - super(s, 'numberPattern'); - this.name = (0, n.getStringOption)(e.name, ['full', 'long', 'med', 'short']); - } - } - class NumberPatterns extends i.XFAObject { - constructor(e) { - super(s, 'numberPatterns', !0); - this.numberPattern = new i.XFAObjectArray(4); - } - } - class NumberSymbol extends i.StringObject { - constructor(e) { - super(s, 'numberSymbol'); - this.name = (0, n.getStringOption)(e.name, [ - 'decimal', - 'grouping', - 'percent', - 'minus', - 'zero', - ]); - } - } - class NumberSymbols extends i.XFAObject { - constructor(e) { - super(s, 'numberSymbols', !0); - this.numberSymbol = new i.XFAObjectArray(5); - } - } - class TimePattern extends i.StringObject { - constructor(e) { - super(s, 'timePattern'); - this.name = (0, n.getStringOption)(e.name, ['full', 'long', 'med', 'short']); - } - } - class TimePatterns extends i.XFAObject { - constructor(e) { - super(s, 'timePatterns', !0); - this.timePattern = new i.XFAObjectArray(4); - } - } - class TypeFace extends i.XFAObject { - constructor(e) { - super(s, 'typeFace', !0); - this.name = '' | e.name; - } - } - class TypeFaces extends i.XFAObject { - constructor(e) { - super(s, 'typeFaces', !0); - this.typeFace = new i.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), - i = a(77); - const n = r.NamespaceIds.signature.id; - class Signature extends i.XFAObject { - constructor(e) { - super(n, '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), - i = a(77); - const n = r.NamespaceIds.stylesheet.id; - class Stylesheet extends i.XFAObject { - constructor(e) { - super(n, '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), - i = a(77); - const n = r.NamespaceIds.xdp.id; - class Xdp extends i.XFAObject { - constructor(e) { - super(n, '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 i.XFAObjectArray(); - this.template = null; - } - [i.$onChildCheck](e) { - const t = r.NamespaceIds[e[i.$nodeName]]; - return t && e[i.$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), - i = a(79), - n = a(84), - s = a(78); - const o = i.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, n.measureToString)(0.99 * e); - }, - ], - ['letter-spacing', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['line-height', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['margin', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['margin-bottom', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['margin-left', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['margin-right', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['margin-top', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['text-indent', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ['font-family', (e) => e], - ['vertical-align', (e) => (0, n.measureToString)((0, s.getMeasurement)(e))], - ]), - u = /\s+/g, - d = /[\r\n]+/g, - f = /\r\n?/g; - function mapStyle(e, t, a) { - const i = Object.create(null); - if (!e) return i; - 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') - ? i.transform - ? (i.transform = `${i[t]} ${r}`) - : (i.transform = r) - : (i[t.replaceAll(/-([a-zA-Z])/g, (e, t) => t.toUpperCase())] = r); - } - i.fontFamily && - (0, n.setFontFamily)( - { - typeface: i.fontFamily, - weight: i.fontWeight || 'normal', - posture: i.fontStyle || 'normal', - size: o.fontSize || 0, - }, - t, - t[r.$globalData].fontFinder, - i, - ); - if (a && i.verticalAlign && '0px' !== i.verticalAlign && i.fontSize) { - const e = 0.583, - t = 0.333, - a = (0, s.getMeasurement)(i.fontSize); - i.fontSize = (0, n.measureToString)(a * e); - i.verticalAlign = (0, n.measureToString)( - Math.sign((0, s.getMeasurement)(i.verticalAlign)) * a * t, - ); - } - a && i.fontSize && (i.fontSize = `calc(${i.fontSize} * var(--scale-factor))`); - (0, n.fixTextIndent)(i); - return i; - } - 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.replaceAll(d, ''); - this.style.includes('xfa-spacerun:yes') || (e = e.replaceAll(u, ' ')); - } - e && (this[r.$content] += e); - } - [r.$pushGlyphs](e, t = !0) { - const a = Object.create(null), - i = { top: NaN, bottom: NaN, left: NaN, right: NaN }; - let n = 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: - i.top = i.bottom = i.left = i.right = e[0]; - break; - case 2: - i.top = i.bottom = e[0]; - i.left = i.right = e[1]; - break; - case 3: - i.top = e[0]; - i.bottom = e[2]; - i.left = i.right = e[1]; - break; - case 4: - i.top = e[0]; - i.left = e[1]; - i.bottom = e[2]; - i.right = e[3]; - } - break; - case 'margin-top': - i.top = (0, s.getMeasurement)(t); - break; - case 'margin-bottom': - i.bottom = (0, s.getMeasurement)(t); - break; - case 'margin-left': - i.left = (0, s.getMeasurement)(t); - break; - case 'margin-right': - i.right = (0, s.getMeasurement)(t); - break; - case 'line-height': - n = (0, s.getMeasurement)(t); - } - e.pushData(a, i, n); - 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].replaceAll(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, n.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 [i.$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), - i = a(77); - class UnknownNamespace { - constructor(e) { - this.namespaceId = e; - } - [r.$buildXFAObject](e, t) { - return new i.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), - i = a(3), - n = 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 n.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 n.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, i.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), - i = a(4), - n = a(16), - s = a(3), - o = a(5), - c = a(67); - t.XRef = class XRef { - constructor(e, t) { - this.stream = e; - this.pdfManager = t; - this.entries = []; - this._xrefStms = new Set(); - this._cacheMap = new Map(); - this._pendingRefs = new i.RefSet(); - this._newPersistentRefNum = null; - this._newTemporaryRefNum = null; - } - getNewPersistentRef(e) { - null === this._newPersistentRefNum && - (this._newPersistentRefNum = this.entries.length || 1); - const t = this._newPersistentRefNum++; - this._cacheMap.set(t, e); - return i.Ref.get(t, 0); - } - getNewTemporaryRef() { - null === this._newTemporaryRefNum && - (this._newTemporaryRefNum = this.entries.length || 1); - return i.Ref.get(this._newTemporaryRefNum++, 0); - } - resetNewTemporaryRef() { - this._newTemporaryRefNum = null; - } - setStartXRef(e) { - this.startXRefQueue = [e]; - } - parse(e = !1) { - let t, a, n; - 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 s.MissingDataException) throw e; - (0, r.warn)(`XRef.parse - Invalid "Encrypt" reference: "${e}".`); - } - if (a instanceof i.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 { - n = t.get('Root'); - } catch (e) { - if (e instanceof s.MissingDataException) throw e; - (0, r.warn)(`XRef.parse - Invalid "Root" reference: "${e}".`); - } - if (n instanceof i.Dict) - try { - if (n.get('Pages') instanceof i.Dict) { - this.root = n; - return; - } - } catch (e) { - if (e instanceof s.MissingDataException) throw e; - (0, r.warn)(`XRef.parse - Invalid "Pages" reference: "${e}".`); - } - if (!e) throw new s.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, i.isCmd)(t, 'trailer')) - throw new r.FormatError('Invalid XRef table: could not find trailer dictionary'); - let a = e.getObj(); - a instanceof i.Dict || !a.dict || (a = a.dict); - if (!(a instanceof i.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 n; - for (;;) { - if (!('firstEntryNum' in a) || !('entryCount' in a)) { - if ((0, i.isCmd)((n = e.getObj()), 'trailer')) break; - a.firstEntryNum = n; - 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 n = a.entryNum; n < o; n++) { - a.streamPos = t.pos; - a.entryNum = n; - a.parserBuf1 = e.buf1; - a.parserBuf2 = e.buf2; - const c = {}; - c.offset = e.getObj(); - c.gen = e.getObj(); - const l = e.getObj(); - if (l instanceof i.Cmd) - switch (l.cmd) { - case 'f': - c.free = !0; - break; - case 'n': - c.uncompressed = !0; - } - if ( - !Number.isInteger(c.offset) || - !Number.isInteger(c.gen) || - (!c.free && !c.uncompressed) - ) - throw new r.FormatError(`Invalid entry in XRef subsection: ${s}, ${o}`); - 0 === n && c.free && 1 === s && (s = 0); - this.entries[n + s] || (this.entries[n + s] = c); - } - a.entryNum = 0; - a.streamPos = t.pos; - a.parserBuf1 = e.buf1; - a.parserBuf2 = e.buf2; - delete a.firstEntryNum; - delete a.entryCount; - } - if (this.entries[0] && !this.entries[0].free) - throw new r.FormatError('Invalid XRef table: unexpected first object'); - return n; - } - processXRefStream(e) { - if (!('streamState' in this)) { - const t = e.dict, - a = t.get('W'); - let r = t.get('Index'); - r || (r = [0, t.get('Size')]); - this.streamState = { entryRanges: r, byteWidths: a, entryNum: 0, streamPos: e.pos }; - } - this.readXRefStream(e); - delete this.streamState; - return e.dict; - } - readXRefStream(e) { - const t = this.streamState; - e.pos = t.streamPos; - const [a, i, n] = t.byteWidths, - s = t.entryRanges; - for (; s.length > 0; ) { - 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(i) || !Number.isInteger(n)) - throw new r.FormatError(`Invalid XRef entry fields length: ${o}, ${c}`); - for (let s = t.entryNum; s < c; ++s) { - t.entryNum = s; - t.streamPos = e.pos; - let c = 0, - l = 0, - h = 0; - for (let t = 0; t < a; ++t) { - const t = e.getByte(); - if (-1 === t) throw new r.FormatError("Invalid XRef byteWidths 'type'."); - c = (c << 8) | t; - } - 0 === a && (c = 1); - for (let t = 0; t < i; ++t) { - const t = e.getByte(); - if (-1 === t) throw new r.FormatError("Invalid XRef byteWidths 'offset'."); - l = (l << 8) | t; - } - for (let t = 0; t < n; ++t) { - const t = e.getByte(); - if (-1 === t) throw new r.FormatError("Invalid XRef byteWidths 'generation'."); - h = (h << 8) | t; - } - const u = {}; - u.offset = l; - u.gen = h; - switch (c) { - case 0: - u.free = !0; - break; - case 1: - u.uncompressed = !0; - break; - case 2: - break; - default: - throw new r.FormatError(`Invalid XRef entry type: ${c}`); - } - this.entries[o + s] || (this.entries[o + s] = u); - } - t.entryNum = 0; - t.streamPos = e.pos; - s.splice(0, 2); - } - } - indexObjects() { - function readToken(e, t) { - let a = '', - r = e[t]; - for (; 10 !== r && 13 !== r && 60 !== r && !(++t >= e.length); ) { - a += String.fromCharCode(r); - r = e[t]; - } - return a; - } - function skipUntil(e, t, a) { - const r = a.length, - i = e.length; - let n = 0; - for (; t < i; ) { - let i = 0; - for (; i < r && e[t + i] === a[i]; ) ++i; - if (i >= r) break; - t++; - n++; - } - return n; - } - const e = /\b(endobj|\d+\s+\d+\s+obj|xref|trailer)\b/g, - t = /\b(startxref|\d+\s+\d+\s+obj)\b/g, - a = /^(\d+)\s+(\d+)\s+obj\b/, - 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([47, 88, 82, 101, 102]); - this.entries.length = 0; - this._cacheMap.clear(); - const h = this.stream; - h.pos = 0; - const u = h.getBytes(), - d = (0, r.bytesToString)(u), - f = u.length; - let g = h.start; - const p = [], - m = []; - for (; g < f; ) { - let i = u[g]; - if (9 === i || 10 === i || 13 === i || 32 === i) { - ++g; - continue; - } - if (37 === i) { - do { - ++g; - if (g >= f) break; - i = u[g]; - } while (10 !== i && 13 !== i); - continue; - } - const b = readToken(u, g); - let y; - if (b.startsWith('xref') && (4 === b.length || /\s/.test(b[4]))) { - g += skipUntil(u, g, o); - p.push(g); - g += skipUntil(u, g, c); - } else if ((y = a.exec(b))) { - const t = 0 | y[1], - a = 0 | y[2], - i = g + b.length; - let o, - c = !1; - if (this.entries[t]) { - if (this.entries[t].gen === a) - try { - new n.Parser({ lexer: new n.Lexer(h.makeSubStream(i)) }).getObj(); - c = !0; - } catch (e) { - e instanceof s.ParserEOFException - ? (0, r.warn)(`indexObjects -- checking object (${b}): "${e}".`) - : (c = !0); - } - } else c = !0; - c && (this.entries[t] = { offset: g - h.start, gen: a, uncompressed: !0 }); - e.lastIndex = i; - const p = e.exec(d); - if (p) { - o = e.lastIndex + 1 - g; - if ('endobj' !== p[1]) { - (0, r.warn)( - `indexObjects: Found "${p[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`, - ); - o -= p[1].length + 1; - } - } else o = f - g; - const w = u.subarray(g, g + o), - S = skipUntil(w, 0, l); - if (S < o && w[S + 5] < 64) { - m.push(g - h.start); - this._xrefStms.add(g - h.start); - } - g += o; - } else if (b.startsWith('trailer') && (7 === b.length || /\s/.test(b[7]))) { - p.push(g); - const e = g + b.length; - let a; - t.lastIndex = e; - const i = t.exec(d); - if (i) { - a = t.lastIndex + 1 - g; - if ('startxref' !== i[1]) { - (0, r.warn)( - `indexObjects: Found "${i[1]}" after "trailer", caused by missing "startxref" -- trying to recover.`, - ); - a -= i[1].length + 1; - } - } else a = f - g; - g += a; - } else g += b.length + 1; - } - for (const e of m) { - this.startXRefQueue.push(e); - this.readXRef(!0); - } - const b = []; - let y, - w, - S = !1; - for (const e of p) { - h.pos = e; - const t = new n.Parser({ - lexer: new n.Lexer(h), - xref: this, - allowStreams: !0, - recoveryMode: !0, - }), - a = t.getObj(); - if (!(0, i.isCmd)(a, 'trailer')) continue; - const r = t.getObj(); - if (r instanceof i.Dict) { - b.push(r); - r.has('Encrypt') && (S = !0); - } - } - for (const e of [...b, 'genFallback', ...b]) { - if ('genFallback' === e) { - if (!w) break; - this._generationFallback = !0; - continue; - } - let t = !1; - try { - const a = e.get('Root'); - if (!(a instanceof i.Dict)) continue; - const r = a.get('Pages'); - if (!(r instanceof i.Dict)) continue; - const n = r.get('Count'); - Number.isInteger(n) && (t = !0); - } catch (e) { - w = e; - continue; - } - if (t && (!S || e.has('Encrypt')) && e.has('ID')) return e; - y = e; - } - if (y) return y; - if (this.topDict) return this.topDict; - throw new r.InvalidPDFException('Invalid PDF structure.'); - } - readXRef(e = !1) { - const t = this.stream, - a = new Set(); - for (; this.startXRefQueue.length; ) { - try { - const e = this.startXRefQueue[0]; - if (a.has(e)) { - (0, r.warn)('readXRef - skipping XRef table since it was already parsed.'); - this.startXRefQueue.shift(); - continue; - } - a.add(e); - t.pos = e + t.start; - const s = new n.Parser({ lexer: new n.Lexer(t), xref: this, allowStreams: !0 }); - let c, - l = s.getObj(); - if ((0, i.isCmd)(l, 'xref')) { - c = this.processXRefTable(s); - this.topDict || (this.topDict = c); - l = c.get('XRefStm'); - if (Number.isInteger(l) && !this._xrefStms.has(l)) { - this._xrefStms.add(l); - this.startXRefQueue.push(l); - } - } else { - if (!Number.isInteger(l)) throw new r.FormatError('Invalid XRef stream header'); - if ( - !( - Number.isInteger(s.getObj()) && - (0, i.isCmd)(s.getObj(), 'obj') && - (l = s.getObj()) instanceof o.BaseStream - ) - ) - throw new r.FormatError('Invalid XRef stream'); - c = this.processXRefStream(l); - this.topDict || (this.topDict = c); - if (!c) throw new r.FormatError('Failed to read XRef stream'); - } - l = c.get('Prev'); - Number.isInteger(l) - ? this.startXRefQueue.push(l) - : l instanceof i.Ref && this.startXRefQueue.push(l.num); - } catch (e) { - if (e instanceof s.MissingDataException) throw e; - (0, r.info)('(while reading XRef): ' + e); - } - this.startXRefQueue.shift(); - } - if (this.topDict) return this.topDict; - if (!e) throw new s.XRefParseException(); - } - get lastXRefStreamPos() { - return this._xrefStms.size > 0 ? Math.max(...this._xrefStms) : null; - } - getEntry(e) { - const t = this.entries[e]; - return t && !t.free && t.offset ? t : null; - } - fetchIfRef(e, t = !1) { - return e instanceof i.Ref ? this.fetch(e, t) : e; - } - fetch(e, t = !1) { - if (!(e instanceof i.Ref)) throw new Error('ref object is not a reference'); - const a = e.num, - n = this._cacheMap.get(a); - if (void 0 !== n) { - n instanceof i.Dict && !n.objId && (n.objId = e.toString()); - return n; - } - let s = this.getEntry(a); - if (null === s) { - this._cacheMap.set(a, s); - return s; - } - if (this._pendingRefs.has(e)) { - this._pendingRefs.remove(e); - (0, r.warn)(`Ignoring circular reference: ${e}.`); - return i.CIRCULAR_REF; - } - this._pendingRefs.put(e); - try { - s = s.uncompressed - ? this.fetchUncompressed(e, s, t) - : this.fetchCompressed(e, s, t); - this._pendingRefs.remove(e); - } catch (t) { - this._pendingRefs.remove(e); - throw t; - } - s instanceof i.Dict - ? (s.objId = e.toString()) - : s instanceof o.BaseStream && (s.dict.objId = e.toString()); - return s; - } - fetchUncompressed(e, t, a = !1) { - const c = e.gen; - let l = e.num; - if (t.gen !== c) { - const n = `Inconsistent generation in XRef: ${e}`; - if (this._generationFallback && t.gen < c) { - (0, r.warn)(n); - return this.fetchUncompressed(i.Ref.get(l, t.gen), t, a); - } - throw new s.XRefEntryException(n); - } - const h = this.stream.makeSubStream(t.offset + this.stream.start), - u = new n.Parser({ lexer: new n.Lexer(h), xref: this, allowStreams: !0 }), - d = u.getObj(), - f = u.getObj(), - g = u.getObj(); - if (d !== l || f !== c || !(g instanceof i.Cmd)) - throw new s.XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`); - if ('obj' !== g.cmd) { - if (g.cmd.startsWith('obj')) { - l = parseInt(g.cmd.substring(3), 10); - if (!Number.isNaN(l)) return l; - } - throw new s.XRefEntryException(`Bad (uncompressed) XRef entry: ${e}`); - } - (t = - this.encrypt && !a - ? u.getObj(this.encrypt.createCipherTransform(l, c)) - : u.getObj()) instanceof o.BaseStream || this._cacheMap.set(l, t); - return t; - } - fetchCompressed(e, t, a = !1) { - const c = t.offset, - l = this.fetch(i.Ref.get(c, 0)); - if (!(l instanceof o.BaseStream)) throw new r.FormatError('bad ObjStm stream'); - const h = l.dict.get('First'), - u = l.dict.get('N'); - if (!Number.isInteger(h) || !Number.isInteger(u)) - throw new r.FormatError('invalid first and n parameters for ObjStm stream'); - let d = new n.Parser({ lexer: new n.Lexer(l), xref: this, allowStreams: !0 }); - const f = new Array(u), - g = new Array(u); - for (let e = 0; e < u; ++e) { - const t = d.getObj(); - if (!Number.isInteger(t)) - throw new r.FormatError(`invalid object number in the ObjStm stream: ${t}`); - const a = d.getObj(); - if (!Number.isInteger(a)) - throw new r.FormatError(`invalid object offset in the ObjStm stream: ${a}`); - f[e] = t; - g[e] = a; - } - const p = (l.start || 0) + h, - m = new Array(u); - for (let e = 0; e < u; ++e) { - const t = e < u - 1 ? g[e + 1] - g[e] : void 0; - if (t < 0) throw new r.FormatError('Invalid offset in the ObjStm stream.'); - d = new n.Parser({ - lexer: new n.Lexer(l.makeSubStream(p + g[e], t, l.dict)), - xref: this, - allowStreams: !0, - }); - const a = d.getObj(); - m[e] = a; - if (a instanceof o.BaseStream) continue; - const i = f[e], - s = this.entries[i]; - s && s.offset === c && s.gen === e && this._cacheMap.set(i, a); - } - if (void 0 === (t = m[t.gen])) - throw new s.XRefEntryException(`Bad (compressed) XRef entry: ${e}`); - return t; - } - async fetchIfRefAsync(e, t) { - return e instanceof i.Ref ? this.fetchAsync(e, t) : e; - } - async fetchAsync(e, t) { - try { - return this.fetch(e, t); - } catch (a) { - if (!(a instanceof s.MissingDataException)) throw a; - await this.pdfManager.requestRange(a.begin, a.end); - return this.fetchAsync(e, t); - } - } - getCatalogObj() { - return this.root; - } - }; - }, - (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.MessageHandler = void 0; - var r = a(2); - const i = 1, - n = 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.#t(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 === i) a.resolve(t.data); - else { - if (t.callback !== n) 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: i, - callbackId: t.callbackId, - data: r, - }); - }, - function (r) { - a.postMessage({ - sourceName: e, - targetName: s, - callback: n, - callbackId: t.callbackId, - reason: wrapReason(r), - }); - }, - ); - } else t.streamId ? this.#a(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 i = this.callbackId++, - n = new r.PromiseCapability(); - this.callbackCapabilities[i] = n; - try { - this.comObj.postMessage( - { - sourceName: this.sourceName, - targetName: this.targetName, - action: e, - callbackId: i, - data: t, - }, - a, - ); - } catch (e) { - n.reject(e); - } - return n.promise; - } - sendWithStream(e, t, a, i) { - const n = this.streamId++, - o = this.sourceName, - c = this.targetName, - l = this.comObj; - return new ReadableStream( - { - start: (a) => { - const s = new r.PromiseCapability(); - this.streamControllers[n] = { - controller: a, - startCall: s, - pullCall: null, - cancelCall: null, - isClosed: !1, - }; - l.postMessage( - { - sourceName: o, - targetName: c, - action: e, - streamId: n, - data: t, - desiredSize: a.desiredSize, - }, - i, - ); - return s.promise; - }, - pull: (e) => { - const t = new r.PromiseCapability(); - this.streamControllers[n].pullCall = t; - l.postMessage({ - sourceName: o, - targetName: c, - stream: u, - streamId: n, - desiredSize: e.desiredSize, - }); - return t.promise; - }, - cancel: (e) => { - (0, r.assert)(e instanceof Error, 'cancel must have a valid reason'); - const t = new r.PromiseCapability(); - this.streamControllers[n].cancelCall = t; - this.streamControllers[n].isClosed = !0; - l.postMessage({ - sourceName: o, - targetName: c, - stream: s, - streamId: n, - reason: wrapReason(e), - }); - return t.promise; - }, - }, - a, - ); - } - #a(e) { - const t = e.streamId, - a = this.sourceName, - i = e.sourceName, - n = 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 = new r.PromiseCapability(); - this.ready = this.sinkCapability.promise; - } - n.postMessage( - { sourceName: a, targetName: i, stream: l, streamId: t, chunk: e }, - o, - ); - }, - close() { - if (!this.isCancelled) { - this.isCancelled = !0; - n.postMessage({ sourceName: a, targetName: i, 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; - n.postMessage({ - sourceName: a, - targetName: i, - stream: h, - streamId: t, - reason: wrapReason(e), - }); - } - }, - sinkCapability: new r.PromiseCapability(), - 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 () { - n.postMessage({ - sourceName: a, - targetName: i, - stream: f, - streamId: t, - success: !0, - }); - }, - function (e) { - n.postMessage({ - sourceName: a, - targetName: i, - stream: f, - streamId: t, - reason: wrapReason(e), - }); - }, - ); - } - #t(e) { - const t = e.streamId, - a = this.sourceName, - i = e.sourceName, - n = 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) { - n.postMessage({ - sourceName: a, - targetName: i, - 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?.()); - }).then( - function () { - n.postMessage({ - sourceName: a, - targetName: i, - stream: d, - streamId: t, - success: !0, - }); - }, - function (e) { - n.postMessage({ - sourceName: a, - targetName: i, - 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.#r(g, t); - break; - case h: - (0, r.assert)(g, 'error should have stream controller'); - g.controller.error(wrapReason(e.reason)); - this.#r(g, t); - break; - case o: - e.success ? g.cancelCall.resolve() : g.cancelCall.reject(wrapReason(e.reason)); - this.#r(g, t); - break; - case s: - if (!p) break; - new Promise(function (t) { - t(p.onCancel?.(wrapReason(e.reason))); - }).then( - function () { - n.postMessage({ - sourceName: a, - targetName: i, - stream: o, - streamId: t, - success: !0, - }); - }, - function (e) { - n.postMessage({ - sourceName: a, - targetName: i, - 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 #r(e, t) { - await Promise.allSettled([ - e.startCall?.promise, - e.pullCall?.promise, - 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 i = (t[a] = { exports: {} }); - e[a](i, i.exports, __w_pdfjs_require__); - return i.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; - })(), -); +!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),i=a(3),n=a(4),s=a(6),o=a(71),c=a(65),l=a(102),h=a(103),u=a(104);class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=new r.PromiseCapability}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(t){if(!a){a=!0;e.send("test",t instanceof Uint8Array)}}));e.on("configure",(function(e){(0,r.setVerbosityLevel)(e.verbosity)}));e.on("GetDocRequest",(function(e){return WorkerMessageHandler.createDocumentHandler(e,t)}))}static createDocumentHandler(e,t){let a,d=!1,f=null;const g=new Set,p=(0,r.getVerbosityLevel)(),{docId:m,apiVersion:b}=e,y="3.6.172";if(b!==y)throw new Error(`The API version "${b}" does not match the Worker version "${y}".`);const w=[];for(const e in[])w.push(e);if(w.length)throw new Error("The `Array.prototype` contains unexpected enumerable properties: "+w.join(", ")+"; thus breaking e.g. `for...in` iteration of `Array`s.");if(l.isNodeJS&&"undefined"==typeof Path2D||"undefined"==typeof ReadableStream){const e="The browser/environment lacks native support for critical functionality used by the PDF.js library (e.g. `Path2D` and/or `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 S=m+"_worker";let x=new h.MessageHandler(S,m,t);function ensureNotTerminated(){if(d)throw new Error("Worker was terminated")}function startWorkerTask(e){g.add(e)}function finishWorkerTask(e){e.finish();g.delete(e)}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(x,e).catch((e=>{})).then((()=>finishWorkerTask(e))),a.loadXfaImages()])}const[r,i]=await Promise.all([a.ensureDoc("numPages"),a.ensureDoc("fingerprints")]);return{numPages:r,fingerprints:i,htmlForXfa:t?await a.ensureDoc("htmlForXfa"):null}}function getPdfManager({data:e,password:t,disableAutoFetch:a,rangeChunkSize:n,length:o,docBaseUrl:c,enableXfa:l,evaluatorOptions:h}){const d={source:null,disableAutoFetch:a,docBaseUrl:c,docId:m,enableXfa:l,evaluatorOptions:h,handler:x,length:o,password:t,rangeChunkSize:n},g=new r.PromiseCapability;let p;if(e){try{d.source=e;p=new s.LocalPdfManager(d);g.resolve(p)}catch(e){g.reject(e)}return g.promise}let b,y=[];try{b=new u.PDFWorkerStream(x)}catch(e){g.reject(e);return g.promise}const w=b.getFullReader();w.headersReady.then((function(){if(w.isRangeSupported){d.source=b;d.length=w.contentLength;d.disableAutoFetch||=w.isStreamingSupported;p=new s.NetworkPdfManager(d);for(const e of y)p.sendProgressiveData(e);y=[];g.resolve(p);f=null}})).catch((function(e){g.reject(e);f=null}));let S=0;new Promise((function(e,t){const readChunk=function({value:e,done:a}){try{ensureNotTerminated();if(a){p||function(){const e=(0,i.arrayBuffersToBytes)(y);o&&e.length!==o&&(0,r.warn)("reported HTTP length is different from actual");try{d.source=e;p=new s.LocalPdfManager(d);g.resolve(p)}catch(e){g.reject(e)}y=[]}();f=null;return}S+=e.byteLength;w.isStreamingSupported||x.send("DocProgress",{loaded:S,total:Math.max(S,w.contentLength||0)});p?p.sendProgressiveData(e):y.push(e);w.read().then(readChunk,t)}catch(e){t(e)}};w.read().then(readChunk,t)})).catch((function(e){g.reject(e);f=null}));f=function(e){b.cancelAllRequests(e)};return g.promise}x.on("GetPage",(function(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}}))}))}));x.on("GetPageIndex",(function(e){const t=n.Ref.get(e.num,e.gen);return a.ensureCatalog("getPageIndex",[t])}));x.on("GetDestinations",(function(e){return a.ensureCatalog("destinations")}));x.on("GetDestination",(function(e){return a.ensureCatalog("getDestination",[e.id])}));x.on("GetPageLabels",(function(e){return a.ensureCatalog("pageLabels")}));x.on("GetPageLayout",(function(e){return a.ensureCatalog("pageLayout")}));x.on("GetPageMode",(function(e){return a.ensureCatalog("pageMode")}));x.on("GetViewerPreferences",(function(e){return a.ensureCatalog("viewerPreferences")}));x.on("GetOpenAction",(function(e){return a.ensureCatalog("openAction")}));x.on("GetAttachments",(function(e){return a.ensureCatalog("attachments")}));x.on("GetJavaScript",(function(e){return a.ensureCatalog("javaScript")}));x.on("GetDocJSActions",(function(e){return a.ensureCatalog("jsActions")}));x.on("GetPageJSActions",(function({pageIndex:e}){return a.getPage(e).then((function(e){return a.ensure(e,"jsActions")}))}));x.on("GetOutline",(function(e){return a.ensureCatalog("documentOutline")}));x.on("GetOptionalContentConfig",(function(e){return a.ensureCatalog("optionalContentConfig")}));x.on("GetPermissions",(function(e){return a.ensureCatalog("permissions")}));x.on("GetMetadata",(function(e){return Promise.all([a.ensureDoc("documentInfo"),a.ensureCatalog("metadata")])}));x.on("GetMarkInfo",(function(e){return a.ensureCatalog("markInfo")}));x.on("GetData",(function(e){return a.requestLoadedStream().then((function(e){return e.bytes}))}));x.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(x,r,t).then((e=>{finishWorkerTask(r);return e}),(e=>{finishWorkerTask(r);throw e}))}))}));x.on("GetFieldObjects",(function(e){return a.ensureDoc("fieldObjects")}));x.on("HasJSActions",(function(e){return a.ensureDoc("hasJSActions")}));x.on("GetCalculationOrderIds",(function(e){return a.ensureDoc("calculationOrderIds")}));x.on("SaveDocument",(function({isPureXfa:e,numPages:t,annotationStorage:s,filename:o}){const l=[a.requestLoadedStream(),a.ensureCatalog("acroForm"),a.ensureCatalog("acroFormRef"),a.ensureDoc("xref"),a.ensureDoc("startXRef")],h=e?null:(0,i.getNewAnnotationsMap)(s);if(h)for(const[e,t]of h)l.push(a.getPage(e).then((a=>{const r=new WorkerTask(`Save (editor): page ${e}`);return a.saveNewAnnotations(x,r,t).finally((function(){finishWorkerTask(r)}))})));if(e)l.push(a.serializeXfaData(s));else for(let e=0;ee.needAppearances)),g=a instanceof n.Dict&&a.get("XFA")||null;let p=null,m=!1;if(Array.isArray(g)){for(let e=0,t=g.length;e{"string"==typeof a&&(e[t]=(0,r.stringToPDFString)(a))}));b={rootRef:s.trailer.getRaw("Root")||null,encryptRef:s.trailer.getRaw("Encrypt")||null,newRef:s.getNewTemporaryRef(),infoRef:s.trailer.getRaw("Info")||null,info:e,fileIds:s.trailer.get("ID")||null,startXRef:s.lastXRefStreamPos??l,filename:o}}try{return(0,c.incrementalUpdate)({originalData:t.bytes,xrefInfo:b,newRefs:u,xref:s,hasXfa:!!g,xfaDatasetsRef:p,hasXfaDatasetsEntry:m,needAppearances:f,acroFormRef:i,acroForm:a,xfaData:d})}finally{s.resetNewTemporaryRef()}}))}));x.on("GetOperatorList",(function(e,t){const i=e.pageIndex;a.getPage(i).then((function(a){const n=new WorkerTask(`GetOperatorList: page ${i}`);startWorkerTask(n);const s=p>=r.VerbosityLevel.INFOS?Date.now():0;a.getOperatorList({handler:x,sink:t,task:n,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage}).then((function(e){finishWorkerTask(n);s&&(0,r.info)(`page=${i+1} - getOperatorList: time=${Date.now()-s}ms, len=${e.length}`);t.close()}),(function(e){finishWorkerTask(n);n.terminated||t.error(e)}))}))}));x.on("GetTextContent",(function(e,t){const{pageIndex:i,includeMarkedContent:n,disableNormalization:s}=e;a.getPage(i).then((function(e){const a=new WorkerTask("GetTextContent: page "+i);startWorkerTask(a);const o=p>=r.VerbosityLevel.INFOS?Date.now():0;e.extractTextContent({handler:x,task:a,sink:t,includeMarkedContent:n,disableNormalization:s}).then((function(){finishWorkerTask(a);o&&(0,r.info)(`page=${i+1} - getTextContent: time=`+(Date.now()-o)+"ms");t.close()}),(function(e){finishWorkerTask(a);a.terminated||t.error(e)}))}))}));x.on("GetStructTree",(function(e){return a.getPage(e.pageIndex).then((function(e){return a.ensure(e,"getStructTree")}))}));x.on("FontFallback",(function(e){return a.fontFallback(e.id,x)}));x.on("Cleanup",(function(e){return a.cleanup(!0)}));x.on("Terminate",(function(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(){x.destroy();x=null}))}));x.on("Ready",(function(t){!function setupDoc(e){function onSuccess(e){ensureNotTerminated();x.send("GetDoc",{pdfInfo:e})}function onFailure(e){ensureNotTerminated();if(e instanceof r.PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);x.sendWithPromise("PasswordRequest",e).then((function({password:e}){finishWorkerTask(t);a.updatePassword(e);pdfManagerReady()})).catch((function(){finishWorkerTask(t);x.send("DocException",e)}))}else e instanceof r.InvalidPDFException||e instanceof r.MissingPDFException||e instanceof r.UnexpectedResponseException||e instanceof r.UnknownErrorException?x.send("DocException",e):x.send("DocException",new r.UnknownErrorException(e.message,e.toString()))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,(function(e){ensureNotTerminated();e instanceof i.XRefParseException?a.requestLoadedStream().then((function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)})):onFailure(e)}))}ensureNotTerminated();getPdfManager(e).then((function(e){if(d){e.terminate(new r.AbortException("Worker was terminated."));throw new Error("Worker was terminated")}a=e;a.requestLoadedStream(!0).then((e=>{x.send("DataLoaded",{length:e.bytes.byteLength})}))})).then(pdfManagerReady,onFailure)}(e);e=null}));return S}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)=>{Object.defineProperty(t,"__esModule",{value:!0});t.VerbosityLevel=t.Util=t.UnknownErrorException=t.UnexpectedResponseException=t.TextRenderingMode=t.RenderingIntentFlag=t.PromiseCapability=t.PermissionFlag=t.PasswordResponses=t.PasswordException=t.PageActionEventType=t.OPS=t.MissingPDFException=t.MAX_IMAGE_SIZE_TO_CACHE=t.LINE_FACTOR=t.LINE_DESCENT_FACTOR=t.InvalidPDFException=t.ImageKind=t.IDENTITY_MATRIX=t.FormatError=t.FeatureTest=t.FONT_IDENTITY_MATRIX=t.DocumentActionEventType=t.CMapCompressionType=t.BaseException=t.BASELINE_FACTOR=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.assert=function assert(e,t){e||unreachable(t)};t.bytesToString=function bytesToString(e){"object"==typeof e&&void 0!==e?.length||unreachable("Invalid argument for bytesToString");const t=e.length,a=8192;if(t=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){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.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 r};t.info=function info(e){r>=a.INFOS&&console.log(`Info: ${e}`)};t.isArrayBuffer=function isArrayBuffer(e){return"object"==typeof 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;at?t.normalize("NFKC"):c.get(a)))};t.objectFromMap=function objectFromMap(e){const t=Object.create(null);for(const[a,r]of e)t[a]=r;return t};t.objectSize=function objectSize(e){return Object.keys(e).length};t.setVerbosityLevel=function setVerbosityLevel(e){Number.isInteger(e)&&(r=e)};t.shadow=shadow;t.string32=function string32(e){return String.fromCharCode(e>>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=a.WARNINGS&&console.log(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function shadow(e,t,a,r=!1){Object.defineProperty(e,t,{value:a,enumerable:!r,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`#${n[e]}${n[t]}${n[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),i=Util.applyTransform([e[0],e[3]],t),n=Util.applyTransform([e[2],e[1]],t);return[Math.min(a[0],r[0],i[0],n[0]),Math.min(a[1],r[1],i[1],n[1]),Math.max(a[0],r[0],i[0],n[0]),Math.max(a[1],r[1],i[1],n[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 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],i=e[2]*t[0]+e[3]*t[2],n=e[2]*t[1]+e[3]*t[3],s=(a+n)/2,o=Math.sqrt((a+n)**2-4*(a*n-i*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 i=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),n=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return i>n?null:[a,i,r,n]}static bezierBoundingBox(e,t,a,r,i,n,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*i;h=-3*e+9*a-9*i+3*s;d=3*a-3*e}else{u=6*t-12*r+6*n;h=-3*t+9*r-9*n+3*o;d=3*r-3*t}if(Math.abs(h)<1e-12){if(Math.abs(u)<1e-12)continue;f=-d/u;0{this.resolve=t=>{this.#e=!0;e(t)};this.reject=e=>{this.#e=!0;t(e)}}))}get settled(){return this.#e}};let o=null,c=null},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XRefParseException=t.XRefEntryException=t.ParserEOFException=t.PDF_VERSION_REGEXP=t.MissingDataException=void 0;t.arrayBuffersToBytes=function arrayBuffersToBytes(e){const t=e.length;if(0===t)return new Uint8Array(0);if(1===t)return new Uint8Array(e[0]);let a=0;for(let r=0;r=0;t--){const r=s[t];if(r instanceof i.Dict)for(const t of r.getKeys()){const s=a[t];if(!s)continue;const o=[];_collectJS(r.getRaw(t),e,o,new i.RefSet);o.length>0&&(n[s]=o)}}if(t.has("A")){const a=[];_collectJS(t.get("A"),e,a,new i.RefSet);a.length>0&&(n.Action=a)}return(0,r.objectSize)(n)>0?n:null};t.encodeToXmlString=function encodeToXmlString(e){const t=[];let a=0;for(let r=0,i=e.length;r55295&&(i<57344||i>65533)&&r++;a=r+1}}if(0===t.length)return e;a126||35===i||40===i||41===i||60===i||62===i||91===i||93===i||123===i||125===i||47===i||37===i){a"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`))};t.getInheritableProperty=getInheritableProperty;t.getLookupTableFactory=function getLookupTableFactory(e){let t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}};t.getNewAnnotationsMap=function getNewAnnotationsMap(e){if(!e)return null;const t=new Map;for(const[a,i]of e){if(!a.startsWith(r.AnnotationEditorPrefix))continue;let e=t.get(i.pageIndex);if(!e){e=[];t.set(i.pageIndex,e)}e.push(i)}return t.size>0?t:null};t.getRotationMatrix=function 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")}};t.isAscii=function isAscii(e){return/^[\x00-\x7F]*$/.test(e)};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("|").replaceAll(".","\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\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.stringToUTF16HexString=function stringToUTF16HexString(e){const t=[];for(let a=0,r=e.length;a>8&255).toString(16).padStart(2,"0"),(255&r).toString(16).padStart(2,"0"))}return t.join("")};t.stringToUTF16String=function stringToUTF16String(e,t=!1){const a=[];t&&a.push("þÿ");for(let t=0,r=e.length;t>8&255),String.fromCharCode(255&r))}return a.join("")};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 i;for(;e>=1e3;){e-=1e3;a.push("M")}i=e/100|0;e%=100;a.push(s[i]);i=e/10|0;e%=10;a.push(s[10+i]);a.push(s[20+e]);const n=a.join("");return t?n.toLowerCase():n};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:i,italicAngle:n}=e,s=/^("|').*("|')$/.exec(a);if(s&&s[1]===s[2]){if(new RegExp(`[^\\\\]${s[1]}`).test(a.slice(1,-1))){(0,r.warn)(`XFA - FontFamily contains unescaped ${s[1]}: ${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 invalid : ${a}.`);return!1}const o=i?i.toString():"";e.fontWeight=t.has(o)?o:"400";const c=parseFloat(n);e.italicAngle=isNaN(c)||c<-90||c>90?"14":n.toString();return!0};var r=a(2),i=a(4),n=a(5);t.PDF_VERSION_REGEXP=/^[1-9]\.\d$/;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;function getInheritableProperty({dict:e,key:t,getArray:a=!1,stopWhenFound:r=!0}){let n;const s=new i.RefSet;for(;e instanceof i.Dict&&(!e.objId||!s.has(e.objId));){e.objId&&s.put(e.objId);const i=a?e.getArray(t):e.get(t);if(void 0!==i){if(r)return i;(n||=[]).push(i)}e=e.get("Parent")}return n}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 i.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 i.Dict){if((0,i.isName)(e.get("S"),"JavaScript")){const t=e.get("JS");let i;t instanceof n.BaseStream?i=t.getString():"string"==typeof t&&(i=t);i&&=(0,r.stringToPDFString)(i).replaceAll("\0","");i&&a.push(i)}_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.RefSetCache=t.RefSet=t.Ref=t.Name=t.EOF=t.Dict=t.Cmd=t.CIRCULAR_REF=void 0;t.clearPrimitiveCaches=function clearPrimitiveCaches(){s=Object.create(null);o=Object.create(null);c=Object.create(null)};t.isCmd=function isCmd(e,t){return e instanceof Cmd&&(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 i=Symbol("CIRCULAR_REF");t.CIRCULAR_REF=i;const n=Symbol("EOF");t.EOF=n;let s=Object.create(null),o=Object.create(null),c=Object.create(null);class Name{constructor(e){this.name=e}static get(e){return o[e]||=new Name(e)}}t.Name=Name;class Cmd{constructor(e){this.cmd=e}static get(e){return s[e]||=new Cmd(e)}}t.Cmd=Cmd;const l=function nonSerializableClosure(){return l};class Dict{constructor(e=null){this._map=Object.create(null);this.xref=e;this.objId=null;this.suppressEncryption=!1;this.__nonSerializable__=l}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 Ref&&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 Ref&&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 Ref&&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),i=new Map;for(const e of t)if(e instanceof Dict)for(const[t,r]of Object.entries(e._map)){let e=i.get(t);if(void 0===e){e=[];i.set(t,e)}else if(!(a&&r instanceof Dict))continue;e.push(r)}for(const[t,a]of i){if(1===a.length||!(a[0]instanceof Dict)){r._map[t]=a[0];continue}const i=new Dict(e);for(const e of a)for(const[t,a]of Object.entries(e._map))void 0===i._map[t]&&(i._map[t]=a);i.size>0&&(r._map[t]=i)}i.clear();return r.size>0?r:Dict.empty}}t.Dict=Dict;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(e,t){const a=0===t?`${e}R`:`${e}R${t}`;return c[a]||=new Ref(e,t)}}t.Ref=Ref;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 Name&&(void 0===t||e.name===t)}},(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),i=a(7),n=a(3),s=a(9),o=a(8);class BasePdfManager{constructor(e){this.constructor===BasePdfManager&&(0,r.unreachable)("Cannot initialize BasePdfManager.");this._docBaseUrl=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}(e.docBaseUrl);this._docId=e.docId;this._password=e.password;this.enableXfa=e.enableXfa;e.evaluatorOptions.isOffscreenCanvasSupported&&=r.FeatureTest.isOffscreenCanvasSupported;this.evaluatorOptions=e.evaluatorOptions}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)}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(e=!1){(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){super(e);const t=new o.Stream(e.source);this.pdfDocument=new s.PDFDocument(this,t);this._loadedStreamPromise=Promise.resolve(t)}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(e=!1){return this._loadedStreamPromise}terminate(e){}};t.NetworkPdfManager=class NetworkPdfManager extends BasePdfManager{constructor(e){super(e);this.streamManager=new i.ChunkedStreamManager(e.source,{msgHandler:e.handler,length:e.length,disableAutoFetch:e.disableAutoFetch,rangeChunkSize:e.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 n.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(e=!1){return this.streamManager.requestAllChunks(e)}sendProgressiveData(e){this.streamManager.onReceiveData({chunk:e})}terminate(e){this.streamManager.abort(e)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ChunkedStreamManager=t.ChunkedStream=void 0;var r=a(3),i=a(2),n=a(8);class ChunkedStream extends n.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 r.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 i=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let n=a;n=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 i=a+e;i>r&&(i=r);i>this.progressiveDataLength&&this.ensureRange(a,i);this.pos=i;return t.subarray(a,i)}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=({value:s,done:o})=>{try{if(o){const t=(0,r.arrayBuffersToBytes)(i);i=null;e(t);return}n+=s.byteLength;a.isStreamingSupported&&this.onProgress({loaded:n});i.push(s);a.read().then(readChunk,t)}catch(e){t(e)}};a.read().then(readChunk,t)})).then((t=>{this.aborted||this.onReceiveData({chunk:t,begin:e})}))}requestAllChunks(e=!1){if(!e){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 r=new i.PromiseCapability;this._promisesByRequest.set(t,r);const n=[];for(const e of a){let a=this._requestsByChunk.get(e);if(!a){a=[];this._requestsByChunk.set(e,a);n.push(e)}a.push(t)}if(n.length>0){const e=this.groupChunks(n);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(r.reject)}}return r.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),i=[];for(let e=a;e=0&&r+1!==n){t.push({beginChunk:a,endChunk:r+1});a=n}i+1===e.length&&t.push({beginChunk:a,endChunk:n+1});r=n}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,i=r+t.byteLength,n=Math.floor(r/this.chunkSize),s=i0||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(5),i=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 i=a+e;i>r&&(i=r);this.pos=i;return t.subarray(a,i)}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,i.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(10),i=a(2),n=a(3),s=a(4),o=a(51),c=a(5),l=a(67),h=a(69),u=a(71),d=a(100),f=a(16),g=a(8),p=a(75),m=a(63),b=a(13),y=a(18),w=a(74),S=a(65),x=a(76),C=a(101);const k=[0,0,612,792];class Page{constructor({pdfManager:e,xref:t,pageIndex:a,pageDict:r,ref:i,globalIdFactory:n,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=i;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 n{static createObjId(){return`p${a}_${++d.obj}`}static getPageObjId(){return`page${i.toString()}`}}}_getInheritableProperty(e,t=!1){const a=(0,n.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,i.shadow)(this,"resources",e instanceof s.Dict?e:s.Dict.empty)}_getBoundingBox(e){if(this.xfaData)return this.xfaData.bbox;let t=this._getInheritableProperty(e,!0);if(Array.isArray(t)&&4===t.length){t=i.Util.normalizeRect(t);if(t[2]-t[0]>0&&t[3]-t[1]>0)return t;(0,i.warn)(`Empty, or invalid, /${e} entry.`)}return null}get mediaBox(){return(0,i.shadow)(this,"mediaBox",this._getBoundingBox("MediaBox")||k)}get cropBox(){return(0,i.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,i.shadow)(this,"userUnit",e)}get view(){const{cropBox:e,mediaBox:t}=this;if(e!==t&&!(0,i.isArrayEqual)(e,t)){const a=i.Util.intersect(e,t);if(a&&a[2]-a[0]>0&&a[3]-a[1]>0)return(0,i.shadow)(this,"view",a);(0,i.warn)("Empty /CropBox and /MediaBox intersection.")}return(0,i.shadow)(this,"view",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,i.shadow)(this,"rotate",e)}_onSubStreamError(e,t){if(!this.evaluatorOptions.ignoreErrors)throw e;(0,i.warn)(`getContentStream - ignoring sub-stream (${t}): "${e}".`)}getContentStream(){return this.pdfManager.ensure(this,"content").then((e=>e instanceof c.BaseStream?e:Array.isArray(e)?new y.StreamsSequenceStream(e,this._onSubStreamError.bind(this)):new g.NullStream))}get xfaData(){return(0,i.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 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}),n=this.pageDict,s=this.annotations.slice(),o=await r.AnnotationFactory.saveNewAnnotations(i,t,a);for(const{ref:e}of o.annotations)s.push(e);const c=n.get("Annots");n.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,n,l,h);c&&n.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 n=[];for(const s of e)s.mustBePrinted(a)&&n.push(s.save(r,t,a).catch((function(e){(0,i.warn)(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null})));return Promise.all(n).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(),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,n.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 i=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:i}).then((function(){return i}))}));return Promise.all([g,this._parsedAnnotations,f]).then((function([e,t,r]){r&&(t=t.concat(r));if(0===t.length||s&i.RenderingIntentFlag.ANNOTATIONS_DISABLE){e.flush(!0);return{length:e.totalLength}}const n=!!(s&i.RenderingIntentFlag.ANNOTATIONS_FORMS),o=!!(s&i.RenderingIntentFlag.ANY),l=!!(s&i.RenderingIntentFlag.DISPLAY),h=!!(s&i.RenderingIntentFlag.PRINT),d=[];for(const e of t)(o||l&&e.mustBeViewed(c)||h&&e.mustBePrinted(c))&&d.push(e.getOperatorList(u,a,s,n,c).catch((function(e){(0,i.warn)(`getOperatorList - ignoring annotation data during "${a.name}" task: "${e}".`);return{opList:null,separateForm:!1,separateCanvas:!1}})));return Promise.all(d).then((function(t){let a=!1,r=!1;for(const{opList:i,separateForm:n,separateCanvas:s}of t){e.addOpList(i);a||=n;r||=s}e.flush(!0,{form:a,canvas:r});return{length:e.totalLength}}))}))}extractTextContent({handler:e,task:t,includeMarkedContent:a,disableNormalization:r,sink:i}){const n=this.getContentStream(),s=this.loadResources(["ExtGState","Font","Properties","XObject"]);return Promise.all([n,s]).then((([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}).getTextContent({stream:n,task:t,resources:this.resources,includeMarkedContent:a,disableNormalization:r,sink:i,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 n=[],s=[];let o;const c=!!(a&i.RenderingIntentFlag.ANY),l=!!(a&i.RenderingIntentFlag.DISPLAY),h=!!(a&i.RenderingIntentFlag.PRINT);for(const a of r){const r=c||l&&a.viewable;(r||h&&a.printable)&&n.push(a.data);if(a.hasTextContent&&r){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});s.push(a.extractTextContent(o,t,this.view).catch((function(e){(0,i.warn)(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)})))}}await Promise.all(s);return n}get annotations(){const e=this._getInheritableProperty("Annots");return(0,i.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,i.warn)(`_parsedAnnotations: "${e}".`);return null})));return Promise.all(e).then((function(e){if(0===e.length)return e;const t=[];let a;for(const i of e)i&&(i instanceof r.PopupAnnotation?(a||=[]).push(i):t.push(i));a&&t.push(...a);return t}))}));return(0,i.shadow)(this,"_parsedAnnotations",e)}get jsActions(){const e=(0,n.collectActions)(this.xref,this.pageDict,i.PageActionEventType);return(0,i.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]);function find(e,t,a=1024,r=!1){const i=t.length,n=e.peekBytes(a),s=n.length-i;if(s<=0)return!1;if(r){const a=i-1;let r=n.length-1;for(;r>=a;){let s=0;for(;s=i){e.pos+=r-a;return!0}r--}}else{let a=0;for(;a<=s;){let r=0;for(;r=i){e.pos+=a;return!0}a++}}return!1}t.PDFDocument=class PDFDocument{constructor(e,t){if(t.length<=0)throw new i.InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new C.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,i.unreachable)("Abstract method `createObjId` called.")}static getPageObjId(){(0,i.unreachable)("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new h.Catalog(this.pdfManager,this.xref)}get linearization(){let e=null;try{e=f.Linearization.create(this.stream)}catch(e){if(e instanceof n.MissingDataException)throw e;(0,i.info)(e)}return(0,i.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 i=!1,s=e.end;for(;!i&&s>0;){s-=a-r;s<0&&(s=0);e.pos=s;i=find(e,F,a,!0)}if(i){e.skip(9);let a;do{a=e.getByte()}while((0,n.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,i.shadow)(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,v))return;e.moveStart();e.skip(v.length);let t,a="";for(;(t=e.getByte())>32&&a.length<7;)a+=String.fromCharCode(t);n.PDF_VERSION_REGEXP.test(a)?this._version=a:(0,i.warn)(`Invalid PDF header version: ${a}`)}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,i.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,i.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"),n=Array.isArray(r)&&r.every((e=>0===e));return a&&n}))}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.replaceAll(/[ ]+(\d)/g,"$1");const l={fontFamily:c,fontWeight:o.get("FontWeight"),italicAngle:-o.get("ItalicAngle")};(0,n.validateCSSFont)(l)&&w.push(u.handleSetFont(r,[s.Name.get(e),1],null,d,t,g,null,l).catch((function(e){(0,i.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 n=`${e}-${a.name}`,c=(0,o.getXfaFontDict)(n);w.push(u.handleSetFont(r,[s.Name.get(n),1],null,d,t,g,c,{fontFamily:e,fontWeight:a.fontWeight,italicAngle:a.italicAngle}).catch((function(e){(0,i.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 version(){return this.catalog.version||this._version}get formInfo(){const e={hasFields:!1,hasAcroForm:!1,hasXfa:!1,hasSignatures:!1},t=this.catalog.acroForm;if(!t)return(0,i.shadow)(this,"formInfo",e);try{const a=t.get("Fields"),r=Array.isArray(a)&&a.length>0;e.hasFields=r;const i=t.get("XFA");e.hasXfa=Array.isArray(i)&&i.length>0||i instanceof c.BaseStream&&!i.isEmpty;const n=!!(1&t.get("SigFlags")),s=n&&this._hasOnlyDocumentSignatures(a);e.hasAcroForm=r&&!s;e.hasSignatures=n}catch(e){if(e instanceof n.MissingDataException)throw e;(0,i.warn)(`Cannot fetch form information: "${e}".`)}return(0,i.shadow)(this,"formInfo",e)}get documentInfo(){const e={PDFFormatVersion:this.version,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 t;try{t=this.xref.trailer.get("Info")}catch(e){if(e instanceof n.MissingDataException)throw e;(0,i.info)("The document information dictionary is invalid.")}if(!(t instanceof s.Dict))return(0,i.shadow)(this,"documentInfo",e);for(const a of t.getKeys()){const r=t.get(a);switch(a){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof r){e[a]=(0,i.stringToPDFString)(r);continue}break;case"Trapped":if(r instanceof s.Name){e[a]=r;continue}break;default:let t;switch(typeof r){case"string":t=(0,i.stringToPDFString)(r);break;case"number":case"boolean":t=r;break;default:r instanceof s.Name&&(t=r)}if(void 0===t){(0,i.warn)(`Bad value, for custom key "${a}", in Info: ${r}.`);continue}e.Custom||(e.Custom=Object.create(null));e.Custom[a]=t;continue}(0,i.warn)(`Bad value, for key "${a}", in Info: ${r}.`)}return(0,i.shadow)(this,"documentInfo",e)}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(const a of e){const e=a.toString(16);t.push(e.padStart(2,"0"))}return t.join("")}const e=this.xref.trailer.get("ID");let t,a;if(Array.isArray(e)&&validate(e[0])){t=(0,i.stringToBytes)(e[0]);e[1]!==e[0]&&validate(e[1])&&(a=(0,i.stringToBytes)(e[1]))}else t=(0,l.calculateMD5)(this.stream.getByteRange(0,1024),0,1024);return(0,i.shadow)(this,"fingerprints",[hexString(t),a?hexString(a):null])}async _getLinearizationPage(e){const{catalog:t,linearization:a,xref:r}=this,n=s.Ref.get(a.objectNumberFirst,0);try{const e=await r.fetchAsync(n);if(e instanceof s.Dict){let a=e.getRaw("Type");a instanceof s.Ref&&(a=await r.fetchAsync(a));if((0,s.isName)(a,"Page")||!e.has("Type")&&!e.has("Kids")){t.pageKidsCountCache.has(n)||t.pageKidsCountCache.put(n,1);t.pageIndexCache.has(n)||t.pageIndexCache.put(n,0);return[e,n]}}throw new i.FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.")}catch(a){(0,i.warn)(`_getLinearizationPage: "${a.message}".`);return t.getPageDict(e)}}getPage(e){const t=this._pagePromises.get(e);if(t)return t;const{catalog:a,linearization:r,xfaFactory:i}=this;let n;n=i?Promise.resolve([s.Dict.empty,null]):r&&r.pageFirst===e?this._getLinearizationPage(e):a.getPageDict(e);n=n.then((([t,r])=>new 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:i})));this._pagePromises.set(e,n);return n}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof n.XRefEntryException){this._pagePromises.delete(0);await this.cleanup();throw new n.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 i.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 n.XRefEntryException&&!e)throw new n.XRefParseException;(0,i.warn)(`checkLastPage - invalid /Pages tree /Count: ${r}.`);let o;try{o=await t.getAllPageDicts(e)}catch(a){if(a instanceof n.XRefEntryException&&!e)throw new n.XRefParseException;t.setActualNumPages(1);return}for(const[e,[r,i]]of o){let n;if(r instanceof Error){n=Promise.reject(r);n.catch((()=>{}))}else n=Promise.resolve(new Page({pdfManager:a,xref:this.xref,pageIndex:e,pageDict:r,ref:i,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalImageCache:t.globalImageCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this._pagePromises.set(e,n)}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 n=this.xref.fetchIfRef(t);if(n.has("T")){const t=(0,i.stringToPDFString)(n.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,i.warn)(`_collectFieldObjects: "${e}".`);return null})));if(n.has("Kids")){const t=n.get("Kids");for(const r of t)this._collectFieldObjects(e,r,a)}}get fieldObjects(){if(!this.formInfo.hasFields)return(0,i.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,i]of t)a.push(Promise.all(i).then((t=>{(t=t.filter((e=>!!e))).length>0&&(e[r]=t)})));return(0,i.shadow)(this,"fieldObjects",Promise.all(a).then((()=>e)))}get hasJSActions(){const e=this.pdfManager.ensureDoc("_parseHasJSActions");return(0,i.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,i.shadow)(this,"calculationOrderIds",null);const t=e.get("CO");if(!Array.isArray(t)||0===t.length)return(0,i.shadow)(this,"calculationOrderIds",null);const a=[];for(const e of t)e instanceof s.Ref&&a.push(e.toString());return 0===a.length?(0,i.shadow)(this,"calculationOrderIds",null):(0,i.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),i=a(3),n=a(11),s=a(4),o=a(65),c=a(5),l=a(60),h=a(69),u=a(12),d=a(72),f=a(75),g=a(63),p=a(8),m=a(76);t.AnnotationFactory=class AnnotationFactory{static create(e,t,a,r,i){return Promise.all([a.ensureCatalog("acroForm"),a.ensureCatalog("baseUrl"),a.ensureCatalog("attachments"),a.ensureDoc("xfaDatasets"),i?this._getPageIndex(e,t,a):-1]).then((([n,s,o,c,l])=>a.ensure(this,"_create",[e,t,a,r,n,o,c,i,l])))}static _create(e,t,a,n,o,c=null,l,h,u=-1){const d=e.fetchIfRef(t);if(!(d instanceof s.Dict))return;const f=t instanceof s.Ref?t.toString():`annot_${n.createObjId()}`;let g=d.get("Subtype");g=g instanceof s.Name?g.name:null;const p=o instanceof s.Dict?o:s.Dict.empty,m={xref:e,ref:t,dict:d,subtype:g,id:f,pdfManager:a,acroForm:p,attachments:c,xfaDatasets:l,collectFields:h,needAppearances:!h&&!0===p.get("NeedAppearances"),pageIndex:u,isOffscreenCanvasSupported:a.evaluatorOptions.isOffscreenCanvasSupported};switch(g){case"Link":return new LinkAnnotation(m);case"Text":return new TextAnnotation(m);case"Widget":let e=(0,i.getInheritableProperty)({dict:d,key:"FT"});e=e instanceof s.Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(m);case"Btn":return new ButtonWidgetAnnotation(m);case"Ch":return new ChoiceWidgetAnnotation(m);case"Sig":return new SignatureWidgetAnnotation(m)}(0,r.warn)(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(m);case"Popup":return new PopupAnnotation(m);case"FreeText":return new FreeTextAnnotation(m);case"Line":return new LineAnnotation(m);case"Square":return new SquareAnnotation(m);case"Circle":return new CircleAnnotation(m);case"PolyLine":return new PolylineAnnotation(m);case"Polygon":return new PolygonAnnotation(m);case"Caret":return new CaretAnnotation(m);case"Ink":return new InkAnnotation(m);case"Highlight":return new HighlightAnnotation(m);case"Underline":return new UnderlineAnnotation(m);case"Squiggly":return new SquigglyAnnotation(m);case"StrikeOut":return new StrikeOutAnnotation(m);case"Stamp":return new StampAnnotation(m);case"FileAttachment":return new FileAttachmentAnnotation(m);default:h||(g?(0,r.warn)(`Unimplemented annotation type "${g}", falling back to base annotation.`):(0,r.warn)("Annotation is missing the required /Subtype."));return new Annotation(m)}}static async _getPageIndex(e,t,a){try{const r=await e.fetchIfRefAsync(t);if(!(r instanceof s.Dict))return-1;const i=r.getRaw("P");if(!(i instanceof s.Ref))return-1;return await a.ensureCatalog("getPageIndex",[i])}catch(e){(0,r.warn)(`_getPageIndex: "${e}".`);return-1}}static async saveNewAnnotations(e,t,a){const i=e.xref;let n;const c=[],l=[];for(const h of a)switch(h.annotationType){case r.AnnotationEditorType.FREETEXT:if(!n){const e=new s.Dict(i);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=[];n=i.getNewTemporaryRef();(0,o.writeObject)(n,e,t,null);c.push({ref:n,data:t.join("")})}l.push(FreeTextAnnotation.createNewAnnotation(i,h,c,{evaluator:e,task:t,baseFontRef:n}));break;case r.AnnotationEditorType.INK:l.push(InkAnnotation.createNewAnnotation(i,h,c))}return{annotations:await Promise.all(l),dependencies:c}}static async printNewAnnotations(e,t,a){if(!a)return null;const i=e.xref,{isOffscreenCanvasSupported:n}=e.options,s=[];for(const o of a)switch(o.annotationType){case r.AnnotationEditorType.FREETEXT:s.push(FreeTextAnnotation.createNewPrintAnnotation(i,o,{evaluator:e,task:t,isOffscreenCanvasSupported:n}));break;case r.AnnotationEditorType.INK:s.push(InkAnnotation.createNewPrintAnnotation(i,o,{isOffscreenCanvasSupported:n}))}return Promise.all(s)}};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 getPdfColorArray(e){return Array.from(e,(e=>e/255))}function getQuadPoints(e,t){const a=e.getArray("QuadPoints");if(!Array.isArray(a)||0===a.length||a.length%8>0)return null;const r=[];for(let e=0,i=a.length/8;et[2]||st[3]))return null;r.push([{x:i,y:o},{x:n,y:o},{x:i,y:s},{x:n,y:s}])}return r}function getTransformMatrix(e,t,a){const[i,n,s,o]=r.Util.getAxialAlignedBoundingBox(t,a);if(i===s||n===o)return[1,0,0,1,e[0],e[1]];const c=(e[2]-e[0])/(s-i),l=(e[3]-e[1])/(o-n);return[c,0,0,l,e[0]-i*c,e[1]-n*l]}class Annotation{constructor(e){const{dict:t,xref:a}=e;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 n=t.get("MK");this.setBorderAndBackgroundColors(n);this.setRotation(n);this._streams=[];this.appearance&&this._streams.push(this.appearance);const o=!!(this.flags&r.AnnotationFlag.LOCKED),c=!!(this.flags&r.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:e.id,modificationDate:this.modificationDate,rect:this.rectangle,subtype:e.subtype,hasOwnCanvas:!1,noRotate:!!(this.flags&r.AnnotationFlag.NOROTATE),noHTML:o&&c};if(e.collectFields){const n=t.get("Kids");if(Array.isArray(n)){const e=[];for(const t of n)t instanceof s.Ref&&e.push(t.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=(0,i.collectActions)(a,t,r.AnnotationActionEventType);this.data.fieldName=this._constructFieldName(t);this.data.pageIndex=e.pageIndex}this._isOffscreenCanvasSupported=e.isOffscreenCanvasSupported;this._fallbackFontDict=null;this._needAppearances=!1}_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"}}setDefaultAppearance(e){const t=(0,i.getInheritableProperty)({dict:e.dict,key:"DA"})||e.acroForm.get("DA");this._defaultAppearance="string"==typeof t?t:"";this.data.defaultAppearanceData=(0,n.parseDefaultAppearance)(this._defaultAppearance)}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");if(!(r instanceof s.Name&&a.has(r.name)))return;const i=a.get(r.name);i instanceof c.BaseStream&&(this.appearance=i)}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,i,n){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),i=[],n=[],s={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items){n.push(t.str);if(t.hasEOL){i.push(n.join(""));n.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:r,includeMarkedContent:!0,sink:s,viewBox:a});this.reset();n.length&&i.push(n.join(""));i.length>0&&(this.data.textContent=i)}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 i=new s.RefSet;e.objId&&i.put(e.objId);for(;a.has("Parent");){a=a.get("Parent");if(!(a instanceof s.Dict)||a.objId&&i.has(a.objId))break;a.objId&&i.put(a.objId);if(a.has("T")){const e=(0,r.stringToPDFString)(a.get("T"));e.startsWith("#")||t.unshift(e)}}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,i=(t[3]-t[1])/2;if(a>0&&i>0&&(e>a||e>i)){(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{dict:t}=e;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:i,strokeAlpha:n,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,i]=c(f,e);l=Math.min(l,t);u=Math.max(u,a);h=Math.min(h,r);d=Math.max(d,i)}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);i&&w.set("BM",s.Name.get(i));"number"==typeof n&&w.set("CA",n);"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 C=new s.Dict(e);C.set("Resources",x);const k=this.data.rect=[l,h,u,d];C.set("BBox",k);this.appearance=new p.StringStream("/GS0 gs /Fm0 Do");this.appearance.dict=C;this._streams.push(this.appearance,y)}static async createNewAnnotation(e,t,a,r){const i=e.getNewTemporaryRef(),n=await this.createNewAppearanceStream(t,e,r),s=[];let c;if(n){const r=e.getNewTemporaryRef();c=this.createNewDict(t,e,{apRef:r});const i=e.encrypt?e.encrypt.createCipherTransform(r.num,r.gen):null;(0,o.writeObject)(r,n,s,i);a.push({ref:r,data:s.join("")})}else c=this.createNewDict(t,e,{});s.length=0;const l=e.encrypt?e.encrypt.createCipherTransform(i.num,i.gen):null;(0,o.writeObject)(i,c,s,l);return{ref:i,data:s.join("")}}static async createNewPrintAnnotation(e,t,a){const r=await this.createNewAppearanceStream(t,e,a),i=this.createNewDict(t,e,{ap:r});return new this.prototype.constructor({dict:i,xref:e,isOffscreenCanvasSupported:a.isOffscreenCanvasSupported})}}t.MarkupAnnotation=MarkupAnnotation;class WidgetAnnotation extends Annotation{constructor(e){super(e);const{dict:t,xref:a}=e,n=this.data;this.ref=e.ref;this._needAppearances=e.needAppearances;n.annotationType=r.AnnotationType.WIDGET;void 0===n.fieldName&&(n.fieldName=this._constructFieldName(t));void 0===n.actions&&(n.actions=(0,i.collectActions)(a,t,r.AnnotationActionEventType));let o=(0,i.getInheritableProperty)({dict:t,key:"V",getArray:!0});n.fieldValue=this._decodeFormValue(o);const c=(0,i.getInheritableProperty)({dict:t,key:"DV",getArray:!0});n.defaultFieldValue=this._decodeFormValue(c);if(void 0===o&&e.xfaDatasets){const t=this._title.str;if(t){this._hasValueFromXFA=!0;n.fieldValue=o=e.xfaDatasets.getValue(t)}}void 0===o&&null!==n.defaultFieldValue&&(n.fieldValue=n.defaultFieldValue);n.alternativeText=(0,r.stringToPDFString)(t.get("TU")||"");this.setDefaultAppearance(e);n.hasAppearance||=this._needAppearances&&void 0!==n.fieldValue&&null!==n.fieldValue;const l=(0,i.getInheritableProperty)({dict:t,key:"FT"});n.fieldType=l instanceof s.Name?l.name:null;const h=(0,i.getInheritableProperty)({dict:t,key:"DR"}),u=e.acroForm.get("DR"),d=this.appearance&&this.appearance.dict.get("Resources");this._fieldResources={localResources:h,acroFormResources:u,appearanceResources:d,mergedResources:s.Dict.merge({xref:a,dictArray:[h,d,u],mergeSubDicts:!0})};n.fieldFlags=(0,i.getInheritableProperty)({dict:t,key:"Ff"});(!Number.isInteger(n.fieldFlags)||n.fieldFlags<0)&&(n.fieldFlags=0);n.readOnly=this.hasFieldFlag(r.AnnotationFieldFlag.READONLY);n.required=this.hasFieldFlag(r.AnnotationFieldFlag.REQUIRED);n.hidden=this._hasFlag(n.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)}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],s=this.data.rect[3]-this.data.rect[1];return(0,i.getRotationMatrix)(a,n,s)}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],i=this.data.rect[3]-this.data.rect[1],s=0===a||180===a?`0 0 ${r} ${i} re`:`0 0 ${i} ${r} re`;let o="";this.backgroundColor&&(o=`${(0,n.getPdfColor)(this.backgroundColor,!0)} ${s} f `);if(this.borderColor){o+=`${this.borderStyle.width||1} w ${(0,n.getPdfColor)(this.borderColor,!1)} ${s} S `}return o}async getOperatorList(e,t,a,i,n){if(i&&!(this instanceof SignatureWidgetAnnotation)&&!this.data.noHTML&&!this.data.hasOwnCanvas)return{opList:new g.OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,a,i,n);const s=await this._getAppearance(e,t,a,n);if(this.appearance&&null===s)return super.getOperatorList(e,t,a,i,n);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(n),!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",getPdfColorArray(this.borderColor));this.backgroundColor&&t.set("BG",getPdfColorArray(this.backgroundColor));return t.size>0?t:null}amendSavedDict(e,t){}async save(e,t,a){const n=a?a.get(this.data.id):void 0;let c=n&&n.value,l=n&&n.rotation;if(c===this.data.fieldValue||void 0===c){if(!this._hasValueFromXFA&&void 0===l)return null;c||=this.data.fieldValue}if(void 0===l&&!this._hasValueFromXFA&&Array.isArray(c)&&Array.isArray(this.data.fieldValue)&&c.length===this.data.fieldValue.length&&c.every(((e,t)=>e===this.data.fieldValue[t])))return null;void 0===l&&(l=this.rotation);let h=null;if(!this._needAppearances){h=await this._getAppearance(e,t,r.RenderingIntentFlag.SAVE,a);if(null===h)return null}let u=!1;if(h&&h.needAppearances){u=!0;h=null}const{xref:d}=e,f=d.fetchIfRef(this.ref);if(!(f instanceof s.Dict))return null;const g=new s.Dict(d);for(const e of f.getKeys())"AP"!==e&&g.set(e,f.getRaw(e));const m={path:this.data.fieldName,value:c},encoder=e=>(0,i.isAscii)(e)?e:(0,i.stringToUTF16String)(e,!0);g.set("V",Array.isArray(c)?c.map(encoder):encoder(c));this.amendSavedDict(a,g);const b=this._getMKDict(l);b&&g.set("MK",b);const y=d.encrypt,w=y?y.createCipherTransform(this.ref.num,this.ref.gen):null,S=[],x=[{ref:this.ref,data:"",xfa:m,needAppearances:u}];if(null!==h){const e=d.getNewTemporaryRef(),t=new s.Dict(d);g.set("AP",t);t.set("N",e);let i=null;y&&(i=y.createCipherTransform(e.num,e.gen));const n=this._getSaveFieldResources(d),c=new p.StringStream(h),l=c.dict=new s.Dict(d);l.set("Subtype",s.Name.get("Form"));l.set("Resources",n);l.set("BBox",[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]]);const u=this.getRotationMatrix(a);u!==r.IDENTITY_MATRIX&&l.set("Matrix",u);(0,o.writeObject)(e,c,S,i);x.push({ref:e,data:S.join(""),xfa:null,needAppearances:!1});S.length=0}g.set("M",`D:${(0,r.getModificationDate)()}`);(0,o.writeObject)(this.ref,g,S,w);x[0].data=S.join("");return x}async _getAppearance(e,t,a,s){if(this.hasFieldFlag(r.AnnotationFieldFlag.PASSWORD))return null;const o=s?s.get(this.data.id):void 0;let c,l;if(o){c=o.formattedValue||o.value;l=o.rotation}if(void 0===l&&void 0===c&&!this._needAppearances&&(!this._hasValueFromXFA||this.appearance))return null;const h=this.getBorderAndBackgroundAppearances(s);if(void 0===c){c=this.data.fieldValue;if(!c)return`/Tx BMC q ${h}Q EMC`}Array.isArray(c)&&1===c.length&&(c=c[0]);(0,r.assert)("string"==typeof c,"Expected `value` to be a string.");c=c.trim();if(this.data.combo){const e=this.data.options.find((({exportValue:e})=>c===e));c=e&&e.displayValue||c}if(""===c)return`/Tx BMC q ${h}Q EMC`;void 0===l&&(l=this.rotation);let u,d=-1;if(this.data.multiLine){u=c.split(/\r\n?|\n/).map((e=>e.normalize("NFC")));d=u.length}else u=[c.replace(/\r\n?|\n/,"").normalize("NFC")];let f=this.data.rect[3]-this.data.rect[1],g=this.data.rect[2]-this.data.rect[0];90!==l&&270!==l||([g,f]=[f,g]);this._defaultAppearance||(this.data.defaultAppearanceData=(0,n.parseDefaultAppearance)(this._defaultAppearance="/Helvetica 0 Tf 0 g"));let p,m,b,y=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources);const w=[];let S=!1;for(const e of u){const t=y.encodeString(e);t.length>1&&(S=!0);w.push(t.join(""))}if(S&&a&r.RenderingIntentFlag.SAVE)return{needAppearances:!0};if(S&&this._isOffscreenCanvasSupported){const a=this.data.comb?"monospace":"sans-serif",r=new n.FakeUnicodeFont(e.xref,a),s=r.createFontResources(u.join("")),o=s.getRaw("Font");if(this._fieldResources.mergedResources.has("Font")){const e=this._fieldResources.mergedResources.get("Font");for(const t of o.getKeys())e.set(t,o.getRaw(t))}else this._fieldResources.mergedResources.set("Font",o);const l=r.fontName.name;y=await WidgetAnnotation._getFontData(e,t,{fontName:l,fontSize:0},s);for(let e=0,t=w.length;e2)return`/Tx BMC q ${h}BT `+p+` 1 0 0 1 ${(0,i.numberToString)(2)} ${(0,i.numberToString)(v)} Tm (${(0,i.escapeString)(w[0])}) Tj ET Q EMC`;return`/Tx BMC q ${h}BT `+p+` 1 0 0 1 0 0 Tm ${this._renderText(w[0],y,m,g,k,{shift:0},2,v)} ET Q EMC`}static async _getFontData(e,t,a,r){const i=new g.OperatorList,n={font:null,clone(){return this}},{fontName:o,fontSize:c}=a;await e.handleSetFont(r,[o&&s.Name.get(o),c],null,i,t,n,null);return n.font}_getTextWidth(e,t){return t.charsToGlyphs(e).reduce(((e,t)=>e+t.width),0)/1e3}_computeFontSize(e,t,a,i,s){let{fontSize:o}=this.data.defaultAppearanceData,c=(o||12)*r.LINE_FACTOR,l=Math.round(e/c);if(!o){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===s){const n=this._getTextWidth(a,i);o=roundWithTwoDigits(Math.min(e/r.LINE_FACTOR,n>t?t/n:1/0));l=1}else{const n=a.split(/\r\n?|\n/),h=[];for(const e of n){const t=i.encodeString(e).join(""),a=i.charsToGlyphs(t),r=i.getCharPositions(t);h.push({line:t,glyphs:a,positions:r})}const isTooBig=a=>{let r=0;for(const n of h){r+=this._splitLine(null,i,a,t,n).length*a;if(r>e)return!0}return!1};l=Math.max(l,s);for(;;){c=e/l;o=roundWithTwoDigits(c/r.LINE_FACTOR);if(!isTooBig(o))break;l++}}const{fontName:h,fontColor:u}=this.data.defaultAppearanceData;this._defaultAppearance=(0,n.createDefaultAppearance)({fontSize:o,fontName:h,fontColor:u})}return[this._defaultAppearance,o,e/l]}_renderText(e,t,a,r,n,s,o,c){let l;if(1===n){l=(r-this._getTextWidth(e,t)*a)/2}else if(2===n){l=r-this._getTextWidth(e,t)*a-o}else l=o;const h=(0,i.numberToString)(l-s.shift);s.shift=l;return`${h} ${c=(0,i.numberToString)(c)} Td (${(0,i.escapeString)(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:a,acroFormResources:r}=this._fieldResources,i=this.data.defaultAppearanceData&&this.data.defaultAppearanceData.fontName;if(!i)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(i))return e}if(r instanceof s.Dict){const a=r.get("Font");if(a instanceof s.Dict&&a.has(i)){const r=new s.Dict(e);r.set(i,a.getRaw(i));const n=new s.Dict(e);n.set("Font",r);return s.Dict.merge({xref:e,dictArray:[n,t],mergeSubDicts:!0})}}return t||s.Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);this.data.hasOwnCanvas=this.data.readOnly&&!this.data.noHTML;this._hasText=!0;const t=e.dict;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let a=(0,i.getInheritableProperty)({dict:t,key:"Q"});(!Number.isInteger(a)||a<0||a>2)&&(a=null);this.data.textAlignment=a;let n=(0,i.getInheritableProperty)({dict:t,key:"MaxLen"});(!Number.isInteger(n)||n<0)&&(n=0);this.data.maxLen=n;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,r,n,s,o,c,l,h,u){const d=n/this.data.maxLen,f=this.getBorderAndBackgroundAppearances(u),g=[],p=t.getCharPositions(a);for(const[e,t]of p)g.push(`(${(0,i.escapeString)(a.substring(e,t))}) Tj`);const m=g.join(` ${(0,i.numberToString)(d)} 0 Td `);return`/Tx BMC q ${f}BT `+e+` 1 0 0 1 ${(0,i.numberToString)(o)} ${(0,i.numberToString)(c+l)} Tm ${m} ET Q EMC`}_getMultilineAppearance(e,t,a,r,n,s,o,c,l,h,u,d){const f=[],g=n-2*c,p={shift:0};for(let e=0,i=t.length;er){c.push(e.substring(d,a));d=a;f=p;l=-1;u=-1}else{f+=p;l=a;h=i;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));n.length=0;n.push("Off",e)}n.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=n[1];const o=a.get(this.data.exportValue);this.checkedAppearance=o instanceof c.BaseStream?o:null;const l=a.get("Off");this.uncheckedAppearance=l instanceof c.BaseStream?l: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))return;for(const e of r.getKeys())if("Off"!==e){this.data.buttonValue=this._decodeFormValue(e);break}const i=r.get(this.data.buttonValue);this.checkedAppearance=i instanceof c.BaseStream?i:null;const n=r.get("Off");this.uncheckedAppearance=n instanceof c.BaseStream?n: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,docAttachments:e.attachments})}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);const{dict:t,xref:a}=e;this.indices=t.getArray("I");this.hasIndices=Array.isArray(this.indices)&&this.indices.length>0;this.data.options=[];const n=(0,i.getInheritableProperty)({dict:t,key:"Opt"});if(Array.isArray(n))for(let e=0,t=n.length;e=0&&t0?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}}amendSavedDict(e,t){if(!this.hasIndices)return;const a=e?e.get(this.data.id):void 0;let r=a&&a.value;Array.isArray(r)||(r=[r]);const i=[],{options:n}=this.data;for(let e=0,t=0,a=n.length;ea){a=r;t=e}}[g,p]=this._computeFontSize(e,h-4,t,f,-1)}const m=p*r.LINE_FACTOR,b=(m-p)/2,y=Math.floor(l/m);let w;if(1===d.length){const e=d[0];w=e-e%y}else w=d.length?d[0]:0;const S=Math.min(w+y+1,u),x=["/Tx BMC q",`1 1 ${h} ${l} re W n`];if(d.length){x.push("0.600006 0.756866 0.854904 rg");for(const e of d)w<=e&&e1)return null;e=t.join("");M.push(e);let a=0;const r=y.charsToGlyphs(e);for(const e of r)a+=e.width*O;T=Math.max(T,a)}let E=1;T>k&&(E=k/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 _=u*Math.min(E,D),$=["q",`0 0 ${(0,i.numberToString)(k)} ${(0,i.numberToString)(v)} re W n`,"BT",`1 0 0 1 0 ${(0,i.numberToString)(v+R)} Tm 0 Tc ${(0,n.getPdfColor)(h,!0)}`,`/Helv ${(0,i.numberToString)(_)} Tf`],j=(0,i.numberToString)(N);for(const e of M)$.push(`0 -${j} Td (${(0,i.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,k,v]);X.set("Resources",m);if(f){const e=(0,i.getRotationMatrix)(f,k,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,xref:a}=e;this.data.annotationType=r.AnnotationType.LINE;this.data.hasOwnCanvas=this.data.noRotate;const i=t.getArray("L");this.data.lineCoordinates=r.Util.normalizeRect(i);this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],n=t.get("CA"),s=getRgbColor(t.getArray("IC"),null),o=s?getPdfColorArray(s):null,c=o?n: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:a,extra:`${l} w`,strokeColor:e,fillColor:o,strokeAlpha:n,fillAlpha:c,pointsCallback:(e,t)=>{e.push(`${i[0]} ${i[1]} m`,`${i[2]} ${i[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);const{dict:t,xref:a}=e;this.data.annotationType=r.AnnotationType.SQUARE;this.data.hasOwnCanvas=this.data.noRotate;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],r=t.get("CA"),i=getRgbColor(t.getArray("IC"),null),n=i?getPdfColorArray(i):null,s=n?r:null;if(0===this.borderStyle.width&&!n)return;this._setDefaultAppearance({xref:a,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:n,strokeAlpha:r,fillAlpha:s,pointsCallback:(e,t)=>{const a=t[2].x+this.borderStyle.width/2,r=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} ${r} ${i} ${s} re`);n?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);const{dict:t,xref:a}=e;this.data.annotationType=r.AnnotationType.CIRCLE;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],r=t.get("CA"),i=getRgbColor(t.getArray("IC"),null),n=i?getPdfColorArray(i):null,s=n?r:null;if(0===this.borderStyle.width&&!n)return;const o=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:a,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:n,strokeAlpha:r,fillAlpha:s,pointsCallback:(e,t)=>{const a=t[0].x+this.borderStyle.width/2,r=t[0].y-this.borderStyle.width/2,i=t[3].x-this.borderStyle.width/2,s=t[3].y+this.borderStyle.width/2,c=a+(i-a)/2,l=r+(s-r)/2,h=(i-a)/2*o,u=(s-r)/2*o;e.push(`${c} ${s} m`,`${c+h} ${s} ${i} ${l+u} ${i} ${l} c`,`${i} ${l-u} ${c+h} ${r} ${c} ${r} c`,`${c-h} ${r} ${a} ${l-u} ${a} ${l} c`,`${a} ${l+u} ${c-h} ${s} ${c} ${s} c`,"h");n?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,xref:a}=e;this.data.annotationType=r.AnnotationType.POLYLINE;this.data.hasOwnCanvas=this.data.noRotate;this.data.vertices=[];if(!(this instanceof PolygonAnnotation)){this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings}const i=t.getArray("Vertices");if(Array.isArray(i)){for(let e=0,t=i.length;e{const a=this.data.vertices;for(let t=0,r=a.length;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",i);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,n.getPdfColor)(r,!1)}`];1!==u&&w.push("/R0 gs");const S=[];for(const{bezier:e}of l){S.length=0;S.push(`${(0,i.numberToString)(e[0])} ${(0,i.numberToString)(e[1])} m`);for(let t=2,a=e.length;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);const{dict:t,xref:a}=e;this.data.annotationType=r.AnnotationType.UNDERLINE;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],r=t.get("CA");this._setDefaultAppearance({xref:a,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:r,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);const{dict:t,xref:a}=e;this.data.annotationType=r.AnnotationType.SQUIGGLY;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],r=t.get("CA");this._setDefaultAppearance({xref:a,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:r,pointsCallback:(e,t)=>{const a=(t[0].y-t[2].y)/6;let r=a,i=t[2].x;const n=t[2].y,s=t[3].x;e.push(`${i} ${n+r} m`);do{i+=2;r=0===r?a:0;e.push(`${i} ${n+r} l`)}while(i{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;this.data.hasOwnCanvas=this.data.noRotate}}class FileAttachmentAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:a}=e,i=new d.FileSpec(t.get("FS"),a);this.data.annotationType=r.AnnotationType.FILEATTACHMENT;this.data.hasOwnCanvas=this.data.noRotate;this.data.file=i.serializable;const n=t.get("Name");this.data.name=n instanceof s.Name?(0,r.stringToPDFString)(n.name):"PushPin"}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FakeUnicodeFont=void 0;t.createDefaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:a}){return`/${(0,i.escapePDFName)(t)} ${e} Tf ${getPdfColor(a,!0)}`};t.getPdfColor=getPdfColor;t.parseDefaultAppearance=function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()};var r=a(4),i=a(3),n=a(2),s=a(12),o=a(13),c=a(8);class DefaultAppearanceEvaluator extends o.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:i}=e;switch(0|a){case n.OPS.setFont:const[e,a]=i;e instanceof r.Name&&(t.fontName=e.name);"number"==typeof a&&a>0&&(t.fontSize=a);break;case n.OPS.setFillRGBColor:s.ColorSpace.singletons.rgb.getRgbItem(i,0,t.fontColor,0);break;case n.OPS.setFillGray:s.ColorSpace.singletons.gray.getRgbItem(i,0,t.fontColor,0);break;case n.OPS.setFillColorSpace:s.ColorSpace.singletons.cmyk.getRgbItem(i,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,i.numberToString)(a)} ${t?"g":"G"}`}return Array.from(e,(e=>(0,i.numberToString)(e/255))).join(" ")+" "+(t?"rg":"RG")}class FakeUnicodeFont{constructor(e,t){this.xref=e;this.widths=null;this.firstChar=1/0;this.lastChar=-1/0;this.fontFamily=t;const a=new OffscreenCanvas(1,1);this.ctxMeasure=a.getContext("2d");FakeUnicodeFont._fontNameId||(FakeUnicodeFont._fontNameId=1);this.fontName=r.Name.get(`InvalidPDFjsFont_${t}_${FakeUnicodeFont._fontNameId++}`)}get toUnicodeRef(){if(!FakeUnicodeFont._toUnicodeRef){const e="/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo\n<< /Registry (Adobe)\n/Ordering (UCS) /Supplement 0 >> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000> \nendcodespacerange\n1 beginbfrange\n<0000> <0000>\nendbfrange\nendcmap CMapName currentdict /CMap defineresource pop end end",t=FakeUnicodeFont.toUnicodeStream=new c.StringStream(e),a=new r.Dict(this.xref);t.dict=a;a.set("Length",e.length);FakeUnicodeFont._toUnicodeRef=this.xref.getNewPersistentRef(t)}return FakeUnicodeFont._toUnicodeRef}get fontDescriptorRef(){if(!FakeUnicodeFont._fontDescriptorRef){const e=new r.Dict(this.xref);e.set("Type",r.Name.get("FontDescriptor"));e.set("FontName",this.fontName);e.set("FontFamily","MyriadPro Regular");e.set("FontBBox",[0,0,0,0]);e.set("FontStretch",r.Name.get("Normal"));e.set("FontWeight",400);e.set("ItalicAngle",0);FakeUnicodeFont._fontDescriptorRef=this.xref.getNewPersistentRef(e)}return FakeUnicodeFont._fontDescriptorRef}get descendantFontRef(){const e=new r.Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",r.Name.get("Font"));e.set("Subtype",r.Name.get("CIDFontType0"));e.set("CIDToGIDMap",r.Name.get("Identity"));e.set("FirstChar",this.firstChar);e.set("LastChar",this.lastChar);e.set("FontDescriptor",this.fontDescriptorRef);e.set("DW",1e3);const t=[],a=[...this.widths.entries()].sort();let i=null,n=null;for(const[e,r]of a)if(i)if(e===i+n.length)n.push(r);else{t.push(i,n);i=e;n=[r]}else{i=e;n=[r]}i&&t.push(i,n);e.set("W",t);const s=new r.Dict(this.xref);s.set("Ordering","Identity");s.set("Registry","Adobe");s.set("Supplement",0);e.set("CIDSystemInfo",s);return this.xref.getNewPersistentRef(e)}get baseFontRef(){const e=new r.Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",r.Name.get("Font"));e.set("Subtype",r.Name.get("Type0"));e.set("Encoding",r.Name.get("Identity-H"));e.set("DescendantFonts",[this.descendantFontRef]);e.set("ToUnicode",this.toUnicodeRef);return this.xref.getNewPersistentRef(e)}get resources(){const e=new r.Dict(this.xref),t=new r.Dict(this.xref);t.set(this.fontName.name,this.baseFontRef);e.set("Font",t);return e}_createContext(){this.widths=new Map;this.ctxMeasure.font=`1000px ${this.fontFamily}`;return this.ctxMeasure}createFontResources(e){const t=this._createContext();for(const a of e.split(/\r\n?|\n/))for(const e of a.split("")){const a=e.charCodeAt(0);if(this.widths.has(a))continue;const r=t.measureText(e),i=Math.ceil(r.width);this.widths.set(a,i);this.firstChar=Math.min(a,this.firstChar);this.lastChar=Math.max(a,this.lastChar)}return this.resources}createAppearance(e,t,a,s,o,l){const h=this._createContext(),u=[];let d=-1/0;for(const t of e.split(/\r\n?|\n/)){u.push(t);const e=h.measureText(t).width;d=Math.max(d,e);for(const e of t.split("")){const t=e.charCodeAt(0);let a=this.widths.get(t);if(void 0===a){const r=h.measureText(e);a=Math.ceil(r.width);this.widths.set(t,a);this.firstChar=Math.min(t,this.firstChar);this.lastChar=Math.max(t,this.lastChar)}}}d*=s/1e3;const[f,g,p,m]=t;let b=p-f,y=m-g;a%180!=0&&([b,y]=[y,b]);let w=1;d>b&&(w=b/d);let S=1;const x=n.LINE_FACTOR*s,C=n.LINE_DESCENT_FACTOR*s,k=x*u.length;k>y&&(S=y/k);const v=s*Math.min(w,S),F=["q",`0 0 ${(0,i.numberToString)(b)} ${(0,i.numberToString)(y)} re W n`,"BT",`1 0 0 1 0 ${(0,i.numberToString)(y+C)} Tm 0 Tc ${getPdfColor(o,!0)}`,`/${this.fontName.name} ${(0,i.numberToString)(v)} Tf`],{resources:O}=this;if(1!==(l="number"==typeof l&&l>=0&&l<=1?l:1)){F.push("/R0 gs");const e=new r.Dict(this.xref),t=new r.Dict(this.xref);t.set("ca",l);t.set("CA",l);t.set("Type",r.Name.get("ExtGState"));e.set("R0",t);O.set("ExtGState",e)}const T=(0,i.numberToString)(x);for(const e of u)F.push(`0 -${T} Td <${(0,i.stringToUTF16HexString)(e)}> Tj`);F.push("ET","Q");const M=F.join("\n"),E=new r.Dict(this.xref);E.set("Subtype",r.Name.get("Form"));E.set("Type",r.Name.get("XObject"));E.set("BBox",[0,0,b,y]);E.set("Length",M.length);E.set("Resources",O);if(a){const e=(0,i.getRotationMatrix)(a,b,y);E.set("Matrix",e)}const D=new c.StringStream(M);D.dict=E;return D}}t.FakeUnicodeFont=FakeUnicodeFont},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.ColorSpace=void 0;var r=a(2),i=a(4),n=a(5),s=a(3);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,i){(0,r.unreachable)("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,a,i,n,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,i,n,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:e*c}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,C=s;C[0]=w;C[1]=S;C[2]=x;const k=o;!function normalizeWhitePointToFlat(a,r,i){if(1===a[0]&&1===a[2]){i[0]=r[0];i[1]=r[1];i[2]=r[2];return}const s=i;matrixProduct(e,r,s);const o=n;!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,i)}(r.whitePoint,C,k);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),i=(1-r)/(1-decodeL(e[0])),n=1-i,s=(1-r)/(1-decodeL(e[1])),o=1-s,c=(1-r)/(1-decodeL(e[2])),l=1-c;a[0]=t[0]*i+n;a[1]=t[1]*s+o;a[2]=t[2]*c+l}(r.blackPoint,k,v);const F=o;!function normalizeWhitePointToD65(a,r,i){const s=i;matrixProduct(e,r,s);const o=n;!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,i)}(i,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,i){super("CalRGB",3);if(!e)throw new r.FormatError("WhitePoint missing - required for color space CalRGB");t||=new Float32Array(3);a||=new Float32Array([1,1,1]);i||=new Float32Array([1,0,0,0,1,0,0,0,1]);const n=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=i[0];this.MYA=i[1];this.MZA=i[2];this.MXB=i[3];this.MYB=i[4];this.MZB=i[5];this.MXC=i[6];this.MYC=i[7];this.MZC=i[8];if(n<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,i,n,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,i,n){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,i,n,s){const o=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.PartialEvaluator=t.EvaluatorPreprocessor=void 0;var r=a(2),i=a(14),n=a(4),s=a(34),o=a(37),c=a(41),l=a(50),h=a(51),u=a(42),d=a(57),f=a(16),g=a(59),p=a(8),m=a(5),b=a(60),y=a(12),w=a(18),S=a(38),x=a(39),C=a(3),k=a(45),v=a(40),F=a(61),O=a(62),T=a(63),M=a(64);const E=Object.freeze({maxImageSize:-1,disableFontFace:!1,ignoreErrors:!1,isEvalSupported:!0,isOffscreenCanvasSupported:!1,canvasMaxAreaInBytes:-1,fontExtraProperties:!1,useSystemFonts:!0,cMapUrl:null,standardFontDataUrl:null}),D=1,N=2,R=Promise.resolve();function normalizeBlendMode(e,t=!1){if(Array.isArray(e)){for(const t of e){const e=normalizeBlendMode(t,!0);if(e)return e}(0,r.warn)(`Unsupported blend mode Array: ${e}`);return"source-over"}if(!(e instanceof n.Name))return t?null:"source-over";switch(e.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(t)return null;(0,r.warn)(`Unsupported blend mode: ${e.name}`);return"source-over"}function incrementCachedImageMaskCount(e){e.fn===r.OPS.paintImageMaskXObject&&e.args[0]&&e.args[0].count>0&&e.args[0].count++}class TimeSlotManager{static TIME_SLOT_DURATION_MS=20;static 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=M.PDFImage.createRawMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof w.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e});g.cached=!!n;p=[g];i.addImageOps(r.OPS.paintImageMaskXObject,p,f);if(n){const e={fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f};s.set(n,l,e);l&&this._regionalImageCache.set(null,l,e)}return}g=await M.PDFImage.createMask({imgArray:o,width:h,height:u,imageIsFromDecodeStream:t instanceof w.DecodeStream,inverseDecode:!!d&&d[0]>0,interpolate:e,isOffscreenCanvasSupported:this.options.isOffscreenCanvasSupported});if(g.isSingleOpaquePixel){i.addImageOps(r.OPS.paintSolidColorImageMask,[],f);if(n){const e={fn:r.OPS.paintSolidColorImageMask,args:[],optionalContent:f};s.set(n,l,e);l&&this._regionalImageCache.set(null,l,e)}return}const m=`mask_${this.idFactory.createObjId()}`;i.addDependency(m);this._sendImgData(m,g);p=[{data:m,width:g.width,height:g.height,interpolate:g.interpolate,count:1}];i.addImageOps(r.OPS.paintImageMaskXObject,p,f);if(n){const e={fn:r.OPS.paintImageMaskXObject,args:p,optionalContent:f};s.set(n,l,e);l&&this._regionalImageCache.set(null,l,e)}return}const m=c.get("SM","SMask")||!1,b=c.get("Mask")||!1;if(a&&!m&&!b&&h+u<200){const n=new M.PDFImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o});g=await n.createImageData(!0,!1);i.isOffscreenCanvasSupported=this.options.isOffscreenCanvasSupported;i.addImageOps(r.OPS.paintInlineImageXObject,[g],f);return}let y=`img_${this.idFactory.createObjId()}`,S=!1;if(this.parsingType3Font)y=`${this.idFactory.getDocId()}_type3_${y}`;else if(l){S=this.globalImageCache.shouldCache(l,this.pageIndex);S&&(y=`${this.idFactory.getDocId()}_${y}`)}i.addDependency(y);p=[y,h,u];M.PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:a,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:o}).then((async e=>{g=await e.createImageData(!1,this.options.isOffscreenCanvasSupported);if(n&&l&&S){let e=0;e=g.bitmap?g.width*g.height*4:g.data.length;this.globalImageCache.addByteSize(l,e)}return this._sendImgData(y,g,S)})).catch((e=>{(0,r.warn)(`Unable to decode image "${y}": "${e}".`);return this._sendImgData(y,null,S)}));i.addImageOps(r.OPS.paintImageXObject,p,f);if(n){const e={fn:r.OPS.paintImageXObject,args:p,optionalContent:f};s.set(n,l,e);if(l){this._regionalImageCache.set(null,l,e);if(S){(0,r.assert)(!a,"Cannot cache an inline image globally.");this.globalImageCache.setData(l,{objId:y,fn:r.OPS.paintImageXObject,args:p,optionalContent:f,byteSize:0})}}}}handleSMask(e,t,a,r,i,n){const s=e.get("G"),o={subtype:e.get("S").name,backdrop:e.get("BC")},c=e.get("TR");if((0,d.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,i.state.clone(),n)}handleTransferFunction(e){let t;if(Array.isArray(e))t=e;else{if(!(0,d.isPDFFunction)(e))return null;t=[e]}const a=[];let r=0,i=0;for(const e of t){const t=this.xref.fetchIfRef(e);r++;if((0,n.isName)(t,"Identity")){a.push(null);continue}if(!(0,d.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);i++}return 1!==r&&4!==r||0===i?null:a}handleTilingType(e,t,a,i,s,o,c,h){const u=new T.OperatorList,d=n.Dict.merge({xref:this.xref,dictArray:[s.get("Resources"),a]});return this.getOperatorList({stream:i,task:c,resources:d,operatorList:u}).then((function(){const a=u.getIR(),r=(0,l.getTilingPatternIR)(a,s,t);o.addDependencies(u.dependencies);o.addOp(e,r);s.objId&&h.set(null,s.objId,{operatorListIR:a,dict:s})})).catch((e=>{if(!(e instanceof r.AbortException)){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`handleTilingType - ignoring pattern: "${e}".`)}}))}handleSetFont(e,t,a,r,i,o,c=null,l=null){const h=t&&t[0]instanceof n.Name?t[0].name:null;return this.loadFont(h,a,e,c,l).then((t=>t.font.isType3Font?t.loadType3Data(this,e,i).then((function(){r.addDependencies(t.type3Dependencies);return t})).catch((e=>new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Type3 font load error: ${e}`),dict:t.font,evaluatorOptions:this.options}))):t)).then((e=>{o.font=e.font;e.send(this.handler);return e.loadedName}))}handleText(e,t){const a=t.font,i=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,i,this.handler,this.options)}return i}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;(0,r.warn)(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:a,cacheKey:i,task:s,stateManager:o,localGStateCache:c,localColorSpaceCache:l}){const h=t.objId;let u=!0;const d=[];let f=Promise.resolve();for(const i of t.getKeys()){const c=t.get(i);switch(i){case"Type":break;case"LW":case"LC":case"LJ":case"ML":case"D":case"RI":case"FL":case"CA":case"ca":d.push([i,c]);break;case"Font":u=!1;f=f.then((()=>this.handleSetFont(e,null,c[0],a,s,o.state).then((function(e){a.addDependency(e);d.push([i,[e,c[1]]])}))));break;case"BM":d.push([i,normalizeBlendMode(c)]);break;case"SMask":if((0,n.isName)(c,"None")){d.push([i,!1]);break}if(c instanceof n.Dict){u=!1;f=f.then((()=>this.handleSMask(c,e,a,s,o,l)));d.push([i,!0])}else(0,r.warn)("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(c);d.push([i,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 "+i);break;default:(0,r.info)("Unknown graphic state operator "+i)}}return f.then((function(){d.length>0&&a.addOp(r.OPS.setGState,[d]);u&&c.set(i,h,d)}))}loadFont(e,t,a,i=null,o=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new s.ErrorFont(`Font "${e}" is not available.`),dict:t,evaluatorOptions:this.options}),c=this.xref;let l;if(t)t instanceof n.Ref&&(l=t);else{const t=a.get("Font");t&&(l=t.getRaw(e))}if(!l){const a=`Font "${e||t&&t.toString()}" is not available`;if(!this.options.ignoreErrors&&!this.parsingType3Font){(0,r.warn)(`${a}.`);return errorFont()}(0,r.warn)(`${a} -- attempting to fallback to a default font.`);l=i||PartialEvaluator.fallbackFontDict}if(this.parsingType3Font&&this.type3FontRefs.has(l))return errorFont();if(this.fontCache.has(l))return this.fontCache.get(l);if(!((t=c.fetchIfRef(l))instanceof n.Dict))return errorFont();if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const h=new r.PromiseCapability;let u;try{u=this.preEvaluateFont(t);u.cssFontInfo=o}catch(e){(0,r.warn)(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:d,hash:f}=u,g=l instanceof n.Ref;let p;g&&(p=`f${l.toString()}`);if(f&&d instanceof n.Dict){const e=d.fontAliases||=Object.create(null);if(e[f]){const t=e[f].aliasRef;if(g&&t&&this.fontCache.has(t)){this.fontCache.putAlias(l,t);return this.fontCache.get(l)}}else e[f]={fontID:this.idFactory.createFontId()};g&&(e[f].aliasRef=l);p=e[f].fontID}if(g)this.fontCache.put(l,h.promise);else{p||(p=this.idFactory.createFontId());t.cacheKey=`cacheKey_${p}`;this.fontCache.put(t.cacheKey,h.promise)}(0,r.assert)(p&&p.startsWith("f"),'The "fontID" must be (correctly) defined.');t.loadedName=`${this.idFactory.getDocId()}_${p}`;this.translateFont(u).then((e=>{h.resolve(new TranslatedFont({loadedName:t.loadedName,font:e,dict:t,evaluatorOptions:this.options}))})).catch((e=>{(0,r.warn)(`loadFont - translateFont failed: "${e}".`);h.resolve(new TranslatedFont({loadedName:t.loadedName,font:new s.ErrorFont(e instanceof Error?e.message:e),dict:t,evaluatorOptions:this.options}))}));return h.promise}buildPath(e,t,a,i=!1){const n=e.length-1;a||(a=[]);if(n<0||e.fnArray[n]!==r.OPS.constructPath){if(i){(0,r.warn)(`Encountered path operator "${t}" inside of a text object.`);e.addOp(r.OPS.save,null)}let n;switch(t){case r.OPS.rectangle:const e=a[0]+a[2],t=a[1]+a[3];n=[Math.min(a[0],e),Math.max(a[0],e),Math.min(a[1],t),Math.max(a[1],t)];break;case r.OPS.moveTo:case r.OPS.lineTo:n=[a[0],a[0],a[1],a[1]];break;default:n=[1/0,-1/0,1/0,-1/0]}e.addOp(r.OPS.constructPath,[[t],a,n]);i&&e.addOp(r.OPS.restore,null)}else{const i=e.argsArray[n];i[0].push(t);i[1].push(...a);const s=i[2];switch(t){case r.OPS.rectangle:const e=a[0]+a[2],t=a[1]+a[3];s[0]=Math.min(s[0],a[0],e);s[1]=Math.max(s[1],a[0],e);s[2]=Math.min(s[2],a[1],t);s[3]=Math.max(s[3],a[1],t);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 y.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){(0,r.warn)(`parseColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}))}parseShading({shading:e,resources:t,localColorSpaceCache:a,localShadingPatternCache:r}){let i=r.get(e);if(!i){const n=l.Pattern.parseShading(e,this.xref,t,this._pdfFunctionFactory,a).getIR();i=`pattern_${this.idFactory.createObjId()}`;this.parsingType3Font&&(i=`${this.idFactory.getDocId()}_type3_${i}`);r.set(e,i);this.parsingType3Font?this.handler.send("commonobj",[i,"Pattern",n]):this.handler.send("obj",[i,this.pageIndex,"Pattern",n])}return i}handleColorN(e,t,a,i,s,o,c,h,u,d){const f=a.pop();if(f instanceof n.Name){const g=s.getRaw(f.name),p=g instanceof n.Ref&&u.getByRef(g);if(p)try{const r=i.base?i.base.getRgb(a,0):null,n=(0,l.getTilingPatternIR)(p.operatorListIR,p.dict,r);e.addOp(t,n);return}catch(e){}const b=this.xref.fetchIfRef(g);if(b){const n=b instanceof m.BaseStream?b.dict:b,s=n.get("PatternType");if(s===D){const r=i.base?i.base.getRgb(a,0):null;return this.handleTilingType(t,r,o,b,n,e,c,u)}if(s===N){const a=n.get("Shading"),r=n.getArray("Matrix"),i=this.parseShading({shading:a,resources:o,localColorSpaceCache:h,localShadingPatternCache:d});e.addOp(t,["Shading",i,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 i=e.length,s=this.xref.fetchIfRef(e[0]);if(!(i<2)&&s instanceof n.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 n.Dict){const e=[];if(Array.isArray(t))for(const a of t)e.push(a.toString());else e.push(t.objId);return{type:i,ids:e,policy:a.get("P")instanceof n.Name?a.get("P").name:null,expression:null}}if(t instanceof n.Ref)return{type:i,id:t.toString()}}return null}getOperatorList({stream:e,task:t,resources:a,operatorList:i,initialState:s=null,fallbackFontDict:o=null}){a||=n.Dict.empty;s||=new EvalState;if(!i)throw new Error('getOperatorList: missing "operatorList" parameter');const c=this,l=this.xref;let h=!1;const u=new g.LocalImageCache,d=new g.LocalColorSpaceCache,f=new g.LocalGStateCache,p=new g.LocalTilingPatternCache,b=new Map,w=a.get("XObject")||n.Dict.empty,S=a.get("Pattern")||n.Dict.empty,x=new StateManager(s),C=new EvaluatorPreprocessor(e,l,x),k=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=C.savedStatesDepth;e0&&i.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 n.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const l=o.get(M);if(!(l instanceof n.Dict))throw new r.FormatError("GState should be a dictionary.");c.setGState({resources:a,gState:l,operatorList:i,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;(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(i,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 n.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=>{i.addOp(r.OPS.beginMarkedContentProps,["OC",e])})).catch((e=>{if(!(e instanceof r.AbortException)){if(!c.options.ignoreErrors)throw e;(0,r.warn)(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`)}})));return}e=[e[0].name,e[1]instanceof n.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;(0,r.warn)(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`);closePendingRestoreOPS()}}))}getTextContent({stream:e,task:t,resources:a,stateManager:i=null,includeMarkedContent:s=!1,sink:o,seenStyles:c=new Set,viewBox:l,markedContentData:h=null,disableNormalization:u=!1}){a||=n.Dict.empty;i||=new StateManager(new TextState);s&&(h||={level:0});const d={items:[],styles:Object.create(null)},f={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 y=0;function saveLastChar(e){const t=(y+1)%2,a=" "!==p[y]&&" "===p[t];p[y]=e;y=t;return a}function shouldAddWhitepsace(){return" "!==p[y]&&" "===p[(y+1)%2]}function resetLastChars(){p[0]=p[1]=" ";y=0}const w=this,S=this.xref,x=[];let C=null;const k=new g.LocalImageCache,v=new g.LocalGStateCache,F=new EvaluatorPreprocessor(e,S,i);let O;function pushWhitespace({width:e=0,height:t=0,transform:a=f.prevTransform,fontName:r=f.fontName}){d.items.push({str:" ",dir:"ltr",width:e,height:t,transform:a,fontName:r,hasEOL:!1})}function getCurrentTextTransform(){const e=O.font,t=[O.fontSize*O.textHScale,0,0,O.fontSize,0,O.textRise];if(e.isType3Font&&(O.fontSize<=1||e.isCharBBox)&&!(0,r.isArrayEqual)(O.fontMatrix,r.FONT_IDENTITY_MATRIX)){const a=e.bbox[3]-e.bbox[1];a>0&&(t[3]*=a*O.fontMatrix[3])}return r.Util.transform(O.ctm,r.Util.transform(O.textMatrix,t))}function ensureTextContentItem(){if(f.initialized)return f;const{font:e,loadedName:t}=O;if(!c.has(t)){c.add(t);d.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical}}f.fontName=t;const a=f.transform=getCurrentTextTransform();if(e.vertical){f.width=f.totalWidth=Math.hypot(a[0],a[1]);f.height=f.totalHeight=0;f.vertical=!0}else{f.width=f.totalWidth=0;f.height=f.totalHeight=Math.hypot(a[2],a[3]);f.vertical=!1}const r=Math.hypot(O.textLineMatrix[0],O.textLineMatrix[1]),i=Math.hypot(O.ctm[0],O.ctm[1]);f.textAdvanceScale=i*r;const{fontSize:n}=O;f.trackingSpaceMin=.102*n;f.notASpace=.03*n;f.negativeSpaceMax=-.2*n;f.spaceInFlowMin=.102*n;f.spaceInFlowMax=.6*n;f.hasEOL=!1;f.initialized=!0;return f}function updateAdvanceScale(){if(!f.initialized)return;const e=Math.hypot(O.textLineMatrix[0],O.textLineMatrix[1]),t=Math.hypot(O.ctm[0],O.ctm[1])*e;if(t!==f.textAdvanceScale){if(f.vertical){f.totalHeight+=f.height*f.textAdvanceScale;f.height=0}else{f.totalWidth+=f.width*f.textAdvanceScale;f.width=0}f.textAdvanceScale=t}}function handleSetFont(e,i){return w.loadFont(e,i,a).then((function(e){return e.font.isType3Font?e.loadType3Data(w,a,t).catch((function(){})).then((function(){return e})):e})).then((function(e){O.loadedName=e.loadedName;O.font=e.font;O.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(e){const t=getCurrentTextTransform();let a=t[4],r=t[5];if(O.font&&O.font.vertical){if(al[2]||r+el[3])return!1}else if(a+el[2]||rl[3])return!1;if(!O.font||!f.prevTransform)return!0;let i=f.prevTransform[4],n=f.prevTransform[5];if(i===a&&n===r)return!0;let s=-1;t[0]&&0===t[1]&&0===t[2]?s=t[0]>0?0:180:t[1]&&0===t[0]&&0===t[3]&&(s=t[1]>0?90:270);switch(s){case 0:break;case 90:[a,r]=[r,a];[i,n]=[n,i];break;case 180:[a,r,i,n]=[-a,-r,-i,-n];break;case 270:[a,r]=[-r,-a];[i,n]=[-n,-i];break;default:[a,r]=applyInverseRotation(a,r,t);[i,n]=applyInverseRotation(i,n,f.prevTransform)}if(O.font.vertical){const e=(n-r)/f.textAdvanceScale,t=a-i,s=Math.sign(f.height);if(e.5*f.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(t)>f.width){appendEOL();return!0}e<=s*f.notASpace&&resetLastChars();if(e<=s*f.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({height:Math.abs(e)})}else f.height+=e;else if(!addFakeSpaces(e,f.prevTransform,s))if(0===f.str.length){resetLastChars();pushWhitespace({height:Math.abs(e)})}else f.height+=e;Math.abs(t)>.25*f.width&&flushTextContentItem();return!0}const o=(a-i)/f.textAdvanceScale,c=r-n,h=Math.sign(f.width);if(o.5*f.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(c)>f.height){appendEOL();return!0}o<=h*f.notASpace&&resetLastChars();if(o<=h*f.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({width:Math.abs(o)})}else f.width+=o;else if(!addFakeSpaces(o,f.prevTransform,h))if(0===f.str.length){resetLastChars();pushWhitespace({width:Math.abs(o)})}else f.width+=o;Math.abs(c)>.25*f.height&&flushTextContentItem();return!0}function buildTextContentItem({chars:e,extraSpacing:t}){const a=O.font;if(!e){const e=O.charSpacing+t;e&&(a.vertical?O.translateTextMatrix(0,-e):O.translateTextMatrix(e*O.textHScale,0));return}const r=a.charsToGlyphs(e),i=O.fontMatrix[0]*O.fontSize;for(let e=0,n=r.length;e0){const e=x.join("");x.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case r.OPS.showText:if(!i.state.font){w.ensureStateFont(i.state);continue}buildTextContentItem({chars:b[0],extraSpacing:0});break;case r.OPS.nextLineShowText:if(!i.state.font){w.ensureStateFont(i.state);continue}O.carriageReturn();buildTextContentItem({chars:b[0],extraSpacing:0});break;case r.OPS.nextLineSetSpacingShowText:if(!i.state.font){w.ensureStateFont(i.state);continue}O.wordSpacing=b[0];O.charSpacing=b[1];O.carriageReturn();buildTextContentItem({chars:b[2],extraSpacing:0});break;case r.OPS.paintXObject:flushTextContentItem();C||(C=a.get("XObject")||n.Dict.empty);var E=b[0]instanceof n.Name,D=b[0].name;if(E&&k.getByName(D))break;next(new Promise((function(e,d){if(!E)throw new r.FormatError("XObject must be referred to by name.");let f=C.getRaw(D);if(f instanceof n.Ref){if(k.getByRef(f)){e();return}if(w.globalImageCache.getData(f,w.pageIndex)){e();return}f=S.fetch(f)}if(!(f instanceof m.BaseStream))throw new r.FormatError("XObject should be a stream");const g=f.dict.get("Subtype");if(!(g instanceof n.Name))throw new r.FormatError("XObject should have a Name subtype");if("Form"!==g.name){k.set(D,f.dict.objId,!0);e();return}const p=i.state.clone(),b=new StateManager(p),y=f.dict.getArray("Matrix");Array.isArray(y)&&6===y.length&&b.transform(y);enqueueChunk();const x={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;o.enqueue(e,t)},get desiredSize(){return o.desiredSize},get ready(){return o.ready}};w.getTextContent({stream:f,task:t,resources:f.dict.get("Resources")||a,stateManager:b,includeMarkedContent:s,sink:x,seenStyles:c,viewBox:l,markedContentData:h,disableNormalization:u}).then((function(){x.enqueueInvoked||k.set(D,f.dict.objId,!0);e()}),d)})).catch((function(e){if(!(e instanceof r.AbortException)){if(!w.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring XObject: "${e}".`)}})));return;case r.OPS.setGState:E=b[0]instanceof n.Name;D=b[0].name;if(E&&v.getByName(D))break;next(new Promise((function(e,t){if(!E)throw new r.FormatError("GState must be referred to by name.");const i=a.get("ExtGState");if(!(i instanceof n.Dict))throw new r.FormatError("ExtGState should be a dictionary.");const s=i.get(D);if(!(s instanceof n.Dict))throw new r.FormatError("GState should be a dictionary.");const o=s.get("Font");if(o){flushTextContentItem();O.fontName=null;O.fontSize=o[1];handleSetFont(null,o[0]).then(e,t)}else{v.set(D,s.objId,!0);e()}})).catch((function(e){if(!(e instanceof r.AbortException)){if(!w.options.ignoreErrors)throw e;(0,r.warn)(`getTextContent - ignoring ExtGState: "${e}".`)}})));return;case r.OPS.beginMarkedContent:flushTextContentItem();if(s){h.level++;d.items.push({type:"beginMarkedContent",tag:b[0]instanceof n.Name?b[0].name:null})}break;case r.OPS.beginMarkedContentProps:flushTextContentItem();if(s){h.level++;let e=null;b[1]instanceof n.Dict&&(e=b[1].get("MCID"));d.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${w.idFactory.getPageObjId()}_mcid${e}`:null,tag:b[0]instanceof n.Name?b[0].name:null})}break;case r.OPS.endMarkedContent:flushTextContentItem();if(s){if(0===h.level)break;h.level--;d.items.push({type:"endMarkedContent"})}}if(d.items.length>=o.desiredSize){p=!0;break}}if(p)next(R);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 i=this.xref;let s;const c=this.readToUnicode(a.toUnicode||e.get("ToUnicode")||t.get("ToUnicode"));if(a.composite){const t=e.get("CIDSystemInfo");t instanceof n.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 m.BaseStream&&(s=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const l=[];let h,u=null;if(e.has("Encoding")){h=e.get("Encoding");if(h instanceof n.Dict){u=h.get("BaseEncoding");u=u instanceof n.Name?u.name:null;if(h.has("Differences")){const e=h.get("Differences");let t=0;for(const a of e){const e=i.fetchIfRef(a);if("number"==typeof e)t=e;else{if(!(e instanceof n.Name))throw new r.FormatError(`Invalid entry in 'Differences' array: ${e}`);l[t++]=e.name}}}}else if(h instanceof n.Name)u=h.name;else{const e="Encoding is not a Name nor a Dict";if(!this.options.ignoreErrors)throw new r.FormatError(e);(0,r.warn)(e)}"MacRomanEncoding"!==u&&"MacExpertEncoding"!==u&&"WinAnsiEncoding"!==u&&(u=null)}if(u)a.defaultEncoding=(0,o.getEncoding)(u);else{const e=!!(a.flags&S.FontFlags.Symbolic),t=!!(a.flags&S.FontFlags.Nonsymbolic);h=o.StandardEncoding;"TrueType"!==a.type||t||(h=o.WinAnsiEncoding);if(e){h=o.MacRomanEncoding;a.file&&!a.isInternalFont||(/Symbol/i.test(a.name)?h=o.SymbolSetEncoding:/Dingbats|Wingdings/i.test(a.name)&&(h=o.ZapfDingbatsEncoding))}a.defaultEncoding=h}a.differences=l;a.baseEncodingName=u;a.hasEncoding=!!u||l.length>0;a.dict=e;return c.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=[],i=e.defaultEncoding.slice(),n=e.baseEncodingName,s=e.differences;for(const e in s){const t=s[e];".notdef"!==t&&(i[e]=t)}const c=(0,x.getGlyphsUnicode)();for(const r in i){let s=i[r];if(""===s)continue;let l=c[s];if(void 0!==l){a[r]=String.fromCharCode(l);continue}let h=0;switch(s[0]){case"G":3===s.length&&(h=parseInt(s.substring(1),16));break;case"g":5===s.length&&(h=parseInt(s.substring(1),16));break;case"C":case"c":if(s.length>=3&&s.length<=4){const a=s.substring(1);if(t){h=parseInt(a,16);break}h=+a;if(Number.isNaN(h)&&Number.isInteger(parseInt(a,16)))return this._simpleFontToUnicode(e,!0)}break;case"u":l=(0,v.getUnicodeForGlyph)(s,c);-1!==l&&(h=l);break;default:switch(s){case"f_h":case"f_t":case"T_h":a[r]=s.replaceAll("_","");continue}}if(h>0&&h<=1114111&&Number.isInteger(h)){if(n&&h===+r){const e=(0,o.getEncoding)(n);if(e&&(s=e[r])){a[r]=String.fromCharCode(c[s]);continue}}a[r]=String.fromCodePoint(h)}}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 u.ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof i.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=n.Name.get(`${t}-${a}-UCS2`),o=await i.CMapFactory.create({encoding:s,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),c=[],l=[];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);if(a){l.length=0;for(let e=0,t=a.length;e{if(e instanceof r.AbortException)return null;if(this.options.ignoreErrors){(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,i=e.length;r>1;(0!==i||t.has(n))&&(a[n]=i)}return a}extractWidths(e,t,a){const r=this.xref;let i=[],s=0;const o=[];let c,l,h,u,d,f,g,p;if(a.composite){s=e.has("DW")?e.get("DW"):1e3;p=e.get("W");if(p)for(l=0,h=p.length;l{if(g){const e=[];let a=u;for(const t of g)e[a++]=this.xref.fetchIfRef(t);t.widths=e}else t.widths=this.buildCharCodeToWidth(i.widths,t);return new s.Font(e,y,t)}))}(e=new n.Dict(null)).set("FontName",n.Name.get(l));e.set("FontBBox",t.getArray("FontBBox")||[0,0,0,0])}let y,w,x,C,k,v=e.get("FontName"),F=t.get("BaseFont");"string"==typeof v&&(v=n.Name.get(v));"string"==typeof F&&(F=n.Name.get(F));if(!m){const e=v&&v.name,t=F&&F.name;if(e!==t){(0,r.info)(`The FontDescriptor's FontName is "${e}" but should be the same as the Font's BaseFont "${t}".`);e&&t&&t.startsWith(e)&&(v=F)}}v||=F;if(!(v instanceof n.Name))throw new r.FormatError("invalid font name");try{y=e.get("FontFile","FontFile2","FontFile3")}catch(e){if(!this.options.ignoreErrors)throw e;(0,r.warn)(`translateFont - fetching "${v.name}" font file: "${e}".`);y=new p.NullStream}let O=!1,T=null;if(y){if(y.dict){const e=y.dict.get("Subtype");e instanceof n.Name&&(w=e.name);x=y.dict.get("Length1");C=y.dict.get("Length2");k=y.dict.get("Length3")}}else if(g){const e=(0,h.getXfaFontName)(v.name);if(e){g.fontFamily=`${g.fontFamily}-PdfJS-XFA`;g.metrics=e.metrics||null;T=e.factors||null;y=await this.fetchStandardFontData(e.name);O=!!y;a=t=(0,h.getXfaFontDict)(v.name);o=!0}}else if(!m){const e=(0,c.getStandardFontName)(v.name);if(e){y=await this.fetchStandardFontData(e);O=!!y}}b={type:l,name:v.name,subtype:w,file:y,length1:x,length2:C,length3:k,isInternalFont:O,loadedName:a.loadedName,composite:o,fixedPitch:!1,fontMatrix:t.getArray("FontMatrix")||r.FONT_IDENTITY_MATRIX,firstChar:u,lastChar:d,toUnicode:f,bbox:e.getArray("FontBBox")||t.getArray("FontBBox"),ascent:e.get("Ascent"),descent:e.get("Descent"),xHeight:e.get("XHeight")||0,capHeight:e.get("CapHeight")||0,flags:e.get("Flags"),italicAngle:e.get("ItalicAngle")||0,isType3Font:m,cssFontInfo:g,scaleFactors:T};if(o){const e=a.get("Encoding");e instanceof n.Name&&(b.cidEncoding=e.name);const t=await i.CMapFactory.create({encoding:e,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null});b.cMap=t;b.vertical=b.cMap.vertical}return this.extractDataStructures(t,a,b).then((a=>{this.extractWidths(t,e,a);return new s.Font(v.name,y,a)}))}static buildFontPaths(e,t,a,i){function buildPath(t){const n=`${e.loadedName}_path_${t}`;try{if(e.renderer.hasBuiltPath(t))return;a.send("commonobj",[n,"FontPath",e.renderer.getPathJs(t)])}catch(e){if(i.ignoreErrors){(0,r.warn)(`buildFontPaths - ignoring ${n} 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 n.Dict;e.set("BaseFont",n.Name.get("PDFJS-FallbackFont"));e.set("Type",n.Name.get("FallbackType"));e.set("Subtype",n.Name.get("FallbackType"));e.set("Encoding",n.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||E;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 i=e.clone({ignoreErrors:!1});i.parsingType3Font=!0;const s=new n.RefSet(e.type3FontRefs);this.dict.objId&&!s.has(this.dict.objId)&&s.put(this.dict.objId);i.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),n=new T.OperatorList;return i.getOperatorList({stream:t,task:a,resources:u,operatorList:n}).then((()=>{n.fnArray[0]===r.OPS.setCharWidthAndBounds&&this._removeType3ColorOperators(n,m);d[e]=n.getIR();for(const e of n.dependencies)c.add(e)})).catch((function(t){(0,r.warn)(`Type3 font resource "${e}" is not available.`);const a=new T.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)),i=a[2]-a[0],n=a[3]-a[1],s=Math.hypot(i,n);if(0===i||0===n){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(n.variableArgs)c>o&&(0,r.info)(`Command ${i}: 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===n.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),i=a(4),n=a(5),s=a(15),o=a(16),c=a(3),l=a(8);const h=["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"],u=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>u)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=a++}mapBfRange(e,t,a){if(t-e>u)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>u)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const r=a.length;let i=0;for(;e<=t&&i>>0;const s=i[n];for(let e=0,t=s.length;e=t&&r<=i){a.charcode=r;a.length=n+1;return}}}a.charcode=0;a.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let a=0,r=t.length;a=i&&e<=n)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;function strToInt(e){let t=0;for(let a=0;a>>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===i.EOF)break;if((0,i.isCmd)(a,"endbfchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const n=a;e.mapOne(r,n)}}function parseBfRange(e,t){for(;;){let a=t.getObj();if(a===i.EOF)break;if((0,i.isCmd)(a,"endbfrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const n=strToInt(a);a=t.getObj();if(Number.isInteger(a)||"string"==typeof a){const t=Number.isInteger(a)?String.fromCharCode(a):a;e.mapBfRange(r,n,t)}else{if(!(0,i.isCmd)(a,"["))break;{a=t.getObj();const s=[];for(;!(0,i.isCmd)(a,"]")&&a!==i.EOF;){s.push(a);a=t.getObj()}e.mapBfRangeToArray(r,n,s)}}}throw new r.FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let a=t.getObj();if(a===i.EOF)break;if((0,i.isCmd)(a,"endcidchar"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectInt(a);const n=a;e.mapOne(r,n)}}function parseCidRange(e,t){for(;;){let a=t.getObj();if(a===i.EOF)break;if((0,i.isCmd)(a,"endcidrange"))return;expectString(a);const r=strToInt(a);a=t.getObj();expectString(a);const n=strToInt(a);a=t.getObj();expectInt(a);const s=a;e.mapCidRange(r,n,s)}}function parseCodespaceRange(e,t){for(;;){let a=t.getObj();if(a===i.EOF)break;if((0,i.isCmd)(a,"endcodespacerange"))return;if("string"!=typeof a)break;const r=strToInt(a);a=t.getObj();if("string"!=typeof a)break;const n=strToInt(a);e.addCodespaceRange(a.length,r,n)}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 i.Name&&(e.name=a.name)}async function parseCMap(e,t,a,n){let s,o;e:for(;;)try{const a=t.getObj();if(a===i.EOF)break;if(a instanceof i.Name){"WMode"===a.name?parseWMode(e,t):"CMapName"===a.name&&parseCMapName(e,t);s=a}else if(a instanceof i.Cmd)switch(a.cmd){case"endcmap":break e;case"usecmap":s instanceof i.Name&&(o=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 c.MissingDataException)throw e;(0,r.warn)("Invalid cMap data: "+e);continue}!n&&o&&(n=o);return n?extendCMap(e,a,n):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(n,t,e)));if(i===r.CMapCompressionType.NONE){const e=new o.Lexer(new l.Stream(a));return parseCMap(n,e,t,null)}throw new Error(`Invalid CMap "compressionType" value: ${i}`)}t.CMapFactory=class CMapFactory{static async create({encoding:e,fetchBuiltInCMap:t,useCMap:a}){if(e instanceof i.Name)return createBuiltInCMap(e.name,t);if(e instanceof n.BaseStream){const r=await parseCMap(new CMap,new o.Lexer(e),t,a);return r.isIdentityCMap?createBuiltInCMap(r.name,t):r}throw new Error("Encoding required.")}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.BinaryCMapReader=void 0;var r=a(2);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(...e.subarray(0,t+1))}function addHex(e,t,a){let r=0;for(let i=a;i>=0;i--){r+=e[i]+t[i];e[i]=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 i=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 i=this.tmpBuf;let n=0;do{const e=this.readByte();if(e<0)throw new r.FormatError("unexpected EOF in bcmap");a=!(128&e);i[n++]=127&e}while(!a);let s=t,o=0,c=0;for(;s>=0;){for(;c<8&&i.length>0;){o|=i[--n]<>=8;c-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const a=1&e[t]?255:0;let r=0;for(let i=0;i<=t;i++){r=(1&r)<<8|e[i];e[i]=r>>1^a}}readString(){const e=this.readNumber(),t=new Array(e);for(let a=0;a=0;){const e=f>>5;if(7===e){switch(31&f){case 0:r.readString();break;case 1:s=r.readString()}continue}const a=!!(16&f),n=15&f;if(n+1>i)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const g=1,p=r.readNumber();switch(e){case 0:r.readHex(o,n);r.readHexNumber(c,n);addHex(c,o,n);t.addCodespaceRange(n+1,hexToInt(o,n),hexToInt(c,n));for(let e=1;e{Object.defineProperty(t,"__esModule",{value:!0});t.Parser=t.Linearization=t.Lexer=void 0;var r=a(2),i=a(4),n=a(3),s=a(17),o=a(19),c=a(20),l=a(22),h=a(23),u=a(26),d=a(29),f=a(31),g=a(8),p=a(32),m=a(33);class Parser{constructor({lexer:e,xref:t,allowStreams:a=!1,recoveryMode:r=!1}){this.lexer=e;this.xref=t;this.allowStreams=a;this.recoveryMode=r;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 i.Cmd&&"ID"===this.buf2.cmd){this.buf1=this.buf2;this.buf2=null}else{this.buf1=this.buf2;this.buf2=this.lexer.getObj()}}tryShift(){try{this.shift();return!0}catch(e){if(e instanceof n.MissingDataException)throw e;return!1}}getObj(e=null){const t=this.buf1;this.shift();if(t instanceof i.Cmd)switch(t.cmd){case"BI":return this.makeInlineImage(e);case"[":const a=[];for(;!(0,i.isCmd)(this.buf1,"]")&&this.buf1!==i.EOF;)a.push(this.getObj(e));if(this.buf1===i.EOF){if(this.recoveryMode)return a;throw new n.ParserEOFException("End of file inside array.")}this.shift();return a;case"<<":const s=new i.Dict(this.xref);for(;!(0,i.isCmd)(this.buf1,">>")&&this.buf1!==i.EOF;){if(!(this.buf1 instanceof i.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===i.EOF)break;s.set(t,this.getObj(e))}if(this.buf1===i.EOF){if(this.recoveryMode)return s;throw new n.ParserEOFException("End of file inside dictionary.")}if((0,i.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,i.isCmd)(this.buf2,"R")){const e=i.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 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 i.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,n.isWhiteSpace)(s)||l--;return e.pos-l-a}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let a,i,n=!1;for(;-1!==(a=e.getByte());)if(255===a){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:n=!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:i=e.getUint16();i>2?e.skip(i-2):e.skip(-2)}if(n)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,n.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 i=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-i);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return i}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let a;for(;-1!==(a=e.getByte())&&62!==a;);const i=e.pos-t;if(-1===a){(0,r.warn)("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-i);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return i}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,n=Object.create(null);let s;for(;!(0,i.isCmd)(this.buf1,"ID")&&this.buf1!==i.EOF;){if(!(this.buf1 instanceof i.Name))throw new r.FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===i.EOF)break;n[t]=this.getObj(e)}-1!==t.beginInlineImagePos&&(s=a.pos-t.beginInlineImagePos);const o=this.xref.fetchIfRef(n.F||n.Filter);let c;if(o instanceof i.Name)c=o.name;else if(Array.isArray(o)){const e=this.xref.fetchIfRef(o[0]);e instanceof i.Name&&(c=e.name)}const l=a.pos;let h,u;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)}if(h<1e3&&s>0){const e=a.pos;a.pos=t.beginInlineImagePos;u=function getInlineImageCacheKey(e){const t=[],a=e.length;let r=0;for(;r=r){a.pos+=s;return a.pos-e}s++}a.pos+=n}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,i.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 i=1;i<=a;i++){const a=e.length-i,c=e.slice(0,a),l=this._findStreamLength(o,c);if(l>=0){const e=s.peekBytes(a+1)[a];if(!(0,n.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 n=t.get("F","Filter"),s=t.get("DP","DecodeParms");if(n instanceof i.Name){Array.isArray(s)&&(0,r.warn)("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,n.name,a,s)}let o=a;if(Array.isArray(n)){const t=n,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,i=0;if(45===e){i=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else if(43===e){i=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){const t=`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`;if((0,n.isWhiteSpace)(e)||-1===e){(0,r.info)(`Lexer.getNumber - "${t}".`);return 0}throw new r.FormatError(t)}i||=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 i*s}getString(){let e=1,t=!1;const a=this.strBuf;a.length=0;let i=this.nextChar();for(;;){let n=!1;switch(0|i){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:i=this.nextChar();switch(i){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(i));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&i;i=this.nextChar();n=!0;if(i>=48&&i<=55){e=(e<<3)+(15&i);i=this.nextChar();if(i>=48&&i<=55){n=!1;e=(e<<3)+(15&i)}}a.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:a.push(String.fromCharCode(i))}break;default:a.push(String.fromCharCode(i))}if(t)break;n||(i=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 i=toHexDigit(e);if(-1!==i){t=e;e=this.nextChar();const n=toHexDigit(e);if(-1===n){(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(i<<4|n))}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 i.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,i=this.currentChar,n=!0;this._hexStringNumWarn=0;for(;;){if(i<0){(0,r.warn)("Unterminated hex string");break}if(62===i){this.nextChar();break}if(1!==b[i]){if(n){t=toHexDigit(i);if(-1===t){this._hexStringWarn(i);i=this.nextChar();continue}}else{a=toHexDigit(i);if(-1===a){this._hexStringWarn(i);i=this.nextChar();continue}e.push(String.fromCharCode(t<<4|a))}n=!n;i=this.nextChar()}else i=this.nextChar()}return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return i.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 i.Cmd.get("[");case 93:this.nextChar();return i.Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return i.Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return i.Cmd.get(">>")}return i.Cmd.get(">");case 123:this.nextChar();return i.Cmd.get("{");case 125:this.nextChar();return i.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 i.Cmd.get(a)}}const n=this.knownCommands;let s=n&&void 0!==n[a];for(;(t=this.nextChar())>=0&&!b[t];){const e=a+String.fromCharCode(t);if(s&&void 0===n[e])break;if(128===a.length)throw new r.FormatError(`Command token too long: ${a.length}`);a=e;s=n&&void 0!==n[a]}if("true"===a)return!0;if("false"===a)return!1;if("null"===a)return null;"BI"===a&&(this.beginInlineImagePos=this.stream.pos);return i.Cmd.get(a)}peekObj(){const e=this.stream.pos,t=this.currentChar,a=this.beginInlineImagePos;let i;try{i=this.getObj()}catch(e){if(e instanceof n.MissingDataException)throw e;(0,r.warn)(`peekObj: ${e}`)}this.stream.pos=e;this.currentChar=t;this.beginInlineImagePos=a;return i}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(),n=t.getObj(),s=t.getObj();let o,c;if(!(Number.isInteger(a)&&Number.isInteger(r)&&(0,i.isCmd)(n,"obj")&&s instanceof i.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(18),i=a(3);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,i.isWhiteSpace)(t);)t=e.getByte();if(-1===t||126===t){this.eof=!0;return}const a=this.bufferLength;let r,n;if(122===t){r=this.ensureBuffer(a+4);for(n=0;n<4;++n)r[a+n]=0;this.bufferLength+=4}else{const s=this.input;s[0]=t;for(n=1;n<5;++n){t=e.getByte();for(;(0,i.isWhiteSpace)(t);)t=e.getByte();s[n]=t;if(-1===t||126===t)break}r=this.ensureBuffer(a+n-1);this.bufferLength+=n-1;if(n<5){for(;n<5;++n)s[n]=117;this.eof=!0}let o=0;for(n=0;n<5;++n)o=85*o+(s[n]-33);for(n=3;n>=0;--n){r[a+n]=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(5),i=a(8);const n=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=n;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 i.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,i=r+a.length;this.ensureBuffer(i).set(a,r);this.bufferLength=i}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(18);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,i=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(i<0)i=e;else{a[r++]=i<<4|e;i=-1}}if(i>=0&&this.eof){a[r++]=i<<4;i=-1}this.firstDigit=i;this.bufferLength=r}}t.AsciiHexStream=AsciiHexStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.CCITTFaxStream=void 0;var r=a(21),i=a(18),n=a(4);class CCITTFaxStream extends i.DecodeStream{constructor(e,t,a){super(t);this.str=e;this.dict=e.dict;a instanceof n.Dict||(a=n.Dict.empty);const i={next:()=>e.getByte()};this.ccittFaxDecoder=new r.CCITTFaxDecoder(i,{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 i=-1,n=[[-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 n,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?--n:++n;for(;e[n]<=t[this.codingPos]&&e[n]0?--n:++n;for(;e[n]<=t[this.codingPos]&&e[n]0?--n:++n;for(;e[n]<=t[this.codingPos]&&e[n]=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!==i&&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===i&&(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===i){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 i=this.codingPos;if(e>a[i]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&i^t&&++i;a[i]=e}this.codingPos=i}_addPixelsNeg(e,t){const a=this.codingLine;let i=this.codingPos;if(e>a[i]){if(e>this.columns){(0,r.info)("row is wrong length");this.err=!0;e=this.columns}1&i^t&&++i;a[i]=e}else if(e0&&e=n){const t=a[e-n];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=n[t];if(e&&e[0]>0){this._eatBits(e[0]);return e[1]}}else{const e=this._findTableCode(1,7,n);if(e[0]&&e[2])return e[1]}(0,r.info)("Bad two dim code");return i}_getWhiteCode(){let e,t=0;if(this.eoblock){t=this._lookBits(12);if(t===i)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===i)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(18),i=a(2);const n=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 i.FormatError(`Invalid header in flate stream: ${a}, ${r}`);if(8!=(15&a))throw new i.FormatError(`Unknown compression method in flate stream: ${a}, ${r}`);if(((a<<8)+r)%31!=0)throw new i.FormatError(`Bad FCHECK in flate stream: ${a}, ${r}`);if(32&r)throw new i.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,n=this.codeBuf;for(;r>e;this.codeSize=r-=e;return a}getCode(e){const t=this.str,a=e[0],r=e[1];let n,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 i=1<>=1}for(a=e;a>=1;if(0===u){let t;if(-1===(t=a.getByte()))throw new i.FormatError("Bad block header in flate stream");let r=t;if(-1===(t=a.getByte()))throw new i.FormatError("Bad block header in flate stream");r|=t<<8;if(-1===(t=a.getByte()))throw new i.FormatError("Bad block header in flate stream");let n=t;if(-1===(t=a.getByte()))throw new i.FormatError("Bad block header in flate stream");n|=t<<8;if(n!==(65535&~r)&&(0!==r||0!==n))throw new i.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 i=a>>16;i>0&&(i=this.getBits(i));t=(65535&a)+i;a=this.getCode(h);a=o[a];i=a>>16;i>0&&(i=this.getBits(i));const n=(65535&a)+i;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(5),i=a(18),n=a(4),s=a(24),o=a(2);class Jbig2Stream extends i.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 n.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),i=a.length;for(let e=0;e{Object.defineProperty(t,"__esModule",{value:!0});t.Jbig2Image=void 0;var r=a(2),i=a(3),n=a(25),s=a(21);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 n.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)}}const o=2**31-1,c=-(2**31);function decodeInteger(e,t,a){const r=e.getContexts(t);let i=1;function readBits(e){let t=0;for(let n=0;n>>0}const n=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);let l;0===n?l=s:s>0&&(l=-s);return l>=c&&l<=o?l:null}function decodeIAID(e,t,a){const r=e.getContexts("IAID");let i=1;for(let e=0;e=O&&_=T){q=q<<1&y;for(b=0;b=0&&j=0){U=N[$][j];U&&(q|=U<=e?l<<=1:l=l<<1|k[o][c]}for(p=0;p=x||c<0||c>=S?l<<=1:l=l<<1|r[o][c]}const u=v.readBit(F,l);t[s]=u}}return k}function decodeTextRegion(e,t,a,r,i,n,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&&(i=e?y.readBits(b):decodeInteger(k,"IAIT",C));const n=s*v+i,F=e?f.symbolIDTable.decode(y):decodeIAID(k,C,c),O=t&&(e?y.readBit():decodeInteger(k,"IARI",C));let T=o[F],M=T[0].length,E=T.length;if(O){const e=decodeInteger(k,"IARDW",C),t=decodeInteger(k,"IARDH",C);M+=e;E+=t;T=decodeRefinement(M,E,g,T,(e>>1)+decodeInteger(k,"IARDX",C),(t>>1)+decodeInteger(k,"IARDY",C),!1,p,m)}const D=n-(1&u?0:E-1),N=r-(2&u?M-1:0);let R,L,_;if(l){for(R=0;R>5&7;const h=[31&o];let u=t+6;if(7===o){c=536870911&(0,i.readUint32)(e,u-1);u+=3;let t=c+7>>3;h[0]=e[u++];for(;--t>0;)h.push(e[u++])}else if(5===o||6===o)throw new Jbig2Error("invalid referred-to flags");a.retainBits=h;let d=4;a.number<=256?d=1:a.number<=65536&&(d=2);const f=[];let p,m;for(p=0;p>>24&255;n[3]=t.height>>16&255;n[4]=t.height>>8&255;n[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&d);u.combinationOperator=d>>7&3;u.defaultPixelValue=d>>9&1;u.dsOffset=d<<17>>27;u.refinementTemplate=d>>15&1;if(u.huffman){const e=(0,i.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,i.readInt8)(r,h),y:(0,i.readInt8)(r,h+1)});h+=2}u.refinementAt=o}u.numberOfSymbolInstances=(0,i.readUint32)(r,h);h+=4;s=[u,a.referredTo,r,h,n];break;case 16:const f={},p=r[h++];f.mmr=!!(1&p);f.template=p>>1&3;f.patternWidth=r[h++];f.patternHeight=r[h++];f.maxPatternIndex=(0,i.readUint32)(r,h);h+=4;s=[f,a.number,r,h,n];break;case 22:case 23:const m={};m.info=readRegionSegmentInformation(r,h);h+=g;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,i.readUint32)(r,h);h+=4;m.gridHeight=(0,i.readUint32)(r,h);h+=4;m.gridOffsetX=4294967295&(0,i.readUint32)(r,h);h+=4;m.gridOffsetY=4294967295&(0,i.readUint32)(r,h);h+=4;m.gridVectorX=(0,i.readUint16)(r,h);h+=2;m.gridVectorY=(0,i.readUint16)(r,h);h+=2;s=[m,a.referredTo,r,h,n];break;case 38:case 39:const y={};y.info=readRegionSegmentInformation(r,h);h+=g;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,n];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,i=e.height,n=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*n+(e.x>>3);switch(s){case 0:for(l=0;l>=1;if(!u){u=128;d++}}f+=n}break;case 2:for(l=0;l>=1;if(!u){u=128;d++}}f+=n}break;default:throw new Jbig2Error(`operator ${s} is not supported`)}}onImmediateGenericRegion(e,t,a,r){const i=e.info,n=new DecodingContext(t,a,r),s=decodeBitmap(e.mmr,i.width,i.height,e.template,e.prediction,null,e.at,n);this.drawBitmap(i,s)}onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion(...arguments)}onSymbolDictionary(e,t,a,r,n,s){let o,c;if(e.huffman){o=function getSymbolDictionaryHuffmanTables(e,t,a){let r,i,n,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:i=getStandardTable(e.huffmanDWSelector+2);break;case 3:i=getCustomHuffmanTable(o,t,a);o++;break;default:throw new Jbig2Error("invalid Huffman DW selector")}if(e.bitmapSizeSelector){n=getCustomHuffmanTable(o,t,a);o++}else n=getStandardTable(1);s=e.aggregationInstancesSelector?getCustomHuffmanTable(o,t,a):getStandardTable(1);return{tableDeltaHeight:r,tableDeltaWidth:i,tableBitmapSize:n,tableAggregateInstances:s}}(e,a,this.customTables);c=new Reader(r,n,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,n,s);l[t]=function decodeSymbolDictionary(e,t,a,r,n,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,i.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,i,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),i=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=i.readBits(2)+3;a=n[e-1].prefixLength;break;case 33:r=i.readBits(3)+3;a=0;break;case 34:r=i.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(_>=0&&_+C<=r&&$>=0&&$+k<=n)for(b=0;b=n)){U=m[t];j=L[b];for(y=0;y=0&&e>1&7),l=1+(r>>4&7),h=[];let u,d,f=n;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 i=0,n=t.length;i>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,i=1&e[t];const n=a[r],s=n.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|i;return o}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.JpegStream=void 0;var r=a(18),i=a(4),n=a(27),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.forceRGBA||this.forceRGB)&&Array.isArray(t)){const a=this.dict.get("BPC","BitsPerComponent")||8,r=t.length,i=new Int32Array(r);let n=!1;const s=(1<{Object.defineProperty(t,"__esModule",{value:!0});t.JpegImage=void 0;var r=a(2),i=a(28),n=a(3);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 s=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]),o=4017,c=799,l=3406,h=2276,u=1567,d=3784,f=5793,g=2896;function buildHuffmanTable(e,t){let a,r,i=0,n=16;for(;n>0&&!e[n-1];)n--;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}i++}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)>=5)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),i=15&r,n=r>>4;if(0===i){if(n<15){y=receive(n)+(1<>4;if(0===i)if(o<15){y=receive(o)+(1<>4;if(0===r){if(n<15)break;i+=16;continue}i+=n;const o=s[i];e.blockData[t+o]=receiveAndExtend(r);i++}};let E,D,N,R,L=0;D=1===C?i[0].blocksPerLine*i[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,i=e.blockData;let n,s,p,m,b,y,w,S,x,C,k,v,F,O,T,M,E;if(!r)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){x=i[t+e];C=i[t+e+1];k=i[t+e+2];v=i[t+e+3];F=i[t+e+4];O=i[t+e+5];T=i[t+e+6];M=i[t+e+7];x*=r[e];if(0!=(C|k|v|F|O|T|M)){C*=r[e+1];k*=r[e+2];v*=r[e+3];F*=r[e+4];O*=r[e+5];T*=r[e+6];M*=r[e+7];n=f*x+128>>8;s=f*F+128>>8;p=k;m=T;b=g*(C-M)+128>>8;S=g*(C+M)+128>>8;y=v<<4;w=O<<4;n=n+s+1>>1;s=n-s;E=p*d+m*u+128>>8;p=p*u-m*d+128>>8;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;n=n+m+1>>1;m=n-m;s=s+p+1>>1;p=s-p;E=b*h+S*l+2048>>12;b=b*l-S*h+2048>>12;S=E;E=y*c+w*o+2048>>12;y=y*o-w*c+2048>>12;w=E;a[e]=n+S;a[e+7]=n-S;a[e+1]=s+w;a[e+6]=s-w;a[e+2]=p+y;a[e+5]=p-y;a[e+3]=m+b;a[e+4]=m-b}else{E=f*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];C=a[e+8];k=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!=(C|k|v|F|O|T|M)){n=f*x+2048>>12;s=f*F+2048>>12;p=k;m=T;b=g*(C-M)+2048>>12;S=g*(C+M)+2048>>12;y=v;w=O;n=4112+(n+s+1>>1);s=n-s;E=p*d+m*u+2048>>12;p=p*u-m*d+2048>>12;m=E;b=b+w+1>>1;w=b-w;S=S+y+1>>1;y=S-y;n=n+m+1>>1;m=n-m;s=s+p+1>>1;p=s-p;E=b*h+S*l+2048>>12;b=b*l-S*h+2048>>12;S=E;E=y*c+w*o+2048>>12;y=y*o-w*c+2048>>12;w=E;x=n+S;M=n-S;C=s+w;T=s-w;k=p+y;O=p-y;v=m+b;F=m-b;x<16?x=0:x>=4080?x=255:x>>=4;C<16?C=0:C>=4080?C=255:C>>=4;k<16?k=0:k>=4080?k=255:k>>=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;i[t+e]=x;i[t+e+8]=C;i[t+e+16]=k;i[t+e+24]=v;i[t+e+32]=F;i[t+e+40]=O;i[t+e+48]=T;i[t+e+56]=M}else{E=f*x+8192>>14;E=E<-2040?0:E>=2024?255:E+2056>>4;i[t+e]=E;i[t+e+8]=E;i[t+e+16]=E;i[t+e+24]=E;i[t+e+32]=E;i[t+e+40]=E;i[t+e+48]=E;i[t+e+56]=E}}}function buildComponentData(e,t){const a=t.blocksPerLine,r=t.blocksPerColumn,i=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(const r of e.components){const i=Math.ceil(Math.ceil(e.samplesPerLine/8)*r.h/e.maxH),n=Math.ceil(Math.ceil(e.scanLines/8)*r.v/e.maxV),s=t*r.h,o=64*(a*r.v)*(s+1);r.blockData=new Int16Array(o);r.blocksPerLine=i;r.blocksPerColumn=n}e.mcusPerLine=t;e.mcusPerColumn=a}let a,i,o=0,c=null,l=null,h=0;const u=[],d=[],f=[];let g=(0,n.readUint16)(e,o);o+=2;if(65496!==g)throw new JpegError("SOI not found");g=(0,n.readUint16)(e,o);o+=2;e:for(;65497!==g;){let p,m,b;switch(g){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:const y=readDataBlock();65504===g&&74===y[0]&&70===y[1]&&73===y[2]&&70===y[3]&&0===y[4]&&(c={version:{major:y[5],minor:y[6]},densityUnits:y[7],xDensity:y[8]<<8|y[9],yDensity:y[10]<<8|y[11],thumbWidth:y[12],thumbHeight:y[13],thumbData:y.subarray(14,14+3*y[12]*y[13])});65518===g&&65===y[0]&&100===y[1]&&111===y[2]&&98===y[3]&&101===y[4]&&(l={version:y[5]<<8|y[6],flags0:y[7]<<8|y[8],flags1:y[9]<<8|y[10],transformCode:y[11]});break;case 65499:const w=(0,n.readUint16)(e,o);o+=2;const S=w+o-2;let x;for(;o>4==0)for(m=0;m<64;m++){x=s[m];a[x]=e[o++]}else{if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(m=0;m<64;m++){x=s[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 C=(0,n.readUint16)(e,o);o+=2;a.scanLines=t||C;a.samplesPerLine=(0,n.readUint16)(e,o);o+=2;a.components=[];a.componentIds={};const k=e[o++];let v=0,F=0;for(p=0;p>4,i=15&e[o+1];v>4==0?f:d)[15&t]=buildHuffmanTable(a,i)}break;case 65501:o+=2;i=(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];i.huffmanTableAC=d[15&n];E.push(i)}const D=e[o++],N=e[o++],R=e[o++];try{const t=decodeScan(e,o,a,E,i,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(const e of a.components){const t=u[e.quantizationId];t&&(e.quantizationTable=t);this.components.push({index:e.index,output:buildComponentData(0,e),scaleX:e.h/a.maxH,scaleY:e.v/a.maxV,blocksPerLine:e.blocksPerLine,blocksPerColumn:e.blocksPerColumn})}this.numComponents=this.components.length}_getLinearizedBlockData(e,t,a=!1){const r=this.width/e,i=this.height/t;let n,s,o,c,l,h,u,d,f,g,p,m=0;const b=this.components.length,y=e*t*b,w=new Uint8ClampedArray(y),S=new Uint32Array(e),x=4294967288;let C;for(u=0;u>8)+k[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 i=0,n=e.length;i4)throw new JpegError("Unsupported color mode");const s=this._getLinearizedBlockData(e,t,n);if(1===this.numComponents&&(a||r)){const e=s.length*(a?4:3),t=new Uint8ClampedArray(e);let r=0;if(a)(0,i.grayToRGBA)(s,new Uint32Array(t.buffer));else for(const e of s){t[r++]=e;t[r++]=e;t[r++]=e}return t}if(3===this.numComponents&&this._isColorConversionNeeded){if(a){const e=new Uint8ClampedArray(s.length/3*4);return this._convertYccToRgba(s,e)}return this._convertYccToRgb(s)}if(4===this.numComponents){if(this._isColorConversionNeeded)return a?this._convertYcckToRgba(s):r?this._convertYcckToRgb(s):this._convertYcckToCmyk(s);if(a)return this._convertCmykToRgba(s);if(r)return this._convertCmykToRgb(s)}return s}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.convertBlackAndWhiteToRGBA=convertBlackAndWhiteToRGBA;t.convertToRGBA=function convertToRGBA(e){switch(e.kind){case r.ImageKind.GRAYSCALE_1BPP:return convertBlackAndWhiteToRGBA(e);case r.ImageKind.RGB_24BPP:return function convertRGBToRGBA({src:e,srcPos:t=0,dest:a,destPos:i=0,width:n,height:s}){let o=0;const c=e.length>>2,l=new Uint32Array(e.buffer,t,c);if(r.FeatureTest.isLittleEndian){for(;o>>24|t<<8|4278190080;a[i+2]=t>>>16|r<<16|4278190080;a[i+3]=r>>>8|4278190080}for(let t=4*o,r=e.length;t>>8|255;a[i+2]=t<<16|r>>>16|255;a[i+3]=r<<8|255}for(let t=4*o,r=e.length;t>3,d=7&i,f=e.length;a=new Uint32Array(a.buffer);let g=0;for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});t.JpxStream=void 0;var r=a(18),i=a(30),n=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,n.shadow)(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(){if(this.eof)return;const e=new i.JpxImage;e.parse(this.bytes);const t=e.width,a=e.height,r=e.componentsCount,n=e.tiles.length;if(1===n)this.buffer=e.tiles[0].items;else{const i=new Uint8ClampedArray(t*a*r);for(let a=0;a{Object.defineProperty(t,"__esModule",{value:!0});t.JpxImage=void 0;var r=a(2),i=a(3),n=a(25);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,i.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} (${n}).`)}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,i=e.getInt32()>>>0;e.skip(16);const n=e.getUint16();this.width=t-r;this.height=a-i;this.componentsCount=n;this.bitsPerComponent=8;return}}throw new JpxError("No size marker found in JPX stream")}parseCodestream(e,t,a){const n={};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(n.mainHeader)n.QCD=b;else{n.currentTile.QCD=b;n.currentTile.QCC=[]}break;case 65373:f=(0,i.readUint16)(e,o);const y={};a=o+2;let w;if(n.SIZ.Csiz<257)w=e[a++];else{w=(0,i.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;n.mainHeader?n.QCC[w]=y:n.currentTile.QCC[w]=y;break;case 65362:f=(0,i.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,i.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 C=e[a++];S.selectiveArithmeticCodingBypass=!!(1&C);S.resetContextProbabilities=!!(2&C);S.terminationOnEachCodingPass=!!(4&C);S.verticallyStripe=!!(8&C);S.predictableTermination=!!(16&C);S.segmentationSymbolUsed=!!(32&C);S.reversibleTransformation=e[a++];if(S.entropyCoderWithCustomPrecincts){const t=[];for(;a>4})}S.precinctsSizes=t}const k=[];S.selectiveArithmeticCodingBypass&&k.push("selectiveArithmeticCodingBypass");S.terminationOnEachCodingPass&&k.push("terminationOnEachCodingPass");S.verticallyStripe&&k.push("verticallyStripe");S.predictableTermination&&k.push("predictableTermination");if(k.length>0){s=!0;(0,r.warn)(`JPX: Unsupported COD options (${k.join(", ")}).`)}if(n.mainHeader)n.COD=S;else{n.currentTile.COD=S;n.currentTile.COC=[]}break;case 65424:f=(0,i.readUint16)(e,o);d={};d.index=(0,i.readUint16)(e,o+2);d.length=(0,i.readUint32)(e,o+4);d.dataEnd=d.length+o-2;d.partIndex=e[o+8];d.partsCount=e[o+9];n.mainHeader=!1;if(0===d.partIndex){d.COD=n.COD;d.COC=n.COC.slice(0);d.QCD=n.QCD;d.QCC=n.QCC.slice(0)}n.currentTile=d;break;case 65427:d=n.currentTile;if(0===d.partIndex){initializeTile(n,d.index);buildPackets(n)}f=d.dataEnd-o;parseTilePackets(n,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,i.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,i=[];for(let t=0,n=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}}i.push(l)}return i}(n);this.width=n.SIZ.Xsiz-n.SIZ.XOsiz;this.height=n.SIZ.Ysiz-n.SIZ.YOsiz;this.componentsCount=n.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 i;const n=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,i.PPx-1):Math.min(r.xcb,i.PPx);i.ycb_=a>0?Math.min(r.ycb,i.PPy-1):Math.min(r.ycb,i.PPy);return i}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/i)-Math.floor(t.try0/i):0,h=c*l;t.precinctParameters={precinctWidth:r,precinctHeight:i,numprecinctswide:c,numprecinctshigh:l,numprecincts:h,precinctWidthInSubband:s,precinctHeightInSubband:o}}function buildCodeblocks(e,t,a){const r=a.xcb_,i=a.ycb_,n=1<>r,c=t.tby0>>i,l=t.tbx1+n-1>>r,h=t.tby1+s-1>>i,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:i,numcodeblockwide:l-o+1,numcodeblockhigh:h-c+1};t.codeblocks=d;t.precincts=f}function createPacket(e,t,a){const r=[],i=e.subbands;for(let e=0,a=i.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,i=g*a.precinctParameters.precinctHeight;h=Math.min(h,r);u=Math.min(u,i);d=Math.max(d,a.precinctParameters.numprecinctswide);f=Math.max(f,a.precinctParameters.numprecinctshigh);l[e]={width:r,height:i};g<<=1}a=Math.min(a,h);r=Math.min(r,u);i=Math.max(i,d);n=Math.max(n,f);s[o]={resolutions:l,minWidth:h,minHeight:u,maxNumWide:d,maxNumHigh:f}}return{components:s,minWidth:a,minHeight:r,maxNumWide:i,maxNumHigh:n}}function buildPackets(e){const t=e.SIZ,a=e.currentTile.index,r=e.tiles[a],i=t.Csiz;for(let e=0;e>>o&(1<0;){const e=n.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,i,s,o,c,l){const h=r.tbx0,u=r.tby0,d=r.tbx1-r.tbx0,f=r.codeblocks,g="H"===r.type.charAt(0)?1:0,p="H"===r.type.charAt(1)?t:0;for(let a=0,m=f.length;a=s?j:j*(1<0?1-e:0)}const p=t.subbands[r],m=s[p.type];copyCoefficients(n,a,0,p,g?1:2**(f+m-o)*(1+i/2048),h+o-1,g,u,d)}m.push({width:a,height:i,items:n})}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]=i;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,i.log2)(Math.max(e,t))+1;this.levels=[];for(let i=0;ia){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}}class BitModel{static UNIFORM_CONTEXT=17;static RUNLENGTH_CONTEXT=18;static LLAndLHContextsLabel=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]);static HLContextLabel=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]);static HHContextLabel=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]);constructor(e,t,a,r,i){this.width=e;this.height=t;let n;n="HH"===a?BitModel.HHContextLabel:"HL"===a?BitModel.HLContextLabel:BitModel.LLAndLHContextsLabel;this.contextLabelTable=n;const s=e*t;this.neighborsSignificance=new Uint8Array(s);this.coefficentsSign=new Uint8Array(s);let o;o=i>14?new Uint32Array(s):i>6?new Uint16Array(s):new Uint8Array(s);this.coefficentsMagnitude=o;this.processingFlags=new Uint8Array(s);const c=new Uint8Array(s);if(0!==r)for(let e=0;e0,o=t+10){c=a-i;s&&(r[c-1]+=16);o&&(r[c+1]+=16);r[c]+=4}if(e+1=a)break;s[d]&=-2;if(r[d]||!n[d])continue;const g=c[n[d]];if(e.readBit(o,g)){const e=this.decodeSignBit(t,u,d);i[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,i=this.height,n=this.coefficentsMagnitude,s=this.coefficentsSign;let o,c,l,h,u,d;h=t>0&&0!==n[a-1];if(t+10&&0!==n[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,i=this.neighborsSignificance,n=this.contexts,s=this.bitsDecoded,o=this.processingFlags,c=t*a,l=4*t;for(let a,h=0;h>1;let i,n,s,o;const c=-1.586134342059924,l=-.052980118572961,h=.882911075530934,u=.443506852043971,d=1.230174104914001;i=(t|=0)-3;for(n=r+4;n--;i+=2)e[i]*=.8128930661159609;i=t-2;s=u*e[i-1];for(n=r+3;n--;i+=2){o=u*e[i+1];e[i]=d*e[i]-s-o;if(!n--)break;i+=2;s=u*e[i+1];e[i]=d*e[i]-s-o}i=t-1;s=h*e[i-1];for(n=r+2;n--;i+=2){o=h*e[i+1];e[i]-=s+o;if(!n--)break;i+=2;s=h*e[i+1];e[i]-=s+o}i=t;s=l*e[i-1];for(n=r+1;n--;i+=2){o=l*e[i+1];e[i]-=s+o;if(!n--)break;i+=2;s=l*e[i+1];e[i]-=s+o}if(0!==r){i=t+1;s=c*e[i-1];for(n=r;n--;i+=2){o=c*e[i+1];e[i]-=s+o;if(!n--)break;i+=2;s=c*e[i+1];e[i]-=s+o}}}}class ReversibleTransform extends Transform{filter(e,t,a){const r=a>>1;let i,n;for(i=t|=0,n=r+1;n--;i+=2)e[i]-=e[i-1]+e[i+1]+2>>2;for(i=t+1,n=r;n--;i+=2)e[i]+=e[i-1]+e[i+1]>>1}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.LZWStream=void 0;var r=a(18);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,i={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){i.dictionaryValues[e]=e;i.dictionaryLengths[e]=1}this.lzwState=i}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(i){l[s]=u;c[s]=c[u]+1;o[s]=d[0];s++;h=s+n&s+n-1?h:0|Math.min(Math.log(s+n)/.6931471805599453+1,12)}u=e;g+=f;if(r{Object.defineProperty(t,"__esModule",{value:!0});t.PredictorStream=void 0;var r=a(18),i=a(4),n=a(2);class PredictorStream extends r.DecodeStream{constructor(e,t,a){super(t);if(!(a instanceof i.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 n.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,i=this.colors,n=this.str.getBytes(e);this.eof=!n.length;if(this.eof)return;let s,o=0,c=0,l=0,h=0,u=t;if(1===r&&1===i)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(i+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 i=this.bufferLength,s=this.ensureBuffer(i+e);let o=s.subarray(i-e,i);0===o.length&&(o=new Uint8Array(e));let c,l,h,u=i;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(18);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 i=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),i=a(35),n=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(14),m=a(47),b=a(3),y=a(8),w=a(48);const S=[[57344,63743],[1048576,1114109]],x=1e3,C=["ascent","bbox","black","bold","charProcOperatorList","composite","cssFontInfo","data","defaultVMetrics","defaultWidth","descent","fallbackName","fontMatrix","isInvalidPDFjsFont","isType3Font","italic","loadedName","mimetype","missingFile","name","remeasure","subtype","type","vertical"],k=["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,i,n,s,o,c){this.originalCharCode=e;this.fontChar=t;this.unicode=a;this.accent=r;this.width=i;this.vmetric=n;this.operatorListId=s;this.isSpace=o;this.isInFont=c}get category(){return(0,r.shadow)(this,"category",(0,s.getCharUnicodeCategory)(this.unicode),!0)}}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:i}){let n,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))n=i?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){const t=e.peekBytes(4);return"OTTO"===(0,r.bytesToString)(t)}(e))n=i?"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))n=i?"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(i){n="CIDFontType0";s="CIDFontType0C"}else{n="MMType1"===t?"MMType1":"Type1";s="Type1C"}else{(0,r.warn)("getFontFileType: Unable to detect correct font file Type/Subtype.");n=t;s=a}return[n,s]}function applyStandardFontGlyphMap(e,t){for(const a in t)e[+a]=t[a]}function buildToFontChar(e,t,a){const r=[];let i;for(let a=0,n=e.length;au){l++;if(l>=S.length){(0,r.warn)("Ran out of space in font private use area.");break}h=S[l][0];u=S[l][1]}const p=h++;0===g&&(g=a);let m=i.get(f);"string"==typeof m&&(m=m.codePointAt(0));if(m&&!(d=m,S[0][0]<=d&&d<=S[0][1]||S[1][0]<=d&&d<=S[1][1])&&!c.has(g)){s.set(m,g);c.add(g)}n[p]=g;o[f]=p}var d;return{toFontChar:o,charCodeToGlyphId:n,toUnicodeExtraMap:s,nextAvailableFontCharCode:h}}function createCmapTable(e,t,a){const i=function getRanges(e,t,a){const r=[];for(const t in e)e[t]>=a||r.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,i]of t)i>=a||r.push({fontCharCode:e,glyphId:i});0===r.length&&r.push({fontCharCode:0,glyphId:0});r.sort((function fontGetRangesSort(e,t){return e.fontCharCode-t.fontCharCode}));const i=[],n=r.length;for(let e=0;e65535?2:1;let s,o,c,l,h="\0\0"+string16(n)+"\0\0"+(0,r.string32)(4+8*n);for(s=i.length-1;s>=0&&!(i[s][0]<=65535);--s);const u=s+1;i[s][0]<65535&&65535===i[s][1]&&(i[s][1]=65534);const d=i[s][1]<65535?1:0,f=u+d,g=m.OpenTypeFileBuilder.getSearchParams(f,2);let p,b,y,w,S="",x="",C="",k="",v="",F=0;for(s=0,o=u;s0){x+="ÿÿ";S+="ÿÿ";C+="\0";k+="\0\0"}const O="\0\0"+string16(2*f)+string16(g.range)+string16(g.entry)+string16(g.rangeShift)+x+"\0\0"+S+C+k+v;let T="",M="";if(n>1){h+="\0\0\n"+(0,r.string32)(4+8*n+4+O.length);T="";for(s=0,o=i.length;se||!l)&&(l=e);h 123 are reserved for internal usage");c|=1<65535&&(h=65535)}else{l=0;h=255}const d=e.bbox||[0,0,0,0],f=a.unitsPerEm||1/(e.fontMatrix||r.FONT_IDENTITY_MATRIX)[0],g=e.ascentScaled?1:f/x,p=a.ascent||Math.round(g*(e.ascent||d[3]));let m=a.descent||Math.round(g*(e.descent||d[1]));m>0&&e.descent>0&&d[1]<0&&(m=-m);const b=a.yMax||p,y=-a.yMin||-m;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)(i)+(0,r.string32)(n)+(0,r.string32)(o)+(0,r.string32)(c)+"*21*"+string16(e.italicAngle?1:0)+string16(l||e.firstChar)+string16(h||e.lastChar)+string16(p)+string16(m)+"\0d"+string16(b)+string16(y)+"\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.replaceAll(/[^\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 i,n,s,o,c;for(i=0,n=a.length;i0;if((g||p)&&"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 i=r[e];void 0===a[i]&&(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(i))this.toFontChar=buildToFontChar(c.SymbolSetEncoding,(0,o.getGlyphsUnicode)(),this.differences);else if(/Dingbats/i.test(i)){/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(g){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],i=(0,s.getUnicodeForGlyph)(a,e);-1!==i&&(r=i)}a[+t]=r}));this.composite&&this.toUnicode instanceof h.IdentityToUnicodeMap&&/Tahoma|Verdana/i.test(t)&&applyStandardFontGlyphMap(a,(0,l.getGlyphMapForStandardFonts)());this.toFontChar=a}amendFallbackToUnicode(e);this.loadedName=i.split("-")[0]}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,i=e.getInt32()>>>0,n=e.pos;e.pos=e.start||0;e.skip(r);const s=e.getBytes(i);e.pos=n;if("head"===t){s[8]=s[9]=s[10]=s[11]=0;s[17]|=32}return{tag:t,checksum:a,length:i,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,i,n){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,i);s.length=o.length;return s}let l,h=10,u=0;for(l=0;lo.length)return s;if(!n&&f>0){r.set(o.subarray(0,d),i);r.set([0,0],i+d);r.set(o.subarray(g,m),i+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),i);s.length=m;return s}r.set(o,i);s.length=o.length;return s}function readNameTable(e){const a=(t.start||0)+e.offset;t.pos=a;const r=[[],[]],i=[],n=e.length,s=a+n;if(0!==t.getUint16()||n<6)return[r,i];const o=t.getUint16(),c=t.getUint16();let l,h;for(l=0;ls)continue;t.pos=n;const o=e.name;if(e.encoding){let a="";for(let r=0,i=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){i=f.pop();isNaN(i)||(t=2*-i)}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,i=0;for(a=0,r=t.length;a>>0,s=[];for(let t=0;t>>0);const o={ttcTag:t,majorVersion:a,minorVersion:i,numFonts:n,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),n=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(),C=t.getUint16();if(a.scaleFactors&&a.scaleFactors.length===C&&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:C});r.scale(e);const{glyf:i,loca:n,isLocationLong:s}=r.write();f.glyf.data=i;f.loca.data=n;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 k=C+1,v=!0;if(k>65535){v=!1;k=C;(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]=k>>8;f.maxp.data[5]=255&k;const T=function sanitizeTTPrograms(e,t,a,i){const n={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,n);t&&sanitizeTTProgram(t,n);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,i=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}}}(n,i);if(a&&1&a.length){const e=new Uint8Array(a.length+1);e.set(a.data);a.data=e}return n.hintsValid}(f.fpgm,f.prep,f["cvt "],F);if(!T){delete f.fpgm;delete f.prep;delete f["cvt "]}!function sanitizeMetrics(e,t,a,i,n,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(i.data[44],i.data[45]))){t.data[22]=0;t.data[23]=0}}if(c>n){(0,r.info)(`The numOfMetrics (${c}) should not be greater than the numGlyphs (${n}).`);c=n;t.data[34]=(65280&c)>>8;t.data[35]=255&c}const l=n-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,k,v);if(!f.head)throw new r.FormatError('Required "head" table is not found');!function sanitizeHead(e,t,a){const i=e.data,n=function int32(e,t,a,r){return(e<<24)+(t<<16)+(a<<8)+r}(i[0],i[1],i[2],i[3]);if(n>>16!=1){(0,r.info)("Attempting to fix invalid version in head table: "+n);i[0]=0;i[1]=1;i[2]=0;i[3]=0}const s=int16(i[50],i[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){i[50]=0;i[51]=0}else{if(a!==e<<2)throw new r.FormatError("Could not fix indexToLocFormat: "+s);i[50]=0;i[51]=1}}}(f.head,C,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,i,n,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=n?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,C,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,i){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=n.MacStandardGlyphOrdering;break;case 131072:const e=t.getUint16();if(e!==i){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 n=-1;t?n=i:void 0!==e[i]&&(n=e[i]);n>=0&&n>>0;let h=!1;if(!c||c.platformId!==r||c.encodingId!==n){if(0!==r||0!==n&&1!==n&&3!==n)if(1===r&&0===n)h=!0;else if(3!==r||1!==n||!i&&c){if(a&&3===r&&0===n){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 i=r[e[a]];for(f=0;f>1;t.skip(6);const a=[];let r;for(r=0;r>1)-(e-r);n.offsetIndex=i;o=Math.max(o,i+n.end-n.start+1)}else n.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]=e.glyphId}if(a.glyphNames&&(u.length||this.differences.length))for(let e=0;e<256;++e){if(!d&&void 0!==D[e])continue;const t=this.differences[e]||u[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=k-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,k)};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 i.CFFParser(w,a,n.SEAC_ANALYSIS_ENABLED).parse();b.duplicateFirstGlyph();const e=new i.CFFCompiler(b);f["CFF "].data=e.compile()}catch(e){(0,r.warn)("Failed to compile font "+a.loadedName)}if(f.name){const[t,r]=readNameTable(f.name);f.name.data=createNameTable(e,t);this.psName=t[0][6]||null;a.composite||function adjustTrueTypeToUnicode(e,t,a){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(e.hasEncoding)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;if(!t)return;if(0===a.length)return;if(e.defaultEncoding===c.WinAnsiEncoding)return;for(const e of a)if(!isWinNameRecord(e))return;const r=c.WinAnsiEncoding,i=[],n=(0,o.getGlyphsUnicode)();for(const e in r){const t=r[e];if(""===t)continue;const a=n[t];void 0!==a&&(i[e]=String.fromCharCode(a))}i.length>0&&e.toUnicode.amend(i)}(a,this.isSymbolicFont,r)}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 adjustType1ToUnicode(e,t){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof h.IdentityToUnicodeMap)return;const a=[],r=(0,o.getGlyphsUnicode)();for(const i in t){if(e.hasEncoding&&(e.baseEncodingName||void 0!==e.differences[i]))continue;const n=t[i],o=(0,s.getUnicodeForGlyph)(n,r);-1!==o&&(a[i]=String.fromCharCode(o))}a.length>0&&e.toUnicode.amend(a)}(a,a.builtInEncoding);let i=1;t instanceof u.CFFFont&&(i=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),i,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)t===e[r]&&(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&&n.SEAC_ANALYSIS_ENABLED&&b&&b.length){const e=a.fontMatrix||r.FONT_IDENTITY_MATRIX,i=t.getCharset(),n=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=i.indexOf(r),h=i.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(const e of f){const t=d.charCodeToGlyphId,a=createCharCode(t,o),r=createCharCode(t,h);n[e]={baseFontCharCode:a,accentFontCharCode:r,accentOffset:u}}}a.seacMap=n}const y=1/(a.fontMatrix||r.FONT_IDENTITY_MATRIX)[0],w=new m.OpenTypeFileBuilder("OTTO");w.addTable("CFF ",t.data);w.addTable("OS/2",createOS2Table(a,f));w.addTable("cmap",createCmapTable(f,g,p));w.addTable("head","\0\0\0\0\0\0\0\0\0\0_<õ\0\0"+safeString16(y)+"\0\0\0\0ž\v~'\0\0\0\0ž\v~'\0\0"+safeString16(a.descent)+"ÿ"+safeString16(a.ascent)+string16(a.italicAngle?2:0)+"\0\0\0\0\0\0\0");w.addTable("hhea","\0\0\0"+safeString16(a.ascent)+safeString16(a.descent)+"\0\0ÿÿ\0\0\0\0\0\0"+safeString16(a.capHeight)+safeString16(Math.tan(a.italicAngle)*a.xHeight)+"\0\0\0\0\0\0\0\0\0\0\0\0"+string16(p));w.addTable("hmtx",function fontFieldsHmtx(){const e=t.charstrings,a=t.cff?t.cff.widths:null;let r="\0\0\0\0";for(let t=1,i=p;tt.length%2==1,r=this.toUnicode instanceof h.IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let i=0,n=e.length;i55295&&(n<57344||n>65533)&&i++;if(this.toUnicode){const e=r(n);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(n))}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),i=a(36),n=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),i=this.parseIndex(r.endPos),n=this.parseIndex(i.endPos),s=this.parseIndex(n.endPos),o=this.parseDict(i.obj.get(0)),c=this.createDict(CFFTopDict,o,t.strings);t.header=a.obj;t.names=this.parseNameIndex(r.obj);t.strings=this.parseStringIndex(n.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 i=e[0],n=e[1],s=e[2],o=e[3];return{obj:new CFFHeader(i,n,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,i=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],n=e.length;for(;t>4,o=15&n;if(s===r)break;a+=i[s];if(o===r)break;a+=i[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 i=[];t=0;const n=e.length;for(;t10)return!1;let n=e.stackSize;const s=e.stack;let o=t.length;for(let h=0;h>16;h+=2;n++}else if(14===u){if(n>=4){n-=4;if(this.seacAnalysisEnabled){e.seac=s.slice(n,n+4);return!1}}d=c[u]}else if(u>=32&&u<=246){s[n]=u-139;n++}else if(u>=247&&u<=254){s[n]=u<251?(u-247<<8)+t[h]+108:-(u-251<<8)-t[h]-108;h++;n++}else if(255===u){s[n]=(t[h]<<24|t[h+1]<<16|t[h+2]<<8|t[h+3])/65536;h+=4;n++}else if(19===u||20===u){e.hints+=n>>1;h+=e.hints+7>>3;n%=2;d=c[u]}else{if(10===u||29===u){let t;t=10===u?a:i;if(!t){d=c[u];(0,r.warn)("Missing subrsIndex for "+d.id);return!1}let o=32768;t.count<1240?o=107:t.count<33900&&(o=1131);const l=s[--n]+o;if(l<0||l>=t.count||isNaN(l)){d=c[u];(0,r.warn)("Out of bounds subrIndex for "+d.id);return!1}e.stackSize=n;e.callDepth++;if(!this.parseCharString(e,t.get(l),a,i))return!1;e.callDepth--;n=e.stackSize;continue}if(11===u){e.stackSize=n;return!0}if(0===u&&h===t.length){t[h-1]=14;d=c[14]}else{if(9===u){t.copyWithin(h-1,h,-1);h-=1;o-=1;continue}d=c[u]}}if(d){if(d.stem){e.hints+=n>>1;if(3===u||23===u)e.hasVStems=!0;else if(e.hasVStems&&(1===u||18===u)){(0,r.warn)("CFF stem hints are in wrong order");t[h-1]=1===u?3:23}}if("min"in d&&!e.undefStack&&n=2&&d.stem?n%=2:n>1&&(0,r.warn)("Found too many parameters for stack-clearing command");n>0&&(e.width=s[n-1])}if("stackDelta"in d){"stackFn"in d&&d.stackFn(s,n);n+=d.stackDelta}else if(d.stackClearing)n=0;else if(d.resetStack){n=0;e.undefStack=!1}else if(d.undefStack){n=0;e.undefStack=!0;e.firstStackClearing=!1}}}o=n.length){(0,r.warn)("Invalid fd index for glyph index.");d=!1}if(d){g=n[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 i=r+a,n=this.bytes.subarray(r,i),s=this.parseDict(n),o=this.createDict(CFFPrivateDict,s,e.strings);e.privateDict=o;0===o.getByName("ExpansionFactor")&&o.setByName("ExpansionFactor",.06);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,n){if(0===e)return new CFFCharset(!0,d.ISO_ADOBE,i.ISOAdobeCharset);if(1===e)return new CFFCharset(!0,d.EXPERT,i.ExpertCharset);if(2===e)return new CFFCharset(!0,d.EXPERT_SUBSET,i.ExpertSubsetCharset);const s=this.bytes,o=e,c=s[e++],l=[n?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;if(0===t.length)return!0;for(const a of t)if(isNaN(a)){(0,r.warn)(`Invalid CFFDict value: "${t}" for key "${e}".`);return!0}const a=this.types[e];"num"!==a&&"sid"!==a&&"offset"!==a||(t=t[0]);this.values[e]=t;return!0}setByName(e,t){if(!(e in this.nameToKeyMap))throw new r.FormatError(`Invalid dictionary name "${e}"`);this.values[this.nameToKeyMap[e]]=t}hasName(e){return this.nameToKeyMap[e]in this.values}getByName(e){if(!(e in this.nameToKeyMap))throw new r.FormatError(`Invalid dictionary name ${e}"`);const t=this.nameToKeyMap[e];return t in this.values?this.values[t]:this.defaults[t]}removeByName(e){delete this.values[this.nameToKeyMap[e]]}static createTables(e){const t={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]};for(const a of e){const e=Array.isArray(a[0])?(a[0][0]<<8)+a[0][1]:a[0];t.keyToNameMap[e]=a[1];t.nameToKeyMap[a[1]]=e;t.types[e]=a[2];t.defaults[e]=a[3];t.opcodes[e]=Array.isArray(a[0])?a[0]:[a[0]];t.order.push(e)}return t}}const h=[[[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"],[.001,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(0,r.shadow)(this,"tables",this.createTables(h))}constructor(e){super(CFFTopDict.tables,e);this.privateDict=null}}t.CFFTopDict=CFFTopDict;const u=[[6,"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",.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",.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(0,r.shadow)(this,"tables",this.createTables(u))}constructor(e){super(CFFPrivateDict.tables,e);this.subrsIndex=null}}t.CFFPrivateDict=CFFPrivateDict;const d={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2};class CFFCharset{constructor(e,t,a,r){this.predefined=e;this.format=t;this.charset=a;this.raw=r}}t.CFFCharset=CFFCharset;class CFFEncoding{constructor(e,t,a,r){this.predefined=e;this.format=t;this.encoding=a;this.raw=r}}class CFFFDSelect{constructor(e,t){this.format=e;this.fdSelect=t}getFDIndex(e){return e<0||e>=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 i=a.data,n=this.offsets[e];for(let e=0,a=t.length;e>24&255;i[o]=h>>16&255;i[c]=h>>8&255;i[l]=255&h}}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t={data:[],length:0,add(e){e.length<=65536?this.data.push(...e):this.data=this.data.concat(e);this.length=this.data.length}},a=this.compileHeader(e.header);t.add(a);const i=this.compileNameIndex(e.names);t.add(i);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(const a of e.fdArray){let e=t.slice(0);a.hasName("FontMatrix")&&(e=r.Util.transform(e,a.getByName("FontMatrix")));a.setByName("FontMatrix",e)}}const n=e.topDict.getByName("XUID");n&&n.length>16&&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,i,n="";for(r=0,i=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(const a of e){const e=Math.min(a.length,127);let i=new Array(e);for(let t=0;t"~"||"["===e||"]"===e||"("===e||")"===e||"{"===e||"}"===e||"<"===e||">"===e||"/"===e||"%"===e)&&(e="_");i[t]=e}i=i.join("");""===i&&(i="Bad_Font_Name");t.add((0,r.stringToBytes)(i))}return this.compileIndex(t)}compileTopDicts(e,t,a){const r=[];let i=new CFFIndex;for(const n of e){if(a){n.removeByName("CIDFontVersion");n.removeByName("CIDFontRevision");n.removeByName("CIDFontType");n.removeByName("CIDCount");n.removeByName("UIDBase")}const e=new CFFOffsetTracker,s=this.compileDict(n,e);r.push(e);i.add(s);e.offset(t)}i=this.compileIndex(i,r);return{trackers:r,output:i}}compilePrivateDicts(e,t,a){for(let i=0,n=e.length;i>8&255,255&s]);else{n=new Uint8Array(1+2*s);n[0]=0;let t=0;const i=e.charset.length;let o=!1;for(let s=1;s>8&255;n[s+1]=255&c}}return this.compileTypedArray(n)}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&i,n];for(r=1;r>8&255,255&r,t);n=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){return Array.from(e)}compileIndex(e,t=[]){const a=e.objects,r=a.length;if(0===r)return[0,0];const i=[r>>8&255,255&r];let n,s,o=1;for(n=0;n>8&255,255&c):3===s?i.push(c>>16&255,c>>8&255,255&c):i.push(c>>>24&255,c>>16&255,c>>8&255,255&c);a[n]&&(c+=a[n].length)}for(n=0;n{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 n;case"MacRomanEncoding":return i;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","","","",""],i=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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=i;const n=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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=n;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.normalizeFontName=function normalizeFontName(e){return e.replaceAll(/[,_]/g,"-").replaceAll(/\s/g,"")};t.recoverGlyphName=recoverGlyphName;t.type1FontGlyphMapping=function type1FontGlyphMapping(e,t,a){const n=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,r.getEncoding)(e.baseEncodingName);for(c=0;c=0?s:0}}else if(h)for(c in t)n[c]=t[c];else{l=r.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))}n[c]=s>=0?s:0}return n};var r=a(37),i=a(39),n=a(40),s=a(2);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,n.getUnicodeForGlyph)(e,t);if(-1!==a)for(const e in t)if(t[e]===a)return e;(0,s.info)("Unable to recover a standard glyph name for: "+e);return e}},(e,t,a)=>{a.r(t);a.d(t,{getDingbatsGlyphsUnicode:()=>n,getGlyphsUnicode:()=>i});var r=a(3);const i=(0,r.getLookupTableFactory)((function(e){e.A=65;e.AE=198;e.AEacute=508;e.AEmacron=482;e.AEsmall=63462;e.Aacute=193;e.Aacutesmall=63457;e.Abreve=258;e.Abreveacute=7854;e.Abrevecyrillic=1232;e.Abrevedotbelow=7862;e.Abrevegrave=7856;e.Abrevehookabove=7858;e.Abrevetilde=7860;e.Acaron=461;e.Acircle=9398;e.Acircumflex=194;e.Acircumflexacute=7844;e.Acircumflexdotbelow=7852;e.Acircumflexgrave=7846;e.Acircumflexhookabove=7848;e.Acircumflexsmall=63458;e.Acircumflextilde=7850;e.Acute=63177;e.Acutesmall=63412;e.Acyrillic=1040;e.Adblgrave=512;e.Adieresis=196;e.Adieresiscyrillic=1234;e.Adieresismacron=478;e.Adieresissmall=63460;e.Adotbelow=7840;e.Adotmacron=480;e.Agrave=192;e.Agravesmall=63456;e.Ahookabove=7842;e.Aiecyrillic=1236;e.Ainvertedbreve=514;e.Alpha=913;e.Alphatonos=902;e.Amacron=256;e.Amonospace=65313;e.Aogonek=260;e.Aring=197;e.Aringacute=506;e.Aringbelow=7680;e.Aringsmall=63461;e.Asmall=63329;e.Atilde=195;e.Atildesmall=63459;e.Aybarmenian=1329;e.B=66;e.Bcircle=9399;e.Bdotaccent=7682;e.Bdotbelow=7684;e.Becyrillic=1041;e.Benarmenian=1330;e.Beta=914;e.Bhook=385;e.Blinebelow=7686;e.Bmonospace=65314;e.Brevesmall=63220;e.Bsmall=63330;e.Btopbar=386;e.C=67;e.Caarmenian=1342;e.Cacute=262;e.Caron=63178;e.Caronsmall=63221;e.Ccaron=268;e.Ccedilla=199;e.Ccedillaacute=7688;e.Ccedillasmall=63463;e.Ccircle=9400;e.Ccircumflex=264;e.Cdot=266;e.Cdotaccent=266;e.Cedillasmall=63416;e.Chaarmenian=1353;e.Cheabkhasiancyrillic=1212;e.Checyrillic=1063;e.Chedescenderabkhasiancyrillic=1214;e.Chedescendercyrillic=1206;e.Chedieresiscyrillic=1268;e.Cheharmenian=1347;e.Chekhakassiancyrillic=1227;e.Cheverticalstrokecyrillic=1208;e.Chi=935;e.Chook=391;e.Circumflexsmall=63222;e.Cmonospace=65315;e.Coarmenian=1361;e.Csmall=63331;e.D=68;e.DZ=497;e.DZcaron=452;e.Daarmenian=1332;e.Dafrican=393;e.Dcaron=270;e.Dcedilla=7696;e.Dcircle=9401;e.Dcircumflexbelow=7698;e.Dcroat=272;e.Ddotaccent=7690;e.Ddotbelow=7692;e.Decyrillic=1044;e.Deicoptic=1006;e.Delta=8710;e.Deltagreek=916;e.Dhook=394;e.Dieresis=63179;e.DieresisAcute=63180;e.DieresisGrave=63181;e.Dieresissmall=63400;e.Digammagreek=988;e.Djecyrillic=1026;e.Dlinebelow=7694;e.Dmonospace=65316;e.Dotaccentsmall=63223;e.Dslash=272;e.Dsmall=63332;e.Dtopbar=395;e.Dz=498;e.Dzcaron=453;e.Dzeabkhasiancyrillic=1248;e.Dzecyrillic=1029;e.Dzhecyrillic=1039;e.E=69;e.Eacute=201;e.Eacutesmall=63465;e.Ebreve=276;e.Ecaron=282;e.Ecedillabreve=7708;e.Echarmenian=1333;e.Ecircle=9402;e.Ecircumflex=202;e.Ecircumflexacute=7870;e.Ecircumflexbelow=7704;e.Ecircumflexdotbelow=7878;e.Ecircumflexgrave=7872;e.Ecircumflexhookabove=7874;e.Ecircumflexsmall=63466;e.Ecircumflextilde=7876;e.Ecyrillic=1028;e.Edblgrave=516;e.Edieresis=203;e.Edieresissmall=63467;e.Edot=278;e.Edotaccent=278;e.Edotbelow=7864;e.Efcyrillic=1060;e.Egrave=200;e.Egravesmall=63464;e.Eharmenian=1335;e.Ehookabove=7866;e.Eightroman=8551;e.Einvertedbreve=518;e.Eiotifiedcyrillic=1124;e.Elcyrillic=1051;e.Elevenroman=8554;e.Emacron=274;e.Emacronacute=7702;e.Emacrongrave=7700;e.Emcyrillic=1052;e.Emonospace=65317;e.Encyrillic=1053;e.Endescendercyrillic=1186;e.Eng=330;e.Enghecyrillic=1188;e.Enhookcyrillic=1223;e.Eogonek=280;e.Eopen=400;e.Epsilon=917;e.Epsilontonos=904;e.Ercyrillic=1056;e.Ereversed=398;e.Ereversedcyrillic=1069;e.Escyrillic=1057;e.Esdescendercyrillic=1194;e.Esh=425;e.Esmall=63333;e.Eta=919;e.Etarmenian=1336;e.Etatonos=905;e.Eth=208;e.Ethsmall=63472;e.Etilde=7868;e.Etildebelow=7706;e.Euro=8364;e.Ezh=439;e.Ezhcaron=494;e.Ezhreversed=440;e.F=70;e.Fcircle=9403;e.Fdotaccent=7710;e.Feharmenian=1366;e.Feicoptic=996;e.Fhook=401;e.Fitacyrillic=1138;e.Fiveroman=8548;e.Fmonospace=65318;e.Fourroman=8547;e.Fsmall=63334;e.G=71;e.GBsquare=13191;e.Gacute=500;e.Gamma=915;e.Gammaafrican=404;e.Gangiacoptic=1002;e.Gbreve=286;e.Gcaron=486;e.Gcedilla=290;e.Gcircle=9404;e.Gcircumflex=284;e.Gcommaaccent=290;e.Gdot=288;e.Gdotaccent=288;e.Gecyrillic=1043;e.Ghadarmenian=1346;e.Ghemiddlehookcyrillic=1172;e.Ghestrokecyrillic=1170;e.Gheupturncyrillic=1168;e.Ghook=403;e.Gimarmenian=1331;e.Gjecyrillic=1027;e.Gmacron=7712;e.Gmonospace=65319;e.Grave=63182;e.Gravesmall=63328;e.Gsmall=63335;e.Gsmallhook=667;e.Gstroke=484;e.H=72;e.H18533=9679;e.H18543=9642;e.H18551=9643;e.H22073=9633;e.HPsquare=13259;e.Haabkhasiancyrillic=1192;e.Hadescendercyrillic=1202;e.Hardsigncyrillic=1066;e.Hbar=294;e.Hbrevebelow=7722;e.Hcedilla=7720;e.Hcircle=9405;e.Hcircumflex=292;e.Hdieresis=7718;e.Hdotaccent=7714;e.Hdotbelow=7716;e.Hmonospace=65320;e.Hoarmenian=1344;e.Horicoptic=1e3;e.Hsmall=63336;e.Hungarumlaut=63183;e.Hungarumlautsmall=63224;e.Hzsquare=13200;e.I=73;e.IAcyrillic=1071;e.IJ=306;e.IUcyrillic=1070;e.Iacute=205;e.Iacutesmall=63469;e.Ibreve=300;e.Icaron=463;e.Icircle=9406;e.Icircumflex=206;e.Icircumflexsmall=63470;e.Icyrillic=1030;e.Idblgrave=520;e.Idieresis=207;e.Idieresisacute=7726;e.Idieresiscyrillic=1252;e.Idieresissmall=63471;e.Idot=304;e.Idotaccent=304;e.Idotbelow=7882;e.Iebrevecyrillic=1238;e.Iecyrillic=1045;e.Ifraktur=8465;e.Igrave=204;e.Igravesmall=63468;e.Ihookabove=7880;e.Iicyrillic=1048;e.Iinvertedbreve=522;e.Iishortcyrillic=1049;e.Imacron=298;e.Imacroncyrillic=1250;e.Imonospace=65321;e.Iniarmenian=1339;e.Iocyrillic=1025;e.Iogonek=302;e.Iota=921;e.Iotaafrican=406;e.Iotadieresis=938;e.Iotatonos=906;e.Ismall=63337;e.Istroke=407;e.Itilde=296;e.Itildebelow=7724;e.Izhitsacyrillic=1140;e.Izhitsadblgravecyrillic=1142;e.J=74;e.Jaarmenian=1345;e.Jcircle=9407;e.Jcircumflex=308;e.Jecyrillic=1032;e.Jheharmenian=1355;e.Jmonospace=65322;e.Jsmall=63338;e.K=75;e.KBsquare=13189;e.KKsquare=13261;e.Kabashkircyrillic=1184;e.Kacute=7728;e.Kacyrillic=1050;e.Kadescendercyrillic=1178;e.Kahookcyrillic=1219;e.Kappa=922;e.Kastrokecyrillic=1182;e.Kaverticalstrokecyrillic=1180;e.Kcaron=488;e.Kcedilla=310;e.Kcircle=9408;e.Kcommaaccent=310;e.Kdotbelow=7730;e.Keharmenian=1364;e.Kenarmenian=1343;e.Khacyrillic=1061;e.Kheicoptic=998;e.Khook=408;e.Kjecyrillic=1036;e.Klinebelow=7732;e.Kmonospace=65323;e.Koppacyrillic=1152;e.Koppagreek=990;e.Ksicyrillic=1134;e.Ksmall=63339;e.L=76;e.LJ=455;e.LL=63167;e.Lacute=313;e.Lambda=923;e.Lcaron=317;e.Lcedilla=315;e.Lcircle=9409;e.Lcircumflexbelow=7740;e.Lcommaaccent=315;e.Ldot=319;e.Ldotaccent=319;e.Ldotbelow=7734;e.Ldotbelowmacron=7736;e.Liwnarmenian=1340;e.Lj=456;e.Ljecyrillic=1033;e.Llinebelow=7738;e.Lmonospace=65324;e.Lslash=321;e.Lslashsmall=63225;e.Lsmall=63340;e.M=77;e.MBsquare=13190;e.Macron=63184;e.Macronsmall=63407;e.Macute=7742;e.Mcircle=9410;e.Mdotaccent=7744;e.Mdotbelow=7746;e.Menarmenian=1348;e.Mmonospace=65325;e.Msmall=63341;e.Mturned=412;e.Mu=924;e.N=78;e.NJ=458;e.Nacute=323;e.Ncaron=327;e.Ncedilla=325;e.Ncircle=9411;e.Ncircumflexbelow=7754;e.Ncommaaccent=325;e.Ndotaccent=7748;e.Ndotbelow=7750;e.Nhookleft=413;e.Nineroman=8552;e.Nj=459;e.Njecyrillic=1034;e.Nlinebelow=7752;e.Nmonospace=65326;e.Nowarmenian=1350;e.Nsmall=63342;e.Ntilde=209;e.Ntildesmall=63473;e.Nu=925;e.O=79;e.OE=338;e.OEsmall=63226;e.Oacute=211;e.Oacutesmall=63475;e.Obarredcyrillic=1256;e.Obarreddieresiscyrillic=1258;e.Obreve=334;e.Ocaron=465;e.Ocenteredtilde=415;e.Ocircle=9412;e.Ocircumflex=212;e.Ocircumflexacute=7888;e.Ocircumflexdotbelow=7896;e.Ocircumflexgrave=7890;e.Ocircumflexhookabove=7892;e.Ocircumflexsmall=63476;e.Ocircumflextilde=7894;e.Ocyrillic=1054;e.Odblacute=336;e.Odblgrave=524;e.Odieresis=214;e.Odieresiscyrillic=1254;e.Odieresissmall=63478;e.Odotbelow=7884;e.Ogoneksmall=63227;e.Ograve=210;e.Ogravesmall=63474;e.Oharmenian=1365;e.Ohm=8486;e.Ohookabove=7886;e.Ohorn=416;e.Ohornacute=7898;e.Ohorndotbelow=7906;e.Ohorngrave=7900;e.Ohornhookabove=7902;e.Ohorntilde=7904;e.Ohungarumlaut=336;e.Oi=418;e.Oinvertedbreve=526;e.Omacron=332;e.Omacronacute=7762;e.Omacrongrave=7760;e.Omega=8486;e.Omegacyrillic=1120;e.Omegagreek=937;e.Omegaroundcyrillic=1146;e.Omegatitlocyrillic=1148;e.Omegatonos=911;e.Omicron=927;e.Omicrontonos=908;e.Omonospace=65327;e.Oneroman=8544;e.Oogonek=490;e.Oogonekmacron=492;e.Oopen=390;e.Oslash=216;e.Oslashacute=510;e.Oslashsmall=63480;e.Osmall=63343;e.Ostrokeacute=510;e.Otcyrillic=1150;e.Otilde=213;e.Otildeacute=7756;e.Otildedieresis=7758;e.Otildesmall=63477;e.P=80;e.Pacute=7764;e.Pcircle=9413;e.Pdotaccent=7766;e.Pecyrillic=1055;e.Peharmenian=1354;e.Pemiddlehookcyrillic=1190;e.Phi=934;e.Phook=420;e.Pi=928;e.Piwrarmenian=1363;e.Pmonospace=65328;e.Psi=936;e.Psicyrillic=1136;e.Psmall=63344;e.Q=81;e.Qcircle=9414;e.Qmonospace=65329;e.Qsmall=63345;e.R=82;e.Raarmenian=1356;e.Racute=340;e.Rcaron=344;e.Rcedilla=342;e.Rcircle=9415;e.Rcommaaccent=342;e.Rdblgrave=528;e.Rdotaccent=7768;e.Rdotbelow=7770;e.Rdotbelowmacron=7772;e.Reharmenian=1360;e.Rfraktur=8476;e.Rho=929;e.Ringsmall=63228;e.Rinvertedbreve=530;e.Rlinebelow=7774;e.Rmonospace=65330;e.Rsmall=63346;e.Rsmallinverted=641;e.Rsmallinvertedsuperior=694;e.S=83;e.SF010000=9484;e.SF020000=9492;e.SF030000=9488;e.SF040000=9496;e.SF050000=9532;e.SF060000=9516;e.SF070000=9524;e.SF080000=9500;e.SF090000=9508;e.SF100000=9472;e.SF110000=9474;e.SF190000=9569;e.SF200000=9570;e.SF210000=9558;e.SF220000=9557;e.SF230000=9571;e.SF240000=9553;e.SF250000=9559;e.SF260000=9565;e.SF270000=9564;e.SF280000=9563;e.SF360000=9566;e.SF370000=9567;e.SF380000=9562;e.SF390000=9556;e.SF400000=9577;e.SF410000=9574;e.SF420000=9568;e.SF430000=9552;e.SF440000=9580;e.SF450000=9575;e.SF460000=9576;e.SF470000=9572;e.SF480000=9573;e.SF490000=9561;e.SF500000=9560;e.SF510000=9554;e.SF520000=9555;e.SF530000=9579;e.SF540000=9578;e.Sacute=346;e.Sacutedotaccent=7780;e.Sampigreek=992;e.Scaron=352;e.Scarondotaccent=7782;e.Scaronsmall=63229;e.Scedilla=350;e.Schwa=399;e.Schwacyrillic=1240;e.Schwadieresiscyrillic=1242;e.Scircle=9416;e.Scircumflex=348;e.Scommaaccent=536;e.Sdotaccent=7776;e.Sdotbelow=7778;e.Sdotbelowdotaccent=7784;e.Seharmenian=1357;e.Sevenroman=8550;e.Shaarmenian=1351;e.Shacyrillic=1064;e.Shchacyrillic=1065;e.Sheicoptic=994;e.Shhacyrillic=1210;e.Shimacoptic=1004;e.Sigma=931;e.Sixroman=8549;e.Smonospace=65331;e.Softsigncyrillic=1068;e.Ssmall=63347;e.Stigmagreek=986;e.T=84;e.Tau=932;e.Tbar=358;e.Tcaron=356;e.Tcedilla=354;e.Tcircle=9417;e.Tcircumflexbelow=7792;e.Tcommaaccent=354;e.Tdotaccent=7786;e.Tdotbelow=7788;e.Tecyrillic=1058;e.Tedescendercyrillic=1196;e.Tenroman=8553;e.Tetsecyrillic=1204;e.Theta=920;e.Thook=428;e.Thorn=222;e.Thornsmall=63486;e.Threeroman=8546;e.Tildesmall=63230;e.Tiwnarmenian=1359;e.Tlinebelow=7790;e.Tmonospace=65332;e.Toarmenian=1337;e.Tonefive=444;e.Tonesix=388;e.Tonetwo=423;e.Tretroflexhook=430;e.Tsecyrillic=1062;e.Tshecyrillic=1035;e.Tsmall=63348;e.Twelveroman=8555;e.Tworoman=8545;e.U=85;e.Uacute=218;e.Uacutesmall=63482;e.Ubreve=364;e.Ucaron=467;e.Ucircle=9418;e.Ucircumflex=219;e.Ucircumflexbelow=7798;e.Ucircumflexsmall=63483;e.Ucyrillic=1059;e.Udblacute=368;e.Udblgrave=532;e.Udieresis=220;e.Udieresisacute=471;e.Udieresisbelow=7794;e.Udieresiscaron=473;e.Udieresiscyrillic=1264;e.Udieresisgrave=475;e.Udieresismacron=469;e.Udieresissmall=63484;e.Udotbelow=7908;e.Ugrave=217;e.Ugravesmall=63481;e.Uhookabove=7910;e.Uhorn=431;e.Uhornacute=7912;e.Uhorndotbelow=7920;e.Uhorngrave=7914;e.Uhornhookabove=7916;e.Uhorntilde=7918;e.Uhungarumlaut=368;e.Uhungarumlautcyrillic=1266;e.Uinvertedbreve=534;e.Ukcyrillic=1144;e.Umacron=362;e.Umacroncyrillic=1262;e.Umacrondieresis=7802;e.Umonospace=65333;e.Uogonek=370;e.Upsilon=933;e.Upsilon1=978;e.Upsilonacutehooksymbolgreek=979;e.Upsilonafrican=433;e.Upsilondieresis=939;e.Upsilondieresishooksymbolgreek=980;e.Upsilonhooksymbol=978;e.Upsilontonos=910;e.Uring=366;e.Ushortcyrillic=1038;e.Usmall=63349;e.Ustraightcyrillic=1198;e.Ustraightstrokecyrillic=1200;e.Utilde=360;e.Utildeacute=7800;e.Utildebelow=7796;e.V=86;e.Vcircle=9419;e.Vdotbelow=7806;e.Vecyrillic=1042;e.Vewarmenian=1358;e.Vhook=434;e.Vmonospace=65334;e.Voarmenian=1352;e.Vsmall=63350;e.Vtilde=7804;e.W=87;e.Wacute=7810;e.Wcircle=9420;e.Wcircumflex=372;e.Wdieresis=7812;e.Wdotaccent=7814;e.Wdotbelow=7816;e.Wgrave=7808;e.Wmonospace=65335;e.Wsmall=63351;e.X=88;e.Xcircle=9421;e.Xdieresis=7820;e.Xdotaccent=7818;e.Xeharmenian=1341;e.Xi=926;e.Xmonospace=65336;e.Xsmall=63352;e.Y=89;e.Yacute=221;e.Yacutesmall=63485;e.Yatcyrillic=1122;e.Ycircle=9422;e.Ycircumflex=374;e.Ydieresis=376;e.Ydieresissmall=63487;e.Ydotaccent=7822;e.Ydotbelow=7924;e.Yericyrillic=1067;e.Yerudieresiscyrillic=1272;e.Ygrave=7922;e.Yhook=435;e.Yhookabove=7926;e.Yiarmenian=1349;e.Yicyrillic=1031;e.Yiwnarmenian=1362;e.Ymonospace=65337;e.Ysmall=63353;e.Ytilde=7928;e.Yusbigcyrillic=1130;e.Yusbigiotifiedcyrillic=1132;e.Yuslittlecyrillic=1126;e.Yuslittleiotifiedcyrillic=1128;e.Z=90;e.Zaarmenian=1334;e.Zacute=377;e.Zcaron=381;e.Zcaronsmall=63231;e.Zcircle=9423;e.Zcircumflex=7824;e.Zdot=379;e.Zdotaccent=379;e.Zdotbelow=7826;e.Zecyrillic=1047;e.Zedescendercyrillic=1176;e.Zedieresiscyrillic=1246;e.Zeta=918;e.Zhearmenian=1338;e.Zhebrevecyrillic=1217;e.Zhecyrillic=1046;e.Zhedescendercyrillic=1174;e.Zhedieresiscyrillic=1244;e.Zlinebelow=7828;e.Zmonospace=65338;e.Zsmall=63354;e.Zstroke=437;e.a=97;e.aabengali=2438;e.aacute=225;e.aadeva=2310;e.aagujarati=2694;e.aagurmukhi=2566;e.aamatragurmukhi=2622;e.aarusquare=13059;e.aavowelsignbengali=2494;e.aavowelsigndeva=2366;e.aavowelsigngujarati=2750;e.abbreviationmarkarmenian=1375;e.abbreviationsigndeva=2416;e.abengali=2437;e.abopomofo=12570;e.abreve=259;e.abreveacute=7855;e.abrevecyrillic=1233;e.abrevedotbelow=7863;e.abrevegrave=7857;e.abrevehookabove=7859;e.abrevetilde=7861;e.acaron=462;e.acircle=9424;e.acircumflex=226;e.acircumflexacute=7845;e.acircumflexdotbelow=7853;e.acircumflexgrave=7847;e.acircumflexhookabove=7849;e.acircumflextilde=7851;e.acute=180;e.acutebelowcmb=791;e.acutecmb=769;e.acutecomb=769;e.acutedeva=2388;e.acutelowmod=719;e.acutetonecmb=833;e.acyrillic=1072;e.adblgrave=513;e.addakgurmukhi=2673;e.adeva=2309;e.adieresis=228;e.adieresiscyrillic=1235;e.adieresismacron=479;e.adotbelow=7841;e.adotmacron=481;e.ae=230;e.aeacute=509;e.aekorean=12624;e.aemacron=483;e.afii00208=8213;e.afii08941=8356;e.afii10017=1040;e.afii10018=1041;e.afii10019=1042;e.afii10020=1043;e.afii10021=1044;e.afii10022=1045;e.afii10023=1025;e.afii10024=1046;e.afii10025=1047;e.afii10026=1048;e.afii10027=1049;e.afii10028=1050;e.afii10029=1051;e.afii10030=1052;e.afii10031=1053;e.afii10032=1054;e.afii10033=1055;e.afii10034=1056;e.afii10035=1057;e.afii10036=1058;e.afii10037=1059;e.afii10038=1060;e.afii10039=1061;e.afii10040=1062;e.afii10041=1063;e.afii10042=1064;e.afii10043=1065;e.afii10044=1066;e.afii10045=1067;e.afii10046=1068;e.afii10047=1069;e.afii10048=1070;e.afii10049=1071;e.afii10050=1168;e.afii10051=1026;e.afii10052=1027;e.afii10053=1028;e.afii10054=1029;e.afii10055=1030;e.afii10056=1031;e.afii10057=1032;e.afii10058=1033;e.afii10059=1034;e.afii10060=1035;e.afii10061=1036;e.afii10062=1038;e.afii10063=63172;e.afii10064=63173;e.afii10065=1072;e.afii10066=1073;e.afii10067=1074;e.afii10068=1075;e.afii10069=1076;e.afii10070=1077;e.afii10071=1105;e.afii10072=1078;e.afii10073=1079;e.afii10074=1080;e.afii10075=1081;e.afii10076=1082;e.afii10077=1083;e.afii10078=1084;e.afii10079=1085;e.afii10080=1086;e.afii10081=1087;e.afii10082=1088;e.afii10083=1089;e.afii10084=1090;e.afii10085=1091;e.afii10086=1092;e.afii10087=1093;e.afii10088=1094;e.afii10089=1095;e.afii10090=1096;e.afii10091=1097;e.afii10092=1098;e.afii10093=1099;e.afii10094=1100;e.afii10095=1101;e.afii10096=1102;e.afii10097=1103;e.afii10098=1169;e.afii10099=1106;e.afii10100=1107;e.afii10101=1108;e.afii10102=1109;e.afii10103=1110;e.afii10104=1111;e.afii10105=1112;e.afii10106=1113;e.afii10107=1114;e.afii10108=1115;e.afii10109=1116;e.afii10110=1118;e.afii10145=1039;e.afii10146=1122;e.afii10147=1138;e.afii10148=1140;e.afii10192=63174;e.afii10193=1119;e.afii10194=1123;e.afii10195=1139;e.afii10196=1141;e.afii10831=63175;e.afii10832=63176;e.afii10846=1241;e.afii299=8206;e.afii300=8207;e.afii301=8205;e.afii57381=1642;e.afii57388=1548;e.afii57392=1632;e.afii57393=1633;e.afii57394=1634;e.afii57395=1635;e.afii57396=1636;e.afii57397=1637;e.afii57398=1638;e.afii57399=1639;e.afii57400=1640;e.afii57401=1641;e.afii57403=1563;e.afii57407=1567;e.afii57409=1569;e.afii57410=1570;e.afii57411=1571;e.afii57412=1572;e.afii57413=1573;e.afii57414=1574;e.afii57415=1575;e.afii57416=1576;e.afii57417=1577;e.afii57418=1578;e.afii57419=1579;e.afii57420=1580;e.afii57421=1581;e.afii57422=1582;e.afii57423=1583;e.afii57424=1584;e.afii57425=1585;e.afii57426=1586;e.afii57427=1587;e.afii57428=1588;e.afii57429=1589;e.afii57430=1590;e.afii57431=1591;e.afii57432=1592;e.afii57433=1593;e.afii57434=1594;e.afii57440=1600;e.afii57441=1601;e.afii57442=1602;e.afii57443=1603;e.afii57444=1604;e.afii57445=1605;e.afii57446=1606;e.afii57448=1608;e.afii57449=1609;e.afii57450=1610;e.afii57451=1611;e.afii57452=1612;e.afii57453=1613;e.afii57454=1614;e.afii57455=1615;e.afii57456=1616;e.afii57457=1617;e.afii57458=1618;e.afii57470=1607;e.afii57505=1700;e.afii57506=1662;e.afii57507=1670;e.afii57508=1688;e.afii57509=1711;e.afii57511=1657;e.afii57512=1672;e.afii57513=1681;e.afii57514=1722;e.afii57519=1746;e.afii57534=1749;e.afii57636=8362;e.afii57645=1470;e.afii57658=1475;e.afii57664=1488;e.afii57665=1489;e.afii57666=1490;e.afii57667=1491;e.afii57668=1492;e.afii57669=1493;e.afii57670=1494;e.afii57671=1495;e.afii57672=1496;e.afii57673=1497;e.afii57674=1498;e.afii57675=1499;e.afii57676=1500;e.afii57677=1501;e.afii57678=1502;e.afii57679=1503;e.afii57680=1504;e.afii57681=1505;e.afii57682=1506;e.afii57683=1507;e.afii57684=1508;e.afii57685=1509;e.afii57686=1510;e.afii57687=1511;e.afii57688=1512;e.afii57689=1513;e.afii57690=1514;e.afii57694=64298;e.afii57695=64299;e.afii57700=64331;e.afii57705=64287;e.afii57716=1520;e.afii57717=1521;e.afii57718=1522;e.afii57723=64309;e.afii57793=1460;e.afii57794=1461;e.afii57795=1462;e.afii57796=1467;e.afii57797=1464;e.afii57798=1463;e.afii57799=1456;e.afii57800=1458;e.afii57801=1457;e.afii57802=1459;e.afii57803=1474;e.afii57804=1473;e.afii57806=1465;e.afii57807=1468;e.afii57839=1469;e.afii57841=1471;e.afii57842=1472;e.afii57929=700;e.afii61248=8453;e.afii61289=8467;e.afii61352=8470;e.afii61573=8236;e.afii61574=8237;e.afii61575=8238;e.afii61664=8204;e.afii63167=1645;e.afii64937=701;e.agrave=224;e.agujarati=2693;e.agurmukhi=2565;e.ahiragana=12354;e.ahookabove=7843;e.aibengali=2448;e.aibopomofo=12574;e.aideva=2320;e.aiecyrillic=1237;e.aigujarati=2704;e.aigurmukhi=2576;e.aimatragurmukhi=2632;e.ainarabic=1593;e.ainfinalarabic=65226;e.aininitialarabic=65227;e.ainmedialarabic=65228;e.ainvertedbreve=515;e.aivowelsignbengali=2504;e.aivowelsigndeva=2376;e.aivowelsigngujarati=2760;e.akatakana=12450;e.akatakanahalfwidth=65393;e.akorean=12623;e.alef=1488;e.alefarabic=1575;e.alefdageshhebrew=64304;e.aleffinalarabic=65166;e.alefhamzaabovearabic=1571;e.alefhamzaabovefinalarabic=65156;e.alefhamzabelowarabic=1573;e.alefhamzabelowfinalarabic=65160;e.alefhebrew=1488;e.aleflamedhebrew=64335;e.alefmaddaabovearabic=1570;e.alefmaddaabovefinalarabic=65154;e.alefmaksuraarabic=1609;e.alefmaksurafinalarabic=65264;e.alefmaksurainitialarabic=65267;e.alefmaksuramedialarabic=65268;e.alefpatahhebrew=64302;e.alefqamatshebrew=64303;e.aleph=8501;e.allequal=8780;e.alpha=945;e.alphatonos=940;e.amacron=257;e.amonospace=65345;e.ampersand=38;e.ampersandmonospace=65286;e.ampersandsmall=63270;e.amsquare=13250;e.anbopomofo=12578;e.angbopomofo=12580;e.angbracketleft=12296;e.angbracketright=12297;e.angkhankhuthai=3674;e.angle=8736;e.anglebracketleft=12296;e.anglebracketleftvertical=65087;e.anglebracketright=12297;e.anglebracketrightvertical=65088;e.angleleft=9001;e.angleright=9002;e.angstrom=8491;e.anoteleia=903;e.anudattadeva=2386;e.anusvarabengali=2434;e.anusvaradeva=2306;e.anusvaragujarati=2690;e.aogonek=261;e.apaatosquare=13056;e.aparen=9372;e.apostrophearmenian=1370;e.apostrophemod=700;e.apple=63743;e.approaches=8784;e.approxequal=8776;e.approxequalorimage=8786;e.approximatelyequal=8773;e.araeaekorean=12686;e.araeakorean=12685;e.arc=8978;e.arighthalfring=7834;e.aring=229;e.aringacute=507;e.aringbelow=7681;e.arrowboth=8596;e.arrowdashdown=8675;e.arrowdashleft=8672;e.arrowdashright=8674;e.arrowdashup=8673;e.arrowdblboth=8660;e.arrowdbldown=8659;e.arrowdblleft=8656;e.arrowdblright=8658;e.arrowdblup=8657;e.arrowdown=8595;e.arrowdownleft=8601;e.arrowdownright=8600;e.arrowdownwhite=8681;e.arrowheaddownmod=709;e.arrowheadleftmod=706;e.arrowheadrightmod=707;e.arrowheadupmod=708;e.arrowhorizex=63719;e.arrowleft=8592;e.arrowleftdbl=8656;e.arrowleftdblstroke=8653;e.arrowleftoverright=8646;e.arrowleftwhite=8678;e.arrowright=8594;e.arrowrightdblstroke=8655;e.arrowrightheavy=10142;e.arrowrightoverleft=8644;e.arrowrightwhite=8680;e.arrowtableft=8676;e.arrowtabright=8677;e.arrowup=8593;e.arrowupdn=8597;e.arrowupdnbse=8616;e.arrowupdownbase=8616;e.arrowupleft=8598;e.arrowupleftofdown=8645;e.arrowupright=8599;e.arrowupwhite=8679;e.arrowvertex=63718;e.asciicircum=94;e.asciicircummonospace=65342;e.asciitilde=126;e.asciitildemonospace=65374;e.ascript=593;e.ascriptturned=594;e.asmallhiragana=12353;e.asmallkatakana=12449;e.asmallkatakanahalfwidth=65383;e.asterisk=42;e.asteriskaltonearabic=1645;e.asteriskarabic=1645;e.asteriskmath=8727;e.asteriskmonospace=65290;e.asterisksmall=65121;e.asterism=8258;e.asuperior=63209;e.asymptoticallyequal=8771;e.at=64;e.atilde=227;e.atmonospace=65312;e.atsmall=65131;e.aturned=592;e.aubengali=2452;e.aubopomofo=12576;e.audeva=2324;e.augujarati=2708;e.augurmukhi=2580;e.aulengthmarkbengali=2519;e.aumatragurmukhi=2636;e.auvowelsignbengali=2508;e.auvowelsigndeva=2380;e.auvowelsigngujarati=2764;e.avagrahadeva=2365;e.aybarmenian=1377;e.ayin=1506;e.ayinaltonehebrew=64288;e.ayinhebrew=1506;e.b=98;e.babengali=2476;e.backslash=92;e.backslashmonospace=65340;e.badeva=2348;e.bagujarati=2732;e.bagurmukhi=2604;e.bahiragana=12400;e.bahtthai=3647;e.bakatakana=12496;e.bar=124;e.barmonospace=65372;e.bbopomofo=12549;e.bcircle=9425;e.bdotaccent=7683;e.bdotbelow=7685;e.beamedsixteenthnotes=9836;e.because=8757;e.becyrillic=1073;e.beharabic=1576;e.behfinalarabic=65168;e.behinitialarabic=65169;e.behiragana=12409;e.behmedialarabic=65170;e.behmeeminitialarabic=64671;e.behmeemisolatedarabic=64520;e.behnoonfinalarabic=64621;e.bekatakana=12505;e.benarmenian=1378;e.bet=1489;e.beta=946;e.betasymbolgreek=976;e.betdagesh=64305;e.betdageshhebrew=64305;e.bethebrew=1489;e.betrafehebrew=64332;e.bhabengali=2477;e.bhadeva=2349;e.bhagujarati=2733;e.bhagurmukhi=2605;e.bhook=595;e.bihiragana=12403;e.bikatakana=12499;e.bilabialclick=664;e.bindigurmukhi=2562;e.birusquare=13105;e.blackcircle=9679;e.blackdiamond=9670;e.blackdownpointingtriangle=9660;e.blackleftpointingpointer=9668;e.blackleftpointingtriangle=9664;e.blacklenticularbracketleft=12304;e.blacklenticularbracketleftvertical=65083;e.blacklenticularbracketright=12305;e.blacklenticularbracketrightvertical=65084;e.blacklowerlefttriangle=9699;e.blacklowerrighttriangle=9698;e.blackrectangle=9644;e.blackrightpointingpointer=9658;e.blackrightpointingtriangle=9654;e.blacksmallsquare=9642;e.blacksmilingface=9787;e.blacksquare=9632;e.blackstar=9733;e.blackupperlefttriangle=9700;e.blackupperrighttriangle=9701;e.blackuppointingsmalltriangle=9652;e.blackuppointingtriangle=9650;e.blank=9251;e.blinebelow=7687;e.block=9608;e.bmonospace=65346;e.bobaimaithai=3610;e.bohiragana=12412;e.bokatakana=12508;e.bparen=9373;e.bqsquare=13251;e.braceex=63732;e.braceleft=123;e.braceleftbt=63731;e.braceleftmid=63730;e.braceleftmonospace=65371;e.braceleftsmall=65115;e.bracelefttp=63729;e.braceleftvertical=65079;e.braceright=125;e.bracerightbt=63742;e.bracerightmid=63741;e.bracerightmonospace=65373;e.bracerightsmall=65116;e.bracerighttp=63740;e.bracerightvertical=65080;e.bracketleft=91;e.bracketleftbt=63728;e.bracketleftex=63727;e.bracketleftmonospace=65339;e.bracketlefttp=63726;e.bracketright=93;e.bracketrightbt=63739;e.bracketrightex=63738;e.bracketrightmonospace=65341;e.bracketrighttp=63737;e.breve=728;e.brevebelowcmb=814;e.brevecmb=774;e.breveinvertedbelowcmb=815;e.breveinvertedcmb=785;e.breveinverteddoublecmb=865;e.bridgebelowcmb=810;e.bridgeinvertedbelowcmb=826;e.brokenbar=166;e.bstroke=384;e.bsuperior=63210;e.btopbar=387;e.buhiragana=12406;e.bukatakana=12502;e.bullet=8226;e.bulletinverse=9688;e.bulletoperator=8729;e.bullseye=9678;e.c=99;e.caarmenian=1390;e.cabengali=2458;e.cacute=263;e.cadeva=2330;e.cagujarati=2714;e.cagurmukhi=2586;e.calsquare=13192;e.candrabindubengali=2433;e.candrabinducmb=784;e.candrabindudeva=2305;e.candrabindugujarati=2689;e.capslock=8682;e.careof=8453;e.caron=711;e.caronbelowcmb=812;e.caroncmb=780;e.carriagereturn=8629;e.cbopomofo=12568;e.ccaron=269;e.ccedilla=231;e.ccedillaacute=7689;e.ccircle=9426;e.ccircumflex=265;e.ccurl=597;e.cdot=267;e.cdotaccent=267;e.cdsquare=13253;e.cedilla=184;e.cedillacmb=807;e.cent=162;e.centigrade=8451;e.centinferior=63199;e.centmonospace=65504;e.centoldstyle=63394;e.centsuperior=63200;e.chaarmenian=1401;e.chabengali=2459;e.chadeva=2331;e.chagujarati=2715;e.chagurmukhi=2587;e.chbopomofo=12564;e.cheabkhasiancyrillic=1213;e.checkmark=10003;e.checyrillic=1095;e.chedescenderabkhasiancyrillic=1215;e.chedescendercyrillic=1207;e.chedieresiscyrillic=1269;e.cheharmenian=1395;e.chekhakassiancyrillic=1228;e.cheverticalstrokecyrillic=1209;e.chi=967;e.chieuchacirclekorean=12919;e.chieuchaparenkorean=12823;e.chieuchcirclekorean=12905;e.chieuchkorean=12618;e.chieuchparenkorean=12809;e.chochangthai=3594;e.chochanthai=3592;e.chochingthai=3593;e.chochoethai=3596;e.chook=392;e.cieucacirclekorean=12918;e.cieucaparenkorean=12822;e.cieuccirclekorean=12904;e.cieuckorean=12616;e.cieucparenkorean=12808;e.cieucuparenkorean=12828;e.circle=9675;e.circlecopyrt=169;e.circlemultiply=8855;e.circleot=8857;e.circleplus=8853;e.circlepostalmark=12342;e.circlewithlefthalfblack=9680;e.circlewithrighthalfblack=9681;e.circumflex=710;e.circumflexbelowcmb=813;e.circumflexcmb=770;e.clear=8999;e.clickalveolar=450;e.clickdental=448;e.clicklateral=449;e.clickretroflex=451;e.club=9827;e.clubsuitblack=9827;e.clubsuitwhite=9831;e.cmcubedsquare=13220;e.cmonospace=65347;e.cmsquaredsquare=13216;e.coarmenian=1409;e.colon=58;e.colonmonetary=8353;e.colonmonospace=65306;e.colonsign=8353;e.colonsmall=65109;e.colontriangularhalfmod=721;e.colontriangularmod=720;e.comma=44;e.commaabovecmb=787;e.commaaboverightcmb=789;e.commaaccent=63171;e.commaarabic=1548;e.commaarmenian=1373;e.commainferior=63201;e.commamonospace=65292;e.commareversedabovecmb=788;e.commareversedmod=701;e.commasmall=65104;e.commasuperior=63202;e.commaturnedabovecmb=786;e.commaturnedmod=699;e.compass=9788;e.congruent=8773;e.contourintegral=8750;e.control=8963;e.controlACK=6;e.controlBEL=7;e.controlBS=8;e.controlCAN=24;e.controlCR=13;e.controlDC1=17;e.controlDC2=18;e.controlDC3=19;e.controlDC4=20;e.controlDEL=127;e.controlDLE=16;e.controlEM=25;e.controlENQ=5;e.controlEOT=4;e.controlESC=27;e.controlETB=23;e.controlETX=3;e.controlFF=12;e.controlFS=28;e.controlGS=29;e.controlHT=9;e.controlLF=10;e.controlNAK=21;e.controlNULL=0;e.controlRS=30;e.controlSI=15;e.controlSO=14;e.controlSOT=2;e.controlSTX=1;e.controlSUB=26;e.controlSYN=22;e.controlUS=31;e.controlVT=11;e.copyright=169;e.copyrightsans=63721;e.copyrightserif=63193;e.cornerbracketleft=12300;e.cornerbracketlefthalfwidth=65378;e.cornerbracketleftvertical=65089;e.cornerbracketright=12301;e.cornerbracketrighthalfwidth=65379;e.cornerbracketrightvertical=65090;e.corporationsquare=13183;e.cosquare=13255;e.coverkgsquare=13254;e.cparen=9374;e.cruzeiro=8354;e.cstretched=663;e.curlyand=8911;e.curlyor=8910;e.currency=164;e.cyrBreve=63185;e.cyrFlex=63186;e.cyrbreve=63188;e.cyrflex=63189;e.d=100;e.daarmenian=1380;e.dabengali=2470;e.dadarabic=1590;e.dadeva=2342;e.dadfinalarabic=65214;e.dadinitialarabic=65215;e.dadmedialarabic=65216;e.dagesh=1468;e.dageshhebrew=1468;e.dagger=8224;e.daggerdbl=8225;e.dagujarati=2726;e.dagurmukhi=2598;e.dahiragana=12384;e.dakatakana=12480;e.dalarabic=1583;e.dalet=1491;e.daletdagesh=64307;e.daletdageshhebrew=64307;e.dalethebrew=1491;e.dalfinalarabic=65194;e.dammaarabic=1615;e.dammalowarabic=1615;e.dammatanaltonearabic=1612;e.dammatanarabic=1612;e.danda=2404;e.dargahebrew=1447;e.dargalefthebrew=1447;e.dasiapneumatacyrilliccmb=1157;e.dblGrave=63187;e.dblanglebracketleft=12298;e.dblanglebracketleftvertical=65085;e.dblanglebracketright=12299;e.dblanglebracketrightvertical=65086;e.dblarchinvertedbelowcmb=811;e.dblarrowleft=8660;e.dblarrowright=8658;e.dbldanda=2405;e.dblgrave=63190;e.dblgravecmb=783;e.dblintegral=8748;e.dbllowline=8215;e.dbllowlinecmb=819;e.dbloverlinecmb=831;e.dblprimemod=698;e.dblverticalbar=8214;e.dblverticallineabovecmb=782;e.dbopomofo=12553;e.dbsquare=13256;e.dcaron=271;e.dcedilla=7697;e.dcircle=9427;e.dcircumflexbelow=7699;e.dcroat=273;e.ddabengali=2465;e.ddadeva=2337;e.ddagujarati=2721;e.ddagurmukhi=2593;e.ddalarabic=1672;e.ddalfinalarabic=64393;e.dddhadeva=2396;e.ddhabengali=2466;e.ddhadeva=2338;e.ddhagujarati=2722;e.ddhagurmukhi=2594;e.ddotaccent=7691;e.ddotbelow=7693;e.decimalseparatorarabic=1643;e.decimalseparatorpersian=1643;e.decyrillic=1076;e.degree=176;e.dehihebrew=1453;e.dehiragana=12391;e.deicoptic=1007;e.dekatakana=12487;e.deleteleft=9003;e.deleteright=8998;e.delta=948;e.deltaturned=397;e.denominatorminusonenumeratorbengali=2552;e.dezh=676;e.dhabengali=2471;e.dhadeva=2343;e.dhagujarati=2727;e.dhagurmukhi=2599;e.dhook=599;e.dialytikatonos=901;e.dialytikatonoscmb=836;e.diamond=9830;e.diamondsuitwhite=9826;e.dieresis=168;e.dieresisacute=63191;e.dieresisbelowcmb=804;e.dieresiscmb=776;e.dieresisgrave=63192;e.dieresistonos=901;e.dihiragana=12386;e.dikatakana=12482;e.dittomark=12291;e.divide=247;e.divides=8739;e.divisionslash=8725;e.djecyrillic=1106;e.dkshade=9619;e.dlinebelow=7695;e.dlsquare=13207;e.dmacron=273;e.dmonospace=65348;e.dnblock=9604;e.dochadathai=3598;e.dodekthai=3604;e.dohiragana=12393;e.dokatakana=12489;e.dollar=36;e.dollarinferior=63203;e.dollarmonospace=65284;e.dollaroldstyle=63268;e.dollarsmall=65129;e.dollarsuperior=63204;e.dong=8363;e.dorusquare=13094;e.dotaccent=729;e.dotaccentcmb=775;e.dotbelowcmb=803;e.dotbelowcomb=803;e.dotkatakana=12539;e.dotlessi=305;e.dotlessj=63166;e.dotlessjstrokehook=644;e.dotmath=8901;e.dottedcircle=9676;e.doubleyodpatah=64287;e.doubleyodpatahhebrew=64287;e.downtackbelowcmb=798;e.downtackmod=725;e.dparen=9375;e.dsuperior=63211;e.dtail=598;e.dtopbar=396;e.duhiragana=12389;e.dukatakana=12485;e.dz=499;e.dzaltone=675;e.dzcaron=454;e.dzcurl=677;e.dzeabkhasiancyrillic=1249;e.dzecyrillic=1109;e.dzhecyrillic=1119;e.e=101;e.eacute=233;e.earth=9793;e.ebengali=2447;e.ebopomofo=12572;e.ebreve=277;e.ecandradeva=2317;e.ecandragujarati=2701;e.ecandravowelsigndeva=2373;e.ecandravowelsigngujarati=2757;e.ecaron=283;e.ecedillabreve=7709;e.echarmenian=1381;e.echyiwnarmenian=1415;e.ecircle=9428;e.ecircumflex=234;e.ecircumflexacute=7871;e.ecircumflexbelow=7705;e.ecircumflexdotbelow=7879;e.ecircumflexgrave=7873;e.ecircumflexhookabove=7875;e.ecircumflextilde=7877;e.ecyrillic=1108;e.edblgrave=517;e.edeva=2319;e.edieresis=235;e.edot=279;e.edotaccent=279;e.edotbelow=7865;e.eegurmukhi=2575;e.eematragurmukhi=2631;e.efcyrillic=1092;e.egrave=232;e.egujarati=2703;e.eharmenian=1383;e.ehbopomofo=12573;e.ehiragana=12360;e.ehookabove=7867;e.eibopomofo=12575;e.eight=56;e.eightarabic=1640;e.eightbengali=2542;e.eightcircle=9319;e.eightcircleinversesansserif=10129;e.eightdeva=2414;e.eighteencircle=9329;e.eighteenparen=9349;e.eighteenperiod=9369;e.eightgujarati=2798;e.eightgurmukhi=2670;e.eighthackarabic=1640;e.eighthangzhou=12328;e.eighthnotebeamed=9835;e.eightideographicparen=12839;e.eightinferior=8328;e.eightmonospace=65304;e.eightoldstyle=63288;e.eightparen=9339;e.eightperiod=9359;e.eightpersian=1784;e.eightroman=8567;e.eightsuperior=8312;e.eightthai=3672;e.einvertedbreve=519;e.eiotifiedcyrillic=1125;e.ekatakana=12456;e.ekatakanahalfwidth=65396;e.ekonkargurmukhi=2676;e.ekorean=12628;e.elcyrillic=1083;e.element=8712;e.elevencircle=9322;e.elevenparen=9342;e.elevenperiod=9362;e.elevenroman=8570;e.ellipsis=8230;e.ellipsisvertical=8942;e.emacron=275;e.emacronacute=7703;e.emacrongrave=7701;e.emcyrillic=1084;e.emdash=8212;e.emdashvertical=65073;e.emonospace=65349;e.emphasismarkarmenian=1371;e.emptyset=8709;e.enbopomofo=12579;e.encyrillic=1085;e.endash=8211;e.endashvertical=65074;e.endescendercyrillic=1187;e.eng=331;e.engbopomofo=12581;e.enghecyrillic=1189;e.enhookcyrillic=1224;e.enspace=8194;e.eogonek=281;e.eokorean=12627;e.eopen=603;e.eopenclosed=666;e.eopenreversed=604;e.eopenreversedclosed=606;e.eopenreversedhook=605;e.eparen=9376;e.epsilon=949;e.epsilontonos=941;e.equal=61;e.equalmonospace=65309;e.equalsmall=65126;e.equalsuperior=8316;e.equivalence=8801;e.erbopomofo=12582;e.ercyrillic=1088;e.ereversed=600;e.ereversedcyrillic=1101;e.escyrillic=1089;e.esdescendercyrillic=1195;e.esh=643;e.eshcurl=646;e.eshortdeva=2318;e.eshortvowelsigndeva=2374;e.eshreversedloop=426;e.eshsquatreversed=645;e.esmallhiragana=12359;e.esmallkatakana=12455;e.esmallkatakanahalfwidth=65386;e.estimated=8494;e.esuperior=63212;e.eta=951;e.etarmenian=1384;e.etatonos=942;e.eth=240;e.etilde=7869;e.etildebelow=7707;e.etnahtafoukhhebrew=1425;e.etnahtafoukhlefthebrew=1425;e.etnahtahebrew=1425;e.etnahtalefthebrew=1425;e.eturned=477;e.eukorean=12641;e.euro=8364;e.evowelsignbengali=2503;e.evowelsigndeva=2375;e.evowelsigngujarati=2759;e.exclam=33;e.exclamarmenian=1372;e.exclamdbl=8252;e.exclamdown=161;e.exclamdownsmall=63393;e.exclammonospace=65281;e.exclamsmall=63265;e.existential=8707;e.ezh=658;e.ezhcaron=495;e.ezhcurl=659;e.ezhreversed=441;e.ezhtail=442;e.f=102;e.fadeva=2398;e.fagurmukhi=2654;e.fahrenheit=8457;e.fathaarabic=1614;e.fathalowarabic=1614;e.fathatanarabic=1611;e.fbopomofo=12552;e.fcircle=9429;e.fdotaccent=7711;e.feharabic=1601;e.feharmenian=1414;e.fehfinalarabic=65234;e.fehinitialarabic=65235;e.fehmedialarabic=65236;e.feicoptic=997;e.female=9792;e.ff=64256;e.f_f=64256;e.ffi=64259;e.f_f_i=64259;e.ffl=64260;e.f_f_l=64260;e.fi=64257;e.f_i=64257;e.fifteencircle=9326;e.fifteenparen=9346;e.fifteenperiod=9366;e.figuredash=8210;e.filledbox=9632;e.filledrect=9644;e.finalkaf=1498;e.finalkafdagesh=64314;e.finalkafdageshhebrew=64314;e.finalkafhebrew=1498;e.finalmem=1501;e.finalmemhebrew=1501;e.finalnun=1503;e.finalnunhebrew=1503;e.finalpe=1507;e.finalpehebrew=1507;e.finaltsadi=1509;e.finaltsadihebrew=1509;e.firsttonechinese=713;e.fisheye=9673;e.fitacyrillic=1139;e.five=53;e.fivearabic=1637;e.fivebengali=2539;e.fivecircle=9316;e.fivecircleinversesansserif=10126;e.fivedeva=2411;e.fiveeighths=8541;e.fivegujarati=2795;e.fivegurmukhi=2667;e.fivehackarabic=1637;e.fivehangzhou=12325;e.fiveideographicparen=12836;e.fiveinferior=8325;e.fivemonospace=65301;e.fiveoldstyle=63285;e.fiveparen=9336;e.fiveperiod=9356;e.fivepersian=1781;e.fiveroman=8564;e.fivesuperior=8309;e.fivethai=3669;e.fl=64258;e.f_l=64258;e.florin=402;e.fmonospace=65350;e.fmsquare=13209;e.fofanthai=3615;e.fofathai=3613;e.fongmanthai=3663;e.forall=8704;e.four=52;e.fourarabic=1636;e.fourbengali=2538;e.fourcircle=9315;e.fourcircleinversesansserif=10125;e.fourdeva=2410;e.fourgujarati=2794;e.fourgurmukhi=2666;e.fourhackarabic=1636;e.fourhangzhou=12324;e.fourideographicparen=12835;e.fourinferior=8324;e.fourmonospace=65300;e.fournumeratorbengali=2551;e.fouroldstyle=63284;e.fourparen=9335;e.fourperiod=9355;e.fourpersian=1780;e.fourroman=8563;e.foursuperior=8308;e.fourteencircle=9325;e.fourteenparen=9345;e.fourteenperiod=9365;e.fourthai=3668;e.fourthtonechinese=715;e.fparen=9377;e.fraction=8260;e.franc=8355;e.g=103;e.gabengali=2455;e.gacute=501;e.gadeva=2327;e.gafarabic=1711;e.gaffinalarabic=64403;e.gafinitialarabic=64404;e.gafmedialarabic=64405;e.gagujarati=2711;e.gagurmukhi=2583;e.gahiragana=12364;e.gakatakana=12460;e.gamma=947;e.gammalatinsmall=611;e.gammasuperior=736;e.gangiacoptic=1003;e.gbopomofo=12557;e.gbreve=287;e.gcaron=487;e.gcedilla=291;e.gcircle=9430;e.gcircumflex=285;e.gcommaaccent=291;e.gdot=289;e.gdotaccent=289;e.gecyrillic=1075;e.gehiragana=12370;e.gekatakana=12466;e.geometricallyequal=8785;e.gereshaccenthebrew=1436;e.gereshhebrew=1523;e.gereshmuqdamhebrew=1437;e.germandbls=223;e.gershayimaccenthebrew=1438;e.gershayimhebrew=1524;e.getamark=12307;e.ghabengali=2456;e.ghadarmenian=1394;e.ghadeva=2328;e.ghagujarati=2712;e.ghagurmukhi=2584;e.ghainarabic=1594;e.ghainfinalarabic=65230;e.ghaininitialarabic=65231;e.ghainmedialarabic=65232;e.ghemiddlehookcyrillic=1173;e.ghestrokecyrillic=1171;e.gheupturncyrillic=1169;e.ghhadeva=2394;e.ghhagurmukhi=2650;e.ghook=608;e.ghzsquare=13203;e.gihiragana=12366;e.gikatakana=12462;e.gimarmenian=1379;e.gimel=1490;e.gimeldagesh=64306;e.gimeldageshhebrew=64306;e.gimelhebrew=1490;e.gjecyrillic=1107;e.glottalinvertedstroke=446;e.glottalstop=660;e.glottalstopinverted=662;e.glottalstopmod=704;e.glottalstopreversed=661;e.glottalstopreversedmod=705;e.glottalstopreversedsuperior=740;e.glottalstopstroke=673;e.glottalstopstrokereversed=674;e.gmacron=7713;e.gmonospace=65351;e.gohiragana=12372;e.gokatakana=12468;e.gparen=9378;e.gpasquare=13228;e.gradient=8711;e.grave=96;e.gravebelowcmb=790;e.gravecmb=768;e.gravecomb=768;e.gravedeva=2387;e.gravelowmod=718;e.gravemonospace=65344;e.gravetonecmb=832;e.greater=62;e.greaterequal=8805;e.greaterequalorless=8923;e.greatermonospace=65310;e.greaterorequivalent=8819;e.greaterorless=8823;e.greateroverequal=8807;e.greatersmall=65125;e.gscript=609;e.gstroke=485;e.guhiragana=12368;e.guillemotleft=171;e.guillemotright=187;e.guilsinglleft=8249;e.guilsinglright=8250;e.gukatakana=12464;e.guramusquare=13080;e.gysquare=13257;e.h=104;e.haabkhasiancyrillic=1193;e.haaltonearabic=1729;e.habengali=2489;e.hadescendercyrillic=1203;e.hadeva=2361;e.hagujarati=2745;e.hagurmukhi=2617;e.haharabic=1581;e.hahfinalarabic=65186;e.hahinitialarabic=65187;e.hahiragana=12399;e.hahmedialarabic=65188;e.haitusquare=13098;e.hakatakana=12495;e.hakatakanahalfwidth=65418;e.halantgurmukhi=2637;e.hamzaarabic=1569;e.hamzalowarabic=1569;e.hangulfiller=12644;e.hardsigncyrillic=1098;e.harpoonleftbarbup=8636;e.harpoonrightbarbup=8640;e.hasquare=13258;e.hatafpatah=1458;e.hatafpatah16=1458;e.hatafpatah23=1458;e.hatafpatah2f=1458;e.hatafpatahhebrew=1458;e.hatafpatahnarrowhebrew=1458;e.hatafpatahquarterhebrew=1458;e.hatafpatahwidehebrew=1458;e.hatafqamats=1459;e.hatafqamats1b=1459;e.hatafqamats28=1459;e.hatafqamats34=1459;e.hatafqamatshebrew=1459;e.hatafqamatsnarrowhebrew=1459;e.hatafqamatsquarterhebrew=1459;e.hatafqamatswidehebrew=1459;e.hatafsegol=1457;e.hatafsegol17=1457;e.hatafsegol24=1457;e.hatafsegol30=1457;e.hatafsegolhebrew=1457;e.hatafsegolnarrowhebrew=1457;e.hatafsegolquarterhebrew=1457;e.hatafsegolwidehebrew=1457;e.hbar=295;e.hbopomofo=12559;e.hbrevebelow=7723;e.hcedilla=7721;e.hcircle=9431;e.hcircumflex=293;e.hdieresis=7719;e.hdotaccent=7715;e.hdotbelow=7717;e.he=1492;e.heart=9829;e.heartsuitblack=9829;e.heartsuitwhite=9825;e.hedagesh=64308;e.hedageshhebrew=64308;e.hehaltonearabic=1729;e.heharabic=1607;e.hehebrew=1492;e.hehfinalaltonearabic=64423;e.hehfinalalttwoarabic=65258;e.hehfinalarabic=65258;e.hehhamzaabovefinalarabic=64421;e.hehhamzaaboveisolatedarabic=64420;e.hehinitialaltonearabic=64424;e.hehinitialarabic=65259;e.hehiragana=12408;e.hehmedialaltonearabic=64425;e.hehmedialarabic=65260;e.heiseierasquare=13179;e.hekatakana=12504;e.hekatakanahalfwidth=65421;e.hekutaarusquare=13110;e.henghook=615;e.herutusquare=13113;e.het=1495;e.hethebrew=1495;e.hhook=614;e.hhooksuperior=689;e.hieuhacirclekorean=12923;e.hieuhaparenkorean=12827;e.hieuhcirclekorean=12909;e.hieuhkorean=12622;e.hieuhparenkorean=12813;e.hihiragana=12402;e.hikatakana=12498;e.hikatakanahalfwidth=65419;e.hiriq=1460;e.hiriq14=1460;e.hiriq21=1460;e.hiriq2d=1460;e.hiriqhebrew=1460;e.hiriqnarrowhebrew=1460;e.hiriqquarterhebrew=1460;e.hiriqwidehebrew=1460;e.hlinebelow=7830;e.hmonospace=65352;e.hoarmenian=1392;e.hohipthai=3627;e.hohiragana=12411;e.hokatakana=12507;e.hokatakanahalfwidth=65422;e.holam=1465;e.holam19=1465;e.holam26=1465;e.holam32=1465;e.holamhebrew=1465;e.holamnarrowhebrew=1465;e.holamquarterhebrew=1465;e.holamwidehebrew=1465;e.honokhukthai=3630;e.hookabovecomb=777;e.hookcmb=777;e.hookpalatalizedbelowcmb=801;e.hookretroflexbelowcmb=802;e.hoonsquare=13122;e.horicoptic=1001;e.horizontalbar=8213;e.horncmb=795;e.hotsprings=9832;e.house=8962;e.hparen=9379;e.hsuperior=688;e.hturned=613;e.huhiragana=12405;e.huiitosquare=13107;e.hukatakana=12501;e.hukatakanahalfwidth=65420;e.hungarumlaut=733;e.hungarumlautcmb=779;e.hv=405;e.hyphen=45;e.hypheninferior=63205;e.hyphenmonospace=65293;e.hyphensmall=65123;e.hyphensuperior=63206;e.hyphentwo=8208;e.i=105;e.iacute=237;e.iacyrillic=1103;e.ibengali=2439;e.ibopomofo=12583;e.ibreve=301;e.icaron=464;e.icircle=9432;e.icircumflex=238;e.icyrillic=1110;e.idblgrave=521;e.ideographearthcircle=12943;e.ideographfirecircle=12939;e.ideographicallianceparen=12863;e.ideographiccallparen=12858;e.ideographiccentrecircle=12965;e.ideographicclose=12294;e.ideographiccomma=12289;e.ideographiccommaleft=65380;e.ideographiccongratulationparen=12855;e.ideographiccorrectcircle=12963;e.ideographicearthparen=12847;e.ideographicenterpriseparen=12861;e.ideographicexcellentcircle=12957;e.ideographicfestivalparen=12864;e.ideographicfinancialcircle=12950;e.ideographicfinancialparen=12854;e.ideographicfireparen=12843;e.ideographichaveparen=12850;e.ideographichighcircle=12964;e.ideographiciterationmark=12293;e.ideographiclaborcircle=12952;e.ideographiclaborparen=12856;e.ideographicleftcircle=12967;e.ideographiclowcircle=12966;e.ideographicmedicinecircle=12969;e.ideographicmetalparen=12846;e.ideographicmoonparen=12842;e.ideographicnameparen=12852;e.ideographicperiod=12290;e.ideographicprintcircle=12958;e.ideographicreachparen=12867;e.ideographicrepresentparen=12857;e.ideographicresourceparen=12862;e.ideographicrightcircle=12968;e.ideographicsecretcircle=12953;e.ideographicselfparen=12866;e.ideographicsocietyparen=12851;e.ideographicspace=12288;e.ideographicspecialparen=12853;e.ideographicstockparen=12849;e.ideographicstudyparen=12859;e.ideographicsunparen=12848;e.ideographicsuperviseparen=12860;e.ideographicwaterparen=12844;e.ideographicwoodparen=12845;e.ideographiczero=12295;e.ideographmetalcircle=12942;e.ideographmooncircle=12938;e.ideographnamecircle=12948;e.ideographsuncircle=12944;e.ideographwatercircle=12940;e.ideographwoodcircle=12941;e.ideva=2311;e.idieresis=239;e.idieresisacute=7727;e.idieresiscyrillic=1253;e.idotbelow=7883;e.iebrevecyrillic=1239;e.iecyrillic=1077;e.ieungacirclekorean=12917;e.ieungaparenkorean=12821;e.ieungcirclekorean=12903;e.ieungkorean=12615;e.ieungparenkorean=12807;e.igrave=236;e.igujarati=2695;e.igurmukhi=2567;e.ihiragana=12356;e.ihookabove=7881;e.iibengali=2440;e.iicyrillic=1080;e.iideva=2312;e.iigujarati=2696;e.iigurmukhi=2568;e.iimatragurmukhi=2624;e.iinvertedbreve=523;e.iishortcyrillic=1081;e.iivowelsignbengali=2496;e.iivowelsigndeva=2368;e.iivowelsigngujarati=2752;e.ij=307;e.ikatakana=12452;e.ikatakanahalfwidth=65394;e.ikorean=12643;e.ilde=732;e.iluyhebrew=1452;e.imacron=299;e.imacroncyrillic=1251;e.imageorapproximatelyequal=8787;e.imatragurmukhi=2623;e.imonospace=65353;e.increment=8710;e.infinity=8734;e.iniarmenian=1387;e.integral=8747;e.integralbottom=8993;e.integralbt=8993;e.integralex=63733;e.integraltop=8992;e.integraltp=8992;e.intersection=8745;e.intisquare=13061;e.invbullet=9688;e.invcircle=9689;e.invsmileface=9787;e.iocyrillic=1105;e.iogonek=303;e.iota=953;e.iotadieresis=970;e.iotadieresistonos=912;e.iotalatin=617;e.iotatonos=943;e.iparen=9380;e.irigurmukhi=2674;e.ismallhiragana=12355;e.ismallkatakana=12451;e.ismallkatakanahalfwidth=65384;e.issharbengali=2554;e.istroke=616;e.isuperior=63213;e.iterationhiragana=12445;e.iterationkatakana=12541;e.itilde=297;e.itildebelow=7725;e.iubopomofo=12585;e.iucyrillic=1102;e.ivowelsignbengali=2495;e.ivowelsigndeva=2367;e.ivowelsigngujarati=2751;e.izhitsacyrillic=1141;e.izhitsadblgravecyrillic=1143;e.j=106;e.jaarmenian=1393;e.jabengali=2460;e.jadeva=2332;e.jagujarati=2716;e.jagurmukhi=2588;e.jbopomofo=12560;e.jcaron=496;e.jcircle=9433;e.jcircumflex=309;e.jcrossedtail=669;e.jdotlessstroke=607;e.jecyrillic=1112;e.jeemarabic=1580;e.jeemfinalarabic=65182;e.jeeminitialarabic=65183;e.jeemmedialarabic=65184;e.jeharabic=1688;e.jehfinalarabic=64395;e.jhabengali=2461;e.jhadeva=2333;e.jhagujarati=2717;e.jhagurmukhi=2589;e.jheharmenian=1403;e.jis=12292;e.jmonospace=65354;e.jparen=9381;e.jsuperior=690;e.k=107;e.kabashkircyrillic=1185;e.kabengali=2453;e.kacute=7729;e.kacyrillic=1082;e.kadescendercyrillic=1179;e.kadeva=2325;e.kaf=1499;e.kafarabic=1603;e.kafdagesh=64315;e.kafdageshhebrew=64315;e.kaffinalarabic=65242;e.kafhebrew=1499;e.kafinitialarabic=65243;e.kafmedialarabic=65244;e.kafrafehebrew=64333;e.kagujarati=2709;e.kagurmukhi=2581;e.kahiragana=12363;e.kahookcyrillic=1220;e.kakatakana=12459;e.kakatakanahalfwidth=65398;e.kappa=954;e.kappasymbolgreek=1008;e.kapyeounmieumkorean=12657;e.kapyeounphieuphkorean=12676;e.kapyeounpieupkorean=12664;e.kapyeounssangpieupkorean=12665;e.karoriisquare=13069;e.kashidaautoarabic=1600;e.kashidaautonosidebearingarabic=1600;e.kasmallkatakana=12533;e.kasquare=13188;e.kasraarabic=1616;e.kasratanarabic=1613;e.kastrokecyrillic=1183;e.katahiraprolongmarkhalfwidth=65392;e.kaverticalstrokecyrillic=1181;e.kbopomofo=12558;e.kcalsquare=13193;e.kcaron=489;e.kcedilla=311;e.kcircle=9434;e.kcommaaccent=311;e.kdotbelow=7731;e.keharmenian=1412;e.kehiragana=12369;e.kekatakana=12465;e.kekatakanahalfwidth=65401;e.kenarmenian=1391;e.kesmallkatakana=12534;e.kgreenlandic=312;e.khabengali=2454;e.khacyrillic=1093;e.khadeva=2326;e.khagujarati=2710;e.khagurmukhi=2582;e.khaharabic=1582;e.khahfinalarabic=65190;e.khahinitialarabic=65191;e.khahmedialarabic=65192;e.kheicoptic=999;e.khhadeva=2393;e.khhagurmukhi=2649;e.khieukhacirclekorean=12920;e.khieukhaparenkorean=12824;e.khieukhcirclekorean=12906;e.khieukhkorean=12619;e.khieukhparenkorean=12810;e.khokhaithai=3586;e.khokhonthai=3589;e.khokhuatthai=3587;e.khokhwaithai=3588;e.khomutthai=3675;e.khook=409;e.khorakhangthai=3590;e.khzsquare=13201;e.kihiragana=12365;e.kikatakana=12461;e.kikatakanahalfwidth=65399;e.kiroguramusquare=13077;e.kiromeetorusquare=13078;e.kirosquare=13076;e.kiyeokacirclekorean=12910;e.kiyeokaparenkorean=12814;e.kiyeokcirclekorean=12896;e.kiyeokkorean=12593;e.kiyeokparenkorean=12800;e.kiyeoksioskorean=12595;e.kjecyrillic=1116;e.klinebelow=7733;e.klsquare=13208;e.kmcubedsquare=13222;e.kmonospace=65355;e.kmsquaredsquare=13218;e.kohiragana=12371;e.kohmsquare=13248;e.kokaithai=3585;e.kokatakana=12467;e.kokatakanahalfwidth=65402;e.kooposquare=13086;e.koppacyrillic=1153;e.koreanstandardsymbol=12927;e.koroniscmb=835;e.kparen=9382;e.kpasquare=13226;e.ksicyrillic=1135;e.ktsquare=13263;e.kturned=670;e.kuhiragana=12367;e.kukatakana=12463;e.kukatakanahalfwidth=65400;e.kvsquare=13240;e.kwsquare=13246;e.l=108;e.labengali=2482;e.lacute=314;e.ladeva=2354;e.lagujarati=2738;e.lagurmukhi=2610;e.lakkhangyaothai=3653;e.lamaleffinalarabic=65276;e.lamalefhamzaabovefinalarabic=65272;e.lamalefhamzaaboveisolatedarabic=65271;e.lamalefhamzabelowfinalarabic=65274;e.lamalefhamzabelowisolatedarabic=65273;e.lamalefisolatedarabic=65275;e.lamalefmaddaabovefinalarabic=65270;e.lamalefmaddaaboveisolatedarabic=65269;e.lamarabic=1604;e.lambda=955;e.lambdastroke=411;e.lamed=1500;e.lameddagesh=64316;e.lameddageshhebrew=64316;e.lamedhebrew=1500;e.lamfinalarabic=65246;e.lamhahinitialarabic=64714;e.laminitialarabic=65247;e.lamjeeminitialarabic=64713;e.lamkhahinitialarabic=64715;e.lamlamhehisolatedarabic=65010;e.lammedialarabic=65248;e.lammeemhahinitialarabic=64904;e.lammeeminitialarabic=64716;e.largecircle=9711;e.lbar=410;e.lbelt=620;e.lbopomofo=12556;e.lcaron=318;e.lcedilla=316;e.lcircle=9435;e.lcircumflexbelow=7741;e.lcommaaccent=316;e.ldot=320;e.ldotaccent=320;e.ldotbelow=7735;e.ldotbelowmacron=7737;e.leftangleabovecmb=794;e.lefttackbelowcmb=792;e.less=60;e.lessequal=8804;e.lessequalorgreater=8922;e.lessmonospace=65308;e.lessorequivalent=8818;e.lessorgreater=8822;e.lessoverequal=8806;e.lesssmall=65124;e.lezh=622;e.lfblock=9612;e.lhookretroflex=621;e.lira=8356;e.liwnarmenian=1388;e.lj=457;e.ljecyrillic=1113;e.ll=63168;e.lladeva=2355;e.llagujarati=2739;e.llinebelow=7739;e.llladeva=2356;e.llvocalicbengali=2529;e.llvocalicdeva=2401;e.llvocalicvowelsignbengali=2531;e.llvocalicvowelsigndeva=2403;e.lmiddletilde=619;e.lmonospace=65356;e.lmsquare=13264;e.lochulathai=3628;e.logicaland=8743;e.logicalnot=172;e.logicalnotreversed=8976;e.logicalor=8744;e.lolingthai=3621;e.longs=383;e.lowlinecenterline=65102;e.lowlinecmb=818;e.lowlinedashed=65101;e.lozenge=9674;e.lparen=9383;e.lslash=322;e.lsquare=8467;e.lsuperior=63214;e.ltshade=9617;e.luthai=3622;e.lvocalicbengali=2444;e.lvocalicdeva=2316;e.lvocalicvowelsignbengali=2530;e.lvocalicvowelsigndeva=2402;e.lxsquare=13267;e.m=109;e.mabengali=2478;e.macron=175;e.macronbelowcmb=817;e.macroncmb=772;e.macronlowmod=717;e.macronmonospace=65507;e.macute=7743;e.madeva=2350;e.magujarati=2734;e.magurmukhi=2606;e.mahapakhhebrew=1444;e.mahapakhlefthebrew=1444;e.mahiragana=12414;e.maichattawalowleftthai=63637;e.maichattawalowrightthai=63636;e.maichattawathai=3659;e.maichattawaupperleftthai=63635;e.maieklowleftthai=63628;e.maieklowrightthai=63627;e.maiekthai=3656;e.maiekupperleftthai=63626;e.maihanakatleftthai=63620;e.maihanakatthai=3633;e.maitaikhuleftthai=63625;e.maitaikhuthai=3655;e.maitholowleftthai=63631;e.maitholowrightthai=63630;e.maithothai=3657;e.maithoupperleftthai=63629;e.maitrilowleftthai=63634;e.maitrilowrightthai=63633;e.maitrithai=3658;e.maitriupperleftthai=63632;e.maiyamokthai=3654;e.makatakana=12510;e.makatakanahalfwidth=65423;e.male=9794;e.mansyonsquare=13127;e.maqafhebrew=1470;e.mars=9794;e.masoracirclehebrew=1455;e.masquare=13187;e.mbopomofo=12551;e.mbsquare=13268;e.mcircle=9436;e.mcubedsquare=13221;e.mdotaccent=7745;e.mdotbelow=7747;e.meemarabic=1605;e.meemfinalarabic=65250;e.meeminitialarabic=65251;e.meemmedialarabic=65252;e.meemmeeminitialarabic=64721;e.meemmeemisolatedarabic=64584;e.meetorusquare=13133;e.mehiragana=12417;e.meizierasquare=13182;e.mekatakana=12513;e.mekatakanahalfwidth=65426;e.mem=1502;e.memdagesh=64318;e.memdageshhebrew=64318;e.memhebrew=1502;e.menarmenian=1396;e.merkhahebrew=1445;e.merkhakefulahebrew=1446;e.merkhakefulalefthebrew=1446;e.merkhalefthebrew=1445;e.mhook=625;e.mhzsquare=13202;e.middledotkatakanahalfwidth=65381;e.middot=183;e.mieumacirclekorean=12914;e.mieumaparenkorean=12818;e.mieumcirclekorean=12900;e.mieumkorean=12609;e.mieumpansioskorean=12656;e.mieumparenkorean=12804;e.mieumpieupkorean=12654;e.mieumsioskorean=12655;e.mihiragana=12415;e.mikatakana=12511;e.mikatakanahalfwidth=65424;e.minus=8722;e.minusbelowcmb=800;e.minuscircle=8854;e.minusmod=727;e.minusplus=8723;e.minute=8242;e.miribaarusquare=13130;e.mirisquare=13129;e.mlonglegturned=624;e.mlsquare=13206;e.mmcubedsquare=13219;e.mmonospace=65357;e.mmsquaredsquare=13215;e.mohiragana=12418;e.mohmsquare=13249;e.mokatakana=12514;e.mokatakanahalfwidth=65427;e.molsquare=13270;e.momathai=3617;e.moverssquare=13223;e.moverssquaredsquare=13224;e.mparen=9384;e.mpasquare=13227;e.mssquare=13235;e.msuperior=63215;e.mturned=623;e.mu=181;e.mu1=181;e.muasquare=13186;e.muchgreater=8811;e.muchless=8810;e.mufsquare=13196;e.mugreek=956;e.mugsquare=13197;e.muhiragana=12416;e.mukatakana=12512;e.mukatakanahalfwidth=65425;e.mulsquare=13205;e.multiply=215;e.mumsquare=13211;e.munahhebrew=1443;e.munahlefthebrew=1443;e.musicalnote=9834;e.musicalnotedbl=9835;e.musicflatsign=9837;e.musicsharpsign=9839;e.mussquare=13234;e.muvsquare=13238;e.muwsquare=13244;e.mvmegasquare=13241;e.mvsquare=13239;e.mwmegasquare=13247;e.mwsquare=13245;e.n=110;e.nabengali=2472;e.nabla=8711;e.nacute=324;e.nadeva=2344;e.nagujarati=2728;e.nagurmukhi=2600;e.nahiragana=12394;e.nakatakana=12490;e.nakatakanahalfwidth=65413;e.napostrophe=329;e.nasquare=13185;e.nbopomofo=12555;e.nbspace=160;e.ncaron=328;e.ncedilla=326;e.ncircle=9437;e.ncircumflexbelow=7755;e.ncommaaccent=326;e.ndotaccent=7749;e.ndotbelow=7751;e.nehiragana=12397;e.nekatakana=12493;e.nekatakanahalfwidth=65416;e.newsheqelsign=8362;e.nfsquare=13195;e.ngabengali=2457;e.ngadeva=2329;e.ngagujarati=2713;e.ngagurmukhi=2585;e.ngonguthai=3591;e.nhiragana=12435;e.nhookleft=626;e.nhookretroflex=627;e.nieunacirclekorean=12911;e.nieunaparenkorean=12815;e.nieuncieuckorean=12597;e.nieuncirclekorean=12897;e.nieunhieuhkorean=12598;e.nieunkorean=12596;e.nieunpansioskorean=12648;e.nieunparenkorean=12801;e.nieunsioskorean=12647;e.nieuntikeutkorean=12646;e.nihiragana=12395;e.nikatakana=12491;e.nikatakanahalfwidth=65414;e.nikhahitleftthai=63641;e.nikhahitthai=3661;e.nine=57;e.ninearabic=1641;e.ninebengali=2543;e.ninecircle=9320;e.ninecircleinversesansserif=10130;e.ninedeva=2415;e.ninegujarati=2799;e.ninegurmukhi=2671;e.ninehackarabic=1641;e.ninehangzhou=12329;e.nineideographicparen=12840;e.nineinferior=8329;e.ninemonospace=65305;e.nineoldstyle=63289;e.nineparen=9340;e.nineperiod=9360;e.ninepersian=1785;e.nineroman=8568;e.ninesuperior=8313;e.nineteencircle=9330;e.nineteenparen=9350;e.nineteenperiod=9370;e.ninethai=3673;e.nj=460;e.njecyrillic=1114;e.nkatakana=12531;e.nkatakanahalfwidth=65437;e.nlegrightlong=414;e.nlinebelow=7753;e.nmonospace=65358;e.nmsquare=13210;e.nnabengali=2467;e.nnadeva=2339;e.nnagujarati=2723;e.nnagurmukhi=2595;e.nnnadeva=2345;e.nohiragana=12398;e.nokatakana=12494;e.nokatakanahalfwidth=65417;e.nonbreakingspace=160;e.nonenthai=3603;e.nonuthai=3609;e.noonarabic=1606;e.noonfinalarabic=65254;e.noonghunnaarabic=1722;e.noonghunnafinalarabic=64415;e.nooninitialarabic=65255;e.noonjeeminitialarabic=64722;e.noonjeemisolatedarabic=64587;e.noonmedialarabic=65256;e.noonmeeminitialarabic=64725;e.noonmeemisolatedarabic=64590;e.noonnoonfinalarabic=64653;e.notcontains=8716;e.notelement=8713;e.notelementof=8713;e.notequal=8800;e.notgreater=8815;e.notgreaternorequal=8817;e.notgreaternorless=8825;e.notidentical=8802;e.notless=8814;e.notlessnorequal=8816;e.notparallel=8742;e.notprecedes=8832;e.notsubset=8836;e.notsucceeds=8833;e.notsuperset=8837;e.nowarmenian=1398;e.nparen=9385;e.nssquare=13233;e.nsuperior=8319;e.ntilde=241;e.nu=957;e.nuhiragana=12396;e.nukatakana=12492;e.nukatakanahalfwidth=65415;e.nuktabengali=2492;e.nuktadeva=2364;e.nuktagujarati=2748;e.nuktagurmukhi=2620;e.numbersign=35;e.numbersignmonospace=65283;e.numbersignsmall=65119;e.numeralsigngreek=884;e.numeralsignlowergreek=885;e.numero=8470;e.nun=1504;e.nundagesh=64320;e.nundageshhebrew=64320;e.nunhebrew=1504;e.nvsquare=13237;e.nwsquare=13243;e.nyabengali=2462;e.nyadeva=2334;e.nyagujarati=2718;e.nyagurmukhi=2590;e.o=111;e.oacute=243;e.oangthai=3629;e.obarred=629;e.obarredcyrillic=1257;e.obarreddieresiscyrillic=1259;e.obengali=2451;e.obopomofo=12571;e.obreve=335;e.ocandradeva=2321;e.ocandragujarati=2705;e.ocandravowelsigndeva=2377;e.ocandravowelsigngujarati=2761;e.ocaron=466;e.ocircle=9438;e.ocircumflex=244;e.ocircumflexacute=7889;e.ocircumflexdotbelow=7897;e.ocircumflexgrave=7891;e.ocircumflexhookabove=7893;e.ocircumflextilde=7895;e.ocyrillic=1086;e.odblacute=337;e.odblgrave=525;e.odeva=2323;e.odieresis=246;e.odieresiscyrillic=1255;e.odotbelow=7885;e.oe=339;e.oekorean=12634;e.ogonek=731;e.ogonekcmb=808;e.ograve=242;e.ogujarati=2707;e.oharmenian=1413;e.ohiragana=12362;e.ohookabove=7887;e.ohorn=417;e.ohornacute=7899;e.ohorndotbelow=7907;e.ohorngrave=7901;e.ohornhookabove=7903;e.ohorntilde=7905;e.ohungarumlaut=337;e.oi=419;e.oinvertedbreve=527;e.okatakana=12458;e.okatakanahalfwidth=65397;e.okorean=12631;e.olehebrew=1451;e.omacron=333;e.omacronacute=7763;e.omacrongrave=7761;e.omdeva=2384;e.omega=969;e.omega1=982;e.omegacyrillic=1121;e.omegalatinclosed=631;e.omegaroundcyrillic=1147;e.omegatitlocyrillic=1149;e.omegatonos=974;e.omgujarati=2768;e.omicron=959;e.omicrontonos=972;e.omonospace=65359;e.one=49;e.onearabic=1633;e.onebengali=2535;e.onecircle=9312;e.onecircleinversesansserif=10122;e.onedeva=2407;e.onedotenleader=8228;e.oneeighth=8539;e.onefitted=63196;e.onegujarati=2791;e.onegurmukhi=2663;e.onehackarabic=1633;e.onehalf=189;e.onehangzhou=12321;e.oneideographicparen=12832;e.oneinferior=8321;e.onemonospace=65297;e.onenumeratorbengali=2548;e.oneoldstyle=63281;e.oneparen=9332;e.oneperiod=9352;e.onepersian=1777;e.onequarter=188;e.oneroman=8560;e.onesuperior=185;e.onethai=3665;e.onethird=8531;e.oogonek=491;e.oogonekmacron=493;e.oogurmukhi=2579;e.oomatragurmukhi=2635;e.oopen=596;e.oparen=9386;e.openbullet=9702;e.option=8997;e.ordfeminine=170;e.ordmasculine=186;e.orthogonal=8735;e.oshortdeva=2322;e.oshortvowelsigndeva=2378;e.oslash=248;e.oslashacute=511;e.osmallhiragana=12361;e.osmallkatakana=12457;e.osmallkatakanahalfwidth=65387;e.ostrokeacute=511;e.osuperior=63216;e.otcyrillic=1151;e.otilde=245;e.otildeacute=7757;e.otildedieresis=7759;e.oubopomofo=12577;e.overline=8254;e.overlinecenterline=65098;e.overlinecmb=773;e.overlinedashed=65097;e.overlinedblwavy=65100;e.overlinewavy=65099;e.overscore=175;e.ovowelsignbengali=2507;e.ovowelsigndeva=2379;e.ovowelsigngujarati=2763;e.p=112;e.paampssquare=13184;e.paasentosquare=13099;e.pabengali=2474;e.pacute=7765;e.padeva=2346;e.pagedown=8671;e.pageup=8670;e.pagujarati=2730;e.pagurmukhi=2602;e.pahiragana=12401;e.paiyannoithai=3631;e.pakatakana=12497;e.palatalizationcyrilliccmb=1156;e.palochkacyrillic=1216;e.pansioskorean=12671;e.paragraph=182;e.parallel=8741;e.parenleft=40;e.parenleftaltonearabic=64830;e.parenleftbt=63725;e.parenleftex=63724;e.parenleftinferior=8333;e.parenleftmonospace=65288;e.parenleftsmall=65113;e.parenleftsuperior=8317;e.parenlefttp=63723;e.parenleftvertical=65077;e.parenright=41;e.parenrightaltonearabic=64831;e.parenrightbt=63736;e.parenrightex=63735;e.parenrightinferior=8334;e.parenrightmonospace=65289;e.parenrightsmall=65114;e.parenrightsuperior=8318;e.parenrighttp=63734;e.parenrightvertical=65078;e.partialdiff=8706;e.paseqhebrew=1472;e.pashtahebrew=1433;e.pasquare=13225;e.patah=1463;e.patah11=1463;e.patah1d=1463;e.patah2a=1463;e.patahhebrew=1463;e.patahnarrowhebrew=1463;e.patahquarterhebrew=1463;e.patahwidehebrew=1463;e.pazerhebrew=1441;e.pbopomofo=12550;e.pcircle=9439;e.pdotaccent=7767;e.pe=1508;e.pecyrillic=1087;e.pedagesh=64324;e.pedageshhebrew=64324;e.peezisquare=13115;e.pefinaldageshhebrew=64323;e.peharabic=1662;e.peharmenian=1402;e.pehebrew=1508;e.pehfinalarabic=64343;e.pehinitialarabic=64344;e.pehiragana=12410;e.pehmedialarabic=64345;e.pekatakana=12506;e.pemiddlehookcyrillic=1191;e.perafehebrew=64334;e.percent=37;e.percentarabic=1642;e.percentmonospace=65285;e.percentsmall=65130;e.period=46;e.periodarmenian=1417;e.periodcentered=183;e.periodhalfwidth=65377;e.periodinferior=63207;e.periodmonospace=65294;e.periodsmall=65106;e.periodsuperior=63208;e.perispomenigreekcmb=834;e.perpendicular=8869;e.perthousand=8240;e.peseta=8359;e.pfsquare=13194;e.phabengali=2475;e.phadeva=2347;e.phagujarati=2731;e.phagurmukhi=2603;e.phi=966;e.phi1=981;e.phieuphacirclekorean=12922;e.phieuphaparenkorean=12826;e.phieuphcirclekorean=12908;e.phieuphkorean=12621;e.phieuphparenkorean=12812;e.philatin=632;e.phinthuthai=3642;e.phisymbolgreek=981;e.phook=421;e.phophanthai=3614;e.phophungthai=3612;e.phosamphaothai=3616;e.pi=960;e.pieupacirclekorean=12915;e.pieupaparenkorean=12819;e.pieupcieuckorean=12662;e.pieupcirclekorean=12901;e.pieupkiyeokkorean=12658;e.pieupkorean=12610;e.pieupparenkorean=12805;e.pieupsioskiyeokkorean=12660;e.pieupsioskorean=12612;e.pieupsiostikeutkorean=12661;e.pieupthieuthkorean=12663;e.pieuptikeutkorean=12659;e.pihiragana=12404;e.pikatakana=12500;e.pisymbolgreek=982;e.piwrarmenian=1411;e.plus=43;e.plusbelowcmb=799;e.pluscircle=8853;e.plusminus=177;e.plusmod=726;e.plusmonospace=65291;e.plussmall=65122;e.plussuperior=8314;e.pmonospace=65360;e.pmsquare=13272;e.pohiragana=12413;e.pointingindexdownwhite=9759;e.pointingindexleftwhite=9756;e.pointingindexrightwhite=9758;e.pointingindexupwhite=9757;e.pokatakana=12509;e.poplathai=3611;e.postalmark=12306;e.postalmarkface=12320;e.pparen=9387;e.precedes=8826;e.prescription=8478;e.primemod=697;e.primereversed=8245;e.product=8719;e.projective=8965;e.prolongedkana=12540;e.propellor=8984;e.propersubset=8834;e.propersuperset=8835;e.proportion=8759;e.proportional=8733;e.psi=968;e.psicyrillic=1137;e.psilipneumatacyrilliccmb=1158;e.pssquare=13232;e.puhiragana=12407;e.pukatakana=12503;e.pvsquare=13236;e.pwsquare=13242;e.q=113;e.qadeva=2392;e.qadmahebrew=1448;e.qafarabic=1602;e.qaffinalarabic=65238;e.qafinitialarabic=65239;e.qafmedialarabic=65240;e.qamats=1464;e.qamats10=1464;e.qamats1a=1464;e.qamats1c=1464;e.qamats27=1464;e.qamats29=1464;e.qamats33=1464;e.qamatsde=1464;e.qamatshebrew=1464;e.qamatsnarrowhebrew=1464;e.qamatsqatanhebrew=1464;e.qamatsqatannarrowhebrew=1464;e.qamatsqatanquarterhebrew=1464;e.qamatsqatanwidehebrew=1464;e.qamatsquarterhebrew=1464;e.qamatswidehebrew=1464;e.qarneyparahebrew=1439;e.qbopomofo=12561;e.qcircle=9440;e.qhook=672;e.qmonospace=65361;e.qof=1511;e.qofdagesh=64327;e.qofdageshhebrew=64327;e.qofhebrew=1511;e.qparen=9388;e.quarternote=9833;e.qubuts=1467;e.qubuts18=1467;e.qubuts25=1467;e.qubuts31=1467;e.qubutshebrew=1467;e.qubutsnarrowhebrew=1467;e.qubutsquarterhebrew=1467;e.qubutswidehebrew=1467;e.question=63;e.questionarabic=1567;e.questionarmenian=1374;e.questiondown=191;e.questiondownsmall=63423;e.questiongreek=894;e.questionmonospace=65311;e.questionsmall=63295;e.quotedbl=34;e.quotedblbase=8222;e.quotedblleft=8220;e.quotedblmonospace=65282;e.quotedblprime=12318;e.quotedblprimereversed=12317;e.quotedblright=8221;e.quoteleft=8216;e.quoteleftreversed=8219;e.quotereversed=8219;e.quoteright=8217;e.quoterightn=329;e.quotesinglbase=8218;e.quotesingle=39;e.quotesinglemonospace=65287;e.r=114;e.raarmenian=1404;e.rabengali=2480;e.racute=341;e.radeva=2352;e.radical=8730;e.radicalex=63717;e.radoverssquare=13230;e.radoverssquaredsquare=13231;e.radsquare=13229;e.rafe=1471;e.rafehebrew=1471;e.ragujarati=2736;e.ragurmukhi=2608;e.rahiragana=12425;e.rakatakana=12521;e.rakatakanahalfwidth=65431;e.ralowerdiagonalbengali=2545;e.ramiddlediagonalbengali=2544;e.ramshorn=612;e.ratio=8758;e.rbopomofo=12566;e.rcaron=345;e.rcedilla=343;e.rcircle=9441;e.rcommaaccent=343;e.rdblgrave=529;e.rdotaccent=7769;e.rdotbelow=7771;e.rdotbelowmacron=7773;e.referencemark=8251;e.reflexsubset=8838;e.reflexsuperset=8839;e.registered=174;e.registersans=63720;e.registerserif=63194;e.reharabic=1585;e.reharmenian=1408;e.rehfinalarabic=65198;e.rehiragana=12428;e.rekatakana=12524;e.rekatakanahalfwidth=65434;e.resh=1512;e.reshdageshhebrew=64328;e.reshhebrew=1512;e.reversedtilde=8765;e.reviahebrew=1431;e.reviamugrashhebrew=1431;e.revlogicalnot=8976;e.rfishhook=638;e.rfishhookreversed=639;e.rhabengali=2525;e.rhadeva=2397;e.rho=961;e.rhook=637;e.rhookturned=635;e.rhookturnedsuperior=693;e.rhosymbolgreek=1009;e.rhotichookmod=734;e.rieulacirclekorean=12913;e.rieulaparenkorean=12817;e.rieulcirclekorean=12899;e.rieulhieuhkorean=12608;e.rieulkiyeokkorean=12602;e.rieulkiyeoksioskorean=12649;e.rieulkorean=12601;e.rieulmieumkorean=12603;e.rieulpansioskorean=12652;e.rieulparenkorean=12803;e.rieulphieuphkorean=12607;e.rieulpieupkorean=12604;e.rieulpieupsioskorean=12651;e.rieulsioskorean=12605;e.rieulthieuthkorean=12606;e.rieultikeutkorean=12650;e.rieulyeorinhieuhkorean=12653;e.rightangle=8735;e.righttackbelowcmb=793;e.righttriangle=8895;e.rihiragana=12426;e.rikatakana=12522;e.rikatakanahalfwidth=65432;e.ring=730;e.ringbelowcmb=805;e.ringcmb=778;e.ringhalfleft=703;e.ringhalfleftarmenian=1369;e.ringhalfleftbelowcmb=796;e.ringhalfleftcentered=723;e.ringhalfright=702;e.ringhalfrightbelowcmb=825;e.ringhalfrightcentered=722;e.rinvertedbreve=531;e.rittorusquare=13137;e.rlinebelow=7775;e.rlongleg=636;e.rlonglegturned=634;e.rmonospace=65362;e.rohiragana=12429;e.rokatakana=12525;e.rokatakanahalfwidth=65435;e.roruathai=3619;e.rparen=9389;e.rrabengali=2524;e.rradeva=2353;e.rragurmukhi=2652;e.rreharabic=1681;e.rrehfinalarabic=64397;e.rrvocalicbengali=2528;e.rrvocalicdeva=2400;e.rrvocalicgujarati=2784;e.rrvocalicvowelsignbengali=2500;e.rrvocalicvowelsigndeva=2372;e.rrvocalicvowelsigngujarati=2756;e.rsuperior=63217;e.rtblock=9616;e.rturned=633;e.rturnedsuperior=692;e.ruhiragana=12427;e.rukatakana=12523;e.rukatakanahalfwidth=65433;e.rupeemarkbengali=2546;e.rupeesignbengali=2547;e.rupiah=63197;e.ruthai=3620;e.rvocalicbengali=2443;e.rvocalicdeva=2315;e.rvocalicgujarati=2699;e.rvocalicvowelsignbengali=2499;e.rvocalicvowelsigndeva=2371;e.rvocalicvowelsigngujarati=2755;e.s=115;e.sabengali=2488;e.sacute=347;e.sacutedotaccent=7781;e.sadarabic=1589;e.sadeva=2360;e.sadfinalarabic=65210;e.sadinitialarabic=65211;e.sadmedialarabic=65212;e.sagujarati=2744;e.sagurmukhi=2616;e.sahiragana=12373;e.sakatakana=12469;e.sakatakanahalfwidth=65403;e.sallallahoualayhewasallamarabic=65018;e.samekh=1505;e.samekhdagesh=64321;e.samekhdageshhebrew=64321;e.samekhhebrew=1505;e.saraaathai=3634;e.saraaethai=3649;e.saraaimaimalaithai=3652;e.saraaimaimuanthai=3651;e.saraamthai=3635;e.saraathai=3632;e.saraethai=3648;e.saraiileftthai=63622;e.saraiithai=3637;e.saraileftthai=63621;e.saraithai=3636;e.saraothai=3650;e.saraueeleftthai=63624;e.saraueethai=3639;e.saraueleftthai=63623;e.sarauethai=3638;e.sarauthai=3640;e.sarauuthai=3641;e.sbopomofo=12569;e.scaron=353;e.scarondotaccent=7783;e.scedilla=351;e.schwa=601;e.schwacyrillic=1241;e.schwadieresiscyrillic=1243;e.schwahook=602;e.scircle=9442;e.scircumflex=349;e.scommaaccent=537;e.sdotaccent=7777;e.sdotbelow=7779;e.sdotbelowdotaccent=7785;e.seagullbelowcmb=828;e.second=8243;e.secondtonechinese=714;e.section=167;e.seenarabic=1587;e.seenfinalarabic=65202;e.seeninitialarabic=65203;e.seenmedialarabic=65204;e.segol=1462;e.segol13=1462;e.segol1f=1462;e.segol2c=1462;e.segolhebrew=1462;e.segolnarrowhebrew=1462;e.segolquarterhebrew=1462;e.segoltahebrew=1426;e.segolwidehebrew=1462;e.seharmenian=1405;e.sehiragana=12379;e.sekatakana=12475;e.sekatakanahalfwidth=65406;e.semicolon=59;e.semicolonarabic=1563;e.semicolonmonospace=65307;e.semicolonsmall=65108;e.semivoicedmarkkana=12444;e.semivoicedmarkkanahalfwidth=65439;e.sentisquare=13090;e.sentosquare=13091;e.seven=55;e.sevenarabic=1639;e.sevenbengali=2541;e.sevencircle=9318;e.sevencircleinversesansserif=10128;e.sevendeva=2413;e.seveneighths=8542;e.sevengujarati=2797;e.sevengurmukhi=2669;e.sevenhackarabic=1639;e.sevenhangzhou=12327;e.sevenideographicparen=12838;e.seveninferior=8327;e.sevenmonospace=65303;e.sevenoldstyle=63287;e.sevenparen=9338;e.sevenperiod=9358;e.sevenpersian=1783;e.sevenroman=8566;e.sevensuperior=8311;e.seventeencircle=9328;e.seventeenparen=9348;e.seventeenperiod=9368;e.seventhai=3671;e.sfthyphen=173;e.shaarmenian=1399;e.shabengali=2486;e.shacyrillic=1096;e.shaddaarabic=1617;e.shaddadammaarabic=64609;e.shaddadammatanarabic=64606;e.shaddafathaarabic=64608;e.shaddakasraarabic=64610;e.shaddakasratanarabic=64607;e.shade=9618;e.shadedark=9619;e.shadelight=9617;e.shademedium=9618;e.shadeva=2358;e.shagujarati=2742;e.shagurmukhi=2614;e.shalshelethebrew=1427;e.shbopomofo=12565;e.shchacyrillic=1097;e.sheenarabic=1588;e.sheenfinalarabic=65206;e.sheeninitialarabic=65207;e.sheenmedialarabic=65208;e.sheicoptic=995;e.sheqel=8362;e.sheqelhebrew=8362;e.sheva=1456;e.sheva115=1456;e.sheva15=1456;e.sheva22=1456;e.sheva2e=1456;e.shevahebrew=1456;e.shevanarrowhebrew=1456;e.shevaquarterhebrew=1456;e.shevawidehebrew=1456;e.shhacyrillic=1211;e.shimacoptic=1005;e.shin=1513;e.shindagesh=64329;e.shindageshhebrew=64329;e.shindageshshindot=64300;e.shindageshshindothebrew=64300;e.shindageshsindot=64301;e.shindageshsindothebrew=64301;e.shindothebrew=1473;e.shinhebrew=1513;e.shinshindot=64298;e.shinshindothebrew=64298;e.shinsindot=64299;e.shinsindothebrew=64299;e.shook=642;e.sigma=963;e.sigma1=962;e.sigmafinal=962;e.sigmalunatesymbolgreek=1010;e.sihiragana=12375;e.sikatakana=12471;e.sikatakanahalfwidth=65404;e.siluqhebrew=1469;e.siluqlefthebrew=1469;e.similar=8764;e.sindothebrew=1474;e.siosacirclekorean=12916;e.siosaparenkorean=12820;e.sioscieuckorean=12670;e.sioscirclekorean=12902;e.sioskiyeokkorean=12666;e.sioskorean=12613;e.siosnieunkorean=12667;e.siosparenkorean=12806;e.siospieupkorean=12669;e.siostikeutkorean=12668;e.six=54;e.sixarabic=1638;e.sixbengali=2540;e.sixcircle=9317;e.sixcircleinversesansserif=10127;e.sixdeva=2412;e.sixgujarati=2796;e.sixgurmukhi=2668;e.sixhackarabic=1638;e.sixhangzhou=12326;e.sixideographicparen=12837;e.sixinferior=8326;e.sixmonospace=65302;e.sixoldstyle=63286;e.sixparen=9337;e.sixperiod=9357;e.sixpersian=1782;e.sixroman=8565;e.sixsuperior=8310;e.sixteencircle=9327;e.sixteencurrencydenominatorbengali=2553;e.sixteenparen=9347;e.sixteenperiod=9367;e.sixthai=3670;e.slash=47;e.slashmonospace=65295;e.slong=383;e.slongdotaccent=7835;e.smileface=9786;e.smonospace=65363;e.sofpasuqhebrew=1475;e.softhyphen=173;e.softsigncyrillic=1100;e.sohiragana=12381;e.sokatakana=12477;e.sokatakanahalfwidth=65407;e.soliduslongoverlaycmb=824;e.solidusshortoverlaycmb=823;e.sorusithai=3625;e.sosalathai=3624;e.sosothai=3595;e.sosuathai=3626;e.space=32;e.spacehackarabic=32;e.spade=9824;e.spadesuitblack=9824;e.spadesuitwhite=9828;e.sparen=9390;e.squarebelowcmb=827;e.squarecc=13252;e.squarecm=13213;e.squarediagonalcrosshatchfill=9641;e.squarehorizontalfill=9636;e.squarekg=13199;e.squarekm=13214;e.squarekmcapital=13262;e.squareln=13265;e.squarelog=13266;e.squaremg=13198;e.squaremil=13269;e.squaremm=13212;e.squaremsquared=13217;e.squareorthogonalcrosshatchfill=9638;e.squareupperlefttolowerrightfill=9639;e.squareupperrighttolowerleftfill=9640;e.squareverticalfill=9637;e.squarewhitewithsmallblack=9635;e.srsquare=13275;e.ssabengali=2487;e.ssadeva=2359;e.ssagujarati=2743;e.ssangcieuckorean=12617;e.ssanghieuhkorean=12677;e.ssangieungkorean=12672;e.ssangkiyeokkorean=12594;e.ssangnieunkorean=12645;e.ssangpieupkorean=12611;e.ssangsioskorean=12614;e.ssangtikeutkorean=12600;e.ssuperior=63218;e.sterling=163;e.sterlingmonospace=65505;e.strokelongoverlaycmb=822;e.strokeshortoverlaycmb=821;e.subset=8834;e.subsetnotequal=8842;e.subsetorequal=8838;e.succeeds=8827;e.suchthat=8715;e.suhiragana=12377;e.sukatakana=12473;e.sukatakanahalfwidth=65405;e.sukunarabic=1618;e.summation=8721;e.sun=9788;e.superset=8835;e.supersetnotequal=8843;e.supersetorequal=8839;e.svsquare=13276;e.syouwaerasquare=13180;e.t=116;e.tabengali=2468;e.tackdown=8868;e.tackleft=8867;e.tadeva=2340;e.tagujarati=2724;e.tagurmukhi=2596;e.taharabic=1591;e.tahfinalarabic=65218;e.tahinitialarabic=65219;e.tahiragana=12383;e.tahmedialarabic=65220;e.taisyouerasquare=13181;e.takatakana=12479;e.takatakanahalfwidth=65408;e.tatweelarabic=1600;e.tau=964;e.tav=1514;e.tavdages=64330;e.tavdagesh=64330;e.tavdageshhebrew=64330;e.tavhebrew=1514;e.tbar=359;e.tbopomofo=12554;e.tcaron=357;e.tccurl=680;e.tcedilla=355;e.tcheharabic=1670;e.tchehfinalarabic=64379;e.tchehinitialarabic=64380;e.tchehmedialarabic=64381;e.tcircle=9443;e.tcircumflexbelow=7793;e.tcommaaccent=355;e.tdieresis=7831;e.tdotaccent=7787;e.tdotbelow=7789;e.tecyrillic=1090;e.tedescendercyrillic=1197;e.teharabic=1578;e.tehfinalarabic=65174;e.tehhahinitialarabic=64674;e.tehhahisolatedarabic=64524;e.tehinitialarabic=65175;e.tehiragana=12390;e.tehjeeminitialarabic=64673;e.tehjeemisolatedarabic=64523;e.tehmarbutaarabic=1577;e.tehmarbutafinalarabic=65172;e.tehmedialarabic=65176;e.tehmeeminitialarabic=64676;e.tehmeemisolatedarabic=64526;e.tehnoonfinalarabic=64627;e.tekatakana=12486;e.tekatakanahalfwidth=65411;e.telephone=8481;e.telephoneblack=9742;e.telishagedolahebrew=1440;e.telishaqetanahebrew=1449;e.tencircle=9321;e.tenideographicparen=12841;e.tenparen=9341;e.tenperiod=9361;e.tenroman=8569;e.tesh=679;e.tet=1496;e.tetdagesh=64312;e.tetdageshhebrew=64312;e.tethebrew=1496;e.tetsecyrillic=1205;e.tevirhebrew=1435;e.tevirlefthebrew=1435;e.thabengali=2469;e.thadeva=2341;e.thagujarati=2725;e.thagurmukhi=2597;e.thalarabic=1584;e.thalfinalarabic=65196;e.thanthakhatlowleftthai=63640;e.thanthakhatlowrightthai=63639;e.thanthakhatthai=3660;e.thanthakhatupperleftthai=63638;e.theharabic=1579;e.thehfinalarabic=65178;e.thehinitialarabic=65179;e.thehmedialarabic=65180;e.thereexists=8707;e.therefore=8756;e.theta=952;e.theta1=977;e.thetasymbolgreek=977;e.thieuthacirclekorean=12921;e.thieuthaparenkorean=12825;e.thieuthcirclekorean=12907;e.thieuthkorean=12620;e.thieuthparenkorean=12811;e.thirteencircle=9324;e.thirteenparen=9344;e.thirteenperiod=9364;e.thonangmonthothai=3601;e.thook=429;e.thophuthaothai=3602;e.thorn=254;e.thothahanthai=3607;e.thothanthai=3600;e.thothongthai=3608;e.thothungthai=3606;e.thousandcyrillic=1154;e.thousandsseparatorarabic=1644;e.thousandsseparatorpersian=1644;e.three=51;e.threearabic=1635;e.threebengali=2537;e.threecircle=9314;e.threecircleinversesansserif=10124;e.threedeva=2409;e.threeeighths=8540;e.threegujarati=2793;e.threegurmukhi=2665;e.threehackarabic=1635;e.threehangzhou=12323;e.threeideographicparen=12834;e.threeinferior=8323;e.threemonospace=65299;e.threenumeratorbengali=2550;e.threeoldstyle=63283;e.threeparen=9334;e.threeperiod=9354;e.threepersian=1779;e.threequarters=190;e.threequartersemdash=63198;e.threeroman=8562;e.threesuperior=179;e.threethai=3667;e.thzsquare=13204;e.tihiragana=12385;e.tikatakana=12481;e.tikatakanahalfwidth=65409;e.tikeutacirclekorean=12912;e.tikeutaparenkorean=12816;e.tikeutcirclekorean=12898;e.tikeutkorean=12599;e.tikeutparenkorean=12802;e.tilde=732;e.tildebelowcmb=816;e.tildecmb=771;e.tildecomb=771;e.tildedoublecmb=864;e.tildeoperator=8764;e.tildeoverlaycmb=820;e.tildeverticalcmb=830;e.timescircle=8855;e.tipehahebrew=1430;e.tipehalefthebrew=1430;e.tippigurmukhi=2672;e.titlocyrilliccmb=1155;e.tiwnarmenian=1407;e.tlinebelow=7791;e.tmonospace=65364;e.toarmenian=1385;e.tohiragana=12392;e.tokatakana=12488;e.tokatakanahalfwidth=65412;e.tonebarextrahighmod=741;e.tonebarextralowmod=745;e.tonebarhighmod=742;e.tonebarlowmod=744;e.tonebarmidmod=743;e.tonefive=445;e.tonesix=389;e.tonetwo=424;e.tonos=900;e.tonsquare=13095;e.topatakthai=3599;e.tortoiseshellbracketleft=12308;e.tortoiseshellbracketleftsmall=65117;e.tortoiseshellbracketleftvertical=65081;e.tortoiseshellbracketright=12309;e.tortoiseshellbracketrightsmall=65118;e.tortoiseshellbracketrightvertical=65082;e.totaothai=3605;e.tpalatalhook=427;e.tparen=9391;e.trademark=8482;e.trademarksans=63722;e.trademarkserif=63195;e.tretroflexhook=648;e.triagdn=9660;e.triaglf=9668;e.triagrt=9658;e.triagup=9650;e.ts=678;e.tsadi=1510;e.tsadidagesh=64326;e.tsadidageshhebrew=64326;e.tsadihebrew=1510;e.tsecyrillic=1094;e.tsere=1461;e.tsere12=1461;e.tsere1e=1461;e.tsere2b=1461;e.tserehebrew=1461;e.tserenarrowhebrew=1461;e.tserequarterhebrew=1461;e.tserewidehebrew=1461;e.tshecyrillic=1115;e.tsuperior=63219;e.ttabengali=2463;e.ttadeva=2335;e.ttagujarati=2719;e.ttagurmukhi=2591;e.tteharabic=1657;e.ttehfinalarabic=64359;e.ttehinitialarabic=64360;e.ttehmedialarabic=64361;e.tthabengali=2464;e.tthadeva=2336;e.tthagujarati=2720;e.tthagurmukhi=2592;e.tturned=647;e.tuhiragana=12388;e.tukatakana=12484;e.tukatakanahalfwidth=65410;e.tusmallhiragana=12387;e.tusmallkatakana=12483;e.tusmallkatakanahalfwidth=65391;e.twelvecircle=9323;e.twelveparen=9343;e.twelveperiod=9363;e.twelveroman=8571;e.twentycircle=9331;e.twentyhangzhou=21316;e.twentyparen=9351;e.twentyperiod=9371;e.two=50;e.twoarabic=1634;e.twobengali=2536;e.twocircle=9313;e.twocircleinversesansserif=10123;e.twodeva=2408;e.twodotenleader=8229;e.twodotleader=8229;e.twodotleadervertical=65072;e.twogujarati=2792;e.twogurmukhi=2664;e.twohackarabic=1634;e.twohangzhou=12322;e.twoideographicparen=12833;e.twoinferior=8322;e.twomonospace=65298;e.twonumeratorbengali=2549;e.twooldstyle=63282;e.twoparen=9333;e.twoperiod=9353;e.twopersian=1778;e.tworoman=8561;e.twostroke=443;e.twosuperior=178;e.twothai=3666;e.twothirds=8532;e.u=117;e.uacute=250;e.ubar=649;e.ubengali=2441;e.ubopomofo=12584;e.ubreve=365;e.ucaron=468;e.ucircle=9444;e.ucircumflex=251;e.ucircumflexbelow=7799;e.ucyrillic=1091;e.udattadeva=2385;e.udblacute=369;e.udblgrave=533;e.udeva=2313;e.udieresis=252;e.udieresisacute=472;e.udieresisbelow=7795;e.udieresiscaron=474;e.udieresiscyrillic=1265;e.udieresisgrave=476;e.udieresismacron=470;e.udotbelow=7909;e.ugrave=249;e.ugujarati=2697;e.ugurmukhi=2569;e.uhiragana=12358;e.uhookabove=7911;e.uhorn=432;e.uhornacute=7913;e.uhorndotbelow=7921;e.uhorngrave=7915;e.uhornhookabove=7917;e.uhorntilde=7919;e.uhungarumlaut=369;e.uhungarumlautcyrillic=1267;e.uinvertedbreve=535;e.ukatakana=12454;e.ukatakanahalfwidth=65395;e.ukcyrillic=1145;e.ukorean=12636;e.umacron=363;e.umacroncyrillic=1263;e.umacrondieresis=7803;e.umatragurmukhi=2625;e.umonospace=65365;e.underscore=95;e.underscoredbl=8215;e.underscoremonospace=65343;e.underscorevertical=65075;e.underscorewavy=65103;e.union=8746;e.universal=8704;e.uogonek=371;e.uparen=9392;e.upblock=9600;e.upperdothebrew=1476;e.upsilon=965;e.upsilondieresis=971;e.upsilondieresistonos=944;e.upsilonlatin=650;e.upsilontonos=973;e.uptackbelowcmb=797;e.uptackmod=724;e.uragurmukhi=2675;e.uring=367;e.ushortcyrillic=1118;e.usmallhiragana=12357;e.usmallkatakana=12453;e.usmallkatakanahalfwidth=65385;e.ustraightcyrillic=1199;e.ustraightstrokecyrillic=1201;e.utilde=361;e.utildeacute=7801;e.utildebelow=7797;e.uubengali=2442;e.uudeva=2314;e.uugujarati=2698;e.uugurmukhi=2570;e.uumatragurmukhi=2626;e.uuvowelsignbengali=2498;e.uuvowelsigndeva=2370;e.uuvowelsigngujarati=2754;e.uvowelsignbengali=2497;e.uvowelsigndeva=2369;e.uvowelsigngujarati=2753;e.v=118;e.vadeva=2357;e.vagujarati=2741;e.vagurmukhi=2613;e.vakatakana=12535;e.vav=1493;e.vavdagesh=64309;e.vavdagesh65=64309;e.vavdageshhebrew=64309;e.vavhebrew=1493;e.vavholam=64331;e.vavholamhebrew=64331;e.vavvavhebrew=1520;e.vavyodhebrew=1521;e.vcircle=9445;e.vdotbelow=7807;e.vecyrillic=1074;e.veharabic=1700;e.vehfinalarabic=64363;e.vehinitialarabic=64364;e.vehmedialarabic=64365;e.vekatakana=12537;e.venus=9792;e.verticalbar=124;e.verticallineabovecmb=781;e.verticallinebelowcmb=809;e.verticallinelowmod=716;e.verticallinemod=712;e.vewarmenian=1406;e.vhook=651;e.vikatakana=12536;e.viramabengali=2509;e.viramadeva=2381;e.viramagujarati=2765;e.visargabengali=2435;e.visargadeva=2307;e.visargagujarati=2691;e.vmonospace=65366;e.voarmenian=1400;e.voicediterationhiragana=12446;e.voicediterationkatakana=12542;e.voicedmarkkana=12443;e.voicedmarkkanahalfwidth=65438;e.vokatakana=12538;e.vparen=9393;e.vtilde=7805;e.vturned=652;e.vuhiragana=12436;e.vukatakana=12532;e.w=119;e.wacute=7811;e.waekorean=12633;e.wahiragana=12431;e.wakatakana=12527;e.wakatakanahalfwidth=65436;e.wakorean=12632;e.wasmallhiragana=12430;e.wasmallkatakana=12526;e.wattosquare=13143;e.wavedash=12316;e.wavyunderscorevertical=65076;e.wawarabic=1608;e.wawfinalarabic=65262;e.wawhamzaabovearabic=1572;e.wawhamzaabovefinalarabic=65158;e.wbsquare=13277;e.wcircle=9446;e.wcircumflex=373;e.wdieresis=7813;e.wdotaccent=7815;e.wdotbelow=7817;e.wehiragana=12433;e.weierstrass=8472;e.wekatakana=12529;e.wekorean=12638;e.weokorean=12637;e.wgrave=7809;e.whitebullet=9702;e.whitecircle=9675;e.whitecircleinverse=9689;e.whitecornerbracketleft=12302;e.whitecornerbracketleftvertical=65091;e.whitecornerbracketright=12303;e.whitecornerbracketrightvertical=65092;e.whitediamond=9671;e.whitediamondcontainingblacksmalldiamond=9672;e.whitedownpointingsmalltriangle=9663;e.whitedownpointingtriangle=9661;e.whiteleftpointingsmalltriangle=9667;e.whiteleftpointingtriangle=9665;e.whitelenticularbracketleft=12310;e.whitelenticularbracketright=12311;e.whiterightpointingsmalltriangle=9657;e.whiterightpointingtriangle=9655;e.whitesmallsquare=9643;e.whitesmilingface=9786;e.whitesquare=9633;e.whitestar=9734;e.whitetelephone=9743;e.whitetortoiseshellbracketleft=12312;e.whitetortoiseshellbracketright=12313;e.whiteuppointingsmalltriangle=9653;e.whiteuppointingtriangle=9651;e.wihiragana=12432;e.wikatakana=12528;e.wikorean=12639;e.wmonospace=65367;e.wohiragana=12434;e.wokatakana=12530;e.wokatakanahalfwidth=65382;e.won=8361;e.wonmonospace=65510;e.wowaenthai=3623;e.wparen=9394;e.wring=7832;e.wsuperior=695;e.wturned=653;e.wynn=447;e.x=120;e.xabovecmb=829;e.xbopomofo=12562;e.xcircle=9447;e.xdieresis=7821;e.xdotaccent=7819;e.xeharmenian=1389;e.xi=958;e.xmonospace=65368;e.xparen=9395;e.xsuperior=739;e.y=121;e.yaadosquare=13134;e.yabengali=2479;e.yacute=253;e.yadeva=2351;e.yaekorean=12626;e.yagujarati=2735;e.yagurmukhi=2607;e.yahiragana=12420;e.yakatakana=12516;e.yakatakanahalfwidth=65428;e.yakorean=12625;e.yamakkanthai=3662;e.yasmallhiragana=12419;e.yasmallkatakana=12515;e.yasmallkatakanahalfwidth=65388;e.yatcyrillic=1123;e.ycircle=9448;e.ycircumflex=375;e.ydieresis=255;e.ydotaccent=7823;e.ydotbelow=7925;e.yeharabic=1610;e.yehbarreearabic=1746;e.yehbarreefinalarabic=64431;e.yehfinalarabic=65266;e.yehhamzaabovearabic=1574;e.yehhamzaabovefinalarabic=65162;e.yehhamzaaboveinitialarabic=65163;e.yehhamzaabovemedialarabic=65164;e.yehinitialarabic=65267;e.yehmedialarabic=65268;e.yehmeeminitialarabic=64733;e.yehmeemisolatedarabic=64600;e.yehnoonfinalarabic=64660;e.yehthreedotsbelowarabic=1745;e.yekorean=12630;e.yen=165;e.yenmonospace=65509;e.yeokorean=12629;e.yeorinhieuhkorean=12678;e.yerahbenyomohebrew=1450;e.yerahbenyomolefthebrew=1450;e.yericyrillic=1099;e.yerudieresiscyrillic=1273;e.yesieungkorean=12673;e.yesieungpansioskorean=12675;e.yesieungsioskorean=12674;e.yetivhebrew=1434;e.ygrave=7923;e.yhook=436;e.yhookabove=7927;e.yiarmenian=1397;e.yicyrillic=1111;e.yikorean=12642;e.yinyang=9775;e.yiwnarmenian=1410;e.ymonospace=65369;e.yod=1497;e.yoddagesh=64313;e.yoddageshhebrew=64313;e.yodhebrew=1497;e.yodyodhebrew=1522;e.yodyodpatahhebrew=64287;e.yohiragana=12424;e.yoikorean=12681;e.yokatakana=12520;e.yokatakanahalfwidth=65430;e.yokorean=12635;e.yosmallhiragana=12423;e.yosmallkatakana=12519;e.yosmallkatakanahalfwidth=65390;e.yotgreek=1011;e.yoyaekorean=12680;e.yoyakorean=12679;e.yoyakthai=3618;e.yoyingthai=3597;e.yparen=9396;e.ypogegrammeni=890;e.ypogegrammenigreekcmb=837;e.yr=422;e.yring=7833;e.ysuperior=696;e.ytilde=7929;e.yturned=654;e.yuhiragana=12422;e.yuikorean=12684;e.yukatakana=12518;e.yukatakanahalfwidth=65429;e.yukorean=12640;e.yusbigcyrillic=1131;e.yusbigiotifiedcyrillic=1133;e.yuslittlecyrillic=1127;e.yuslittleiotifiedcyrillic=1129;e.yusmallhiragana=12421;e.yusmallkatakana=12517;e.yusmallkatakanahalfwidth=65389;e.yuyekorean=12683;e.yuyeokorean=12682;e.yyabengali=2527;e.yyadeva=2399;e.z=122;e.zaarmenian=1382;e.zacute=378;e.zadeva=2395;e.zagurmukhi=2651;e.zaharabic=1592;e.zahfinalarabic=65222;e.zahinitialarabic=65223;e.zahiragana=12374;e.zahmedialarabic=65224;e.zainarabic=1586;e.zainfinalarabic=65200;e.zakatakana=12470;e.zaqefgadolhebrew=1429;e.zaqefqatanhebrew=1428;e.zarqahebrew=1432;e.zayin=1494;e.zayindagesh=64310;e.zayindageshhebrew=64310;e.zayinhebrew=1494;e.zbopomofo=12567;e.zcaron=382;e.zcircle=9449;e.zcircumflex=7825;e.zcurl=657;e.zdot=380;e.zdotaccent=380;e.zdotbelow=7827;e.zecyrillic=1079;e.zedescendercyrillic=1177;e.zedieresiscyrillic=1247;e.zehiragana=12380;e.zekatakana=12476;e.zero=48;e.zeroarabic=1632;e.zerobengali=2534;e.zerodeva=2406;e.zerogujarati=2790;e.zerogurmukhi=2662;e.zerohackarabic=1632;e.zeroinferior=8320;e.zeromonospace=65296;e.zerooldstyle=63280;e.zeropersian=1776;e.zerosuperior=8304;e.zerothai=3664;e.zerowidthjoiner=65279;e.zerowidthnonjoiner=8204;e.zerowidthspace=8203;e.zeta=950;e.zhbopomofo=12563;e.zhearmenian=1386;e.zhebrevecyrillic=1218;e.zhecyrillic=1078;e.zhedescendercyrillic=1175;e.zhedieresiscyrillic=1245;e.zihiragana=12376;e.zikatakana=12472;e.zinorhebrew=1454;e.zlinebelow=7829;e.zmonospace=65370;e.zohiragana=12382;e.zokatakana=12478;e.zparen=9397;e.zretroflexhook=656;e.zstroke=438;e.zuhiragana=12378;e.zukatakana=12474;e[".notdef"]=0;e.angbracketleftbig=9001;e.angbracketleftBig=9001;e.angbracketleftbigg=9001;e.angbracketleftBigg=9001;e.angbracketrightBig=9002;e.angbracketrightbig=9002;e.angbracketrightBigg=9002;e.angbracketrightbigg=9002;e.arrowhookleft=8618;e.arrowhookright=8617;e.arrowlefttophalf=8636;e.arrowleftbothalf=8637;e.arrownortheast=8599;e.arrownorthwest=8598;e.arrowrighttophalf=8640;e.arrowrightbothalf=8641;e.arrowsoutheast=8600;e.arrowsouthwest=8601;e.backslashbig=8726;e.backslashBig=8726;e.backslashBigg=8726;e.backslashbigg=8726;e.bardbl=8214;e.bracehtipdownleft=65079;e.bracehtipdownright=65079;e.bracehtipupleft=65080;e.bracehtipupright=65080;e.braceleftBig=123;e.braceleftbig=123;e.braceleftbigg=123;e.braceleftBigg=123;e.bracerightBig=125;e.bracerightbig=125;e.bracerightbigg=125;e.bracerightBigg=125;e.bracketleftbig=91;e.bracketleftBig=91;e.bracketleftbigg=91;e.bracketleftBigg=91;e.bracketrightBig=93;e.bracketrightbig=93;e.bracketrightbigg=93;e.bracketrightBigg=93;e.ceilingleftbig=8968;e.ceilingleftBig=8968;e.ceilingleftBigg=8968;e.ceilingleftbigg=8968;e.ceilingrightbig=8969;e.ceilingrightBig=8969;e.ceilingrightbigg=8969;e.ceilingrightBigg=8969;e.circledotdisplay=8857;e.circledottext=8857;e.circlemultiplydisplay=8855;e.circlemultiplytext=8855;e.circleplusdisplay=8853;e.circleplustext=8853;e.contintegraldisplay=8750;e.contintegraltext=8750;e.coproductdisplay=8720;e.coproducttext=8720;e.floorleftBig=8970;e.floorleftbig=8970;e.floorleftbigg=8970;e.floorleftBigg=8970;e.floorrightbig=8971;e.floorrightBig=8971;e.floorrightBigg=8971;e.floorrightbigg=8971;e.hatwide=770;e.hatwider=770;e.hatwidest=770;e.intercal=7488;e.integraldisplay=8747;e.integraltext=8747;e.intersectiondisplay=8898;e.intersectiontext=8898;e.logicalanddisplay=8743;e.logicalandtext=8743;e.logicalordisplay=8744;e.logicalortext=8744;e.parenleftBig=40;e.parenleftbig=40;e.parenleftBigg=40;e.parenleftbigg=40;e.parenrightBig=41;e.parenrightbig=41;e.parenrightBigg=41;e.parenrightbigg=41;e.prime=8242;e.productdisplay=8719;e.producttext=8719;e.radicalbig=8730;e.radicalBig=8730;e.radicalBigg=8730;e.radicalbigg=8730;e.radicalbt=8730;e.radicaltp=8730;e.radicalvertex=8730;e.slashbig=47;e.slashBig=47;e.slashBigg=47;e.slashbigg=47;e.summationdisplay=8721;e.summationtext=8721;e.tildewide=732;e.tildewider=732;e.tildewidest=732;e.uniondisplay=8899;e.unionmultidisplay=8846;e.unionmultitext=8846;e.unionsqdisplay=8852;e.unionsqtext=8852;e.uniontext=8899;e.vextenddouble=8741;e.vextendsingle=8739})),n=(0,r.getLookupTableFactory)((function(e){e.space=32;e.a1=9985;e.a2=9986;e.a202=9987;e.a3=9988;e.a4=9742;e.a5=9990;e.a119=9991;e.a118=9992;e.a117=9993;e.a11=9755;e.a12=9758;e.a13=9996;e.a14=9997;e.a15=9998;e.a16=9999;e.a105=1e4;e.a17=10001;e.a18=10002;e.a19=10003;e.a20=10004;e.a21=10005;e.a22=10006;e.a23=10007;e.a24=10008;e.a25=10009;e.a26=10010;e.a27=10011;e.a28=10012;e.a6=10013;e.a7=10014;e.a8=10015;e.a9=10016;e.a10=10017;e.a29=10018;e.a30=10019;e.a31=10020;e.a32=10021;e.a33=10022;e.a34=10023;e.a35=9733;e.a36=10025;e.a37=10026;e.a38=10027;e.a39=10028;e.a40=10029;e.a41=10030;e.a42=10031;e.a43=10032;e.a44=10033;e.a45=10034;e.a46=10035;e.a47=10036;e.a48=10037;e.a49=10038;e.a50=10039;e.a51=10040;e.a52=10041;e.a53=10042;e.a54=10043;e.a55=10044;e.a56=10045;e.a57=10046;e.a58=10047;e.a59=10048;e.a60=10049;e.a61=10050;e.a62=10051;e.a63=10052;e.a64=10053;e.a65=10054;e.a66=10055;e.a67=10056;e.a68=10057;e.a69=10058;e.a70=10059;e.a71=9679;e.a72=10061;e.a73=9632;e.a74=10063;e.a203=10064;e.a75=10065;e.a204=10066;e.a76=9650;e.a77=9660;e.a78=9670;e.a79=10070;e.a81=9687;e.a82=10072;e.a83=10073;e.a84=10074;e.a97=10075;e.a98=10076;e.a99=10077;e.a100=10078;e.a101=10081;e.a102=10082;e.a103=10083;e.a104=10084;e.a106=10085;e.a107=10086;e.a108=10087;e.a112=9827;e.a111=9830;e.a110=9829;e.a109=9824;e.a120=9312;e.a121=9313;e.a122=9314;e.a123=9315;e.a124=9316;e.a125=9317;e.a126=9318;e.a127=9319;e.a128=9320;e.a129=9321;e.a130=10102;e.a131=10103;e.a132=10104;e.a133=10105;e.a134=10106;e.a135=10107;e.a136=10108;e.a137=10109;e.a138=10110;e.a139=10111;e.a140=10112;e.a141=10113;e.a142=10114;e.a143=10115;e.a144=10116;e.a145=10117;e.a146=10118;e.a147=10119;e.a148=10120;e.a149=10121;e.a150=10122;e.a151=10123;e.a152=10124;e.a153=10125;e.a154=10126;e.a155=10127;e.a156=10128;e.a157=10129;e.a158=10130;e.a159=10131;e.a160=10132;e.a161=8594;e.a163=8596;e.a164=8597;e.a196=10136;e.a165=10137;e.a192=10138;e.a166=10139;e.a167=10140;e.a168=10141;e.a169=10142;e.a170=10143;e.a171=10144;e.a172=10145;e.a173=10146;e.a162=10147;e.a174=10148;e.a175=10149;e.a176=10150;e.a177=10151;e.a178=10152;e.a179=10153;e.a193=10154;e.a180=10155;e.a199=10156;e.a181=10157;e.a200=10158;e.a182=10159;e.a201=10161;e.a183=10162;e.a184=10163;e.a197=10164;e.a185=10165;e.a194=10166;e.a198=10167;e.a186=10168;e.a195=10169;e.a187=10170;e.a188=10171;e.a189=10172;e.a190=10173;e.a191=10174;e.a89=10088;e.a90=10089;e.a93=10090;e.a94=10091;e.a91=10092;e.a92=10093;e.a205=10094;e.a85=10095;e.a206=10096;e.a86=10097;e.a87=10098;e.a88=10099;e.a95=10100;e.a96=10101;e[".notdef"]=0}))},(e,t,a)=>{a.r(t);a.d(t,{clearUnicodeCaches:()=>clearUnicodeCaches,getCharUnicodeCategory:()=>getCharUnicodeCategory,getUnicodeForGlyph:()=>getUnicodeForGlyph,getUnicodeRangeFor:()=>getUnicodeRangeFor,mapSpecialUnicodeValues:()=>mapSpecialUnicodeValues});const r=(0,a(3).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?r()[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=[[0,127],[128,255],[256,383],[384,591],[592,687,7424,7551,7552,7615],[688,767,42752,42783],[768,879,7616,7679],[880,1023],[11392,11519],[1024,1279,1280,1327,11744,11775,42560,42655],[1328,1423],[1424,1535],[42240,42559],[1536,1791,1872,1919],[1984,2047],[2304,2431],[2432,2559],[2560,2687],[2688,2815],[2816,2943],[2944,3071],[3072,3199],[3200,3327],[3328,3455],[3584,3711],[3712,3839],[4256,4351,11520,11567],[6912,7039],[4352,4607],[7680,7935,11360,11391,42784,43007],[7936,8191],[8192,8303,11776,11903],[8304,8351],[8352,8399],[8400,8447],[8448,8527],[8528,8591],[8592,8703,10224,10239,10496,10623,11008,11263],[8704,8959,10752,11007,10176,10223,10624,10751],[8960,9215],[9216,9279],[9280,9311],[9312,9471],[9472,9599],[9600,9631],[9632,9727],[9728,9983],[9984,10175],[12288,12351],[12352,12447],[12448,12543,12784,12799],[12544,12591,12704,12735],[12592,12687],[43072,43135],[12800,13055],[13056,13311],[44032,55215],[55296,57343],[67840,67871],[19968,40959,11904,12031,12032,12255,12272,12287,13312,19903,131072,173791,12688,12703],[57344,63743],[12736,12783,63744,64255,194560,195103],[64256,64335],[64336,65023],[65056,65071],[65040,65055],[65104,65135],[65136,65279],[65280,65519],[65520,65535],[3840,4095],[1792,1871],[1920,1983],[3456,3583],[4096,4255],[4608,4991,4992,5023,11648,11743],[5024,5119],[5120,5759],[5760,5791],[5792,5887],[6016,6143],[6144,6319],[10240,10495],[40960,42127],[5888,5919,5920,5951,5952,5983,5984,6015],[66304,66351],[66352,66383],[66560,66639],[118784,119039,119040,119295,119296,119375],[119808,120831],[1044480,1048573],[65024,65039,917760,917999],[917504,917631],[6400,6479],[6480,6527],[6528,6623],[6656,6687],[11264,11359],[11568,11647],[19904,19967],[43008,43055],[65536,65663,65664,65791,65792,65855],[65856,65935],[66432,66463],[66464,66527],[66640,66687],[66688,66735],[67584,67647],[68096,68191],[119552,119647],[73728,74751,74752,74879],[119648,119679],[7040,7103],[7168,7247],[7248,7295],[43136,43231],[43264,43311],[43312,43359],[43520,43615],[65936,65999],[66e3,66047],[66208,66271,66176,66207,67872,67903],[127024,127135,126976,127023]];function getUnicodeRangeFor(e,t=-1){if(-1!==t){const a=i[t];for(let r=0,i=a.length;r=a[r]&&e<=a[r+1])return t}for(let t=0,a=i.length;t=a[r]&&e<=a[r+1])return t}return-1}const n=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),s=new Map;function getCharUnicodeCategory(e){const t=s.get(e);if(t)return t;const a=e.match(n),r={isWhitespace:!(!a||!a[1]),isZeroWidthDiacritic:!(!a||!a[2]),isInvisibleFormatMark:!(!a||!a[3])};s.set(e,r);return r}function clearUnicodeCaches(){s.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,i.normalizeFontName)(e);return n()[t]};t.getSymbolsFonts=t.getSupplementalGlyphMapForCalibri=t.getSupplementalGlyphMapForArialBlack=t.getStdFontMap=void 0;var r=a(3),i=a(38);const n=(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=n;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[179]=8220;e[180]=8221;e[181]=8216;e[182]=8217;e[200]=193;e[203]=205;e[207]=211;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[5]=192;e[6]=193;e[9]=196;e[17]=66;e[18]=67;e[21]=268;e[24]=68;e[28]=69;e[29]=200;e[30]=201;e[32]=282;e[38]=70;e[39]=71;e[44]=72;e[47]=73;e[48]=204;e[49]=205;e[58]=74;e[60]=75;e[62]=76;e[68]=77;e[69]=78;e[75]=79;e[76]=210;e[80]=214;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[109]=220;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[259]=224;e[260]=225;e[263]=228;e[268]=261;e[271]=98;e[272]=99;e[273]=263;e[275]=269;e[282]=100;e[286]=101;e[287]=232;e[288]=233;e[290]=283;e[295]=281;e[296]=102;e[336]=103;e[346]=104;e[349]=105;e[350]=236;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[382]=242;e[383]=243;e[386]=246;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[442]=252;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),i=a(38),n=a(2);t.CFFFont=class CFFFont{constructor(e,t){this.properties=t;const a=new r.CFFParser(e,t,i.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,n.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,{cidToGidMap:a,cMap:r}=t,n=e.charset.charset;let s,o;if(t.composite){let t,i;if(a&&a.length>0){t=Object.create(null);for(let e=0,r=a.length;e=0){const r=a[t];r&&(i[e]=r)}}i.length>0&&(this.properties.builtInEncoding=i)}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FontRendererFactory=void 0;var r=a(2),i=a(35),n=a(39),s=a(37),o=a(8);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 i=1===getUint16(e,t+2)?getUint32(e,t+8):getUint32(e,t+16),n=getUint16(e,t+i);let s,o,c;if(4===n){getUint16(e,t+i+2);const a=getUint16(e,t+i+6)>>1;o=t+i+14;s=[];for(c=0;c>1;a0;)h.push({flags:n})}for(a=0;a>1;S=!0;break;case 4:c+=n.pop();moveTo(o,c);S=!0;break;case 5:for(;n.length>0;){o+=n.shift();c+=n.shift();lineTo(o,c)}break;case 6:for(;n.length>0;){o+=n.shift();lineTo(o,c);if(0===n.length)break;c+=n.shift();lineTo(o,c)}break;case 7:for(;n.length>0;){c+=n.shift();lineTo(o,c);if(0===n.length)break;o+=n.shift();lineTo(o,c)}break;case 8:for(;n.length>0;){u=o+n.shift();f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g+n.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 10:y=n.pop();w=null;if(a.isCFFCIDFont){const e=a.fdSelect.getFDIndex(i);if(e>=0&&eMath.abs(c-t)?o+=n.shift():c+=n.shift();bezierCurveTo(u,f,d,g,o,c);break;default:throw new r.FormatError(`unknown operator: 12 ${x}`)}break;case 14:if(n.length>=4){const e=n.pop(),r=n.pop();c=n.pop();o=n.pop();t.push({cmd:"save"},{cmd:"translate",args:[o,c]});let i=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[e]]));compileCharString(a.glyphs[i.glyphId],t,a,i.glyphId);t.push({cmd:"restore"});i=lookupCmap(a.cmap,String.fromCharCode(a.glyphNameMap[s.StandardEncoding[r]]));compileCharString(a.glyphs[i.glyphId],t,a,i.glyphId)}return;case 19:case 20:l+=n.length>>1;h+=l+7>>3;S=!0;break;case 21:c+=n.pop();o+=n.pop();moveTo(o,c);S=!0;break;case 22:o+=n.pop();moveTo(o,c);S=!0;break;case 24:for(;n.length>2;){u=o+n.shift();f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g+n.shift();bezierCurveTo(u,f,d,g,o,c)}o+=n.shift();c+=n.shift();lineTo(o,c);break;case 25:for(;n.length>6;){o+=n.shift();c+=n.shift();lineTo(o,c)}u=o+n.shift();f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g+n.shift();bezierCurveTo(u,f,d,g,o,c);break;case 26:n.length%2&&(o+=n.shift());for(;n.length>0;){u=o;f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d;c=g+n.shift();bezierCurveTo(u,f,d,g,o,c)}break;case 27:n.length%2&&(c+=n.shift());for(;n.length>0;){u=o+n.shift();f=c;d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g;bezierCurveTo(u,f,d,g,o,c)}break;case 28:n.push((e[h]<<24|e[h+1]<<16)>>16);h+=2;break;case 29:y=n.pop()+a.gsubrsBias;w=a.gsubrs[y];w&&parse(w);break;case 30:for(;n.length>0;){u=o;f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g+(1===n.length?n.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===n.length)break;u=o+n.shift();f=c;d=u+n.shift();g=f+n.shift();c=g+n.shift();o=d+(1===n.length?n.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;case 31:for(;n.length>0;){u=o+n.shift();f=c;d=u+n.shift();g=f+n.shift();c=g+n.shift();o=d+(1===n.length?n.shift():0);bezierCurveTo(u,f,d,g,o,c);if(0===n.length)break;u=o;f=c+n.shift();d=u+n.shift();g=f+n.shift();o=d+n.shift();c=g+(1===n.length?n.shift():0);bezierCurveTo(u,f,d,g,o,c)}break;default:if(x<32)throw new r.FormatError(`unknown operator: ${x}`);if(x<247)n.push(x-139);else if(x<251)n.push(256*(x-247)+e[h++]+108);else if(x<255)n.push(256*-(x-251)-e[h++]-108);else{n.push((e[h]<<24|e[h+1]<<16|e[h+2]<<8|e[h+3])/65536);h+=4}}S&&(n.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 n=[];let s=i(t,0);for(let a=r;a{Object.defineProperty(t,"__esModule",{value:!0});t.getMetrics=t.getFontBasicMetrics=void 0;var r=a(3);const i=(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=i;const n=(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=n},(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 i=new DataView(a.buffer,a.byteOffset,a.byteLength),n=new DataView(e.buffer,e.byteOffset,e.byteLength),s=t?4:2;let o=t?i.getUint32(0):2*i.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,i=new DataView(new ArrayBuffer((this.glyphs.length+1)*r));a?i.setUint32(0,0):i.setUint16(0,0);let n=0,s=0;for(const e of this.glyphs){n+=e.write(n,t);n=n+3&-4;s+=r;a?i.setUint32(s,n):i.setUint16(s,n>>1)}return{isLocationLong:a,loca:new Uint8Array(i.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:i}){this.numberOfContours=e;this.xMin=t;this.yMin=a;this.xMax=r;this.yMax=i}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 i=0;i255?e+=2:o>0&&(e+=1);t=n;o=Math.abs(s-a);o>255?e+=2:o>0&&(e+=1);a=s}}return e}write(e,t){const a=e,r=[],i=[],n=[];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;i.push(0)}else{const e=Math.abs(l);if(e<=255){t|=l>=0?36:4;i.push(e)}else i.push(l)}o=h;n.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 n)t.setUint8(e++,a);for(let a=0,i=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(3),i=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,i=a.length;ra;){a<<=1;r++}const i=a*t;return{range:i,entry:r,rangeShift:t*e-i}}toArray(){let e=this.sfnt;const t=this.tables,a=Object.keys(t);a.sort();const n=a.length;let s,o,c,l,h,u=12+16*n;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),i=a(2),n=a(38),s=a(3),o=a(8),c=a(49);function findBlock(e,t,a){const r=e.length,i=t.length,n=r-i;let o=a,c=!1;for(;o=i){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=i.length;u{Object.defineProperty(t,"__esModule",{value:!0});t.Type1Parser=void 0;var r=a(37),i=a(3),n=a(8),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 i,n,y,w=!1;for(let S=0;Sr)return!0;const i=r-e;for(let e=i;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(i,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,i,n=0|t;for(r=0;r>8;n=52845*(t+n)+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,i.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 n.Stream(a?decrypt(t,55665,4):function decryptAscii(e,t,a){let r=0|t;const i=e.length,n=new Uint8Array(i>>>1);let s,o;for(s=0,o=0;s>8;r=52845*(e+r)+22719&65535}}return n.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,i.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,i.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=[],i=Object.create(null);i.lenIV=4;const n={subrs:[],charstrings:[],properties:{privateData:i}};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=n.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=n.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":n.properties.privateData[s]=this.readNumberArray();break;case"StdHW":case"StdVW":n.properties.privateData[s]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":n.properties.privateData[s]=this.readNumber();break;case"ExpansionFactor":n.properties.privateData[s]=this.readNumber()||.06;break;case"ForceBold":n.properties.privateData[s]=this.readBoolean()}}for(const{encoded:t,glyph:i}of r){const r=new Type1CharString,s=r.convert(t,a,this.seacAnalysisEnabled);let o=r.output;s&&(o=[14]);const c={glyphName:i,charstring:o,width:r.width,lsb:r.lsb,seac:r.seac};".notdef"===i?n.charstrings.unshift(c):n.charstrings.push(c);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(i);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=r.width)}}return n}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 i=this.getToken();let n;if(/^\d+$/.test(i)){n=[];const e=0|parseInt(i,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 i=t.getArray("Matrix"),n=r.Util.normalizeRect(t.getArray("BBox")),s=t.get("XStep"),o=t.get("YStep"),c=t.get("PaintType"),l=t.get("TilingType");if(n[2]-n[0]==0||n[3]-n[1]==0)throw new r.FormatError(`Invalid getTilingPatternIR /BBox array: [${n}].`);return["TilingPattern",a,e,i,n,s,o,c,l]};var r=a(2),i=a(5),n=a(12),s=a(3);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,n,f){const g=e instanceof i.BaseStream?e.dict:e,p=g.get("ShadingType");try{switch(p){case o:case c:return new RadialAxialShading(g,t,a,n,f);case l:case h:case u:case d:return new MeshShading(e,t,a,n,f);default:throw new r.FormatError("Unsupported ShadingType: "+p)}}catch(e){if(e instanceof s.MissingDataException)throw e;(0,r.warn)(e);return new DummyShading}}};class BaseShading{static 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,i,s){super();this.coordsArr=e.getArray("Coords");this.shadingType=e.get("ShadingType");const o=n.ColorSpace.parse({cs:e.getRaw("CS")||e.getRaw("ColorSpace"),xref:t,resources:a,pdfFunctionFactory:i,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,i,n,s]=this.coordsArr,o=Math.hypot(e-i,t-n);a<=s+o&&s<=a+o&&(0,r.warn)("Unsupported radial gradient.")}this.extendStart=d;this.extendEnd=f;const g=e.getRaw("Function"),p=i.createFromArray(g),m=(u-h)/840,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,x=0;w[0]=h;p(w,0,y,0);let C=o.getRgb(y,0);const k=r.Util.makeHexColor(C[0],C[1],C[2]);b.push([0,k]);let v=1;w[0]=h+m;p(w,0,y,0);let F=o.getRgb(y,0),O=F[0]-C[0]+1,T=F[1]-C[1]+1,M=F[2]-C[2]+1,E=F[0]-C[0]-1,D=F[1]-C[1]-1,N=F[2]-C[2]-1;for(let e=2;e<840;e++){w[0]=h+e*m;p(w,0,y,0);S=o.getRgb(y,0);const t=e-x;O=Math.min(O,(S[0]-C[0]+1)/t);T=Math.min(T,(S[1]-C[1]+1)/t);M=Math.min(M,(S[2]-C[2]+1)/t);E=Math.max(E,(S[0]-C[0]-1)/t);D=Math.max(D,(S[1]-C[1]-1)/t);N=Math.max(N,(S[2]-C[2]-1)/t);if(!(E<=O&&D<=T&&N<=M)){const e=r.Util.makeHexColor(F[0],F[1],F[2]);b.push([v/840,e]);O=S[0]-F[0]+1;T=S[1]-F[1]+1;M=S[2]-F[2]+1;E=S[0]-F[0]-1;D=S[1]-F[1]-1;N=S[2]-F[2]-1;x=v;C=F}v=e;F=S}const R=r.Util.makeHexColor(F[0],F[1],F[2]);b.push([1,R]);let L="transparent";if(e.has("Background")){S=o.getRgb(e.get("Background"),0);L=r.Util.makeHexColor(S[0],S[1],S[2])}if(!d){b.unshift([0,L]);b[1][0]+=BaseShading.SMALL_NUMBER}if(!f){b.at(-1)[0]-=BaseShading.SMALL_NUMBER;b.push([1,L])}this.colorStops=b}getIR(){const e=this.coordsArr,t=this.shadingType;let a,i,n,s,l;if(t===o){i=[e[0],e[1]];n=[e[2],e[3]];s=null;l=null;a="axial"}else if(t===c){i=[e[0],e[1]];n=[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,i,n,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,i=e<32?1/((1<n?n: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:i}=t;let n;n=i?a.map(((e,t)=>e*i[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(n[t]);o+=1}else{o=e;s=[n[t]];c.push(e,s)}return c}(e),a=new i.Dict(null);a.set("BaseFont",i.Name.get(e));a.set("Type",i.Name.get("Font"));a.set("Subtype",i.Name.get("CIDFontType2"));a.set("Encoding",i.Name.get("Identity-H"));a.set("CIDToGIDMap",i.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 i.Dict(null);a.set("FontDescriptor",r);const n=new i.Dict(null);n.set("Ordering","Identity");n.set("Registry","Adobe");n.set("Supplement",0);a.set("CIDSystemInfo",n);return a};t.getXfaFontName=getXfaFontName;var r=a(52),i=a(4),n=a(53),s=a(54),o=a(55),c=a(56),l=a(3),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:n.HelveticaRegularFactors,baseWidths:s.LiberationSansRegularWidths,baseMapping:s.LiberationSansRegularMapping,metrics:n.HelveticaRegularMetrics};e["Helvetica-Bold"]={name:"LiberationSans-Bold",factors:n.HelveticaBoldFactors,baseWidths:s.LiberationSansBoldWidths,baseMapping:s.LiberationSansBoldMapping,metrics:n.HelveticaBoldMetrics};e["Helvetica-Italic"]={name:"LiberationSans-Italic",factors:n.HelveticaItalicFactors,baseWidths:s.LiberationSansItalicWidths,baseMapping:s.LiberationSansItalicMapping,metrics:n.HelveticaItalicMetrics};e["Helvetica-BoldItalic"]={name:"LiberationSans-BoldItalic",factors:n.HelveticaBoldItalicFactors,baseWidths:s.LiberationSansBoldItalicWidths,baseMapping:s.LiberationSansBoldItalicMapping,metrics:n.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(e instanceof r.Dict)t=e;else{if(!(e instanceof s.BaseStream))return!1;t=e.dict}return t.has("FunctionType")};var r=a(4),i=a(2),n=a(58),s=a(5),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,i.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=s[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 i,n,s="";const c=p;for(i=0;ie&&(n=e)}m[i]=n}if(g>0){g--;f[s]=m}a.set(m,r)}}}class PostScriptStack{static MAX_STACK_SIZE=100;constructor(e){this.stack=e?Array.from(e):[]}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,i=a.length-1,n=r+(t-Math.floor(t/e)*e);for(let e=r,t=i;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%360/180*Math.PI));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=[],i=[],n=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(",n,", ");o.push(")")}if(s{Object.defineProperty(t,"__esModule",{value:!0});t.PostScriptParser=t.PostScriptLexer=void 0;var r=a(2),i=a(4),n=a(3);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){return 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 i.EOF;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!(0,n.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.RegionalImageCache=t.LocalTilingPatternCache=t.LocalImageCache=t.LocalGStateCache=t.LocalFunctionCache=t.LocalColorSpaceCache=t.GlobalImageCache=void 0;var r=a(2),i=a(4);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 i.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)}};t.RegionalImageCache=class RegionalImageCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,a){if(!t)throw new Error('RegionalImageCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,a)}};class GlobalImageCache{static NUM_PAGES_THRESHOLD=2;static MIN_IMAGES_TO_CACHE=10;static MAX_BYTE_SIZE=5*r.MAX_IMAGE_SIZE_TO_CACHE;constructor(){this._refCache=new i.RefSetCache;this._imageCache=new i.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 i=["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"],n=["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,i;for(r=t,i=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.ImageResizer=void 0;var r=a(2);class ImageResizer{constructor(e,t){this._imgData=e;this._isMask=t}static needsToBeResized(e,t){if(e<=this._goodSquareLength&&t<=this._goodSquareLength)return!1;const{MAX_DIM:a}=this;if(e>a||t>a)return!0;const r=e*t;if(this._hasMaxArea)return r>this.MAX_AREA;if(r(this.MAX_AREA=this._goodSquareLength**2)}static get MAX_DIM(){return(0,r.shadow)(this,"MAX_DIM",this._guessMax(2048,65537,0,1))}static get MAX_AREA(){this._hasMaxArea=!0;return(0,r.shadow)(this,"MAX_AREA",this._guessMax(ImageResizer._goodSquareLength,this.MAX_DIM,128,0)**2)}static set MAX_AREA(e){if(e>=0){this._hasMaxArea=!0;(0,r.shadow)(this,"MAX_AREA",e)}}static setMaxArea(e){this._hasMaxArea||(this.MAX_AREA=e>>2)}static _areGoodDims(e,t){try{const a=new OffscreenCanvas(e,t),r=a.getContext("2d");r.fillRect(0,0,1,1);const i=r.getImageData(0,0,1,1).data[3];a.width=a.height=1;return 0!==i}catch(e){return!1}}static _guessMax(e,t,a,r){for(;e+a+1>3,r=a+3&-4;if(a!==r){const e=new Uint8Array(r*t);let i=0;for(let s=0,o=t*a;s{Object.defineProperty(t,"__esModule",{value:!0});t.MurmurHash3_64=void 0;var r=a(2);const i=3285377520,n=4294901760,s=65535;t.MurmurHash3_64=class MurmurHash3_64{constructor(e){this.h1=e?4294967295&e:i;this.h2=e?4294967295&e:i}update(e){let t,a;if("string"==typeof e){t=new Uint8Array(2*e.length);a=0;for(let r=0,i=e.length;r>>8;t[a++]=255&i}}}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 i=a>>2,o=a-4*i,c=new Uint32Array(t.buffer,0,i);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&n|l*m&s;u^=l;u=u<<13|u>>>19;u=5*u+3864292196}else{h=c[e];h=h*f&n|h*p&s;h=h<<15|h>>>17;h=h*g&n|h*m&s;d^=h;d=d<<13|d>>>19;d=5*d+3864292196}l=0;switch(o){case 3:l^=t[4*i+2]<<16;case 2:l^=t[4*i+1]<<8;case 1:l^=t[4*i];l=l*f&n|l*p&s;l=l<<15|l>>>17;l=l*g&n|l*m&s;1&i?u^=l:d^=l}this.h1=u;this.h2=d}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&n|36045*e&s;t=4283543511*t&n|(2950163797*(t<<16|e>>>16)&n)>>>16;e^=t>>>1;e=444984403*e&n|60499*e&s;t=3301882366*t&n|(3120437893*(t<<16|e>>>16)&n)>>>16;e^=t>>>1;return(e>>>0).toString(16).padStart(8,"0")+(t>>>0).toString(16).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,i){let n=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[n-4]=t[n];t[n-3]=t[n+1];t[n-2]=t[n+2];t[n-1]=t[n+3];t[n+a]=t[n+a-4];t[n+a+1]=t[n+a-3];t[n+a+2]=t[n+a-2];t[n+a+3]=t[n+a-1];n-=y}}const w={width:p,height:m};if(e.isOffscreenCanvasSupported){const e=new OffscreenCanvas(p,m);e.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(b.buffer),p,m),0,0);w.bitmap=e.transferToImageBitmap();w.data=null}else{w.kind=r.ImageKind.RGBA_32BPP;w.data=b}a.splice(s,4*l,r.OPS.paintInlineImageXObjectGroup);i.splice(s,4*l,[w,u]);return s+1}));addState(i,[r.OPS.save,r.OPS.transform,r.OPS.paintImageMaskXObject,r.OPS.restore],null,(function iterateImageMaskGroup(e,t){const a=e.fnArray,i=(t-(e.iCurr-3))%4;switch(i){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: ${i}`)}),(function foundImageMaskGroup(e,t){const a=e.fnArray,i=e.argsArray,n=e.iCurr,s=n-3,o=n-2,c=n-1;let l=Math.floor((t-s)/4);if(l<10)return t-(t-s)%4;let h,u,d=!1;const f=i[c][0],g=i[o][0],p=i[o][1],m=i[o][2],b=i[o][3];if(p===m){d=!0;h=o+4;let e=c+4;for(let t=1;t=4&&a[n-4]===a[s]&&a[n-3]===a[o]&&a[n-2]===a[c]&&a[n-1]===a[l]&&r[n-4][0]===h&&r[n-4][1]===u){d++;f-=5}let g=f+4;for(let e=1;e=a)break}r=(r||i)[e[t]];if(r&&!Array.isArray(r)){s.iCurr=t;t++;if(!r.checkFn||(0,r.checkFn)(s)){n=r;r=null}else r=null}else t++}this.state=r;this.match=n;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 CHUNK_SIZE=1e3;static 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()}set isOffscreenCanvasSupported(e){this.optimizer.isOffscreenCanvasSupported=e}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),i=a(28),n=a(5),s=a(12),o=a(18),c=a(61),l=a(26),h=a(30),u=a(4);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,i,n){const s=i*n;let o;o=t<=8?new Uint8Array(s):t<=16?new Uint16Array(s):new Uint32Array(s);const c=a/i,l=r/n;let h,u,d,f,g=0;const p=new Uint16Array(i),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 n=g.getRaw("CS")||g.getRaw("ColorSpace");if(!n){(0,r.info)("JPX images (which do not require color spaces)");switch(a.numComps){case 1:n=u.Name.get("DeviceGray");break;case 3:n=u.Name.get("DeviceRGB");break;case 4:n=u.Name.get("DeviceCMYK");break;default:throw new Error(`JPX images with ${a.numComps} color components not supported.`)}}this.colorSpace=s.ColorSpace.parse({cs:n,xref:e,resources:i?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)||l&&!s.ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<>3)*a,o=e.byteLength;let c,l;if(!r||i&&!(s===o))if(i){c=new Uint8Array(s);c.set(e);c.fill(255,o)}else c=new Uint8Array(e);else c=e;if(i)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=n;d>r;i<0?i=0:i>l&&(i=l);s[d]=i;u&=(1<o[r+1]){t=255;break}}c[u]=t}}}if(c)for(u=0,f=3,d=t*i;u>3,f=t&&c.ImageResizer.needsToBeResized(a,i);if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===u?e=r.ImageKind.GRAYSCALE_1BPP:"DeviceRGB"!==this.colorSpace.name||8!==u||this.needsDecode||(e=r.ImageKind.RGB_24BPP);if(e&&!this.smask&&!this.mask&&a===o&&i===h){const s=this.getImageBytes(h*d,{});if(t)return f?c.ImageResizer.createImage({data:s,kind:e,width:a,height:i,interpolate:this.interpolate},this.needsDecode):this.createBitmap(e,o,h,s);n.kind=e;n.data=s;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(i*s,{internal:!0}),c=this.getComponents(o);let l,h;if(1===n){h=a*i;if(this.needsDecode)for(l=0;l{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,needAppearances:d,acroFormRef:f=null,acroForm:g=null,xfaData:p=null}){!function updateAcroform({xref:e,acroForm:t,acroFormRef:a,hasXfa:n,hasXfaDatasetsEntry:s,xfaDatasetsRef:o,needAppearances:c,newRefs:l}){!n||s||o||(0,r.warn)("XFA - Cannot save it");if(!(c||n&&o))return;const h=new i.Dict(e);for(const e of t.getKeys())h.set(e,t.getRaw(e));if(n&&!s){const e=t.get("XFA").slice();e.splice(2,0,"datasets");e.splice(3,0,o);h.set("XFA",e)}c&&h.set("NeedAppearances",!0);const u=e.encrypt;let d=null;u&&(d=u.createCipherTransform(a.num,a.gen));const f=[];writeObject(a,h,f,d);l.push({ref:a,data:f.join("")})}({xref:o,acroForm:g,acroFormRef:f,hasXfa:l,hasXfaDatasetsEntry:u,xfaDatasetsRef:h,needAppearances:d,newRefs:a});l&&function updateXFA({xfaData:e,xfaDatasetsRef:t,newRefs:a,xref:i}){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:i}=e;if(!t)continue;const o=(0,n.parseXFAPath)(t);let c=a.documentElement.searchNode(o,0);!c&&o.length>1&&(c=a.documentElement.searchNode([o.at(-1)],0));c?Array.isArray(i)?c.childNodes=i.map((e=>new s.SimpleDOMNode("value",e))):c.childNodes=[new s.SimpleDOMNode("#text",i)]:(0,r.warn)(`Node not found for path: ${t}`)}const i=[];a.documentElement.dump(i);return i.join("")}(i.fetchIfRef(t).getString(),a)}const o=i.encrypt;if(o){e=o.createCipherTransform(t.num,t.gen).encryptString(e)}const c=`${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n`+e+"\nendstream\nendobj\n";a.push({ref:t,data:c})}({xfaData:p,xfaDatasetsRef:h,newRefs:a,xref:o});const m=new i.Dict(null),b=t.newRef;let y,w;const S=e.at(-1);if(10===S||13===S){y=[];w=e.length}else{y=["\n"];w=e.length+1}m.set("Size",b.num+1);m.set("Prev",t.startXRef);m.set("Type",i.Name.get("XRef"));null!==t.rootRef&&m.set("Root",t.rootRef);null!==t.infoRef&&m.set("Info",t.infoRef);null!==t.encryptRef&&m.set("Encrypt",t.encryptRef);a.push({ref:b,data:""});a=a.sort(((e,t)=>e.ref.num-t.ref.num));const x=[[0,1,65535]],C=[0,1];let k=0;for(const{ref:e,data:t}of a){k=Math.max(k,w);x.push([1,w,Math.min(e.gen,65535)]);w+=t.length;C.push(e.num,1);y.push(t)}m.set("Index",C);if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const e=function computeMD5(e,t){const a=Math.floor(Date.now()/1e3),i=t.filename||"",n=[a.toString(),i,e.toString()];let s=n.reduce(((e,t)=>e+t.length),0);for(const e of Object.values(t.info)){n.push(e);s+=e.length}const o=new Uint8Array(s);let l=0;for(const e of n){writeString(e,l,o);l+=e.length}return(0,r.bytesToString)((0,c.calculateMD5)(o))}(w,t);m.set("ID",[t.fileIds[0],e])}const v=[1,Math.ceil(Math.log2(k)/8),2],F=(v[0]+v[1]+v[2])*x.length;m.set("W",v);m.set("Length",F);y.push(`${b.num} ${b.gen} obj\n`);writeDict(m,y,null);y.push(" stream\n");const O=y.reduce(((e,t)=>e+t.length),0),T=`\nendstream\nendobj\nstartxref\n${w}\n%%EOF\n`,M=new Uint8Array(e.length+O+F+T.length);M.set(e);let E=e.length;for(const e of y){writeString(e,E,M);E+=e.length}for(const[e,t,a]of x){E=writeInt(e,v[0],E,M);E=writeInt(t,v[1],E,M);E=writeInt(a,v[2],E,M)}writeString(T,E,M);return M};t.writeDict=writeDict;t.writeObject=writeObject;var r=a(2),i=a(4),n=a(3),s=a(66),o=a(5),c=a(67);function writeObject(e,t,a,r){a.push(`${e.num} ${e.gen} obj\n`);t instanceof i.Dict?writeDict(t,a,r):t instanceof o.BaseStream&&writeStream(t,a,r);a.push("\nendobj\n")}function writeDict(e,t,a){t.push("<<");for(const r of e.getKeys()){t.push(` /${(0,n.escapePDFName)(r)} `);writeValue(e.getRaw(r),t,a)}t.push(">>")}function writeStream(e,t,a){let r=e.getString();null!==a&&(r=a.encryptString(r));e.dict.set("Length",r.length);writeDict(e.dict,t,a);t.push(" stream\n",r,"\nendstream")}function writeValue(e,t,a){if(e instanceof i.Name)t.push(`/${(0,n.escapePDFName)(e.name)}`);else if(e instanceof i.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 i of e){r?r=!1:t.push(" ");writeValue(i,t,a)}t.push("]")}(e,t,a);else if("string"==typeof e){null!==a&&(e=a.encryptString(e));t.push(`(${(0,n.escapeString)(e)})`)}else"number"==typeof e?t.push((0,n.numberToString)(e)):"boolean"==typeof e?t.push(e.toString()):e instanceof i.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 i=t+a-1;i>a-1;i--){r[i]=255&e;e>>=8}return a+t}function writeString(e,t,a){for(let r=0,i=e.length;r{Object.defineProperty(t,"__esModule",{value:!0});t.XMLParserErrorCode=t.XMLParserBase=t.SimpleXMLParser=t.SimpleDOMNode=void 0;var r=a(3);const i={NoError:0,EndOfDocument:-1,UnterminatedCdat:-2,UnterminatedXmlDeclaration:-3,UnterminatedDoctypeDeclaration:-4,UnterminatedComment:-5,MalformedElement:-6,OutOfMemory:-7,UnterminatedAttributeValue:-8,UnterminatedElement:-9,ElementNeverBegun:-10};t.XMLParserErrorCode=i;function isWhitespace(e,t){const a=e[t];return" "===a||"\n"===a||"\r"===a||"\t"===a}class XMLParserBase{_resolveEntities(e){return e.replaceAll(/&([^;]+);/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 i=e.substring(t,r);skipWs();for(;r"!==e[r]&&"/"!==e[r]&&"?"!==e[r];){skipWs();let t="",i="";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(i,a),parsed:a-t}}parseXml(e){let t=0;for(;t",a);if(t<0){this.onError(i.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(i.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(i.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(i.UnterminatedCdat);return}this.onCdata(e.substring(a+8,t));a=t+3}else{if("DOCTYPE"!==e.substring(a+1,a+8)){this.onError(i.MalformedElement);return}{const r=e.indexOf("[",a+8);let n=!1;t=e.indexOf(">",a+8);if(t<0){this.onError(i.UnterminatedDoctypeDeclaration);return}if(r>0&&t>r){t=e.indexOf("]>",a+8);if(t<0){this.onError(i.UnterminatedDoctypeDeclaration);return}n=!0}const s=e.substring(a+8,t+(n?1:0));this.onDoctype(s);a=t+(n?2:1)}}break;default:const n=this._parseContent(e,a);if(null===n){this.onError(i.MalformedElement);return}let s=!1;if("/>"===e.substring(a+n.parsed,a+n.parsed+2))s=!0;else if(">"!==e.substring(a+n.parsed,a+n.parsed+1)){this.onError(i.UnterminatedElement);return}this.onBeginElement(n.name,n.attributes,s);a+=n.parsed+(s?2:1)}}else{for(;a0}searchNode(e,t){if(t>=e.length)return this;const a=e[t],r=[];let i=this;for(;;){if(a.name===i.nodeName){if(0!==a.pos){if(0===r.length)return null;{const[n]=r.pop();let s=0;for(const r of n.childNodes)if(a.name===r.nodeName){if(s===a.pos)return r.searchNode(e,t+1);s++}return i.searchNode(e,t+1)}}{const a=i.searchNode(e,t+1);if(null!==a)return a}}if(i.childNodes&&0!==i.childNodes.length){r.push([i,0]);i=i.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=i.NoError;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=i.NoError;this.parseXml(e);if(this._errorCode!==i.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),i=a(4),n=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,i=0;r<256;++r){const n=t[r];i=i+n+e[r%a]&255;t[r]=t[i];t[i]=n}this.s=t}encryptBlock(e){let t=this.a,a=this.b;const r=this.s,i=e.length,n=new Uint8Array(i);for(let s=0;s>5&255;h[u++]=i>>13&255;h[u++]=i>>21&255;h[u++]=i>>>29&255;h[u++]=0;h[u++]=0;h[u++]=0;const g=new Int32Array(16);for(u=0;u>>32-o)|0;i=n}n=n+i|0;s=s+l|0;o=o+f|0;c=c+p|0}return new Uint8Array([255&n,n>>8&255,n>>16&255,n>>>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 i=1779033703,n=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=i,d=n,m=s,w=o,S=c,x=l,C=h,k=u;for(p=0;p<64;++p){t=k+sigmaPrime(S)+ch(S,x,C)+e[p]+b[p];a=sigma(r)+maj(r,d,m);k=C;C=x;x=S;S=w+t|0;w=m;m=d;d=r;r=t+a|0}i=i+r|0;n=n+d|0;s=s+m|0;o=o+w|0;c=c+S|0;l=l+x|0;h=h+C|0;u=u+k|0}var y;return new Uint8Array([i>>24&255,i>>16&255,i>>8&255,255&i,n>>24&255,n>>16&255,n>>8&255,255&n,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,i){e.assign(t);e.and(a);i.assign(t);i.not();i.and(r);e.xor(i)}function maj(e,t,a,r,i){e.assign(t);e.and(a);i.assign(t);i.and(r);e.xor(i);i.assign(a);i.and(r);e.xor(i)}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,i=!1){let n,s,o,c,l,h,u,d;if(i){n=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{n=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),C=new Word64(0,0),k=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=n[13];n[13]=n[9];n[9]=n[5];n[5]=n[1];n[1]=a;a=n[14];r=n[10];n[14]=n[6];n[10]=n[2];n[6]=a;n[2]=r;a=n[15];r=n[11];i=n[7];n[15]=n[3];n[11]=a;n[7]=r;n[3]=i;for(let e=0;e<16;++e)n[e]=this._inv_s[n[e]];for(let a=0,r=16*e;a<16;++a,++r)n[a]^=t[r];for(let e=0;e<16;e+=4){const t=this._mix[n[e]],r=this._mix[n[e+1]],i=this._mix[n[e+2]],s=this._mix[n[e+3]];a=t^r>>>8^r<<24^i>>>16^i<<16^s>>>24^s<<8;n[e]=a>>>24&255;n[e+1]=a>>16&255;n[e+2]=a>>8&255;n[e+3]=255&a}}a=n[13];n[13]=n[9];n[9]=n[5];n[5]=n[1];n[1]=a;a=n[14];r=n[10];n[14]=n[6];n[10]=n[2];n[6]=a;n[2]=r;a=n[15];r=n[11];i=n[7];n[15]=n[3];n[11]=a;n[7]=r;n[3]=i;for(let e=0;e<16;++e){n[e]=this._inv_s[n[e]];n[e]^=t[e]}return n}_encrypt(e,t){const a=this._s;let r,i,n;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;n[n.length-1]=e.subarray(0,16-t)}}const c=new Uint8Array(o);for(let e=0,t=0,a=n.length;e=256&&(o=255&(27^o))}for(let t=0;t<4;++t){a[e]=r^=a[e-32];e++;a[e]=i^=a[e-32];e++;a[e]=n^=a[e-32];e++;a[e]=s^=a[e-32];e++}}return a}}t.AES256Cipher=AES256Cipher;class PDF17{checkOwnerPassword(e,t,a,i){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const s=o(n,0,n.length);return(0,r.isArrayEqual)(s,i)}checkUserPassword(e,t,a){const i=new Uint8Array(e.length+8);i.set(e,0);i.set(t,e.length);const n=o(i,0,i.length);return(0,r.isArrayEqual)(n,a)}getOwnerKey(e,t,a,r){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const n=o(i,0,i.length);return new AES256Cipher(n).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 i=o(r,0,r.length);return new AES256Cipher(i).decryptBlock(a,!1,new Uint8Array(16))}}t.PDF17=PDF17;class PDF20{_hash(e,t,a){let r=o(t,0,t.length).subarray(0,32),i=[0],n=0;for(;n<64||i.at(-1)>n-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);i=new AES128Cipher(r.subarray(0,16)).encrypt(h,r.subarray(16,32));const u=i.slice(0,16).reduce(((e,t)=>e+t),0)%3;0===u?r=o(i,0,i.length):1===u?r=calculateSHA384(i,0,i.length):2===u&&(r=c(i,0,i.length));n++}return r.subarray(0,32)}checkOwnerPassword(e,t,a,i){const n=new Uint8Array(e.length+56);n.set(e,0);n.set(t,e.length);n.set(a,e.length+t.length);const s=this._hash(e,n,a);return(0,r.isArrayEqual)(s,i)}checkUserPassword(e,t,a){const i=new Uint8Array(e.length+8);i.set(e,0);i.set(t,e.length);const n=this._hash(e,i,[]);return(0,r.isArrayEqual)(n,a)}getOwnerKey(e,t,a,r){const i=new Uint8Array(e.length+56);i.set(e,0);i.set(t,e.length);i.set(a,e.length+t.length);const n=this._hash(e,i,a);return new AES256Cipher(n).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 i=this._hash(e,r,[]);return new AES256Cipher(i).decryptBlock(a,!1,new Uint8Array(16))}}t.PDF20=PDF20;class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const a=new this.StreamCipherConstructor;return new n.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 i=new Uint8Array(16);if("undefined"!=typeof crypto)crypto.getRandomValues(i);else for(let e=0;e<16;e++)i[e]=Math.floor(256*Math.random());let n=(0,r.stringToBytes)(e);n=t.encrypt(n,i);const s=new Uint8Array(16+n.length);s.set(i);s.set(n,16);return(0,r.bytesToString)(s)}let a=(0,r.stringToBytes)(e);a=t.encrypt(a);return(0,r.bytesToString)(a)}}const l=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,i,n,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++]=n>>16&255;u[g++]=n>>>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;i[o++]=e>>16&255;i[o++]=255&t;i[o++]=t>>8&255;if(r){i[o++]=115;i[o++]=65;i[o++]=108;i[o++]=84}return s(i,0,o).subarray(0,Math.min(a.length+5,16))}function buildCipherConstructor(e,t,a,n,s){if(!(t instanceof i.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,n,s,!1))};if("AESV2"===c.name)return function cipherTransformFactoryBuildCipherConstructorAESV2(){return new AES128Cipher(buildObjectKey(a,n,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,n,o){const c=a.get("Filter");if(!(0,i.isName)(c,"Standard"))throw new r.FormatError("unknown encryption method");this.filterName=c.name;this.dict=a;const l=a.get("V");if(!Number.isInteger(l)||1!==l&&2!==l&&4!==l&&5!==l)throw new r.FormatError("unsupported encryption algorithm");this.algorithm=l;let h=a.get("Length");if(!h)if(l<=3)h=40;else{const e=a.get("CF"),t=a.get("StmF");if(e instanceof i.Dict&&t instanceof i.Name){e.suppressEncryption=!0;const a=e.get(t.name);h=a&&a.get("Length")||128;h<40&&(h<<=3)}}if(!Number.isInteger(h)||h<40||h%8!=0)throw new r.FormatError("invalid key length");const u=(0,r.stringToBytes)(a.get("O")),d=(0,r.stringToBytes)(a.get("U")),f=u.subarray(0,32),g=d.subarray(0,32),p=a.get("P"),m=a.get("R"),b=(4===l||5===l)&&!1!==a.get("EncryptMetadata");this.encryptMetadata=b;const y=(0,r.stringToBytes)(n);let w,S;if(o){if(6===m)try{o=(0,r.utf8StringToString)(o)}catch(e){(0,r.warn)("CipherTransformFactory: Unable to convert UTF8 encoded password.")}w=(0,r.stringToBytes)(o)}if(5!==l)S=prepareKeyData(y,w,f,g,p,m,h,b);else{const e=u.subarray(32,40),t=u.subarray(40,48),i=d.subarray(0,48),n=d.subarray(32,40),s=d.subarray(40,48),o=(0,r.stringToBytes)(a.get("OE")),c=(0,r.stringToBytes)(a.get("UE"));(0,r.stringToBytes)(a.get("Perms"));S=function createEncryptionKey20(e,t,a,r,i,n,s,o,c,l,h,u){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];let d;d=6===e?new PDF20:new PDF17;return d.checkUserPassword(t,o,s)?d.getUserKey(t,c,h):t.length&&d.checkOwnerPassword(t,r,n,a)?d.getOwnerKey(t,i,n,l):null}(m,w,f,e,t,i,g,n,s,o,c)}if(!S&&!o)throw new r.PasswordException("No password given",r.PasswordResponses.NEED_PASSWORD);if(!S&&o){const t=function decodeUserPassword(t,a,r,i){const n=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 i.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=l},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.DecryptStream=void 0;var r=a(18);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);const a=this.bufferLength,r=a+e.length;this.ensureBuffer(r).set(e,a);this.bufferLength=r}}t.DecryptStream=DecryptStream},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.Catalog=void 0;var r=a(3),i=a(2),n=a(4),s=a(70),o=a(5),c=a(71),l=a(12),h=a(72),u=a(59),d=a(73),f=a(74);function fetchDestination(e){e instanceof n.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 n.Dict))throw new i.FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict;this._actualNumPages=null;this.fontCache=new n.RefSetCache;this.builtInCMapCache=new Map;this.standardFontDataCache=new Map;this.globalImageCache=new u.GlobalImageCache;this.pageKidsCountCache=new n.RefSetCache;this.pageIndexCache=new n.RefSetCache;this.nonBlendModesSet=new n.RefSet}get version(){const e=this._catDict.get("Version");if(e instanceof n.Name){if(r.PDF_VERSION_REGEXP.test(e.name))return(0,i.shadow)(this,"version",e.name);(0,i.warn)(`Invalid PDF catalog version: ${e.name}`)}return(0,i.shadow)(this,"version",null)}get lang(){const e=this._catDict.get("Lang");return(0,i.shadow)(this,"lang","string"==typeof e?(0,i.stringToPDFString)(e):null)}get needsRendering(){const e=this._catDict.get("NeedsRendering");return(0,i.shadow)(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this._catDict.get("Collection");t instanceof n.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.info)("Cannot fetch Collection entry; assuming no collection is present.")}return(0,i.shadow)(this,"collection",e)}get acroForm(){let e=null;try{const t=this._catDict.get("AcroForm");t instanceof n.Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.info)("Cannot fetch AcroForm entry; assuming no forms are present.")}return(0,i.shadow)(this,"acroForm",e)}get acroFormRef(){const e=this._catDict.getRaw("AcroForm");return(0,i.shadow)(this,"acroFormRef",e instanceof n.Ref?e:null)}get metadata(){const e=this._catDict.getRaw("Metadata");if(!(e instanceof n.Ref))return(0,i.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 n.Dict){const e=r.dict.get("Type"),a=r.dict.get("Subtype");if((0,n.isName)(e,"Metadata")&&(0,n.isName)(a,"XML")){const e=(0,i.stringToUTF8String)(r.getString());e&&(t=new d.MetadataParser(e).serializable)}}}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.info)(`Skipping invalid Metadata: "${e}".`)}return(0,i.shadow)(this,"metadata",t)}get markInfo(){let e=null;try{e=this._readMarkInfo()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.warn)("Unable to read mark info.")}return(0,i.shadow)(this,"markInfo",e)}_readMarkInfo(){const e=this._catDict.get("MarkInfo");if(!(e instanceof n.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,i.warn)("Unable read to structTreeRoot info.")}return(0,i.shadow)(this,"structTreeRoot",e)}_readStructTreeRoot(){const e=this._catDict.get("StructTreeRoot");if(!(e instanceof n.Dict))return null;const t=new f.StructTreeRoot(e);t.init();return t}get toplevelPagesDict(){const e=this._catDict.get("Pages");if(!(e instanceof n.Dict))throw new i.FormatError("Invalid top-level pages dictionary.");return(0,i.shadow)(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.warn)("Unable to read document outline.")}return(0,i.shadow)(this,"documentOutline",e)}_readDocumentOutline(){let e=this._catDict.get("Outlines");if(!(e instanceof n.Dict))return null;e=e.getRaw("First");if(!(e instanceof n.Ref))return null;const t={items:[]},a=[{obj:e,parent:t}],r=new n.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 i.FormatError("Invalid outline item encountered.");const h={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:c,resultObj:h,docBaseUrl:this.pdfManager.docBaseUrl,docAttachments:this.attachments});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={action:h.action,attachment:h.attachment,dest:h.dest,url:h.url,unsafeUrl:h.unsafeUrl,newWindow:h.newWindow,setOCGState:h.setOCGState,title:(0,i.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 n.Ref&&!r.has(e)){a.push({obj:e,parent:m});r.put(e)}e=c.getRaw("Next");if(e instanceof n.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,i.warn)("Unable to read permissions.")}return(0,i.shadow)(this,"permissions",e)}_readPermissions(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof n.Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const a=[];for(const e in i.PermissionFlag){const r=i.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,i.shadow)(this,"optionalContentConfig",null);const a=t.get("D");if(!a)return(0,i.shadow)(this,"optionalContentConfig",null);const r=t.get("OCGs");if(!Array.isArray(r))return(0,i.shadow)(this,"optionalContentConfig",null);const s=[],o=[];for(const e of r){if(!(e instanceof n.Ref))continue;o.push(e);const t=this.xref.fetchIfRef(e);s.push({id:e.toString(),name:"string"==typeof t.get("Name")?(0,i.stringToPDFString)(t.get("Name")):null,intent:"string"==typeof t.get("Intent")?(0,i.stringToPDFString)(t.get("Intent")):null})}e=this._readOptionalContentConfig(a,o);e.groups=s}catch(e){if(e instanceof r.MissingDataException)throw e;(0,i.warn)(`Unable to read optional content config: ${e}`)}return(0,i.shadow)(this,"optionalContentConfig",e)}_readOptionalContentConfig(e,t){function parseOnOff(e){const a=[];if(Array.isArray(e))for(const r of e)r instanceof n.Ref&&t.includes(r)&&a.push(r.toString());return a}function parseOrder(e,a=0){if(!Array.isArray(e))return null;const i=[];for(const s of e){if(s instanceof n.Ref&&t.includes(s)){r.put(s);i.push(s.toString());continue}const e=parseNestedOrder(s,a);e&&i.push(e)}if(a>0)return i;const s=[];for(const e of t)r.has(e)||s.push(e.toString());s.length&&i.push({name:null,order:s});return i}function parseNestedOrder(e,t){if(++t>s){(0,i.warn)("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const r=a.fetchIfRef(e);if(!Array.isArray(r))return null;const n=a.fetchIfRef(r[0]);if("string"!=typeof n)return null;const o=parseOrder(r.slice(1),t);return o&&o.length?{name:(0,i.stringToPDFString)(n),order:o}:null}const a=this.xref,r=new n.RefSet,s=10;return{name:"string"==typeof e.get("Name")?(0,i.stringToPDFString)(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?(0,i.stringToPDFString)(e.get("Creator")):null,baseState:e.get("BaseState")instanceof n.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 i.FormatError("Page count in top-level pages dictionary is not an integer.");return(0,i.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,i.stringToPDFString)(a)]=e)}else e instanceof n.Dict&&e.forEach((function(e,a){const r=fetchDestination(a);r&&(t[e]=r)}));return(0,i.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,i.warn)(`Found "${e}" at an incorrect position in the NameTree.`);return r}}else if(t instanceof n.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,i.warn)("Unable to read page labels.")}return(0,i.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 i.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="a"===a?97:65,n=h-1;l=String.fromCharCode(t+n%e).repeat(Math.floor(n/e)+1);break;default:if(a)throw new i.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 n.Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return(0,i.shadow)(this,"pageLayout",t)}get pageMode(){const e=this._catDict.get("PageMode");let t="UseNone";if(e instanceof n.Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return(0,i.shadow)(this,"pageMode",t)}get viewerPreferences(){const e=this._catDict.get("ViewerPreferences");if(!(e instanceof n.Dict))return(0,i.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 n.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 n.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 n.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 n.Name)switch(r.name){case"None":case"AppDefault":s=r.name;break;default:s="AppDefault"}break;case"Duplex":if(r instanceof n.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,i.warn)(`Ignoring non-standard key in ViewerPreferences: ${a}.`);continue}if(void 0!==s){t||(t=Object.create(null));t[a]=s}else(0,i.warn)(`Bad value, for key "${a}", in ViewerPreferences: ${r}.`)}return(0,i.shadow)(this,"viewerPreferences",t)}get openAction(){const e=this._catDict.get("OpenAction"),t=Object.create(null);if(e instanceof n.Dict){const a=new n.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,i.shadow)(this,"openAction",(0,i.objectSize)(t)>0?t:null)}get attachments(){const e=this._catDict.get("Names");let t=null;if(e instanceof n.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,i.stringToPDFString)(e)]=a.serializable}}return(0,i.shadow)(this,"attachments",t)}get xfaImages(){const e=this._catDict.get("Names");let t=null;if(e instanceof n.Dict&&e.has("XFAImages")){const a=new s.NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,r]of a.getAll()){t||(t=new n.Dict(this.xref));t.set((0,i.stringToPDFString)(e),r)}}return(0,i.shadow)(this,"xfaImages",t)}_collectJavaScript(){const e=this._catDict.get("Names");let t=null;function appendIfJavaScriptDict(e,a){if(!(a instanceof n.Dict))return;if(!(0,n.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;r=(0,i.stringToPDFString)(r).replaceAll("\0","");(t||=new Map).set(e,r)}if(e instanceof n.Dict&&e.has("JavaScript")){const t=new s.NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,a]of t.getAll())appendIfJavaScriptDict((0,i.stringToPDFString)(e),a)}const a=this._catDict.get("OpenAction");a&&appendIfJavaScriptDict("OpenAction",a);return t}get javaScript(){const e=this._collectJavaScript();return(0,i.shadow)(this,"javaScript",e?[...e.values()]:null)}get jsActions(){const e=this._collectJavaScript();let t=(0,r.collectActions)(this.xref,this._catDict,i.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,i.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 n.RefSet,r=this._catDict.getRaw("Pages");r instanceof n.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 n.Ref){const h=o.get(r);if(h>=0&&l+h<=e){l+=h;continue}if(a.has(r))throw new i.FormatError("Pages tree contains circular reference.");a.put(r);const u=await s.fetchAsync(r);if(u instanceof n.Dict){let t=u.getRaw("Type");t instanceof n.Ref&&(t=await s.fetchAsync(t));if((0,n.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 n.Dict))throw new i.FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:h}=r;let u=r.getRaw("Count");u instanceof n.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 n.Ref&&(d=await s.fetchAsync(d));if(!Array.isArray(d)){let t=r.getRaw("Type");t instanceof n.Ref&&(t=await s.fetchAsync(t));if((0,n.isName)(t,"Page")||!r.has("Kids")){if(l===e)return[r,null];l++;continue}throw new i.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{ignoreErrors:t}=this.pdfManager.evaluatorOptions,a=[{currentNode:this.toplevelPagesDict,posInKids:0}],s=new n.RefSet,o=this._catDict.getRaw("Pages");o instanceof n.Ref&&s.put(o);const c=new Map,l=this.xref,h=this.pageIndexCache;let u=0;function addPageDict(e,t){t&&!h.has(t)&&h.put(t,u);c.set(u++,[e,t])}function addPageError(a){if(a instanceof r.XRefEntryException&&!e)throw a;if(e&&t&&0===u){(0,i.warn)(`getAllPageDicts - Skipping invalid first page: "${a}".`);a=n.Dict.empty}c.set(u++,[a,null])}for(;a.length>0;){const e=a.at(-1),{currentNode:t,posInKids:r}=e;let o=t.getRaw("Kids");if(o instanceof n.Ref)try{o=await l.fetchAsync(o)}catch(e){addPageError(e);break}if(!Array.isArray(o)){addPageError(new i.FormatError("Page dictionary kids object is not an array."));break}if(r>=o.length){a.pop();continue}const c=o[r];let h;if(c instanceof n.Ref){if(s.has(c)){addPageError(new i.FormatError("Pages tree contains circular reference."));break}s.put(c);try{h=await l.fetchAsync(c)}catch(e){addPageError(e);break}}else h=c;if(!(h instanceof n.Dict)){addPageError(new i.FormatError("Page dictionary kid reference points to wrong type of object."));break}let u=h.getRaw("Type");if(u instanceof n.Ref)try{u=await l.fetchAsync(u)}catch(e){addPageError(e);break}(0,n.isName)(u,"Page")||!h.has("Kids")?addPageDict(h,c instanceof n.Ref?c:null):a.push({currentNode:h,posInKids:0});e.posInKids++}return c}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,n.isRefsEqual)(t,e)&&!(0,n.isDict)(a,"Page")&&!(a instanceof n.Dict&&!a.has("Type")&&a.has("Contents")))throw new i.FormatError("The reference does not point to a /Page dictionary.");if(!a)return null;if(!(a instanceof n.Dict))throw new i.FormatError("Node must be a dictionary.");r=a.getRaw("Parent");return a.getAsync("Parent")})).then((function(e){if(!e)return null;if(!(e instanceof n.Dict))throw new i.FormatError("Parent must be a dictionary.");return e.getAsync("Kids")})).then((function(e){if(!e)return null;const o=[];let c=!1;for(const r of e){if(!(r instanceof n.Ref))throw new i.FormatError("Kid must be a reference.");if((0,n.isRefsEqual)(r,t)){c=!0;break}o.push(a.fetchAsync(r).then((function(e){if(!(e instanceof n.Dict))throw new i.FormatError("Kid node must be a dictionary.");e.has("Count")?s+=e.get("Count"):s++})))}if(!c)throw new i.FormatError("Kid reference not found in parent's kids.");return Promise.all(o).then((function(){return[s,r]}))}))}(t).then((t=>{if(!t){this.pageIndexCache.put(e,r);return r}const[a,i]=t;r+=a;return next(i)}));return next(e)}get baseUrl(){const e=this._catDict.get("URI");if(e instanceof n.Dict){const t=e.get("Base");if("string"==typeof t){const e=(0,i.createValidAbsoluteUrl)(t,null,{tryConvertEncoding:!0});if(e)return(0,i.shadow)(this,"baseUrl",e.href)}}return(0,i.shadow)(this,"baseUrl",null)}static parseDestDictionary(e){const t=e.destDict;if(!(t instanceof n.Dict)){(0,i.warn)("parseDestDictionary: `destDict` must be a dictionary.");return}const a=e.resultObj;if("object"!=typeof a){(0,i.warn)("parseDestDictionary: `resultObj` must be an object.");return}const s=e.docBaseUrl||null,c=e.docAttachments||null;let l,h,u=t.get("A");if(!(u instanceof n.Dict))if(t.has("Dest"))u=t.get("Dest");else{u=t.get("AA");u instanceof n.Dict&&(u.has("D")?u=u.get("D"):u.has("U")&&(u=u.get("U")))}if(u instanceof n.Dict){const e=u.get("S");if(!(e instanceof n.Name)){(0,i.warn)("parseDestDictionary: Invalid type in Action dictionary.");return}const t=e.name;switch(t){case"ResetForm":const e=u.get("Flags"),s=0==(1&("number"==typeof e?e:0)),d=[],f=[];for(const e of u.get("Fields")||[])e instanceof n.Ref?f.push(e.toString()):"string"==typeof e&&d.push((0,i.stringToPDFString)(e));a.resetForm={fields:d,refs:f,include:s};break;case"URI":l=u.get("URI");l instanceof n.Name&&(l="/"+l.name);break;case"GoTo":h=u.get("D");break;case"Launch":case"GoToR":const g=u.get("F");g instanceof n.Dict?l=g.get("F")||null:"string"==typeof g&&(l=g);let p=u.get("D");if(p){p instanceof n.Name&&(p=p.name);if("string"==typeof l){const e=l.split("#")[0];"string"==typeof p?l=e+"#"+p:Array.isArray(p)&&(l=e+"#"+JSON.stringify(p))}}const m=u.get("NewWindow");"boolean"==typeof m&&(a.newWindow=m);break;case"GoToE":const b=u.get("T");let y;if(c&&b instanceof n.Dict){const e=b.get("R"),t=b.get("N");(0,n.isName)(e,"C")&&"string"==typeof t&&(y=c[(0,i.stringToPDFString)(t)])}y?a.attachment=y:(0,i.warn)('parseDestDictionary - unimplemented "GoToE" action.');break;case"Named":const w=u.get("N");w instanceof n.Name&&(a.action=w.name);break;case"SetOCGState":const S=u.get("State"),x=u.get("PreserveRB");if(!Array.isArray(S)||0===S.length)break;const C=[];for(const e of S)if(e instanceof n.Name)switch(e.name){case"ON":case"OFF":case"Toggle":C.push(e.name)}else e instanceof n.Ref&&C.push(e.toString());if(C.length!==S.length)break;a.setOCGState={state:C,preserveRB:"boolean"!=typeof x||x};break;case"JavaScript":const k=u.get("JS");let v;k instanceof o.BaseStream?v=k.getString():"string"==typeof k&&(v=k);const F=v&&(0,r.recoverJsURL)((0,i.stringToPDFString)(v));if(F){l=F.url;a.newWindow=F.newWindow;break}default:if("JavaScript"===t||"SubmitForm"===t)break;(0,i.warn)(`parseDestDictionary - unsupported action: "${t}".`)}}else t.has("Dest")&&(h=t.get("Dest"));if("string"==typeof l){const e=(0,i.createValidAbsoluteUrl)(l,s,{addDefaultProtocol:!0,tryConvertEncoding:!0});e&&(a.url=e.href);a.unsafeUrl=l}if(h){h instanceof n.Name&&(h=h.name);"string"==typeof h?a.dest=(0,i.stringToPDFString)(h):Array.isArray(h)&&(a.dest=h)}}}t.Catalog=Catalog},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.NumberTree=t.NameTree=void 0;var r=a(4),i=a(2);class NameOrNumberTree{constructor(e,t,a){this.constructor===NameOrNumberTree&&(0,i.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 n=[this.root];for(;n.length>0;){const s=t.fetchIfRef(n.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 i.FormatError(`Duplicate entry in "${this._type}" tree.`);n.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,i.warn)(`Search depth limit reached for "${this._type}" tree.`);return null}const n=a.get("Kids");if(!Array.isArray(n))return null;let s=0,o=n.length-1;for(;s<=o;){const r=s+o>>1,i=t.fetchIfRef(n[r]),c=i.get("Limits");if(et.fetchIfRef(c[1]))){a=i;break}s=r+1}}if(s>o)return null}const n=a.get(this._type);if(Array.isArray(n)){let a=0,r=n.length-2;for(;a<=r;){const i=a+r>>1,s=i+(1&i),o=t.fetchIfRef(n[s]);if(eo))return t.fetchIfRef(n[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,i.clearUnicodeCaches)()};var r=a(4),i=a(40)},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.FileSpec=void 0;var r=a(2),i=a(5),n=a(4);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 n.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).replaceAll("\\\\","\\").replaceAll("\\/","/").replaceAll("\\","/")}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 i.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(/^[^<]+/,"").replaceAll(/>\\376\\377([^<]+)/g,(function(e,t){const a=t.replaceAll(/\\([0-3])([0-7])([0-7])/g,(function(e,t,a,r){return String.fromCharCode(64*t+8*a+1*r)})).replaceAll(/&(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(4),i=a(2),n=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 i=a.getRaw("Pg");i instanceof r.Ref&&(e=i.toString());const n=a.get("Type")instanceof r.Name?a.get("Type").name:null;return"MCR"===n?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"===n?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:i=null}){this.type=e;this.dict=t;this.mcid=a;this.pageObjId=r;this.refObjId=i;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 n.NumberTree(e,this.rootDict.xref).get(t);if(!Array.isArray(a))return;const i=new Map;for(const e of a)e instanceof r.Ref&&this.addNode(this.rootDict.xref.fetch(e),i)}addNode(e,t,a=0){if(a>40){(0,i.warn)("StructTree MAX_DEPTH reached.");return null}if(t.has(e))return t.get(e);const n=new StructElementNode(this,e);t.set(e,n);const s=e.get("P");if(!s||(0,r.isName)(s.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,n)||t.delete(e);return n}const o=this.addNode(s,t,a+1);if(!o)return n;let c=!1;for(const t of o.kids)if(t.type===l&&t.dict===e){t.parentNode=n;c=!0}c||t.delete(e);return n}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 i=!1;for(let r=0;r40){(0,i.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 n=e.dict.get("Alt");"string"==typeof n&&(r.alt=(0,i.stringToPDFString)(n));const h=e.dict.get("Lang");"string"==typeof h&&(r.lang=(0,i.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(4),i=a(5),n=a(3),s=a(2);function addChildren(e,t){if(e instanceof r.Dict)e=e.getRawValues();else if(e instanceof i.BaseStream)e=e.dict.getRawValues();else if(!Array.isArray(e))return;for(const n of e)((a=n)instanceof r.Ref||a instanceof r.Dict||a instanceof i.BaseStream||Array.isArray(a))&&t.push(n);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(const r of e){const e=t.getRaw(r);void 0!==e&&a.push(e)}return this._walk(a)}async _walk(e){const t=[],a=[];for(;e.length;){let o=e.pop();if(o instanceof r.Ref){if(this.refSet.has(o))continue;try{this.refSet.put(o);o=this.xref.fetch(o)}catch(e){if(!(e instanceof n.MissingDataException)){(0,s.warn)(`ObjectLoader._walk - requesting all data: "${e}".`);this.refSet=null;const{manager:t}=this.xref.stream;return t.requestAllChunks()}t.push(o);a.push({begin:e.begin,end:e.end})}}if(o instanceof i.BaseStream){const e=o.getBaseStreams();if(e){let r=!1;for(const t of e)if(!t.isDataLoaded){r=!0;a.push({begin:t.start,end:t.end})}r&&t.push(o)}}addChildren(o,e)}if(a.length){await this.xref.stream.manager.requestRanges(a);for(const e of t)e instanceof r.Ref&&this.refSet.remove(e);return this._walk(t)}this.refSet=null}}},(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});t.XFAFactory=void 0;var r=a(77),i=a(81),n=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 i.Binder(this.root);this.form=t.bind();this.dataHandler=new n.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:i}=a,{attributes:n}=i;if(n){n.class&&(n.class=n.class.filter((e=>!e.startsWith("xfa"))));n.dir="auto"}return{html:i,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),i=a(2),n=a(3),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 C=Symbol();t.$flushHTML=C;const k=Symbol();t.$getAttributeIt=k;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 _=Symbol();t.$getNextPage=_;const $=Symbol();t.$getSubformParent=$;const j=Symbol();t.$getParent=j;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 J=Symbol();t.$isDescendent=J;const Y=Symbol();t.$isNsAgnostic=Y;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 ie=Symbol("nodeName");t.$nodeName=ie;const ne=Symbol();t.$nsAttributes=ne;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 Ce=Symbol();t.$toString=Ce;const ke=Symbol();t.$toStyle=ke;const ve=Symbol("uid");t.$uid=ve;const Fe=Symbol(),Oe=Symbol(),Ie=Symbol(),Te=Symbol("_children"),Me=Symbol(),Pe=Symbol(),Ee=Symbol(),De=Symbol(),Be=Symbol(),Ne=Symbol(),Re=Symbol(),Le=Symbol(),_e=Symbol(),$e=Symbol("parent"),je=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[ie]=t;this[Re]=a;this[$e]=null;this[Te]=[];this[ve]=`${t}${He++}`;this[X]=null}[se](e){if(!this[Re]||!this[oe](e))return!1;const t=e[ie],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,i.warn)(`XFA - node "${this[ie]}"${r} has already enough "${t}"!`);return!1}[oe](e){return this.hasOwnProperty(e[ie])&&e[re]===this[re]}[Y](){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[Te].push(e);!e[X]&&this[X]&&(e[X]=this[X])}[de](e){const t=this[Te].indexOf(e);this[Te].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[Te].indexOf(e)}[W](e,t){t[$e]=this;this[Te].splice(e,0,t);!t[X]&&this[X]&&(t[X]=this[X])}[ee](){return!this.name}[ae](){return""}[Se](){return 0===this[Te].length?this[b]:this[Te].map((e=>e[Se]())).join("")}get[Ie](){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,i.shadow)(this,Ie,e._attributes)}[J](e){let t=this;for(;t;){if(t===e)return!0;t=t[j]()}return!1}[j](){return this[$e]}[$](){return this[j]()}[R](e=null){return e?this[e]:this[Te]}[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}[ke](){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[ie])){const e=this[F](),t=a[Ae](e);t.success||(this[S].failingNode=a);yield t}}[C](){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))}[Ne](e){const t=this[Ie],a=this[Ue];return[...e].filter((e=>t.has(e)&&!a.has(e)))}[ge](e,t=new Set){for(const a of this[Te])a[je](e,t)}[je](e,t){const a=this[Be](e,t);a?this[Fe](a,e,t):this[ge](e,t)}[Be](e,t){const{use:a,usehref:r}=this;if(!a&&!r)return null;let n=null,s=null,c=null,l=a;if(r){l=r;r.startsWith("#som(")&&r.endsWith(")")?s=r.slice(5,-1):r.startsWith(".#som(")&&r.endsWith(")")?s=r.slice(6,-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)n=e.get(c);else{n=(0,o.searchNode)(e.get(fe),this,s,!0,!1);n&&(n=n[0])}if(!n){(0,i.warn)(`XFA - Invalid prototype reference: ${l}.`);return null}if(n[ie]!==this[ie]){(0,i.warn)(`XFA - Incompatible prototype: ${n[ie]} !== ${this[ie]}.`);return null}if(t.has(n)){(0,i.warn)("XFA - Cycle detected in prototypes use.");return null}t.add(n);const h=n[Be](e,t);h&&n[Fe](h,e,t);n[ge](e,t);t.delete(n);return n}[Fe](e,t,a){if(a.has(e)){(0,i.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[Ne](e[Ue])){this[t]=e[t];this[Ue]&&this[Ue].add(t)}for(const r of Object.getOwnPropertyNames(this)){if(this[Ie].has(r))continue;const i=this[r],n=e[r];if(i instanceof XFAObjectArray){for(const e of i[Te])e[je](t,a);for(let r=i[Te].length,s=n[Te].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,i.shadow)(e,t,this[t])}e[ve]=`${e[ie]}${He++}`;e[Te]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[Ie].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[Te]){const a=t[ie],r=t[p]();e[Te].push(r);r[$e]=e;null===e[a]?e[a]=r:e[a][Te].push(r)}return e}[R](e=null){return e?this[Te].filter((t=>t[ie]===e)):this[Te]}[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[Te]){a[ie]===e&&(yield a);a.name===e&&(yield a);(t||a[ee]())&&(yield*a[M](e,t,!1))}a&&this[Ie].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[Te]=[]}push(e){if(this[Te].length<=this[Le]){this[Te].push(e);return!0}(0,i.warn)(`XFA - node "${e[ie]}" accepts no more than ${this[Le]} children`);return!1}isEmpty(){return 0===this[Te].length}dump(){return 1===this[Te].length?this[Te][0][w]():this[Te].map((e=>e[w]()))}[p](){const e=new XFAObjectArray(this[Le]);e[Te]=this[Te].map((e=>e[p]()));return e}get children(){return this[Te]}clear(){this[Te].length=0}}t.XFAObjectArray=XFAObjectArray;class XFAAttribute{constructor(e,t,a){this[$e]=e;this[ie]=t;this[b]=a;this[m]=!1;this[ve]="attribute"+He++}[j](){return this[$e]}[K](){return!0}[E](){return this[b].trim()}[ye](e){e=e.value||"";this[b]=e.toString()}[Se](){return this[b]}[J](e){return this[$e]===e||this[$e][J](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(ne)){const e=a[ne].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[Pe]=!1:"dataValue"===e&&(this[Pe]=!0))}}this[m]=!1}[Ce](e){const t=this[ie];if("#text"===t){e.push((0,n.encodeToXmlString)(this[b]));return}const a=(0,i.utf8StringToString)(t),r=this[re]===qe?"xfa:":"";e.push(`<${r}${a}`);for(const[t,a]of this[Oe].entries()){const r=(0,i.utf8StringToString)(t);e.push(` ${r}="${(0,n.encodeToXmlString)(a[b])}"`)}null!==this[Pe]&&(this[Pe]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[b]||0!==this[Te].length){e.push(">");if(this[b])"string"==typeof this[b]?e.push((0,n.encodeToXmlString)(this[b])):this[b][Ce](e);else for(const t of this[Te])t[Ce](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[Te].length>0){const e=new XmlObject(this[re],"#text");this[h](e);e[b]=this[b];delete this[b]}}[Ae](){return"#text"===this[ie]?r.HTMLResult.success({name:"#text",value:this[b]}):r.HTMLResult.EMPTY}[R](e=null){return e?this[Te].filter((t=>t[ie]===e)):this[Te]}[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[Te]){a[ie]===e&&(yield a);t&&(yield*a[M](e,t))}}*[k](e,t){const a=this[Oe].get(e);!a||t&&a[m]||(yield a);for(const a of this[Te])yield*a[k](e,t)}*[N](e,t,a){for(const r of this[Te]){r[ie]!==e||a&&r[m]||(yield r);t&&(yield*r[N](e,t,a))}}[K](){return null===this[Pe]?0===this[Te].length||this[Te][0][re]===s.NamespaceIds.xhtml.id:this[Pe]}[E](){return null===this[Pe]?0===this[Te].length?this[b].trim():this[Te][0][re]===s.NamespaceIds.xhtml.id?this[Te][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[ie];t.children=[];for(const a of this[Te])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[_e]=a}[x](){this[b]=(0,r.getKeyword)({data:this[b],defaultValue:this[_e][0],validate:e=>this[_e].includes(e)})}[d](e){super[d](e);delete this[_e]}};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,i,n,s]=a;return{x:r,y:i,width:n,height:s}};t.getColor=function getColor(e,t=[0,0,0]){let[a,r,i]=t;if(!e)return{r:a,g:r,b:i};const n=e.trim().split(/\s*,\s*/).map((e=>Math.min(Math.max(0,parseInt(e.trim(),10)),255))).map((e=>isNaN(e)?0:e));if(n.length<3)return{r:a,g:r,b:i};[a,r,i]=n;return{r:a,g:r,b:i}};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,-1);return e};var r=a(2);const i={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},n=/([+-]?\d+\.?\d*)(.*)/;function getKeyword({data:e,defaultValue:t,validate:a}){return e&&a(e=e.trim())?e:t}function getMeasurement(e,t="0"){t||="0";if(!e)return getMeasurement(t);const a=e.trim().match(n);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=i[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 i=parseExpression(a);if(!i)return null;if(i.some((e=>e.operator===c.dotDot)))return null;const s=l.get(i[0].name);let o=0;if(s){e=s(e,t);o=1}else e=t||e;for(let t=i.length;o0&&f.push(e)}if(0!==f.length||u||0!==d)e=isFinite(l)?f.filter((e=>le[l])):f.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),i=a(79),n=a(2);const s=/^[^.[]+/,o=/^[^\]]+/,c={dot:0,dotDot:1,dotHash:2,dotBracket:3,dotParen:4},l=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]]),h=new WeakMap,u=i.NamespaceIds.datasets.id;function parseExpression(e,t,a=!0){let r=e.match(s);if(!r)return null;let[i]=r;const l=[{name:i,cacheName:"."+i,index:0,js:null,formCalc:null,operator:c.dot}];let h=i.length;for(;h{Object.defineProperty(t,"__esModule",{value:!0});t.Binder=void 0;var r=a(77),i=a(82),n=a(80),s=a(79),o=a(2);const c=s.NamespaceIds.datasets.id;function createText(e){const t=new i.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 i.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,i){if(!e)return null;let n,o;for(let i=0;i<3;i++){n=a[r.$getRealChildrenByNameIt](e,!1,!0);for(;;){o=n.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(!i)return null;n=this.data[r.$getRealChildrenByNameIt](e,!0,!1);o=n.next().value;if(o)return o;n=this.data[r.$getAttributeIt](e,!0);o=n.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,n.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,n.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 i.SetProperty||f instanceof i.SetProperty){(0,o.warn)("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(d instanceof i.BindItems||f instanceof i.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 i.Items({}),s=new i.Items({});e[r.$appendChild](a);e.items.push(a);e[r.$appendChild](s);e.items.push(s);for(const{ref:i,labelRef:c,valueRef:l,connection:h}of e.bindItems.children){if(h)continue;if(!i)continue;const e=(0,n.searchNode)(this.root,t,i,!1,!1);if(e)for(const t of e){if(!t[r.$isDescendent](this.datasets)){(0,o.warn)(`XFA - Invalid ref (${i}): must be a datasets child.`);continue}const e=(0,n.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,n.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: ${i}.`)}}_bindOccurrences(e,t,a){let i;if(t.length>1){i=e[r.$clone]();i[r.$removeChild](i.occur);i.occur=null}this._bindValue(e,t[0],a);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const n=e[r.$getParent](),s=e[r.$nodeName],o=n[r.$indexOf](e);for(let e=1,c=t.length;et.name===e.name)).length:a[i].children.length;const s=a[r.$indexOf](e)+1,o=t.initial-n;if(o){const t=e[r.$clone]();t[r.$removeChild](t.occur);t.occur=null;a[i].push(t);a[r.$insertAt](s,t);for(let e=1;e0)this._bindOccurrences(i,[e[0]],null);else if(this.emptyMerge){const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId],a=i[r.$data]=new r.XmlObject(e,i.name||"root");t[r.$appendChild](a);this._bindElement(i,a)}continue}if(!i[r.$isBindable]())continue;let e=!1,s=null,l=null,h=null;if(i.bind){switch(i.bind.match){case"none":this._setAndBind(i,t);continue;case"global":e=!0;break;case"dataRef":if(!i.bind.ref){(0,o.warn)(`XFA - ref is empty in node ${i[r.$nodeName]}.`);this._setAndBind(i,t);continue}l=i.bind.ref}i.bind.picture&&(s=i.bind.picture[r.$content])}const[u,d]=this._getOccurInfo(i);if(l){h=(0,n.searchNode)(this.root,t,l,!0,!1);if(null===h){h=(0,n.createDataNode)(this.data,t,l);if(!h)continue;this._isConsumeData()&&(h[r.$consumed]=!0);this._setAndBind(i,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(!i.name){this._setAndBind(i,t);continue}if(this._isConsumeData()){const a=[];for(;a.length0?a:null}else{h=t[r.$getRealChildrenByNameIt](i.name,!1,this.emptyMerge).next().value;if(!h){if(0===u){a.push(i);continue}const e=t[r.$namespaceId]===c?-1:t[r.$namespaceId];h=i[r.$data]=new r.XmlObject(e,i.name);this.emptyMerge&&(h[r.$consumed]=!0);t[r.$appendChild](h);this._setAndBind(i,h);continue}this.emptyMerge&&(h[r.$consumed]=!0);h=[h]}}h?this._bindOccurrences(i,h,s):u>0?this._setAndBind(i,t):a.push(i)}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),i=a(79),n=a(83),s=a(84),o=a(78),c=a(2),l=a(85),h=a(3),u=a(80);const d=i.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 i=a[r.$searchNode](t.ref,e);if(!i)return;e=i[0]}}function applyAssist(e,t){const a=e.assist;if(a){const e=a[r.$toHTML]();e&&(t.title=e);const i=a.role.match(g);if(i){const e="heading",a=i[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:i,currentContentArea:n}=t[r.$extra];if("pageArea"===e.targetType){a instanceof PageArea||(a=null);if(e.startNew){e[r.$extra].target=a||i;return!0}if(a&&a!==i){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(n),r=e.indexOf(a);-1!==t&&te;i[r.$extra].noLayoutFailure=!0;const o=t[r.$toHTML](a);e[r.$addHTML](o.html,o.bbox);i[r.$extra].noLayoutFailure=n;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 i;const n={xmlns:f,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)i={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))];i={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(n,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const c={name:"svg",children:[i],attributes:n};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,i,n,s]=t;this[r.$extra].width=Math.max(this[r.$extra].width,a+n);this[r.$extra].height=Math.max(this[r.$extra].height,i+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 i=[];this[r.$extra]={children:i,width:0,height:0,availableSpace:e};const n=this[r.$childrenToHTML]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!n.success){if(n.isBreak())return n;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:i},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 i=(0,s.fixURL)(t.url);i&&a.children.push({name:"a",attributes:{id:"link"+this[r.$uid],href:i,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 i=[];"string"==typeof t?i.push({name:"#text",value:t}):i.push(t);const n=(0,s.toStyle)(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(n.width=(0,s.measureToString)(this.reserve));break;case"top":case"bottom":this.reserve>0&&(n.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:n,class:["xfaCaption"]},children:i})}}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 i,n,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];i="radio";n="xfaRadio";p=f[r.$data]&&f[r.$data][r.$uid]||f[r.$uid]}else{i="checkbox";n="xfaCheckbox";p=l[r.$data]&&l[r.$data][r.$uid]||l[r.$uid]}const m={name:"input",attributes:{class:[n],style:t,fieldId:g,dataId:p,type:i,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](),i={fontSize:`calc(${a.font&&a.font.size||10}px * var(--scale-factor))`},n=[];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](),i={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)){i.attributes["aria-required"]=!0;i.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[i]})}}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:i,h:c,isBroken:l}=(0,s.layoutNode)(this,e);if(i&&""===this.w){if(l&&this[r.$getSubformParent]()[r.$isThereMoreWidth]()){this[r.$popPara]();return o.HTMLResult.FAILURE}this.w=i}c&&""===this.h&&(this.h=c);setFirstUnsplittable(this);if(!(0,n.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]===i.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,n.flushHTML)(this)}[r.$addHTML](e,t){(0,n.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,n.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 i=this[r.$isSplittable]();i||setFirstUnsplittable(this);if(!(0,n.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,i=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,i=0,n=0;if(this.ui.checkButton)i=n=this.ui.checkButton.size;else{const{w:t,h:a}=(0,s.layoutNode)(this,e);if(null!==t){i=t;n=a}else n=(0,l.getMetrics)(this.font,!0).lineNoGap}u=getBorderDims(this.ui[r.$getExtra]());i+=u.w;n+=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+=i;break;case"top":case"bottom":a+=n}}else{t=i;a=n}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 i=this[r.$getParent]();return o.HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:a,src:URL.createObjectURL(t),alt:i?ariaLabel(i[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](),i=Object.create(null),n="visible"===t.presence?t.thickness:0;i.strokeWidth=(0,s.measureToString)(n);i.stroke=a.color;let c,l,h,u,d="100%",g="100%";if(e.w<=n){[c,l,h,u]=["50%",0,"50%","100%"];d=i.strokeWidth}else if(e.h<=n){[c,l,h,u]=[0,"50%","100%","50%"];g=i.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:i}}],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](),i={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)){i.attributes["aria-required"]=!0;i.attributes.required=!0}return o.HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[i]})}}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(i)return i;i=this.pageArea.children.find((e=>"any"===e.oddOrEven&&e.pagePosition===a));if(i)return i;i=this.pageArea.children.find((e=>"any"===e.oddOrEven&&"any"===e.pagePosition));return i||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",i=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${a}(to top,${i}) ${a}(to right,${i})`;case"crossDiagonal":return`${a}(45deg,${i}) ${a}(-45deg,${i})`;case"diagonalLeft":return`${a}(45deg,${i})`;case"diagonalRight":return`${a}(-45deg,${i})`;case"horizontal":return`${a}(to top,${i})`;case"vertical":return`${a}(to right,${i})`}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 i=(this.corner.children.length?this.corner.children[0]:new Corner({}))[r.$toStyle](),n={name:"svg",children:[{name:"rect",attributes:{xmlns:f,width:"100%",height:"100%",x:0,y:0,rx:i.radius,ry:i.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:[n]});n.attributes.style.position="absolute";return o.HTMLResult.success(n)}}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,n.flushHTML)(this)}[r.$addHTML](e,t){(0,n.addHTML)(this,e,t)}[r.$getAvailableSpace](){return(0,n.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 i=this[r.$getTemplateRoot](),l=i[r.$extra].noLayoutFailure,h=this[r.$isSplittable]();h||setFirstUnsplittable(this);if(!(0,n.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=k;return o.HTMLResult.breakNode(e)}}delete this[r.$extra];return k}}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 i=null,n=null,s=null;if(e.breakBefore.children.length>=1){n=e.breakBefore.children[0];s=n.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){n=e.subform.children[0].breakBefore.children[0];s=n.target}else if(e.break&&e.break.beforeTarget){n=e.break;s=n.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break&&e.subform.children[0].break.beforeTarget){n=e.subform.children[0].break;s=n.beforeTarget}if(n){const e=this[r.$searchNode](s,n[r.$getParent]());if(e instanceof PageArea){i=e;n[r.$extra]={}}}i||(i=t[0]);i[r.$extra]={numberOfUse:1};const l=i[r.$getParent]();l[r.$extra]={numberOfUse:1,pageIndex:l.pageArea.children.indexOf(i),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=i;const t=i[r.$toHTML]().html;a.children.push(t);if(u){this[r.$extra].noLayoutFailure=!0;t.children.push(u[r.$toHTML](i[r.$extra].space).html);u=null}if(d){this[r.$extra].noLayoutFailure=!0;t.children.push(d[r.$toHTML](i[r.$extra].space).html);d=null}const n=i.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||=!!a.children&&0!==a.children.length;s[t].children.push(a)}};for(let t=p,i=n.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](),i=a.target;a.addLeader=null!==a.leader;a.addTrailer=null!==a.trailer;flush(t);const s=t;t=1/0;if(i instanceof PageArea)h=i;else if(i instanceof ContentArea){const e=n.indexOf(i);if(-1!==e)e>s?t=e-1:p=e;else{h=i[r.$getParent]();p=h.contentArea.children.indexOf(i)}}}else flush(t)}this[r.$extra].pageNumber+=1;h&&(h[r.$isUsable]()?h[r.$extra].numberOfUse+=1:h=null);i=h||i[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]===i.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].replaceAll("\r\n","\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 i=this[r.$getParent]()[r.$getParent]();""===this.multiLine&&(this.multiLine=i instanceof Draw?1:0);a=1===this.multiLine?{name:"textarea",attributes:{dataId:i[r.$data]&&i[r.$data][r.$uid]||i[r.$uid],fieldId:i[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:i[r.$data]&&i[r.$data][r.$uid]||i[r.$uid],fieldId:i[r.$uid],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}};if(isRequired(i)){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[i.$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 n=e[r.$extra],s=n.availableSpace,[o,c,l,h]=a;switch(e.layout){case"position":n.width=Math.max(n.width,o+l);n.height=Math.max(n.height,c+h);n.children.push(t);break;case"lr-tb":case"rl-tb":if(!n.line||1===n.attempt){n.line=createLine(e,[]);n.children.push(n.line);n.numberInLine=0}n.numberInLine+=1;n.line.children.push(t);if(0===n.attempt){n.currentWidth+=l;n.height=Math.max(n.height,n.prevHeight+h)}else{n.currentWidth=l;n.prevHeight=n.height;n.height+=h;n.attempt=0}n.width=Math.max(n.width,n.currentWidth);break;case"rl-row":case"row":{n.children.push(t);n.width+=l;n.height=Math.max(n.height,h);const e=(0,i.measureToString)(n.height);for(const t of n.children)t.attributes.style.height=e;break}case"table":case"tb":n.width=Math.min(s.width,Math.max(n.width,l));n.height+=h;n.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](),i=a[r.$extra]&&a[r.$extra].attempt||0,[,n,s,o]=function getTransformedBBox(e){let t,a,r=""===e.w?NaN:e.w,i=""===e.h?NaN:e.h,[n,s]=[0,0];switch(e.anchorType||""){case"bottomCenter":[n,s]=[r/2,i];break;case"bottomLeft":[n,s]=[0,i];break;case"bottomRight":[n,s]=[r,i];break;case"middleCenter":[n,s]=[r/2,i/2];break;case"middleLeft":[n,s]=[0,i/2];break;case"middleRight":[n,s]=[r,i/2];break;case"topCenter":[n,s]=[r/2,0];break;case"topRight":[n,s]=[r,0]}switch(e.rotate||0){case 0:[t,a]=[-n,-s];break;case 90:[t,a]=[-s,n];[r,i]=[i,-r];break;case 180:[t,a]=[n,s];[r,i]=[-r,-i];break;case 270:[t,a]=[s,-n];[r,i]=[-i,r]}return[e.x+t+Math.min(0,r),e.y+a+Math.min(0,i),Math.abs(r),Math.abs(i)]}(e);switch(a.layout){case"lr-tb":case"rl-tb":return 0===i?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+n-t.height)<=2)return!0;return o+n>e[r.$getTemplateRoot]()[r.$extra].currentContentArea.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,i=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-i-e[r.$extra].currentWidth,height:t.height-a-e[r.$extra].prevHeight}:{width:t.width-i,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-i};case"table":case"tb":return{width:t.width-i,height:t.height-a-e[r.$extra].height};default:return t}};var r=a(77),i=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 i;if(""!==e.w&&""!==e.h)i=[e.x,e.y,e.w,e.h];else{if(!a)return null;let n=e.w;if(""===n){if(0===e.maxW){const t=e[r.$getSubformParent]();n="position"===t.layout&&""!==t.w?0:e.minW}else n=Math.min(e.maxW,a.width);t.attributes.style.width=measureToString(n)}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)}i=[e.x,e.y,n,s]}return i};t.createWrapper=function createWrapper(e,t){const{attributes:a}=t,{style:i}=a,n={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!==i[e]){g.attributes.style[e]=i[e];delete i[e]}n.children.push(g,t)}else n.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==i[e]){n.attributes.style[e]=i[e];delete i[e]}"absolute"===i.position?n.attributes.style.position="absolute":n.attributes.style.position="relative";delete i.position;if(i.alignSelf){n.attributes.style.alignSelf=i.alignSelf;delete i.alignSelf}return n};t.fixDimensions=function fixDimensions(e){const t=e[r.$getSubformParent]();if(t.layout&&t.layout.includes("row")){const a=t[r.$extra],i=e.colSpan;let n;n=-1===i?a.columnWidths.slice(a.currentColumn).reduce(((e,t)=>e+t),0):a.columnWidths.slice(a.currentColumn,a.currentColumn+i).reduce(((e,t)=>e+t),0);isNaN(n)||(e.w=n)}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,n.getMeasurement)(e.textIndent,"0px");if(t>=0)return;const a="padding"+("left"==("right"===e.textAlign?"right":"left")?"Left":"Right"),r=(0,n.getMeasurement)(e[a],"0px");e[a]=r-t+"px"};t.fixURL=function fixURL(e){const t=(0,i.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,i=null,n=!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);i=t.width;a=t.height;n=t.isBroken}else{const t=e.value[r.$text]();if(t){const e=layoutText(t,h,l,c,d,u);i=e.width;a=e.height;n=e.isBroken}}null===i||e.w||(i+=s);null===a||e.h||(a+=o)}return{w:i,h:a,isBroken:n}};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 i=(0,n.stripQuotes)(e.typeface);r.fontFamily=`"${i}"`;const o=a.find(i);if(o){const{fontFamily:a}=o.regular.cssFontInfo;a!==i&&(r.fontFamily=`"${a}"`);const n=getCurrentPara(t);if(n&&""!==n.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 i=getCurrentPara(e);if(i){const e=a.attributes.style;e.display="flex";e.flexDirection="column";switch(i.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=i[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 n of t){const t=e[n];if(null!==t)if(c.hasOwnProperty(n))c[n](e,a);else if(t instanceof r.XFAObject){const e=t[r.$toStyle]();e?Object.assign(a,e):(0,i.warn)(`(DEBUG) - XFA - style for ${n} not implemented yet`)}}return a};var r=a(77),i=a(2),n=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 i=e.w;const n=e.h;if(a.layout&&a.layout.includes("row")){const t=a[r.$extra],n=e.colSpan;let s;if(-1===n){s=t.columnWidths.slice(t.currentColumn).reduce(((e,t)=>e+t),0);t.currentColumn=0}else{s=t.columnWidths.slice(t.currentColumn,t.currentColumn+n).reduce(((e,t)=>e+t),0);t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(s)||(i=e.w=s)}t.width=""!==i?measureToString(i):"auto";t.height=""!==n?measureToString(n):"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,i,n,s){const c=new o.TextMeasure(t,a,i,n);"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,i.stripQuotes)(e.typeface),n=e[r.$globalData].fontFinder.find(t);a=selectFont(e,n)}if(!a)return{lineHeight:12,lineGap:2,lineNoGap:10};const n=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*n,lineGap:o*n,lineNoGap:Math.max(1,s-o)*n}};t.selectFont=selectFont;var r=a(77),i=a(78),n=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 i="";const n=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?i=n>=700?"bolditalic":"italic":n>=700&&(i="bold");if(!i){(e.name.includes("Bold")||e.psName&&e.psName.includes("Bold"))&&(i="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName&&(e.psName.includes("Italic")||e.psName.endsWith("It")))&&(i+="italic")}i||(i="regular");r[i]=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 i=e.replaceAll(r,"");a=this.fonts.get(i);if(a){this.cache.set(e,a);return a}i=i.toLowerCase();const s=[];for(const[e,t]of this.fonts.entries())e.replaceAll(r,"").toLowerCase().startsWith(i)&&s.push(t);if(0===s.length)for(const[,e]of this.fonts.entries())e.regular.name&&e.regular.name.replaceAll(r,"").toLowerCase().startsWith(i)&&s.push(e);if(0===s.length){i=i.replaceAll(/psmt|mt/gi,"");for(const[e,t]of this.fonts.entries())e.replaceAll(r,"").toLowerCase().startsWith(i)&&s.push(t)}if(0===s.length)for(const e of this.fonts.values())e.regular.name&&e.regular.name.replaceAll(r,"").toLowerCase().startsWith(i)&&s.push(e);if(s.length>=1){1!==s.length&&t&&(0,n.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,n.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,i){this.lineHeight=a;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(i);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const n=i.find(e.typeface);if(n){this.pdfFont=(0,r.selectFont)(e,n);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(i))}else[this.pdfFont,this.xfaFont]=this.defaultFont(i)}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 i=new FontInfo(e,t,a||r.lineHeight,this.fontFinder);i.pdfFont||(i.pdfFont=r.pdfFont);this.stack.push(i)}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,i=t.pdfFont,n=i.lineHeight||1.2,s=t.lineHeight||Math.max(1.2,n)*a,o=n-(void 0===i.lineGap?.2:i.lineGap),c=Math.max(1,o)*a,l=a/1e3,h=i.defaultWidth||i.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=i.encodeString(t).join(""),a=i.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,i=0,n=0,s=0,o=!1,c=!0;for(let l=0,h=this.glyphs.length;le){r=Math.max(r,n);n=0;i+=s;s=m;t=-1;a=0;o=!0;c=!1}else{s=Math.max(m,s);a=n;n+=h;t=l}else if(n+h>e){i+=s;s=m;if(-1!==t){l=t;r=Math.max(r,a);n=0;t=-1;a=0}else{r=Math.max(r,n);n=h}o=!0;c=!1}else{n+=h;s=Math.max(m,s)}}r=Math.max(r,n);i+=s+this.extraHeight;return{width:1.02*r,height:i,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),[i,n]=a;if(i+1===n.length){t.pop();continue}const s=n[++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),i=a(66),n=a(89),s=a(2);class XFAParser extends i.XMLParserBase{constructor(e=null,t=!1){super();this._builder=new n.Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=i.XMLParserErrorCode.NoError;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===i.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,i=null;const n=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(6);i||(i=[]);i.push({prefix:e,value:c})}else{const e=o.indexOf(":");if(-1===e)n[o]=c;else{let t=n[r.$nsAttributes];t||(t=n[r.$nsAttributes]=Object.create(null));const[a,i]=[o.slice(0,e),o.slice(e+1)];(t[a]||=Object.create(null))[i]=c}}return[a,i,n]}_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[i,n,s]=this._mkAttributes(t,e),[o,c]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),l=this._builder.build({nsPrefix:c,name:o,attributes:s,namespace:i,prefixes:n});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),i=a(77),n=a(90),s=a(82),o=a(99),c=a(2);class Root extends i.XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[i.$ids]=e}[i.$onChild](e){this.element=e;return!0}[i.$finalize](){super[i.$finalize]();if(this.element.template instanceof s.Template){this[i.$ids].set(i.$root,this.element);this.element.template[i.$resolvePrototypes](this[i.$ids]);this.element.template[i.$ids]=this[i.$ids]}}}class Empty extends i.XFAObject{constructor(){super(-1,"",Object.create(null))}[i.$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(i.$nsAttributes)){const e=n.NamespaceSetUp.datasets,t=a[i.$nsAttributes];let r=null;for(const[a,i]of Object.entries(t)){if(this._getNamespaceToUse(a)===e){r={xfa:i};break}}r?a[i.$nsAttributes]=r:delete a[i.$nsAttributes]}const l=this._getNamespaceToUse(e),h=l&&l[r.$buildXFAObject](t,a)||new Empty;h[i.$isNsAgnostic]()&&this._nsAgnosticLevel++;(c||o||h[i.$isNsAgnostic]())&&(h[i.$cleanup]={hasNamespace:c,prefixes:o,nsAgnostic:h[i.$isNsAgnostic]()});return h}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[a,{check:i}]of Object.entries(r.NamespaceIds))if(i(e)){t=n.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),i=a(92),n=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:i.ConnectionSetNamespace,datasets:n.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),i=a(77),n=a(78),s=a(2);const o=r.NamespaceIds.config.id;class Acrobat extends i.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 i.XFAObjectArray}}class Acrobat7 extends i.XFAObject{constructor(e){super(o,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends i.OptionObject{constructor(e){super(o,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends i.OptionObject{constructor(e){super(o,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends i.Option01{constructor(e){super(o,"addSilentPrint")}}class AddViewerPreferences extends i.Option01{constructor(e){super(o,"addViewerPreferences")}}class AdjustData extends i.Option10{constructor(e){super(o,"adjustData")}}class AdobeExtensionLevel extends i.IntegerObject{constructor(e){super(o,"adobeExtensionLevel",0,(e=>e>=1&&e<=8))}}class Agent extends i.XFAObject{constructor(e){super(o,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new i.XFAObjectArray}}class AlwaysEmbed extends i.ContentObject{constructor(e){super(o,"alwaysEmbed")}}class Amd extends i.StringObject{constructor(e){super(o,"amd")}}class Area extends i.XFAObject{constructor(e){super(o,"area");this.level=(0,n.getInteger)({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=(0,n.getStringOption)(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends i.OptionObject{constructor(e){super(o,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends i.OptionObject{constructor(e){super(o,"autoSave",["disabled","enabled"])}}class Base extends i.StringObject{constructor(e){super(o,"base")}}class BatchOutput extends i.XFAObject{constructor(e){super(o,"batchOutput");this.format=(0,n.getStringOption)(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends i.ContentObject{constructor(e){super(o,"behaviorOverride")}[i.$finalize](){this[i.$content]=new Map(this[i.$content].trim().split(/\s+/).filter((e=>e.includes(":"))).map((e=>e.split(":",2))))}}class Cache extends i.XFAObject{constructor(e){super(o,"cache",!0);this.templateCache=null}}class Change extends i.Option01{constructor(e){super(o,"change")}}class Common extends i.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 i.XFAObjectArray}}class Compress extends i.XFAObject{constructor(e){super(o,"compress");this.scope=(0,n.getStringOption)(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends i.Option01{constructor(e){super(o,"compressLogicalStructure")}}class CompressObjectStream extends i.Option10{constructor(e){super(o,"compressObjectStream")}}class Compression extends i.XFAObject{constructor(e){super(o,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends i.XFAObject{constructor(e){super(o,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new i.XFAObjectArray}}class Conformance extends i.OptionObject{constructor(e){super(o,"conformance",["A","B"])}}class ContentCopy extends i.Option01{constructor(e){super(o,"contentCopy")}}class Copies extends i.IntegerObject{constructor(e){super(o,"copies",1,(e=>e>=1))}}class Creator extends i.StringObject{constructor(e){super(o,"creator")}}class CurrentPage extends i.IntegerObject{constructor(e){super(o,"currentPage",0,(e=>e>=0))}}class Data extends i.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 i.XFAObjectArray;this.transform=new i.XFAObjectArray}}class Debug extends i.XFAObject{constructor(e){super(o,"debug",!0);this.uri=null}}class DefaultTypeface extends i.ContentObject{constructor(e){super(o,"defaultTypeface");this.writingScript=(0,n.getStringOption)(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends i.OptionObject{constructor(e){super(o,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends i.Option01{constructor(e){super(o,"documentAssembly")}}class Driver extends i.XFAObject{constructor(e){super(o,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends i.OptionObject{constructor(e){super(o,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends i.OptionObject{constructor(e){super(o,"dynamicRender",["forbidden","required"])}}class Embed extends i.Option01{constructor(e){super(o,"embed")}}class Encrypt extends i.Option01{constructor(e){super(o,"encrypt")}}class Encryption extends i.XFAObject{constructor(e){super(o,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends i.OptionObject{constructor(e){super(o,"encryptionLevel",["40bit","128bit"])}}class Enforce extends i.StringObject{constructor(e){super(o,"enforce")}}class Equate extends i.XFAObject{constructor(e){super(o,"equate");this.force=(0,n.getInteger)({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends i.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 i.ContentObject{constructor(e){super(o,"exclude")}[i.$finalize](){this[i.$content]=this[i.$content].trim().split(/\s+/).filter((e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e)))}}class ExcludeNS extends i.StringObject{constructor(e){super(o,"excludeNS")}}class FlipLabel extends i.OptionObject{constructor(e){super(o,"flipLabel",["usePrinterSetting","on","off"])}}class FontInfo extends i.XFAObject{constructor(e){super(o,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new i.XFAObjectArray;this.defaultTypeface=new i.XFAObjectArray;this.neverEmbed=new i.XFAObjectArray}}class FormFieldFilling extends i.Option01{constructor(e){super(o,"formFieldFilling")}}class GroupParent extends i.StringObject{constructor(e){super(o,"groupParent")}}class IfEmpty extends i.OptionObject{constructor(e){super(o,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends i.StringObject{constructor(e){super(o,"includeXDPContent")}}class IncrementalLoad extends i.OptionObject{constructor(e){super(o,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends i.Option01{constructor(e){super(o,"incrementalMerge")}}class Interactive extends i.Option01{constructor(e){super(o,"interactive")}}class Jog extends i.OptionObject{constructor(e){super(o,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends i.XFAObject{constructor(e){super(o,"labelPrinter",!0);this.name=(0,n.getStringOption)(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends i.OptionObject{constructor(e){super(o,"layout",["paginate","panel"])}}class Level extends i.IntegerObject{constructor(e){super(o,"level",0,(e=>e>0))}}class Linearized extends i.Option01{constructor(e){super(o,"linearized")}}class Locale extends i.StringObject{constructor(e){super(o,"locale")}}class LocaleSet extends i.StringObject{constructor(e){super(o,"localeSet")}}class Log extends i.XFAObject{constructor(e){super(o,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends i.XFAObject{constructor(e){super(o,"map",!0);this.equate=new i.XFAObjectArray;this.equateRange=new i.XFAObjectArray}}class MediumInfo extends i.XFAObject{constructor(e){super(o,"mediumInfo",!0);this.map=null}}class Message extends i.XFAObject{constructor(e){super(o,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends i.XFAObject{constructor(e){super(o,"messaging",!0);this.message=new i.XFAObjectArray}}class Mode extends i.OptionObject{constructor(e){super(o,"mode",["append","overwrite"])}}class ModifyAnnots extends i.Option01{constructor(e){super(o,"modifyAnnots")}}class MsgId extends i.IntegerObject{constructor(e){super(o,"msgId",1,(e=>e>=1))}}class NameAttr extends i.StringObject{constructor(e){super(o,"nameAttr")}}class NeverEmbed extends i.ContentObject{constructor(e){super(o,"neverEmbed")}}class NumberOfCopies extends i.IntegerObject{constructor(e){super(o,"numberOfCopies",null,(e=>e>=2&&e<=5))}}class OpenAction extends i.XFAObject{constructor(e){super(o,"openAction",!0);this.destination=null}}class Output extends i.XFAObject{constructor(e){super(o,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends i.StringObject{constructor(e){super(o,"outputBin")}}class OutputXSL extends i.XFAObject{constructor(e){super(o,"outputXSL",!0);this.uri=null}}class Overprint extends i.OptionObject{constructor(e){super(o,"overprint",["none","both","draw","field"])}}class Packets extends i.StringObject{constructor(e){super(o,"packets")}[i.$finalize](){"*"!==this[i.$content]&&(this[i.$content]=this[i.$content].trim().split(/\s+/).filter((e=>["config","datasets","template","xfdf","xslt"].includes(e))))}}class PageOffset extends i.XFAObject{constructor(e){super(o,"pageOffset");this.x=(0,n.getInteger)({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=(0,n.getInteger)({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends i.StringObject{constructor(e){super(o,"pageRange")}[i.$finalize](){const e=this[i.$content].trim().split(/\s+/).map((e=>parseInt(e,10))),t=[];for(let a=0,r=e.length;a!1))}}class Pcl extends i.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 i.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 i.XFAObject{constructor(e){super(o,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends i.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 i.Option01{constructor(e){super(o,"pickTrayByPDFSize")}}class Picture extends i.StringObject{constructor(e){super(o,"picture")}}class PlaintextMetadata extends i.Option01{constructor(e){super(o,"plaintextMetadata")}}class Presence extends i.OptionObject{constructor(e){super(o,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends i.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 i.XFAObjectArray;this.labelPrinter=new i.XFAObjectArray;this.pcl=new i.XFAObjectArray;this.pdf=new i.XFAObjectArray;this.ps=new i.XFAObjectArray;this.submitUrl=new i.XFAObjectArray;this.webClient=new i.XFAObjectArray;this.zpl=new i.XFAObjectArray}}class Print extends i.Option01{constructor(e){super(o,"print")}}class PrintHighQuality extends i.Option01{constructor(e){super(o,"printHighQuality")}}class PrintScaling extends i.OptionObject{constructor(e){super(o,"printScaling",["appdefault","noScaling"])}}class PrinterName extends i.StringObject{constructor(e){super(o,"printerName")}}class Producer extends i.StringObject{constructor(e){super(o,"producer")}}class Ps extends i.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 i.ContentObject{constructor(e){super(o,"range")}[i.$finalize](){this[i.$content]=this[i.$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 i.ContentObject{constructor(e){super(o,"record")}[i.$finalize](){this[i.$content]=this[i.$content].trim();const e=parseInt(this[i.$content],10);!isNaN(e)&&e>=0&&(this[i.$content]=e)}}class Relevant extends i.ContentObject{constructor(e){super(o,"relevant")}[i.$finalize](){this[i.$content]=this[i.$content].trim().split(/\s+/)}}class Rename extends i.ContentObject{constructor(e){super(o,"rename")}[i.$finalize](){this[i.$content]=this[i.$content].trim();(this[i.$content].toLowerCase().startsWith("xml")||new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u").test(this[i.$content]))&&(0,s.warn)("XFA - Rename: invalid XFA name")}}class RenderPolicy extends i.OptionObject{constructor(e){super(o,"renderPolicy",["server","client"])}}class RunScripts extends i.OptionObject{constructor(e){super(o,"runScripts",["both","client","none","server"])}}class Script extends i.XFAObject{constructor(e){super(o,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends i.OptionObject{constructor(e){super(o,"scriptModel",["XFA","none"])}}class Severity extends i.OptionObject{constructor(e){super(o,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends i.XFAObject{constructor(e){super(o,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends i.XFAObject{constructor(e){super(o,"staple");this.mode=(0,n.getStringOption)(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends i.StringObject{constructor(e){super(o,"startNode")}}class StartPage extends i.IntegerObject{constructor(e){super(o,"startPage",0,(e=>!0))}}class SubmitFormat extends i.OptionObject{constructor(e){super(o,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends i.StringObject{constructor(e){super(o,"submitUrl")}}class SubsetBelow extends i.IntegerObject{constructor(e){super(o,"subsetBelow",100,(e=>e>=0&&e<=100))}}class SuppressBanner extends i.Option01{constructor(e){super(o,"suppressBanner")}}class Tagged extends i.Option01{constructor(e){super(o,"tagged")}}class Template extends i.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 i.OptionObject{constructor(e){super(o,"threshold",["trace","error","information","warning"])}}class To extends i.OptionObject{constructor(e){super(o,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends i.XFAObject{constructor(e){super(o,"templateCache");this.maxEntries=(0,n.getInteger)({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends i.XFAObject{constructor(e){super(o,"trace",!0);this.area=new i.XFAObjectArray}}class Transform extends i.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 i.OptionObject{constructor(e){super(o,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends i.StringObject{constructor(e){super(o,"uri")}}class Validate extends i.OptionObject{constructor(e){super(o,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends i.ContentObject{constructor(e){super(o,"validateApprovalSignatures")}[i.$finalize](){this[i.$content]=this[i.$content].trim().split(/\s+/).filter((e=>["docReady","postSign"].includes(e)))}}class ValidationMessaging extends i.OptionObject{constructor(e){super(o,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends i.OptionObject{constructor(e){super(o,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends i.XFAObject{constructor(e){super(o,"VersionControl");this.outputBelow=(0,n.getStringOption)(e.outputBelow,["warn","error","update"]);this.sourceAbove=(0,n.getStringOption)(e.sourceAbove,["warn","error"]);this.sourceBelow=(0,n.getStringOption)(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends i.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 i.XFAObject{constructor(e){super(o,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends i.OptionObject{constructor(e){super(o,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends i.ContentObject{constructor(e){super(o,"window")}[i.$finalize](){const e=this[i.$content].trim().split(/\s*,\s*/,2).map((e=>parseInt(e,10)));if(e.some((e=>isNaN(e))))this[i.$content]=[0,0];else{1===e.length&&e.push(e[0]);this[i.$content]=e}}}class Xdc extends i.XFAObject{constructor(e){super(o,"xdc",!0);this.uri=new i.XFAObjectArray;this.xsl=new i.XFAObjectArray}}class Xdp extends i.XFAObject{constructor(e){super(o,"xdp",!0);this.packets=null}}class Xsl extends i.XFAObject{constructor(e){super(o,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends i.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),i=a(77);const n=r.NamespaceIds.connectionSet.id;class ConnectionSet extends i.XFAObject{constructor(e){super(n,"connectionSet",!0);this.wsdlConnection=new i.XFAObjectArray;this.xmlConnection=new i.XFAObjectArray;this.xsdConnection=new i.XFAObjectArray}}class EffectiveInputPolicy extends i.XFAObject{constructor(e){super(n,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends i.XFAObject{constructor(e){super(n,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends i.StringObject{constructor(e){super(n,"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 i.StringObject{constructor(e){super(n,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends i.StringObject{constructor(e){super(n,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends i.StringObject{constructor(e){super(n,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Uri extends i.StringObject{constructor(e){super(n,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends i.StringObject{constructor(e){super(n,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends i.XFAObject{constructor(e){super(n,"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 i.XFAObject{constructor(e){super(n,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends i.XFAObject{constructor(e){super(n,"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),i=a(79);const n=i.NamespaceIds.datasets.id;class Data extends r.XmlObject{constructor(e){super(n,"data",e)}[r.$isNsAgnostic](){return!0}}class Datasets extends r.XFAObject{constructor(e){super(n,"datasets",!0);this.data=null;this.Signature=null}[r.$onChild](e){const t=e[r.$nodeName];("data"===t&&e[r.$namespaceId]===n||"Signature"===t&&e[r.$namespaceId]===i.NamespaceIds.signature.id)&&(this[t]=e);this[r.$appendChild](e)}}class DatasetsNamespace{static[i.$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),i=a(77),n=a(78);const s=r.NamespaceIds.localeSet.id;class CalendarSymbols extends i.XFAObject{constructor(e){super(s,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new i.XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new i.XFAObjectArray(2)}}class CurrencySymbol extends i.StringObject{constructor(e){super(s,"currencySymbol");this.name=(0,n.getStringOption)(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends i.XFAObject{constructor(e){super(s,"currencySymbols",!0);this.currencySymbol=new i.XFAObjectArray(3)}}class DatePattern extends i.StringObject{constructor(e){super(s,"datePattern");this.name=(0,n.getStringOption)(e.name,["full","long","med","short"])}}class DatePatterns extends i.XFAObject{constructor(e){super(s,"datePatterns",!0);this.datePattern=new i.XFAObjectArray(4)}}class DateTimeSymbols extends i.ContentObject{constructor(e){super(s,"dateTimeSymbols")}}class Day extends i.StringObject{constructor(e){super(s,"day")}}class DayNames extends i.XFAObject{constructor(e){super(s,"dayNames",!0);this.abbr=(0,n.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new i.XFAObjectArray(7)}}class Era extends i.StringObject{constructor(e){super(s,"era")}}class EraNames extends i.XFAObject{constructor(e){super(s,"eraNames",!0);this.era=new i.XFAObjectArray(2)}}class Locale extends i.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 i.XFAObject{constructor(e){super(s,"localeSet",!0);this.locale=new i.XFAObjectArray}}class Meridiem extends i.StringObject{constructor(e){super(s,"meridiem")}}class MeridiemNames extends i.XFAObject{constructor(e){super(s,"meridiemNames",!0);this.meridiem=new i.XFAObjectArray(2)}}class Month extends i.StringObject{constructor(e){super(s,"month")}}class MonthNames extends i.XFAObject{constructor(e){super(s,"monthNames",!0);this.abbr=(0,n.getInteger)({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new i.XFAObjectArray(12)}}class NumberPattern extends i.StringObject{constructor(e){super(s,"numberPattern");this.name=(0,n.getStringOption)(e.name,["full","long","med","short"])}}class NumberPatterns extends i.XFAObject{constructor(e){super(s,"numberPatterns",!0);this.numberPattern=new i.XFAObjectArray(4)}}class NumberSymbol extends i.StringObject{constructor(e){super(s,"numberSymbol");this.name=(0,n.getStringOption)(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends i.XFAObject{constructor(e){super(s,"numberSymbols",!0);this.numberSymbol=new i.XFAObjectArray(5)}}class TimePattern extends i.StringObject{constructor(e){super(s,"timePattern");this.name=(0,n.getStringOption)(e.name,["full","long","med","short"])}}class TimePatterns extends i.XFAObject{constructor(e){super(s,"timePatterns",!0);this.timePattern=new i.XFAObjectArray(4)}}class TypeFace extends i.XFAObject{constructor(e){super(s,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends i.XFAObject{constructor(e){super(s,"typeFaces",!0);this.typeFace=new i.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),i=a(77);const n=r.NamespaceIds.signature.id;class Signature extends i.XFAObject{constructor(e){super(n,"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),i=a(77);const n=r.NamespaceIds.stylesheet.id;class Stylesheet extends i.XFAObject{constructor(e){super(n,"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),i=a(77);const n=r.NamespaceIds.xdp.id;class Xdp extends i.XFAObject{constructor(e){super(n,"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 i.XFAObjectArray;this.template=null}[i.$onChildCheck](e){const t=r.NamespaceIds[e[i.$nodeName]];return t&&e[i.$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),i=a(79),n=a(84),s=a(78);const o=i.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,n.measureToString)(.99*e)}],["letter-spacing",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["line-height",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["margin",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["margin-bottom",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["margin-left",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["margin-right",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["margin-top",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["text-indent",e=>(0,n.measureToString)((0,s.getMeasurement)(e))],["font-family",e=>e],["vertical-align",e=>(0,n.measureToString)((0,s.getMeasurement)(e))]]),u=/\s+/g,d=/[\r\n]+/g,f=/\r\n?/g;function mapStyle(e,t,a){const i=Object.create(null);if(!e)return i;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")?i.transform?i.transform=`${i[t]} ${r}`:i.transform=r:i[t.replaceAll(/-([a-zA-Z])/g,((e,t)=>t.toUpperCase()))]=r}i.fontFamily&&(0,n.setFontFamily)({typeface:i.fontFamily,weight:i.fontWeight||"normal",posture:i.fontStyle||"normal",size:o.fontSize||0},t,t[r.$globalData].fontFinder,i);if(a&&i.verticalAlign&&"0px"!==i.verticalAlign&&i.fontSize){const e=.583,t=.333,a=(0,s.getMeasurement)(i.fontSize);i.fontSize=(0,n.measureToString)(a*e);i.verticalAlign=(0,n.measureToString)(Math.sign((0,s.getMeasurement)(i.verticalAlign))*a*t)}a&&i.fontSize&&(i.fontSize=`calc(${i.fontSize} * var(--scale-factor))`);(0,n.fixTextIndent)(i);return i}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.replaceAll(d,"");this.style.includes("xfa-spacerun:yes")||(e=e.replaceAll(u," "))}e&&(this[r.$content]+=e)}[r.$pushGlyphs](e,t=!0){const a=Object.create(null),i={top:NaN,bottom:NaN,left:NaN,right:NaN};let n=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:i.top=i.bottom=i.left=i.right=e[0];break;case 2:i.top=i.bottom=e[0];i.left=i.right=e[1];break;case 3:i.top=e[0];i.bottom=e[2];i.left=i.right=e[1];break;case 4:i.top=e[0];i.left=e[1];i.bottom=e[2];i.right=e[3]}break;case"margin-top":i.top=(0,s.getMeasurement)(t);break;case"margin-bottom":i.bottom=(0,s.getMeasurement)(t);break;case"margin-left":i.left=(0,s.getMeasurement)(t);break;case"margin-right":i.right=(0,s.getMeasurement)(t);break;case"line-height":n=(0,s.getMeasurement)(t)}e.pushData(a,i,n);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].replaceAll(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,n.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[i.$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),i=a(77);class UnknownNamespace{constructor(e){this.namespaceId=e}[r.$buildXFAObject](e,t){return new i.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),i=a(3),n=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 n.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 n.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,i.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),i=a(4),n=a(16),s=a(3),o=a(5),c=a(67);t.XRef=class XRef{constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this._xrefStms=new Set;this._cacheMap=new Map;this._pendingRefs=new i.RefSet;this._newPersistentRefNum=null;this._newTemporaryRefNum=null}getNewPersistentRef(e){null===this._newPersistentRefNum&&(this._newPersistentRefNum=this.entries.length||1);const t=this._newPersistentRefNum++;this._cacheMap.set(t,e);return i.Ref.get(t,0)}getNewTemporaryRef(){null===this._newTemporaryRefNum&&(this._newTemporaryRefNum=this.entries.length||1);return i.Ref.get(this._newTemporaryRefNum++,0)}resetNewTemporaryRef(){this._newTemporaryRefNum=null}setStartXRef(e){this.startXRefQueue=[e]}parse(e=!1){let t,a,n;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 s.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Encrypt" reference: "${e}".`)}if(a instanceof i.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{n=t.get("Root")}catch(e){if(e instanceof s.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Root" reference: "${e}".`)}if(n instanceof i.Dict)try{if(n.get("Pages")instanceof i.Dict){this.root=n;return}}catch(e){if(e instanceof s.MissingDataException)throw e;(0,r.warn)(`XRef.parse - Invalid "Pages" reference: "${e}".`)}if(!e)throw new s.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,i.isCmd)(t,"trailer"))throw new r.FormatError("Invalid XRef table: could not find trailer dictionary");let a=e.getObj();a instanceof i.Dict||!a.dict||(a=a.dict);if(!(a instanceof i.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 n;for(;;){if(!("firstEntryNum"in a)||!("entryCount"in a)){if((0,i.isCmd)(n=e.getObj(),"trailer"))break;a.firstEntryNum=n;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 n=a.entryNum;n0;){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(i)||!Number.isInteger(n))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,i=e.length;let n=0;for(;t=r)break;t++;n++}return n}const e=/\b(endobj|\d+\s+\d+\s+obj|xref|trailer)\b/g,t=/\b(startxref|\d+\s+\d+\s+obj)\b/g,a=/^(\d+)\s+(\d+)\s+obj\b/,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([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const h=this.stream;h.pos=0;const u=h.getBytes(),d=(0,r.bytesToString)(u),f=u.length;let g=h.start;const p=[],m=[];for(;g=f)break;i=u[g]}while(10!==i&&13!==i);continue}const b=readToken(u,g);let y;if(b.startsWith("xref")&&(4===b.length||/\s/.test(b[4]))){g+=skipUntil(u,g,o);p.push(g);g+=skipUntil(u,g,c)}else if(y=a.exec(b)){const t=0|y[1],a=0|y[2],i=g+b.length;let o,c=!1;if(this.entries[t]){if(this.entries[t].gen===a)try{new n.Parser({lexer:new n.Lexer(h.makeSubStream(i))}).getObj();c=!0}catch(e){e instanceof s.ParserEOFException?(0,r.warn)(`indexObjects -- checking object (${b}): "${e}".`):c=!0}}else c=!0;c&&(this.entries[t]={offset:g-h.start,gen:a,uncompressed:!0});e.lastIndex=i;const p=e.exec(d);if(p){o=e.lastIndex+1-g;if("endobj"!==p[1]){(0,r.warn)(`indexObjects: Found "${p[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`);o-=p[1].length+1}}else o=f-g;const w=u.subarray(g,g+o),S=skipUntil(w,0,l);if(S0?Math.max(...this._xrefStms):null}getEntry(e){const t=this.entries[e];return t&&!t.free&&t.offset?t:null}fetchIfRef(e,t=!1){return e instanceof i.Ref?this.fetch(e,t):e}fetch(e,t=!1){if(!(e instanceof i.Ref))throw new Error("ref object is not a reference");const a=e.num,n=this._cacheMap.get(a);if(void 0!==n){n instanceof i.Dict&&!n.objId&&(n.objId=e.toString());return n}let s=this.getEntry(a);if(null===s){this._cacheMap.set(a,s);return s}if(this._pendingRefs.has(e)){this._pendingRefs.remove(e);(0,r.warn)(`Ignoring circular reference: ${e}.`);return i.CIRCULAR_REF}this._pendingRefs.put(e);try{s=s.uncompressed?this.fetchUncompressed(e,s,t):this.fetchCompressed(e,s,t);this._pendingRefs.remove(e)}catch(t){this._pendingRefs.remove(e);throw t}s instanceof i.Dict?s.objId=e.toString():s instanceof o.BaseStream&&(s.dict.objId=e.toString());return s}fetchUncompressed(e,t,a=!1){const c=e.gen;let l=e.num;if(t.gen!==c){const n=`Inconsistent generation in XRef: ${e}`;if(this._generationFallback&&t.gen{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.MessageHandler=void 0;var r=a(2);const i=1,n=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.#t(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===i)a.resolve(t.data);else{if(t.callback!==n)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:i,callbackId:t.callbackId,data:r})}),(function(r){a.postMessage({sourceName:e,targetName:s,callback:n,callbackId:t.callbackId,reason:wrapReason(r)})}))}else t.streamId?this.#a(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 i=this.callbackId++,n=new r.PromiseCapability;this.callbackCapabilities[i]=n;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:i,data:t},a)}catch(e){n.reject(e)}return n.promise}sendWithStream(e,t,a,i){const n=this.streamId++,o=this.sourceName,c=this.targetName,l=this.comObj;return new ReadableStream({start:a=>{const s=new r.PromiseCapability;this.streamControllers[n]={controller:a,startCall:s,pullCall:null,cancelCall:null,isClosed:!1};l.postMessage({sourceName:o,targetName:c,action:e,streamId:n,data:t,desiredSize:a.desiredSize},i);return s.promise},pull:e=>{const t=new r.PromiseCapability;this.streamControllers[n].pullCall=t;l.postMessage({sourceName:o,targetName:c,stream:u,streamId:n,desiredSize:e.desiredSize});return t.promise},cancel:e=>{(0,r.assert)(e instanceof Error,"cancel must have a valid reason");const t=new r.PromiseCapability;this.streamControllers[n].cancelCall=t;this.streamControllers[n].isClosed=!0;l.postMessage({sourceName:o,targetName:c,stream:s,streamId:n,reason:wrapReason(e)});return t.promise}},a)}#a(e){const t=e.streamId,a=this.sourceName,i=e.sourceName,n=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=new r.PromiseCapability;this.ready=this.sinkCapability.promise}n.postMessage({sourceName:a,targetName:i,stream:l,streamId:t,chunk:e},o)},close(){if(!this.isCancelled){this.isCancelled=!0;n.postMessage({sourceName:a,targetName:i,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;n.postMessage({sourceName:a,targetName:i,stream:h,streamId:t,reason:wrapReason(e)})}},sinkCapability:new r.PromiseCapability,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(){n.postMessage({sourceName:a,targetName:i,stream:f,streamId:t,success:!0})}),(function(e){n.postMessage({sourceName:a,targetName:i,stream:f,streamId:t,reason:wrapReason(e)})}))}#t(e){const t=e.streamId,a=this.sourceName,i=e.sourceName,n=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){n.postMessage({sourceName:a,targetName:i,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?.())})).then((function(){n.postMessage({sourceName:a,targetName:i,stream:d,streamId:t,success:!0})}),(function(e){n.postMessage({sourceName:a,targetName:i,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.#r(g,t);break;case h:(0,r.assert)(g,"error should have stream controller");g.controller.error(wrapReason(e.reason));this.#r(g,t);break;case o:e.success?g.cancelCall.resolve():g.cancelCall.reject(wrapReason(e.reason));this.#r(g,t);break;case s:if(!p)break;new Promise((function(t){t(p.onCancel?.(wrapReason(e.reason)))})).then((function(){n.postMessage({sourceName:a,targetName:i,stream:o,streamId:t,success:!0})}),(function(e){n.postMessage({sourceName:a,targetName:i,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#r(e,t){await Promise.allSettled([e.startCall?.promise,e.pullCall?.promise,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 i=t[a]={exports:{}};e[a](i,i.exports,__w_pdfjs_require__);return i.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/apps/web/public/.well-known/security.txt b/apps/web/public/.well-known/security.txt new file mode 100644 index 000000000..0b00c7123 --- /dev/null +++ b/apps/web/public/.well-known/security.txt @@ -0,0 +1,6 @@ +# General Issues +Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml +# Report critical issues privately, to let us take appropriate action before publishing +Contact: mailto:security@documenso.com +Preferred-Languages: en +Canonical: https://documenso.com/.well-known/security.txt diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs index 5d9eea9f9..d7e42680e 100644 --- a/lint-staged.config.cjs +++ b/lint-staged.config.cjs @@ -1,7 +1,7 @@ /** @type {import('lint-staged').Config} */ module.exports = { - '**/*.{ts,tsx,cts,mts}': (files) => `eslint --fix ${files.join(' ')}`, - '**/*.{js,jsx,cjs,mjs}': (files) => `prettier --write ${files.join(' ')}`, - '**/*.{yml,mdx}': (files) => `prettier --write ${files.join(' ')}`, + '**/*.{ts,tsx,cts,mts}': (files) => files.map((file) => `eslint --fix ${file}`), + '**/*.{js,jsx,cjs,mjs}': (files) => files.map((file) => `prettier --write ${file}`), + '**/*.{yml,mdx}': (files) => files.map((file) => `prettier --write ${file}`), '**/*/package.json': 'npm run precommit', }; diff --git a/scripts/copy-pdfjs.cjs b/scripts/copy-pdfjs.cjs index 5a07a7d3a..cef7b3c8a 100644 --- a/scripts/copy-pdfjs.cjs +++ b/scripts/copy-pdfjs.cjs @@ -8,4 +8,5 @@ const pdfjsDistPath = path.dirname(require.resolve('pdfjs-dist/package.json')); const pdfWorkerPath = path.join(pdfjsDistPath, 'build', 'pdf.worker.min.js'); +console.log(`Copying pdf.js to: ${path.resolve('./public/pdf.worker.min.js')}`); fs.copyFileSync(pdfWorkerPath, './public/pdf.worker.min.js'); diff --git a/scripts/copy-wellknown.cjs b/scripts/copy-wellknown.cjs new file mode 100644 index 000000000..35086828d --- /dev/null +++ b/scripts/copy-wellknown.cjs @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +/* eslint-disable @typescript-eslint/no-var-requires */ +const path = require('path'); +const fs = require('fs'); + +const wellKnownPath = path.join(__dirname, '../.well-known'); + +console.log('Copying .well-known/ contents to apps'); +fs.cpSync(wellKnownPath, path.join(__dirname, '../apps/web/public/.well-known'), { + recursive: true, +}); + +fs.cpSync(wellKnownPath, path.join(__dirname, '../apps/marketing/public/.well-known'), { + recursive: true, +}); From 142c1c003ebbdb7bf39d18f59f78a6a47e278f2e Mon Sep 17 00:00:00 2001 From: apoorv taneja Date: Fri, 2 Feb 2024 18:16:54 +0530 Subject: [PATCH 19/61] changed useEffect variables --- packages/ui/primitives/signature-pad/signature-pad.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index cb546538c..b52626026 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -219,7 +219,7 @@ export const SignaturePad = ({ img.src = defaultValue; } - }, [defaultValue]); + }, []); return (
Date: Fri, 2 Feb 2024 19:32:39 +0530 Subject: [PATCH 20/61] fixed variable declaration --- packages/ui/primitives/signature-pad/signature-pad.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index b52626026..c38c69fb2 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -185,7 +185,7 @@ export const SignaturePad = ({ if ($el.current) { const ctx = $el.current.getContext('2d'); const { width, height } = $el.current; - ctx?.clearRect(0, 0, $el.current.width, $el.current.height); + ctx?.clearRect(0, 0, width, height); if (typeof defaultValue === 'string' && defaultImageRef.current) { ctx?.putImageData(defaultImageRef.current, 0, 0); } From c970abc871d1b3f961717d42a6d4eed1bc3602df Mon Sep 17 00:00:00 2001 From: apoorv taneja Date: Fri, 2 Feb 2024 20:46:54 +0530 Subject: [PATCH 21/61] added onchange handler --- packages/ui/primitives/signature-pad/signature-pad.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index c38c69fb2..ad6f92e91 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -134,7 +134,6 @@ export const SignaturePad = ({ }); onChange?.($el.current.toDataURL()); - ctx.save(); } } @@ -193,6 +192,7 @@ export const SignaturePad = ({ const pathData = new Path2D(getSvgPathFromStroke(getStroke(line, perfectFreehandOptions))); ctx?.fill(pathData); }); + onChange?.($el.current.toDataURL()); } }; From f5930dc934ae99bab826a12b80b8e566215bf125 Mon Sep 17 00:00:00 2001 From: Sumit Bisht <75713174+sumitbishti@users.noreply.github.com> Date: Mon, 5 Feb 2024 07:20:35 +0530 Subject: [PATCH 22/61] perf: mentioned type and size of the doc to be uploaded (#867) explicitly mentioned "PDF" to upload, and added a toast if pdf size is greater than 50mb fixes: #621 --- .env.example | 2 ++ .../app/(dashboard)/documents/upload-document.tsx | 11 +++++++++++ packages/lib/constants/app.ts | 3 +++ packages/ui/primitives/document-dropzone.tsx | 12 ++++++++++-- turbo.json | 1 + 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index f21560ca3..c482c128e 100644 --- a/.env.example +++ b/.env.example @@ -74,6 +74,8 @@ NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN= NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR= # OPTIONAL: The private key to use for DKIM signing. NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY= +# OPTIONAL: Displays the maximum document upload limit to the user in MBs +NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT=5 # [[STRIPE]] NEXT_PRIVATE_STRIPE_API_KEY= diff --git a/apps/web/src/app/(dashboard)/documents/upload-document.tsx b/apps/web/src/app/(dashboard)/documents/upload-document.tsx index 65b95f9ec..444bd1db0 100644 --- a/apps/web/src/app/(dashboard)/documents/upload-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/upload-document.tsx @@ -10,6 +10,7 @@ import { useSession } from 'next-auth/react'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; +import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT } from '@documenso/lib/constants/app'; import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; import { putFile } from '@documenso/lib/universal/upload/put-file'; import { TRPCClientError } from '@documenso/trpc/client'; @@ -96,6 +97,15 @@ export const UploadDocument = ({ className }: UploadDocumentProps) => { } }; + const onFileDropRejected = () => { + toast({ + title: 'Your document failed to upload.', + description: `File cannot be larger than ${APP_DOCUMENT_UPLOAD_SIZE_LIMIT}MB`, + duration: 5000, + variant: 'destructive', + }); + }; + return (
{ disabled={remaining.documents === 0 || !session?.user.emailVerified} disabledMessage={disabledMessage} onDrop={onFileDrop} + onDropRejected={onFileDropRejected} />
diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 827fcef0a..a19d2bb0d 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -6,3 +6,6 @@ export const APP_FOLDER = IS_APP_MARKETING ? 'marketing' : 'web'; export const APP_BASE_URL = IS_APP_WEB ? process.env.NEXT_PUBLIC_WEBAPP_URL : process.env.NEXT_PUBLIC_MARKETING_URL; + +export const APP_DOCUMENT_UPLOAD_SIZE_LIMIT = + Number(process.env.NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT) || 50; diff --git a/packages/ui/primitives/document-dropzone.tsx b/packages/ui/primitives/document-dropzone.tsx index 21337956d..6caf6d040 100644 --- a/packages/ui/primitives/document-dropzone.tsx +++ b/packages/ui/primitives/document-dropzone.tsx @@ -5,6 +5,7 @@ import { motion } from 'framer-motion'; import { Plus } from 'lucide-react'; import { useDropzone } from 'react-dropzone'; +import { APP_DOCUMENT_UPLOAD_SIZE_LIMIT } from '@documenso/lib/constants/app'; import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions'; import { cn } from '../lib/utils'; @@ -89,6 +90,7 @@ export type DocumentDropzoneProps = { disabled?: boolean; disabledMessage?: string; onDrop?: (_file: File) => void | Promise; + onDropRejected?: () => void | Promise; type?: 'document' | 'template'; [key: string]: unknown; }; @@ -96,6 +98,7 @@ export type DocumentDropzoneProps = { export const DocumentDropzone = ({ className, onDrop, + onDropRejected, disabled, disabledMessage = 'You cannot upload documents at this time.', type = 'document', @@ -112,7 +115,12 @@ export const DocumentDropzone = ({ void onDrop(acceptedFile); } }, - maxSize: megabytesToBytes(50), + onDropRejected: () => { + if (onDropRejected) { + void onDropRejected(); + } + }, + maxSize: megabytesToBytes(APP_DOCUMENT_UPLOAD_SIZE_LIMIT), }); return ( @@ -175,7 +183,7 @@ export const DocumentDropzone = ({

- {disabled ? disabledMessage : 'Drag & drop your document here.'} + {disabled ? disabledMessage : 'Drag & drop your PDF here.'}

diff --git a/turbo.json b/turbo.json index b78d7c9d0..b0a7a0fc6 100644 --- a/turbo.json +++ b/turbo.json @@ -45,6 +45,7 @@ "NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID", "NEXT_PUBLIC_STRIPE_FREE_PLAN_ID", "NEXT_PUBLIC_DISABLE_SIGNUP", + "NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT", "NEXT_PRIVATE_DATABASE_URL", "NEXT_PRIVATE_DIRECT_DATABASE_URL", "NEXT_PRIVATE_GOOGLE_CLIENT_ID", From c6457e75e068084feabdc6f735ad01533c59998c Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Mon, 5 Feb 2024 05:17:01 +0200 Subject: [PATCH 23/61] feat: migration for verifying paid users (#889) --- .../20240131132916_verify_paid_users/migration.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 packages/prisma/migrations/20240131132916_verify_paid_users/migration.sql diff --git a/packages/prisma/migrations/20240131132916_verify_paid_users/migration.sql b/packages/prisma/migrations/20240131132916_verify_paid_users/migration.sql new file mode 100644 index 000000000..993f103f0 --- /dev/null +++ b/packages/prisma/migrations/20240131132916_verify_paid_users/migration.sql @@ -0,0 +1,6 @@ +UPDATE "User" +SET "emailVerified" = NOW() +FROM "Subscription" +WHERE "User"."id" = "Subscription"."userId" +AND "Subscription"."status" = 'ACTIVE' +AND "User"."emailVerified" IS NULL From 94e72534e010664c0b612c21978b8dbc7b7a8534 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Mon, 5 Feb 2024 13:13:12 +0530 Subject: [PATCH 24/61] chore: updated redirection Signed-off-by: Adithya Krishna --- apps/web/src/app/(signing)/sign/[token]/form.tsx | 7 +++++-- apps/web/src/app/(signing)/sign/[token]/page.tsx | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/(signing)/sign/[token]/form.tsx b/apps/web/src/app/(signing)/sign/[token]/form.tsx index f5c94e6ec..d773c14e2 100644 --- a/apps/web/src/app/(signing)/sign/[token]/form.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/form.tsx @@ -8,6 +8,7 @@ import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; +import { getDocumentMetaByDocumentId } from '@documenso/lib/server-only/document/get-document-meta-by-document-id'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import type { Document, Field, Recipient } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; @@ -55,6 +56,7 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) = }; const onFormSubmit = async () => { + const documentMeta = await getDocumentMetaByDocumentId({ id: document!.id }).catch(() => null); setValidateUninsertedFields(true); const isFieldsValid = validateFieldsInserted(fields); @@ -73,8 +75,9 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) = documentId: document.id, timestamp: new Date().toISOString(), }); - - router.push(`/sign/${recipient.token}/complete`); + documentMeta?.redirectUrl + ? router.push(documentMeta.redirectUrl) + : router.push(`/sign/${recipient.token}/complete`); }; return ( diff --git a/apps/web/src/app/(signing)/sign/[token]/page.tsx b/apps/web/src/app/(signing)/sign/[token]/page.tsx index 004c59329..81723a085 100644 --- a/apps/web/src/app/(signing)/sign/[token]/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/page.tsx @@ -65,6 +65,7 @@ export default async function SigningPage({ params: { token } }: SigningPageProp document.status === DocumentStatus.COMPLETED || recipient.signingStatus === SigningStatus.SIGNED ) { + // redirect(`/sign/${token}/complete`); } From 0c339b78b65a63c8e9ca52a92266001fb394f183 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Tue, 6 Feb 2024 16:16:10 +1100 Subject: [PATCH 25/61] feat: add teams (#848) ## Description Add support for teams which will allow users to collaborate on documents. Teams features allows users to: - Create, manage and transfer teams - Manage team members - Manage team emails - Manage a shared team inbox and documents These changes do NOT include the following, which are planned for a future release: - Team templates - Team API - Search menu integration ## Testing Performed - Added E2E tests for general team management - Added E2E tests to validate document counts ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [ ] I have updated the documentation to reflect these changes, if applicable. - [X] I have followed the project's coding style guidelines. --- apps/web/public/static/add-user.png | Bin 0 -> 3361 bytes apps/web/public/static/mail-open-alert.png | Bin 0 -> 3818 bytes apps/web/public/static/mail-open.png | Bin 0 -> 3839 bytes .../admin/documents/data-table.tsx | 8 +- .../users/[id]/multiselect-role-combobox.tsx | 4 +- .../app/(dashboard)/admin/users/[id]/page.tsx | 5 +- .../src/app/(dashboard)/admin/users/page.tsx | 5 +- .../documents/[id]/document-page-view.tsx | 131 +++++ .../documents/[id]/edit-document.tsx | 4 +- .../app/(dashboard)/documents/[id]/page.tsx | 119 +--- .../_action-items/resend-document.tsx | 12 +- .../documents/data-table-action-button.tsx | 31 +- .../documents/data-table-action-dropdown.tsx | 18 +- .../documents/data-table-sender-filter.tsx | 63 +++ .../app/(dashboard)/documents/data-table.tsx | 23 +- .../documents/documents-page-view.tsx | 158 ++++++ .../documents/duplicate-document-dialog.tsx | 11 +- .../src/app/(dashboard)/documents/page.tsx | 113 +--- .../(dashboard)/documents/upload-document.tsx | 30 +- apps/web/src/app/(dashboard)/layout.tsx | 9 +- .../billing/billing-portal-button.tsx | 12 +- .../app/(dashboard)/settings/billing/page.tsx | 19 +- .../app/(dashboard)/settings/profile/page.tsx | 7 +- .../(dashboard)/settings/security/page.tsx | 12 +- .../teams/accept-team-invitation-button.tsx | 45 ++ .../app/(dashboard)/settings/teams/page.tsx | 39 ++ .../settings/teams/team-email-usage.tsx | 105 ++++ .../settings/teams/team-invitations.tsx | 83 +++ .../templates/data-table-templates.tsx | 2 +- .../src/app/(signing)/sign/[token]/layout.tsx | 10 +- .../t/[teamUrl]/documents/[id]/page.tsx | 20 + .../(teams)/t/[teamUrl]/documents/page.tsx | 25 + .../web/src/app/(teams)/t/[teamUrl]/error.tsx | 54 ++ .../t/[teamUrl]/layout-billing-banner.tsx | 130 +++++ .../src/app/(teams)/t/[teamUrl]/layout.tsx | 65 +++ .../src/app/(teams)/t/[teamUrl]/not-found.tsx | 32 ++ .../t/[teamUrl]/settings/billing/page.tsx | 84 +++ .../(teams)/t/[teamUrl]/settings/layout.tsx | 54 ++ .../t/[teamUrl]/settings/members/page.tsx | 38 ++ .../app/(teams)/t/[teamUrl]/settings/page.tsx | 186 +++++++ .../settings/team-email-dropdown.tsx | 143 +++++ .../settings/team-transfer-status.tsx | 115 ++++ .../src/app/(unauthenticated)/signin/page.tsx | 23 +- .../src/app/(unauthenticated)/signup/page.tsx | 22 +- .../team/invite/[token]/page.tsx | 121 +++++ .../team/verify/email/[token]/page.tsx | 89 +++ .../team/verify/transfer/[token]/page.tsx | 80 +++ .../(dashboard)/common/command-menu.tsx | 17 +- .../(dashboard)/layout/desktop-nav.tsx | 38 +- .../components/(dashboard)/layout/header.tsx | 44 +- .../(dashboard)/layout/menu-switcher.tsx | 214 ++++++++ .../(dashboard)/layout/mobile-nav.tsx | 0 .../(dashboard)/layout/mobile-navigation.tsx | 96 ++++ .../(dashboard)/layout/profile-dropdown.tsx | 169 ------ .../period-selector/period-selector.tsx | 8 +- .../settings/layout/desktop-nav.tsx | 17 +- .../(dashboard)/settings/layout/header.tsx | 25 + .../settings/layout/mobile-nav.tsx | 17 +- .../(teams)/dialogs/add-team-email-dialog.tsx | 188 +++++++ .../dialogs/create-team-checkout-dialog.tsx | 177 ++++++ .../(teams)/dialogs/create-team-dialog.tsx | 223 ++++++++ .../(teams)/dialogs/delete-team-dialog.tsx | 160 ++++++ .../dialogs/delete-team-member-dialog.tsx | 107 ++++ .../dialogs/invite-team-member-dialog.tsx | 244 +++++++++ .../(teams)/dialogs/leave-team-dialog.tsx | 98 ++++ .../(teams)/dialogs/transfer-team-dialog.tsx | 293 ++++++++++ .../dialogs/update-team-email-dialog.tsx | 165 ++++++ .../dialogs/update-team-member-dialog.tsx | 185 +++++++ .../(teams)/forms/update-team-form.tsx | 173 ++++++ .../(teams)/settings/layout/desktop-nav.tsx | 67 +++ .../(teams)/settings/layout/mobile-nav.tsx | 75 +++ .../tables/current-user-teams-data-table.tsx | 158 ++++++ .../pending-user-teams-data-table-actions.tsx | 53 ++ .../tables/pending-user-teams-data-table.tsx | 145 +++++ .../team-billing-invoices-data-table.tsx | 152 ++++++ .../tables/team-member-invites-data-table.tsx | 203 +++++++ .../tables/team-members-data-table.tsx | 209 +++++++ .../tables/teams-member-page-data-table.tsx | 93 ++++ .../user-settings-teams-page-data-table.tsx | 83 +++ .../(teams)/team-billing-portal-button.tsx | 39 ++ apps/web/src/components/forms/signin.tsx | 5 +- apps/web/src/components/forms/signup.tsx | 5 +- apps/web/src/middleware.ts | 81 ++- package-lock.json | 133 +---- .../app-tests/e2e/fixtures/authentication.ts | 40 ++ .../e2e/pr-711-deletion-of-documents.spec.ts | 65 +-- ...dd-document-search-to-command-menu.spec.ts | 18 - .../app-tests/e2e/teams/manage-team.spec.ts | 87 +++ .../e2e/teams/team-documents.spec.ts | 282 ++++++++++ .../app-tests/e2e/teams/team-email.spec.ts | 102 ++++ .../app-tests/e2e/teams/team-members.spec.ts | 110 ++++ .../app-tests/e2e/teams/transfer-team.spec.ts | 69 +++ packages/app-tests/e2e/test-auth-flow.spec.ts | 2 +- packages/ee/server-only/limits/client.ts | 10 +- packages/ee/server-only/limits/constants.ts | 7 +- packages/ee/server-only/limits/handler.ts | 18 +- .../ee/server-only/limits/provider/client.tsx | 17 +- .../ee/server-only/limits/provider/server.tsx | 12 +- packages/ee/server-only/limits/server.ts | 74 ++- .../stripe/create-team-customer.ts | 20 + .../stripe/delete-customer-payment-methods.ts | 22 + .../stripe/get-checkout-session.ts | 7 + .../stripe/get-community-plan-prices.ts | 13 + .../ee/server-only/stripe/get-customer.ts | 15 +- .../ee/server-only/stripe/get-invoices.ts | 11 + .../server-only/stripe/get-portal-session.ts | 2 +- .../stripe/get-prices-by-interval.ts | 8 +- .../server-only/stripe/get-prices-by-plan.ts | 14 + .../server-only/stripe/get-prices-by-type.ts | 11 - .../ee/server-only/stripe/get-team-prices.ts | 43 ++ .../stripe/transfer-team-subscription.ts | 126 +++++ .../ee/server-only/stripe/update-customer.ts | 18 + .../update-subscription-item-quantity.ts | 44 ++ .../ee/server-only/stripe/webhook/handler.ts | 115 +++- .../stripe/webhook/on-subscription-updated.ts | 26 +- packages/email/static/add-user.png | Bin 0 -> 3361 bytes packages/email/static/mail-open-alert.png | Bin 0 -> 3818 bytes packages/email/static/mail-open.png | Bin 0 -> 3839 bytes .../template-components/template-image.tsx | 17 + packages/email/templates/confirm-email.tsx | 4 +- .../email/templates/confirm-team-email.tsx | 127 +++++ .../email/templates/team-email-removed.tsx | 83 +++ packages/email/templates/team-invite.tsx | 108 ++++ .../email/templates/team-transfer-request.tsx | 112 ++++ packages/lib/constants/app.ts | 9 +- packages/lib/constants/billing.ts | 11 + packages/lib/constants/teams.ts | 102 ++++ packages/lib/errors/app-error.ts | 144 +++++ packages/lib/server-only/crypto/decrypt.ts | 30 +- .../document-meta/upsert-document-meta.ts | 15 +- .../server-only/document/create-document.ts | 36 +- .../document/duplicate-document-by-id.ts | 35 +- .../server-only/document/find-documents.ts | 433 +++++++++++---- .../document/get-document-by-id.ts | 101 +++- .../lib/server-only/document/get-stats.ts | 186 +++++-- .../server-only/document/resend-document.tsx | 21 +- .../server-only/document/send-document.tsx | 15 +- .../lib/server-only/document/update-title.ts | 15 +- .../field/get-fields-for-document.ts | 15 +- .../field/set-fields-for-document.ts | 15 +- .../recipient/get-recipients-for-document.ts | 15 +- .../recipient/set-recipients-for-document.ts | 15 +- .../team/accept-team-invitation.ts | 63 +++ .../team/create-team-billing-portal.ts | 47 ++ .../team/create-team-checkout-session.ts | 52 ++ .../team/create-team-email-verification.ts | 132 +++++ .../team/create-team-member-invites.ts | 161 ++++++ packages/lib/server-only/team/create-team.ts | 207 +++++++ .../team/delete-team-email-verification.ts | 34 ++ .../lib/server-only/team/delete-team-email.ts | 93 ++++ .../team/delete-team-invitations.ts | 47 ++ .../server-only/team/delete-team-members.ts | 102 ++++ .../server-only/team/delete-team-pending.ts | 15 + .../team/delete-team-transfer-request.ts | 42 ++ packages/lib/server-only/team/delete-team.ts | 42 ++ .../server-only/team/find-team-invoices.ts | 52 ++ .../team/find-team-member-invites.ts | 91 ++++ .../lib/server-only/team/find-team-members.ts | 100 ++++ .../server-only/team/find-teams-pending.ts | 58 ++ packages/lib/server-only/team/find-teams.ts | 76 +++ .../team/get-team-email-by-email.ts | 22 + .../server-only/team/get-team-invitations.ts | 22 + .../lib/server-only/team/get-team-members.ts | 33 ++ packages/lib/server-only/team/get-team.ts | 95 ++++ packages/lib/server-only/team/get-teams.ts | 33 ++ packages/lib/server-only/team/leave-team.ts | 59 ++ .../team/request-team-ownership-transfer.ts | 106 ++++ .../team/resend-team-email-verification.ts | 65 +++ .../team/resend-team-member-invitation.ts | 76 +++ .../team/transfer-team-ownership.ts | 88 +++ .../lib/server-only/team/update-team-email.ts | 42 ++ .../server-only/team/update-team-member.ts | 92 ++++ packages/lib/server-only/team/update-team.ts | 65 +++ packages/lib/server-only/user/create-user.ts | 88 ++- packages/lib/utils/billing.ts | 16 + packages/lib/utils/params.ts | 30 ++ packages/lib/utils/recipient-formatter.ts | 4 +- packages/lib/utils/teams.ts | 42 ++ packages/lib/utils/token-verification.ts | 21 + .../20240205040421_add_teams/migration.sql | 187 +++++++ packages/prisma/package.json | 3 +- packages/prisma/schema.prisma | 109 +++- packages/prisma/seed/documents.ts | 375 +++++++++++++ packages/prisma/seed/teams.ts | 177 ++++++ packages/prisma/seed/users.ts | 34 ++ .../trpc/server/document-router/router.ts | 19 +- .../trpc/server/document-router/schema.ts | 3 + packages/trpc/server/router.ts | 4 +- packages/trpc/server/team-router/router.ts | 508 ++++++++++++++++++ packages/trpc/server/team-router/schema.ts | 213 ++++++++ .../animate/animate-generic-fade-in-out.tsx | 27 + packages/ui/package.json | 4 +- packages/ui/primitives/avatar.tsx | 35 +- packages/ui/primitives/badge.tsx | 3 +- packages/ui/primitives/button.tsx | 1 + packages/ui/primitives/command.tsx | 4 +- packages/ui/primitives/dialog.tsx | 5 +- .../primitives/document-flow/add-fields.tsx | 4 +- .../ui/primitives/multi-select-combobox.tsx | 165 ++++++ turbo.json | 1 - 200 files changed, 12916 insertions(+), 968 deletions(-) create mode 100644 apps/web/public/static/add-user.png create mode 100644 apps/web/public/static/mail-open-alert.png create mode 100644 apps/web/public/static/mail-open.png rename packages/ui/primitives/multiselect-combobox.tsx => apps/web/src/app/(dashboard)/admin/users/[id]/multiselect-role-combobox.tsx (95%) create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/data-table-sender-filter.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/documents-page-view.tsx create mode 100644 apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx create mode 100644 apps/web/src/app/(dashboard)/settings/teams/page.tsx create mode 100644 apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx create mode 100644 apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/error.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx create mode 100644 apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx create mode 100644 apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx create mode 100644 apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx create mode 100644 apps/web/src/components/(dashboard)/layout/menu-switcher.tsx delete mode 100644 apps/web/src/components/(dashboard)/layout/mobile-nav.tsx create mode 100644 apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx delete mode 100644 apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx create mode 100644 apps/web/src/components/(dashboard)/settings/layout/header.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/add-team-email-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx create mode 100644 apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx create mode 100644 apps/web/src/components/(teams)/forms/update-team-form.tsx create mode 100644 apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx create mode 100644 apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx create mode 100644 apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx create mode 100644 apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/team-members-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx create mode 100644 apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx create mode 100644 apps/web/src/components/(teams)/team-billing-portal-button.tsx create mode 100644 packages/app-tests/e2e/fixtures/authentication.ts create mode 100644 packages/app-tests/e2e/teams/manage-team.spec.ts create mode 100644 packages/app-tests/e2e/teams/team-documents.spec.ts create mode 100644 packages/app-tests/e2e/teams/team-email.spec.ts create mode 100644 packages/app-tests/e2e/teams/team-members.spec.ts create mode 100644 packages/app-tests/e2e/teams/transfer-team.spec.ts create mode 100644 packages/ee/server-only/stripe/create-team-customer.ts create mode 100644 packages/ee/server-only/stripe/delete-customer-payment-methods.ts create mode 100644 packages/ee/server-only/stripe/get-community-plan-prices.ts create mode 100644 packages/ee/server-only/stripe/get-invoices.ts create mode 100644 packages/ee/server-only/stripe/get-prices-by-plan.ts delete mode 100644 packages/ee/server-only/stripe/get-prices-by-type.ts create mode 100644 packages/ee/server-only/stripe/get-team-prices.ts create mode 100644 packages/ee/server-only/stripe/transfer-team-subscription.ts create mode 100644 packages/ee/server-only/stripe/update-customer.ts create mode 100644 packages/ee/server-only/stripe/update-subscription-item-quantity.ts create mode 100644 packages/email/static/add-user.png create mode 100644 packages/email/static/mail-open-alert.png create mode 100644 packages/email/static/mail-open.png create mode 100644 packages/email/template-components/template-image.tsx create mode 100644 packages/email/templates/confirm-team-email.tsx create mode 100644 packages/email/templates/team-email-removed.tsx create mode 100644 packages/email/templates/team-invite.tsx create mode 100644 packages/email/templates/team-transfer-request.tsx create mode 100644 packages/lib/constants/billing.ts create mode 100644 packages/lib/constants/teams.ts create mode 100644 packages/lib/errors/app-error.ts create mode 100644 packages/lib/server-only/team/accept-team-invitation.ts create mode 100644 packages/lib/server-only/team/create-team-billing-portal.ts create mode 100644 packages/lib/server-only/team/create-team-checkout-session.ts create mode 100644 packages/lib/server-only/team/create-team-email-verification.ts create mode 100644 packages/lib/server-only/team/create-team-member-invites.ts create mode 100644 packages/lib/server-only/team/create-team.ts create mode 100644 packages/lib/server-only/team/delete-team-email-verification.ts create mode 100644 packages/lib/server-only/team/delete-team-email.ts create mode 100644 packages/lib/server-only/team/delete-team-invitations.ts create mode 100644 packages/lib/server-only/team/delete-team-members.ts create mode 100644 packages/lib/server-only/team/delete-team-pending.ts create mode 100644 packages/lib/server-only/team/delete-team-transfer-request.ts create mode 100644 packages/lib/server-only/team/delete-team.ts create mode 100644 packages/lib/server-only/team/find-team-invoices.ts create mode 100644 packages/lib/server-only/team/find-team-member-invites.ts create mode 100644 packages/lib/server-only/team/find-team-members.ts create mode 100644 packages/lib/server-only/team/find-teams-pending.ts create mode 100644 packages/lib/server-only/team/find-teams.ts create mode 100644 packages/lib/server-only/team/get-team-email-by-email.ts create mode 100644 packages/lib/server-only/team/get-team-invitations.ts create mode 100644 packages/lib/server-only/team/get-team-members.ts create mode 100644 packages/lib/server-only/team/get-team.ts create mode 100644 packages/lib/server-only/team/get-teams.ts create mode 100644 packages/lib/server-only/team/leave-team.ts create mode 100644 packages/lib/server-only/team/request-team-ownership-transfer.ts create mode 100644 packages/lib/server-only/team/resend-team-email-verification.ts create mode 100644 packages/lib/server-only/team/resend-team-member-invitation.ts create mode 100644 packages/lib/server-only/team/transfer-team-ownership.ts create mode 100644 packages/lib/server-only/team/update-team-email.ts create mode 100644 packages/lib/server-only/team/update-team-member.ts create mode 100644 packages/lib/server-only/team/update-team.ts create mode 100644 packages/lib/utils/billing.ts create mode 100644 packages/lib/utils/params.ts create mode 100644 packages/lib/utils/teams.ts create mode 100644 packages/lib/utils/token-verification.ts create mode 100644 packages/prisma/migrations/20240205040421_add_teams/migration.sql create mode 100644 packages/prisma/seed/documents.ts create mode 100644 packages/prisma/seed/teams.ts create mode 100644 packages/prisma/seed/users.ts create mode 100644 packages/trpc/server/team-router/router.ts create mode 100644 packages/trpc/server/team-router/schema.ts create mode 100644 packages/ui/components/animate/animate-generic-fade-in-out.tsx create mode 100644 packages/ui/primitives/multi-select-combobox.tsx diff --git a/apps/web/public/static/add-user.png b/apps/web/public/static/add-user.png new file mode 100644 index 0000000000000000000000000000000000000000..abd337ceb70d306c70f31d07f1c74e2ca34399be GIT binary patch literal 3361 zcmV++4c_vJP)Gv`oIefP1`wEzQaL0KGNQ&`y?Uh=78W#-p`*s);-W_U zGcz;iRRRbdVk;eN}Y;suHZD8npcaxE1d`GfO#C`k`2XJ3-i082610B20TR31@FMaS~g zQ2n%>OiOwhAenH=G)1|T;zU(6q<3Os!Yh?ZBXrnj3OF?w?a@cZ9`b|AoI8>eBbe3w z`1rV{f*rztIUFe(LL2ogqL9@TWB63kXP#&vne&=xGTl}U0F_VW5Q$sS#)4i{83OWy%E!lf zlHx?(gKc$;0>$`j7Jz&pKd|m`Z1%aaw!Av7xBRfIqRoHwL66e$fA;R(8_A%4v%vHo zOa`DleSh%a!70vPT<`yBpq2zj^`PAL`Uf=l{y*$#*iNMhOx6QPitqEYq9R7AqA}Jz zGc)sxN(o5~Hk8#LwxdUnE>a;*fBN)Er3q9pdd8`tp`o{`Qkz94!K9%u)%TQ235mRj zaz&Ab484Qif{LWRV3h_Sy&#zOzd?FY@q{Ja8S8!`?Abx#p)z@9u)(``@7``|ix=L# zd#BR?=6)f4>NXul-Z)=6VBuLSpfrlKJym&zRdD`(Y;0`Pix)2@W@l&hmoHy*l0bTx zfQQ28if5CoB0|~(C(;>g43`aUIvF4TBC&aY(X~lZ)v=L`co9F+IdtgIgv^($aCsY1N^CTVyRzhx8)VlMN$i+8pD>_kq#BI8i6eHPM4%eMKcdpRW)AMg_W?f=yWO5#iHhRDI_Y?=Z zMgL0H`ZT3czQ;DMgnbaH2!mkSojGvez_3aIH9f*a{lF&93RTG3n+f1ObwZpaV*d`J zF(`p4HXxeG#yP};UMXxO@rtC@?;WG_)3l$wa^=b-r^E5GF%XcCn$L>9`x>*2$PU3iTu6bk<$wK{p>!iD4X z&?jm86Ll|+hD5zcao;DB|4&ifrm#~Wl;ZLbmoex(*c1PV_R*@^RR?(+_<6bYb>Qah|le5^QA-PRfj)?xkPc}2PtlT}$gmRYu?kBJ1iT5s%yV3JLx&_PC&B$Y{4 zIhuFXHqh(dS#ellgxSM-s3CBt*I^@Wq@GJ0>Q*Q zLpG%PhrBo{jeW`vmQGSU=OL-^Ntu@8vwFburj7IPTzm>3HVH;M+uPd<*ZiX(7Owf* z1?*RvaDQcGklM z4f7d*QF`72j@v=o^=ev0%WE*MI)Pxoc!@v8bGNgurd#&WVTSoe@@ib!Fa#Iy6SM{@YiQQntX!Fg zSEN;ZO)T$iFu=}SXgqoM(9n?IKb_@;Y)yHa<+;e%N~Kakbs(^EU#~lF$!uHPl($(o zJ#`Jj$46!hq^W7Ma;SIoXgM5}@hRbuRD`wNBW;LRrfa!c3UaL^osxEmbLB9_fbS~ll-)B$ zf_gg9g9<^3LM#S2F4LA@D_zAemaGJV_ze!ybbuqYpmddRre^jkEKQEfzOLGt)J9Q_ zps@d8(hx>+(Q?0Ejl7`i*7?8>b=joam8)Y325hNRRY(XTL|H`0LbVAF(-1+Vif~G) zP!D-w6+~HiQ|+jhW6P*6d(Gd_8Sjbf8-nrmAVV(beAsZEWdH?T*Rlz+9j)m~r)#+# zIg7Lc$O5gBhF8b`y6)E*9;bD1h#yV@@{i847CQ}2f*o=R`C4S33%ft;dQcqI?zh7P r9fzHBaBy&NaBy&NaBy&NsEOYJQ|7+=Yxnzq00000NkvXXu0mjfB)pO| literal 0 HcmV?d00001 diff --git a/apps/web/public/static/mail-open-alert.png b/apps/web/public/static/mail-open-alert.png new file mode 100644 index 0000000000000000000000000000000000000000..1511f0bc539302bf3fc9de7e18283d8882861ffb GIT binary patch literal 3818 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 BjST<* literal 0 HcmV?d00001 diff --git a/apps/web/src/app/(dashboard)/admin/documents/data-table.tsx b/apps/web/src/app/(dashboard)/admin/documents/data-table.tsx index 83ad81ca1..0fc660968 100644 --- a/apps/web/src/app/(dashboard)/admin/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/admin/documents/data-table.tsx @@ -7,9 +7,9 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { recipientInitials } from '@documenso/lib/utils/recipient-formatter'; -import { Document, User } from '@documenso/prisma/client'; +import type { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; +import type { Document, User } from '@documenso/prisma/client'; import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; @@ -65,7 +65,7 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { accessorKey: 'owner', cell: ({ row }) => { const avatarFallbackText = row.original.User.name - ? recipientInitials(row.original.User.name) + ? extractInitials(row.original.User.name) : row.original.User.email.slice(0, 1).toUpperCase(); return ( diff --git a/packages/ui/primitives/multiselect-combobox.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/multiselect-role-combobox.tsx similarity index 95% rename from packages/ui/primitives/multiselect-combobox.tsx rename to apps/web/src/app/(dashboard)/admin/users/[id]/multiselect-role-combobox.tsx index bac87ce0b..9a25af897 100644 --- a/packages/ui/primitives/multiselect-combobox.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/[id]/multiselect-role-combobox.tsx @@ -19,7 +19,7 @@ type ComboboxProps = { onChange: (_values: string[]) => void; }; -const MultiSelectCombobox = ({ listValues, onChange }: ComboboxProps) => { +const MultiSelectRoleCombobox = ({ listValues, onChange }: ComboboxProps) => { const [open, setOpen] = React.useState(false); const [selectedValues, setSelectedValues] = React.useState([]); const dbRoles = Object.values(Role); @@ -79,4 +79,4 @@ const MultiSelectCombobox = ({ listValues, onChange }: ComboboxProps) => { ); }; -export { MultiSelectCombobox }; +export { MultiSelectRoleCombobox }; diff --git a/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx b/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx index 9ae270d28..3bd909623 100644 --- a/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/[id]/page.tsx @@ -18,9 +18,10 @@ import { FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; -import { MultiSelectCombobox } from '@documenso/ui/primitives/multiselect-combobox'; import { useToast } from '@documenso/ui/primitives/use-toast'; +import { MultiSelectRoleCombobox } from './multiselect-role-combobox'; + const ZUserFormSchema = ZUpdateProfileMutationByAdminSchema.omit({ id: true }); type TUserFormSchema = z.infer; @@ -117,7 +118,7 @@ export default function UserPage({ params }: { params: { id: number } }) {
Roles - onChange(values)} /> diff --git a/apps/web/src/app/(dashboard)/admin/users/page.tsx b/apps/web/src/app/(dashboard)/admin/users/page.tsx index 069378274..577e0739a 100644 --- a/apps/web/src/app/(dashboard)/admin/users/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/users/page.tsx @@ -1,4 +1,5 @@ -import { getPricesByType } from '@documenso/ee/server-only/stripe/get-prices-by-type'; +import { getPricesByPlan } from '@documenso/ee/server-only/stripe/get-prices-by-plan'; +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { UsersDataTable } from './data-table-users'; import { search } from './fetch-users.actions'; @@ -18,7 +19,7 @@ export default async function AdminManageUsers({ searchParams = {} }: AdminManag const [{ users, totalPages }, individualPrices] = await Promise.all([ search(searchString, page, perPage), - getPricesByType('individual'), + getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY), ]); const individualPriceIds = individualPrices.map((price) => price.id); diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx new file mode 100644 index 000000000..3a46ed5e7 --- /dev/null +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx @@ -0,0 +1,131 @@ +import Link from 'next/link'; +import { redirect } from 'next/navigation'; + +import { ChevronLeft, Users2 } from 'lucide-react'; + +import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto'; +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id'; +import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document'; +import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document'; +import { symmetricDecrypt } from '@documenso/lib/universal/crypto'; +import { formatDocumentsPath } from '@documenso/lib/utils/teams'; +import type { Team } from '@documenso/prisma/client'; +import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/client'; +import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; + +import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; +import { DocumentStatus } from '~/components/formatter/document-status'; + +export type DocumentPageViewProps = { + params: { + id: string; + }; + team?: Team; +}; + +export default async function DocumentPageView({ params, team }: DocumentPageViewProps) { + const { id } = params; + + const documentId = Number(id); + + const documentRootPath = formatDocumentsPath(team?.url); + + if (!documentId || Number.isNaN(documentId)) { + redirect(documentRootPath); + } + + const { user } = await getRequiredServerComponentSession(); + + const document = await getDocumentById({ + id: documentId, + userId: user.id, + teamId: team?.id, + }).catch(() => null); + + if (!document || !document.documentData) { + redirect(documentRootPath); + } + + const { documentData, documentMeta } = document; + + if (documentMeta?.password) { + const key = DOCUMENSO_ENCRYPTION_KEY; + + if (!key) { + throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY'); + } + + const securePassword = Buffer.from( + symmetricDecrypt({ + key, + data: documentMeta.password, + }), + ).toString('utf-8'); + + documentMeta.password = securePassword; + } + + const [recipients, fields] = await Promise.all([ + getRecipientsForDocument({ + documentId, + userId: user.id, + }), + getFieldsForDocument({ + documentId, + userId: user.id, + }), + ]); + + return ( +
+ + + Documents + + +

+ {document.title} +

+ +
+ + + {recipients.length > 0 && ( +
+ + + + {recipients.length} Recipient(s) + +
+ )} +
+ + {document.status !== InternalDocumentStatus.COMPLETED && ( + + )} + + {document.status === InternalDocumentStatus.COMPLETED && ( +
+ +
+ )} +
+ ); +} diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index af1877a64..e6cbd6fd4 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -32,6 +32,7 @@ export type EditDocumentFormProps = { documentMeta: DocumentMeta | null; fields: Field[]; documentData: DocumentData; + documentRootPath: string; }; type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; @@ -45,6 +46,7 @@ export const EditDocumentForm = ({ documentMeta, user: _user, documentData, + documentRootPath, }: EditDocumentFormProps) => { const { toast } = useToast(); const router = useRouter(); @@ -168,7 +170,7 @@ export const EditDocumentForm = ({ duration: 5000, }); - router.push('/documents'); + router.push(documentRootPath); } catch (err) { console.error(err); diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index 44f3991d8..e7a34889e 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -1,20 +1,4 @@ -import Link from 'next/link'; -import { redirect } from 'next/navigation'; - -import { ChevronLeft, Users2 } from 'lucide-react'; - -import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto'; -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id'; -import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document'; -import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document'; -import { symmetricDecrypt } from '@documenso/lib/universal/crypto'; -import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/client'; -import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; - -import { EditDocumentForm } from '~/app/(dashboard)/documents/[id]/edit-document'; -import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; -import { DocumentStatus } from '~/components/formatter/document-status'; +import DocumentPageView from './document-page-view'; export type DocumentPageProps = { params: { @@ -22,103 +6,6 @@ export type DocumentPageProps = { }; }; -export default async function DocumentPage({ params }: DocumentPageProps) { - const { id } = params; - - const documentId = Number(id); - - if (!documentId || Number.isNaN(documentId)) { - redirect('/documents'); - } - - const { user } = await getRequiredServerComponentSession(); - - const document = await getDocumentById({ - id: documentId, - userId: user.id, - }).catch(() => null); - - if (!document || !document.documentData) { - redirect('/documents'); - } - - const { documentData, documentMeta } = document; - - if (documentMeta?.password) { - const key = DOCUMENSO_ENCRYPTION_KEY; - - if (!key) { - throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY'); - } - - const securePassword = Buffer.from( - symmetricDecrypt({ - key, - data: documentMeta.password, - }), - ).toString('utf-8'); - - documentMeta.password = securePassword; - } - - const [recipients, fields] = await Promise.all([ - getRecipientsForDocument({ - documentId, - userId: user.id, - }), - getFieldsForDocument({ - documentId, - userId: user.id, - }), - ]); - - return ( -
- - - Documents - - -

- {document.title} -

- -
- - - {recipients.length > 0 && ( -
- - - - {recipients.length} Recipient(s) - -
- )} -
- - {document.status !== InternalDocumentStatus.COMPLETED && ( - - )} - - {document.status === InternalDocumentStatus.COMPLETED && ( -
- -
- )} -
- ); +export default function DocumentPage({ params }: DocumentPageProps) { + return ; } diff --git a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx index 7fabeef95..e8e3d6130 100644 --- a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx @@ -10,6 +10,7 @@ import * as z from 'zod'; import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { recipientAbbreviation } from '@documenso/lib/utils/recipient-formatter'; +import type { Team } from '@documenso/prisma/client'; import { type Document, type Recipient, SigningStatus } from '@documenso/prisma/client'; import { trpc as trpcReact } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -39,8 +40,11 @@ import { StackAvatar } from '~/components/(dashboard)/avatar/stack-avatar'; const FORM_ID = 'resend-email'; export type ResendDocumentActionItemProps = { - document: Document; + document: Document & { + team: Pick | null; + }; recipients: Recipient[]; + team?: Pick; }; export const ZResendDocumentFormSchema = z.object({ @@ -54,15 +58,17 @@ export type TResendDocumentFormSchema = z.infer { const { data: session } = useSession(); const { toast } = useToast(); const [isOpen, setIsOpen] = useState(false); const isOwner = document.userId === session?.user?.id; + const isCurrentTeamDocument = team && document.team?.url === team.url; const isDisabled = - !isOwner || + (!isOwner && !isCurrentTeamDocument) || document.status !== 'PENDING' || !recipients.some((r) => r.signingStatus === SigningStatus.NOT_SIGNED); @@ -82,7 +88,7 @@ export const ResendDocumentActionItem = ({ const onFormSubmit = async ({ recipients }: TResendDocumentFormSchema) => { try { - await resendDocument({ documentId: document.id, recipients }); + await resendDocument({ documentId: document.id, recipients, teamId: team?.id }); toast({ title: 'Document re-sent', diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index ecddf1190..78ffd0b3b 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -7,7 +7,8 @@ import { useSession } from 'next-auth/react'; import { match } from 'ts-pattern'; import { downloadPDF } from '@documenso/lib/client-only/download-pdf'; -import type { Document, Recipient, User } from '@documenso/prisma/client'; +import { formatDocumentsPath } from '@documenso/lib/utils/teams'; +import type { Document, Recipient, Team, User } from '@documenso/prisma/client'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc as trpcClient } from '@documenso/trpc/client'; @@ -18,10 +19,12 @@ export type DataTableActionButtonProps = { row: Document & { User: Pick; Recipient: Recipient[]; + team: Pick | null; }; + team?: Pick; }; -export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { +export const DataTableActionButton = ({ row, team }: DataTableActionButtonProps) => { const { data: session } = useSession(); const { toast } = useToast(); @@ -38,6 +41,9 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { const isComplete = row.status === DocumentStatus.COMPLETED; const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; const role = recipient?.role; + const isCurrentTeamDocument = team && row.team?.url === team.url; + + const documentsPath = formatDocumentsPath(team?.url); const onDownloadClick = async () => { try { @@ -46,6 +52,7 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { if (!recipient) { document = await trpcClient.document.getDocumentById.query({ id: row.id, + teamId: team?.id, }); } else { document = await trpcClient.document.getDocumentByToken.query({ @@ -81,15 +88,19 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { isPending, isComplete, isSigned, + isCurrentTeamDocument, }) - .with({ isOwner: true, isDraft: true }, () => ( - - )) + .with( + isOwner ? { isDraft: true, isOwner: true } : { isDraft: true, isCurrentTeamDocument: true }, + () => ( + + ), + ) .with({ isRecipient: true, isPending: true, isSigned: false }, () => (
)} - {remaining.documents === 0 && ( + {team?.id === undefined && remaining.documents === 0 && (

diff --git a/apps/web/src/app/(dashboard)/layout.tsx b/apps/web/src/app/(dashboard)/layout.tsx index 433aeb18c..99db66c55 100644 --- a/apps/web/src/app/(dashboard)/layout.tsx +++ b/apps/web/src/app/(dashboard)/layout.tsx @@ -7,6 +7,7 @@ import { getServerSession } from 'next-auth'; import { LimitsProvider } from '@documenso/ee/server-only/limits/provider/server'; import { NEXT_AUTH_OPTIONS } from '@documenso/lib/next-auth/auth-options'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeams } from '@documenso/lib/server-only/team/get-teams'; import { Header } from '~/components/(dashboard)/layout/header'; import { VerifyEmailBanner } from '~/components/(dashboard)/layout/verify-email-banner'; @@ -26,13 +27,17 @@ export default async function AuthenticatedDashboardLayout({ redirect('/signin'); } - const { user } = await getRequiredServerComponentSession(); + const [{ user }, teams] = await Promise.all([ + getRequiredServerComponentSession(), + getTeams({ userId: session.user.id }), + ]); return ( {!user.emailVerified && } -
+ +
{children}
diff --git a/apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx b/apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx index 8fd78cae3..9ed6a2515 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx +++ b/apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx @@ -7,7 +7,11 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; import { createBillingPortal } from './create-billing-portal.action'; -export const BillingPortalButton = () => { +export type BillingPortalButtonProps = { + buttonProps?: React.ComponentProps; +}; + +export const BillingPortalButton = ({ buttonProps }: BillingPortalButtonProps) => { const { toast } = useToast(); const [isFetchingPortalUrl, setIsFetchingPortalUrl] = useState(false); @@ -48,7 +52,11 @@ export const BillingPortalButton = () => { }; return ( - ); diff --git a/apps/web/src/app/(dashboard)/settings/billing/page.tsx b/apps/web/src/app/(dashboard)/settings/billing/page.tsx index e226a7e39..cee2aa2f1 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/billing/page.tsx @@ -5,8 +5,9 @@ import { match } from 'ts-pattern'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPricesByInterval } from '@documenso/ee/server-only/stripe/get-prices-by-interval'; -import { getPricesByType } from '@documenso/ee/server-only/stripe/get-prices-by-type'; +import { getPricesByPlan } from '@documenso/ee/server-only/stripe/get-prices-by-plan'; import { getProductByPriceId } from '@documenso/ee/server-only/stripe/get-product-by-price-id'; +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getServerComponentFlag } from '@documenso/lib/server-only/feature-flags/get-server-component-feature-flag'; import { type Stripe } from '@documenso/lib/server-only/stripe'; @@ -36,23 +37,23 @@ export default async function BillingSettingsPage() { user = await getStripeCustomerByUser(user).then((result) => result.user); } - const [subscriptions, prices, individualPrices] = await Promise.all([ + const [subscriptions, prices, communityPlanPrices] = await Promise.all([ getSubscriptionsByUserId({ userId: user.id }), - getPricesByInterval({ type: 'individual' }), - getPricesByType('individual'), + getPricesByInterval({ plan: STRIPE_PLAN_TYPE.COMMUNITY }), + getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY), ]); - const individualPriceIds = individualPrices.map(({ id }) => id); + const communityPlanPriceIds = communityPlanPrices.map(({ id }) => id); let subscriptionProduct: Stripe.Product | null = null; - const individualUserSubscriptions = subscriptions.filter(({ priceId }) => - individualPriceIds.includes(priceId), + const communityPlanUserSubscriptions = subscriptions.filter(({ priceId }) => + communityPlanPriceIds.includes(priceId), ); const subscription = - individualUserSubscriptions.find(({ status }) => status === SubscriptionStatus.ACTIVE) ?? - individualUserSubscriptions[0]; + communityPlanUserSubscriptions.find(({ status }) => status === SubscriptionStatus.ACTIVE) ?? + communityPlanUserSubscriptions[0]; if (subscription?.priceId) { subscriptionProduct = await getProductByPriceId({ priceId: subscription.priceId }).catch( diff --git a/apps/web/src/app/(dashboard)/settings/profile/page.tsx b/apps/web/src/app/(dashboard)/settings/profile/page.tsx index 60f7da49c..2890eb5d5 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from 'next'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; import { ProfileForm } from '~/components/forms/profile'; export const metadata: Metadata = { @@ -13,11 +14,7 @@ export default async function ProfileSettingsPage() { return (
-

Profile

- -

Here you can edit your personal details.

- -
+
diff --git a/apps/web/src/app/(dashboard)/settings/security/page.tsx b/apps/web/src/app/(dashboard)/settings/security/page.tsx index 4e0a40838..f46784aed 100644 --- a/apps/web/src/app/(dashboard)/settings/security/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/security/page.tsx @@ -6,6 +6,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get- import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; import { AuthenticatorApp } from '~/components/forms/2fa/authenticator-app'; import { RecoveryCodes } from '~/components/forms/2fa/recovery-codes'; import { PasswordForm } from '~/components/forms/password'; @@ -19,13 +20,10 @@ export default async function SecuritySettingsPage() { return (
-

Security

- -

- Here you can manage your password and security settings. -

- -
+ {user.identityProvider === 'DOCUMENSO' ? (
diff --git a/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx b/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx new file mode 100644 index 000000000..8aa81653d --- /dev/null +++ b/apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx @@ -0,0 +1,45 @@ +'use client'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type AcceptTeamInvitationButtonProps = { + teamId: number; +}; + +export const AcceptTeamInvitationButton = ({ teamId }: AcceptTeamInvitationButtonProps) => { + const { toast } = useToast(); + + const { + mutateAsync: acceptTeamInvitation, + isLoading, + isSuccess, + } = trpc.team.acceptTeamInvitation.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Accepted team invitation', + duration: 5000, + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + variant: 'destructive', + duration: 10000, + description: 'Unable to join this team at this time.', + }); + }, + }); + + return ( + + ); +}; diff --git a/apps/web/src/app/(dashboard)/settings/teams/page.tsx b/apps/web/src/app/(dashboard)/settings/teams/page.tsx new file mode 100644 index 000000000..1a3d90b66 --- /dev/null +++ b/apps/web/src/app/(dashboard)/settings/teams/page.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { AnimatePresence } from 'framer-motion'; + +import { trpc } from '@documenso/trpc/react'; +import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; + +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; +import { CreateTeamDialog } from '~/components/(teams)/dialogs/create-team-dialog'; +import { UserSettingsTeamsPageDataTable } from '~/components/(teams)/tables/user-settings-teams-page-data-table'; + +import { TeamEmailUsage } from './team-email-usage'; +import { TeamInvitations } from './team-invitations'; + +export default function TeamsSettingsPage() { + const { data: teamEmail } = trpc.team.getTeamEmailByEmail.useQuery(); + + return ( +
+ + + + + + +
+ + {teamEmail && ( + + + + )} + + + +
+
+ ); +} diff --git a/apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx b/apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx new file mode 100644 index 000000000..56a7b110a --- /dev/null +++ b/apps/web/src/app/(dashboard)/settings/teams/team-email-usage.tsx @@ -0,0 +1,105 @@ +'use client'; + +import { useState } from 'react'; + +import type { TeamEmail } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type TeamEmailUsageProps = { + teamEmail: TeamEmail & { team: { name: string; url: string } }; +}; + +export const TeamEmailUsage = ({ teamEmail }: TeamEmailUsageProps) => { + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const { mutateAsync: deleteTeamEmail, isLoading: isDeletingTeamEmail } = + trpc.team.deleteTeamEmail.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'You have successfully revoked access.', + duration: 5000, + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + variant: 'destructive', + duration: 10000, + description: + 'We encountered an unknown error while attempting to revoke access. Please try again or contact support.', + }); + }, + }); + + return ( + +
+ Team Email + +

+ Your email is currently being used by team{' '} + {teamEmail.team.name} ({teamEmail.team.url} + ). +

+ +

They have permission on your behalf to:

+ +
    +
  • Display your name and email in documents
  • +
  • View all documents sent to your account
  • +
+
+
+ + !isDeletingTeamEmail && setOpen(value)}> + + + + + + + Are you sure? + + + You are about to revoke access for team{' '} + {teamEmail.team.name} ({teamEmail.team.url}) to + use your email. + + + +
+ + + + + +
+
+
+
+ ); +}; diff --git a/apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx b/apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx new file mode 100644 index 000000000..aa1be3f3f --- /dev/null +++ b/apps/web/src/app/(dashboard)/settings/teams/team-invitations.tsx @@ -0,0 +1,83 @@ +'use client'; + +import { AnimatePresence } from 'framer-motion'; +import { BellIcon } from 'lucide-react'; + +import { formatTeamUrl } from '@documenso/lib/utils/teams'; +import { trpc } from '@documenso/trpc/react'; +import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; +import { Alert, AlertDescription } from '@documenso/ui/primitives/alert'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; + +import { AcceptTeamInvitationButton } from './accept-team-invitation-button'; + +export const TeamInvitations = () => { + const { data, isInitialLoading } = trpc.team.getTeamInvitations.useQuery(); + + return ( + + {data && data.length > 0 && !isInitialLoading && ( + + +
+ + + + You have {data.length} pending team invitation + {data.length > 1 ? 's' : ''}. + + + + + + + + + + Pending invitations + + + You have {data.length} pending team invitation{data.length > 1 ? 's' : ''}. + + + +
    + {data.map((invitation) => ( +
  • + + {invitation.team.name} + + } + secondaryText={formatTeamUrl(invitation.team.url)} + rightSideComponent={ +
    + +
    + } + /> +
  • + ))} +
+
+
+
+
+
+ )} +
+ ); +}; diff --git a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx index 7930dcd0e..0e8f822c2 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx @@ -83,7 +83,7 @@ export const TemplatesDataTable = ({ return (
{remaining.documents === 0 && ( - + Document Limit Exceeded! diff --git a/apps/web/src/app/(signing)/sign/[token]/layout.tsx b/apps/web/src/app/(signing)/sign/[token]/layout.tsx index cfec41cdf..9db36e8aa 100644 --- a/apps/web/src/app/(signing)/sign/[token]/layout.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/layout.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; +import { getTeams } from '@documenso/lib/server-only/team/get-teams'; import { Header as AuthenticatedHeader } from '~/components/(dashboard)/layout/header'; import { NextAuthProvider } from '~/providers/next-auth'; @@ -12,10 +14,16 @@ export type SigningLayoutProps = { export default async function SigningLayout({ children }: SigningLayoutProps) { const { user, session } = await getServerComponentSession(); + let teams: GetTeamsResponse = []; + + if (user && session) { + teams = await getTeams({ userId: user.id }); + } + return (
- {user && } + {user && }
{children}
diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx new file mode 100644 index 000000000..b7f610cff --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx @@ -0,0 +1,20 @@ +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import DocumentPageComponent from '~/app/(dashboard)/documents/[id]/document-page-view'; + +export type DocumentPageProps = { + params: { + id: string; + teamUrl: string; + }; +}; + +export default async function DocumentPage({ params }: DocumentPageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx new file mode 100644 index 000000000..952aeeeea --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx @@ -0,0 +1,25 @@ +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import type { DocumentsPageViewProps } from '~/app/(dashboard)/documents/documents-page-view'; +import DocumentsPageView from '~/app/(dashboard)/documents/documents-page-view'; + +export type TeamsDocumentPageProps = { + params: { + teamUrl: string; + }; + searchParams?: DocumentsPageViewProps['searchParams']; +}; + +export default async function TeamsDocumentPage({ + params, + searchParams = {}, +}: TeamsDocumentPageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/error.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/error.tsx new file mode 100644 index 000000000..1e1eb9921 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/error.tsx @@ -0,0 +1,54 @@ +'use client'; + +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; + +import { ChevronLeft } from 'lucide-react'; + +import { AppErrorCode } from '@documenso/lib/errors/app-error'; +import { Button } from '@documenso/ui/primitives/button'; + +type ErrorProps = { + error: Error & { digest?: string }; +}; + +export default function ErrorPage({ error }: ErrorProps) { + const router = useRouter(); + + let errorMessage = 'Unknown error'; + let errorDetails = ''; + + if (error.message === AppErrorCode.UNAUTHORIZED) { + errorMessage = 'Unauthorized'; + errorDetails = 'You are not authorized to view this page.'; + } + + return ( +
+
+

{errorMessage}

+ +

Oops! Something went wrong.

+ +

{errorDetails}

+ +
+ + + +
+
+
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx new file mode 100644 index 000000000..3b4f43031 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx @@ -0,0 +1,130 @@ +'use client'; + +import { useState } from 'react'; + +import { AlertTriangle } from 'lucide-react'; +import { match } from 'ts-pattern'; + +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; +import type { TeamMemberRole } from '@documenso/prisma/client'; +import { type Subscription, SubscriptionStatus } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type LayoutBillingBannerProps = { + subscription: Subscription; + teamId: number; + userRole: TeamMemberRole; +}; + +export const LayoutBillingBanner = ({ + subscription, + teamId, + userRole, +}: LayoutBillingBannerProps) => { + const { toast } = useToast(); + + const [isOpen, setIsOpen] = useState(false); + + const { mutateAsync: createBillingPortal, isLoading } = + trpc.team.createBillingPortal.useMutation(); + + const handleCreatePortal = async () => { + try { + const sessionUrl = await createBillingPortal({ teamId }); + + window.open(sessionUrl, '_blank'); + + setIsOpen(false); + } catch (err) { + toast({ + title: 'Something went wrong', + description: + 'We are unable to proceed to the billing portal at this time. Please try again, or contact support.', + variant: 'destructive', + duration: 10000, + }); + } + }; + + if (subscription.status === SubscriptionStatus.ACTIVE) { + return null; + } + + return ( + <> +
+
+
+ + + {match(subscription.status) + .with(SubscriptionStatus.PAST_DUE, () => 'Payment overdue') + .with(SubscriptionStatus.INACTIVE, () => 'Teams restricted') + .exhaustive()} +
+ + +
+
+ + !isLoading && setIsOpen(value)}> + + Payment overdue + + {match(subscription.status) + .with(SubscriptionStatus.PAST_DUE, () => ( + + Your payment for teams is overdue. Please settle the payment to avoid any service + disruptions. + + )) + .with(SubscriptionStatus.INACTIVE, () => ( + + Due to an unpaid invoice, your team has been restricted. Please settle the payment + to restore full access to your team. + + )) + .otherwise(() => null)} + + {canExecuteTeamAction('MANAGE_BILLING', userRole) && ( + + + + )} + + + + ); +}; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx new file mode 100644 index 000000000..2883abc21 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx @@ -0,0 +1,65 @@ +import React from 'react'; + +import { RedirectType, redirect } from 'next/navigation'; + +import { LimitsProvider } from '@documenso/ee/server-only/limits/provider/server'; +import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; +import { getTeams } from '@documenso/lib/server-only/team/get-teams'; +import { SubscriptionStatus } from '@documenso/prisma/client'; + +import { Header } from '~/components/(dashboard)/layout/header'; +import { RefreshOnFocus } from '~/components/(dashboard)/refresh-on-focus/refresh-on-focus'; +import { NextAuthProvider } from '~/providers/next-auth'; + +import { LayoutBillingBanner } from './layout-billing-banner'; + +export type AuthenticatedTeamsLayoutProps = { + children: React.ReactNode; + params: { + teamUrl: string; + }; +}; + +export default async function AuthenticatedTeamsLayout({ + children, + params, +}: AuthenticatedTeamsLayoutProps) { + const { session, user } = await getServerComponentSession(); + + if (!session || !user) { + redirect('/signin'); + } + + const [getTeamsPromise, getTeamPromise] = await Promise.allSettled([ + getTeams({ userId: user.id }), + getTeamByUrl({ userId: user.id, teamUrl: params.teamUrl }), + ]); + + if (getTeamPromise.status === 'rejected') { + redirect('/documents', RedirectType.replace); + } + + const team = getTeamPromise.value; + const teams = getTeamsPromise.status === 'fulfilled' ? getTeamsPromise.value : []; + + return ( + + + {team.subscription && team.subscription.status !== SubscriptionStatus.ACTIVE && ( + + )} + +
+ +
{children}
+ + + + + ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx new file mode 100644 index 000000000..35962e264 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Link from 'next/link'; + +import { ChevronLeft } from 'lucide-react'; + +import { Button } from '@documenso/ui/primitives/button'; + +export default function NotFound() { + return ( +
+
+

404 Team not found

+ +

Oops! Something went wrong.

+ +

+ The team you are looking for may have been removed, renamed or may have never existed. +

+ +
+ +
+
+
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx new file mode 100644 index 000000000..1d0e87f79 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx @@ -0,0 +1,84 @@ +import { DateTime } from 'luxon'; +import type Stripe from 'stripe'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { stripe } from '@documenso/lib/server-only/stripe'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; +import { Card, CardContent } from '@documenso/ui/primitives/card'; + +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; +import { TeamBillingInvoicesDataTable } from '~/components/(teams)/tables/team-billing-invoices-data-table'; +import { TeamBillingPortalButton } from '~/components/(teams)/team-billing-portal-button'; + +export type TeamsSettingsBillingPageProps = { + params: { + teamUrl: string; + }; +}; + +export default async function TeamsSettingBillingPage({ params }: TeamsSettingsBillingPageProps) { + const session = await getRequiredServerComponentSession(); + + const team = await getTeamByUrl({ userId: session.user.id, teamUrl: params.teamUrl }); + + const canManageBilling = canExecuteTeamAction('MANAGE_BILLING', team.currentTeamMember.role); + + let teamSubscription: Stripe.Subscription | null = null; + + if (team.subscription) { + teamSubscription = await stripe.subscriptions.retrieve(team.subscription.planId); + } + + const formatTeamSubscriptionDetails = (subscription: Stripe.Subscription | null) => { + if (!subscription) { + return 'No payment required'; + } + + const numberOfSeats = subscription.items.data[0].quantity ?? 0; + + const formattedTeamMemberQuanity = numberOfSeats > 1 ? `${numberOfSeats} members` : '1 member'; + + const formattedDate = DateTime.fromSeconds(subscription.current_period_end).toFormat( + 'LLL dd, yyyy', + ); + + return `${formattedTeamMemberQuanity} • Monthly • Renews: ${formattedDate}`; + }; + + return ( +
+ + + + +
+

+ Current plan: {teamSubscription ? 'Team' : 'Community Team'} +

+ +

+ {formatTeamSubscriptionDetails(teamSubscription)} +

+
+ + {teamSubscription && ( +
+ +
+ )} +
+
+ +
+ +
+
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx new file mode 100644 index 000000000..fe2ee5aee --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx @@ -0,0 +1,54 @@ +import React from 'react'; + +import { notFound } from 'next/navigation'; + +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; + +import { DesktopNav } from '~/components/(teams)/settings/layout/desktop-nav'; +import { MobileNav } from '~/components/(teams)/settings/layout/mobile-nav'; + +export type TeamSettingsLayoutProps = { + children: React.ReactNode; + params: { + teamUrl: string; + }; +}; + +export default async function TeamsSettingsLayout({ + children, + params: { teamUrl }, +}: TeamSettingsLayoutProps) { + const session = await getRequiredServerComponentSession(); + + try { + const team = await getTeamByUrl({ userId: session.user.id, teamUrl }); + + if (!canExecuteTeamAction('MANAGE_TEAM', team.currentTeamMember.role)) { + throw new Error(AppErrorCode.UNAUTHORIZED); + } + } catch (e) { + const error = AppError.parseError(e); + + if (error.code === 'P2025') { + notFound(); + } + + throw e; + } + + return ( +
+

Team Settings

+ +
+ + + +
{children}
+
+
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx new file mode 100644 index 000000000..4617b3d48 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx @@ -0,0 +1,38 @@ +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; +import { InviteTeamMembersDialog } from '~/components/(teams)/dialogs/invite-team-member-dialog'; +import { TeamsMemberPageDataTable } from '~/components/(teams)/tables/teams-member-page-data-table'; + +export type TeamsSettingsMembersPageProps = { + params: { + teamUrl: string; + }; +}; + +export default async function TeamsSettingsMembersPage({ params }: TeamsSettingsMembersPageProps) { + const { teamUrl } = params; + + const session = await getRequiredServerComponentSession(); + + const team = await getTeamByUrl({ userId: session.user.id, teamUrl }); + + return ( +
+ + + + + +
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx new file mode 100644 index 000000000..a86797191 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/page.tsx @@ -0,0 +1,186 @@ +import { CheckCircle2, Clock } from 'lucide-react'; +import { P, match } from 'ts-pattern'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; +import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; +import { isTokenExpired } from '@documenso/lib/utils/token-verification'; +import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; + +import { SettingsHeader } from '~/components/(dashboard)/settings/layout/header'; +import { AddTeamEmailDialog } from '~/components/(teams)/dialogs/add-team-email-dialog'; +import { DeleteTeamDialog } from '~/components/(teams)/dialogs/delete-team-dialog'; +import { TransferTeamDialog } from '~/components/(teams)/dialogs/transfer-team-dialog'; +import { UpdateTeamForm } from '~/components/(teams)/forms/update-team-form'; + +import { TeamEmailDropdown } from './team-email-dropdown'; +import { TeamTransferStatus } from './team-transfer-status'; + +export type TeamsSettingsPageProps = { + params: { + teamUrl: string; + }; +}; + +export default async function TeamsSettingsPage({ params }: TeamsSettingsPageProps) { + const { teamUrl } = params; + + const session = await getRequiredServerComponentSession(); + + const team = await getTeamByUrl({ userId: session.user.id, teamUrl }); + + const isTransferVerificationExpired = + !team.transferVerification || isTokenExpired(team.transferVerification.expiresAt); + + return ( +
+ + + + + + +
+ {(team.teamEmail || team.emailVerification) && ( + + Team email + + + You can view documents associated with this email and use this identity when sending + documents. + + +
+ +
+ + {team.teamEmail?.name || team.emailVerification?.name} + + } + secondaryText={ + + {team.teamEmail?.email || team.emailVerification?.email} + + } + /> + +
+
+ {match({ + teamEmail: team.teamEmail, + emailVerification: team.emailVerification, + }) + .with({ teamEmail: P.not(null) }, () => ( + <> + + Active + + )) + .with( + { + emailVerification: P.when( + (emailVerification) => + emailVerification && emailVerification?.expiresAt < new Date(), + ), + }, + () => ( + <> + + Expired + + ), + ) + .with({ emailVerification: P.not(null) }, () => ( + <> + + Awaiting email confirmation + + )) + .otherwise(() => null)} +
+ + +
+
+
+ )} + + {!team.teamEmail && !team.emailVerification && ( + +
+ Team email + + +
    + {/* Feature not available yet. */} + {/*
  • Display this name and email when sending documents
  • */} + {/*
  • View documents associated with this email
  • */} + + View documents associated with this email +
+
+
+ + +
+ )} + + {team.ownerUserId === session.user.id && ( + <> + {isTransferVerificationExpired && ( + +
+ Transfer team + + + Transfer the ownership of the team to another team member. + +
+ + +
+ )} + + +
+ Delete team + + + This team, and any associated data excluding billing invoices will be permanently + deleted. + +
+ + +
+ + )} +
+
+ ); +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx new file mode 100644 index 000000000..e2c0a0d87 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-email-dropdown.tsx @@ -0,0 +1,143 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { Edit, Loader, Mail, MoreHorizontal, X } from 'lucide-react'; + +import type { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; +import { trpc } from '@documenso/trpc/react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@documenso/ui/primitives/dropdown-menu'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { UpdateTeamEmailDialog } from '~/components/(teams)/dialogs/update-team-email-dialog'; + +export type TeamsSettingsPageProps = { + team: Awaited>; +}; + +export const TeamEmailDropdown = ({ team }: TeamsSettingsPageProps) => { + const router = useRouter(); + + const { toast } = useToast(); + + const { mutateAsync: resendEmailVerification, isLoading: isResendingEmailVerification } = + trpc.team.resendTeamEmailVerification.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Email verification has been resent', + duration: 5000, + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + variant: 'destructive', + duration: 10000, + description: 'Unable to resend verification at this time. Please try again.', + }); + }, + }); + + const { mutateAsync: deleteTeamEmail, isLoading: isDeletingTeamEmail } = + trpc.team.deleteTeamEmail.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Team email has been removed', + duration: 5000, + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + variant: 'destructive', + duration: 10000, + description: 'Unable to remove team email at this time. Please try again.', + }); + }, + }); + + const { mutateAsync: deleteTeamEmailVerification, isLoading: isDeletingTeamEmailVerification } = + trpc.team.deleteTeamEmailVerification.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Email verification has been removed', + duration: 5000, + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + variant: 'destructive', + duration: 10000, + description: 'Unable to remove email verification at this time. Please try again.', + }); + }, + }); + + const onRemove = async () => { + if (team.teamEmail) { + await deleteTeamEmail({ teamId: team.id }); + } + + if (team.emailVerification) { + await deleteTeamEmailVerification({ teamId: team.id }); + } + + router.refresh(); + }; + + return ( + + + + + + + {!team.teamEmail && team.emailVerification && ( + { + e.preventDefault(); + void resendEmailVerification({ teamId: team.id }); + }} + > + {isResendingEmailVerification ? ( + + ) : ( + + )} + Resend verification + + )} + + {team.teamEmail && ( + e.preventDefault()}> + + Edit + + } + /> + )} + + onRemove()} + > + + Remove + + + + ); +}; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx new file mode 100644 index 000000000..cba50966f --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/settings/team-transfer-status.tsx @@ -0,0 +1,115 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { AnimatePresence } from 'framer-motion'; + +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; +import { isTokenExpired } from '@documenso/lib/utils/token-verification'; +import type { TeamMemberRole, TeamTransferVerification } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; +import { cn } from '@documenso/ui/lib/utils'; +import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; +import { Button } from '@documenso/ui/primitives/button'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type TeamTransferStatusProps = { + className?: string; + currentUserTeamRole: TeamMemberRole; + teamId: number; + transferVerification: TeamTransferVerification | null; +}; + +export const TeamTransferStatus = ({ + className, + currentUserTeamRole, + teamId, + transferVerification, +}: TeamTransferStatusProps) => { + const router = useRouter(); + + const { toast } = useToast(); + + const isExpired = transferVerification && isTokenExpired(transferVerification.expiresAt); + + const { mutateAsync: deleteTeamTransferRequest, isLoading } = + trpc.team.deleteTeamTransferRequest.useMutation({ + onSuccess: () => { + if (!isExpired) { + toast({ + title: 'Success', + description: 'The team transfer invitation has been successfully deleted.', + duration: 5000, + }); + } + + router.refresh(); + }, + onError: () => { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to remove this transfer. Please try again or contact support.', + }); + }, + }); + + return ( + + {transferVerification && ( + + +
+ + {isExpired ? 'Team transfer request expired' : 'Team transfer in progress'} + + + + {isExpired ? ( +

+ The team transfer request to {transferVerification.name} has + expired. +

+ ) : ( +
+

+ A request to transfer the ownership of this team has been sent to{' '} + + {transferVerification.name} ({transferVerification.email}) + +

+ +

+ If they accept this request, the team will be transferred to their account. +

+
+ )} +
+
+ + {canExecuteTeamAction('DELETE_TEAM_TRANSFER_REQUEST', currentUserTeamRole) && ( + + )} +
+
+ )} +
+ ); +}; diff --git a/apps/web/src/app/(unauthenticated)/signin/page.tsx b/apps/web/src/app/(unauthenticated)/signin/page.tsx index 1332a3f37..8331e7c03 100644 --- a/apps/web/src/app/(unauthenticated)/signin/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signin/page.tsx @@ -1,7 +1,9 @@ import type { Metadata } from 'next'; import Link from 'next/link'; +import { redirect } from 'next/navigation'; import { IS_GOOGLE_SSO_ENABLED } from '@documenso/lib/constants/auth'; +import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { SignInForm } from '~/components/forms/signin'; @@ -9,7 +11,20 @@ export const metadata: Metadata = { title: 'Sign In', }; -export default function SignInPage() { +type SignInPageProps = { + searchParams: { + email?: string; + }; +}; + +export default function SignInPage({ searchParams }: SignInPageProps) { + const rawEmail = typeof searchParams.email === 'string' ? searchParams.email : undefined; + const email = rawEmail ? decryptSecondaryData(rawEmail) : null; + + if (!email && rawEmail) { + redirect('/signin'); + } + return (

Sign in to your account

@@ -18,7 +33,11 @@ export default function SignInPage() { Welcome back, we are lucky to have you.

- + {process.env.NEXT_PUBLIC_DISABLE_SIGNUP !== 'true' && (

diff --git a/apps/web/src/app/(unauthenticated)/signup/page.tsx b/apps/web/src/app/(unauthenticated)/signup/page.tsx index c6d49f891..dbbbcdba9 100644 --- a/apps/web/src/app/(unauthenticated)/signup/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signup/page.tsx @@ -3,6 +3,7 @@ import Link from 'next/link'; import { redirect } from 'next/navigation'; import { IS_GOOGLE_SSO_ENABLED } from '@documenso/lib/constants/auth'; +import { decryptSecondaryData } from '@documenso/lib/server-only/crypto/decrypt'; import { SignUpForm } from '~/components/forms/signup'; @@ -10,11 +11,24 @@ export const metadata: Metadata = { title: 'Sign Up', }; -export default function SignUpPage() { +type SignUpPageProps = { + searchParams: { + email?: string; + }; +}; + +export default function SignUpPage({ searchParams }: SignUpPageProps) { if (process.env.NEXT_PUBLIC_DISABLE_SIGNUP === 'true') { redirect('/signin'); } + const rawEmail = typeof searchParams.email === 'string' ? searchParams.email : undefined; + const email = rawEmail ? decryptSecondaryData(rawEmail) : null; + + if (!email && rawEmail) { + redirect('/signup'); + } + return (

Create a new account

@@ -24,7 +38,11 @@ export default function SignUpPage() { signing is within your grasp.

- +

Already have an account?{' '} diff --git a/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx new file mode 100644 index 000000000..634416fe3 --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/team/invite/[token]/page.tsx @@ -0,0 +1,121 @@ +import Link from 'next/link'; + +import { DateTime } from 'luxon'; + +import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { encryptSecondaryData } from '@documenso/lib/server-only/crypto/encrypt'; +import { acceptTeamInvitation } from '@documenso/lib/server-only/team/accept-team-invitation'; +import { getTeamById } from '@documenso/lib/server-only/team/get-team'; +import { prisma } from '@documenso/prisma'; +import { TeamMemberInviteStatus } from '@documenso/prisma/client'; +import { Button } from '@documenso/ui/primitives/button'; + +type AcceptInvitationPageProps = { + params: { + token: string; + }; +}; + +export default async function AcceptInvitationPage({ + params: { token }, +}: AcceptInvitationPageProps) { + const session = await getServerComponentSession(); + + const teamMemberInvite = await prisma.teamMemberInvite.findUnique({ + where: { + token, + }, + }); + + if (!teamMemberInvite) { + return ( +

+

Invalid token

+ +

+ This token is invalid or has expired. Please contact your team for a new invitation. +

+ + +
+ ); + } + + const team = await getTeamById({ teamId: teamMemberInvite.teamId }); + + const user = await prisma.user.findFirst({ + where: { + email: { + equals: teamMemberInvite.email, + mode: 'insensitive', + }, + }, + }); + + // Directly convert the team member invite to a team member if they already have an account. + if (user) { + await acceptTeamInvitation({ userId: user.id, teamId: team.id }); + } + + // For users who do not exist yet, set the team invite status to accepted, which is checked during + // user creation to determine if we should add the user to the team at that time. + if (!user && teamMemberInvite.status !== TeamMemberInviteStatus.ACCEPTED) { + await prisma.teamMemberInvite.update({ + where: { + id: teamMemberInvite.id, + }, + data: { + status: TeamMemberInviteStatus.ACCEPTED, + }, + }); + } + + const email = encryptSecondaryData({ + data: teamMemberInvite.email, + expiresAt: DateTime.now().plus({ days: 1 }).toMillis(), + }); + + if (!user) { + return ( +
+

Team invitation

+ +

+ You have been invited by {team.name} to join their team. +

+ +

+ To accept this invitation you must create an account. +

+ + +
+ ); + } + + const isSessionUserTheInvitedUser = user.id === session.user?.id; + + return ( +
+

Invitation accepted!

+ +

+ You have accepted an invitation from {team.name} to join their team. +

+ + {isSessionUserTheInvitedUser ? ( + + ) : ( + + )} +
+ ); +} diff --git a/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx new file mode 100644 index 000000000..53ad4461b --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx @@ -0,0 +1,89 @@ +import Link from 'next/link'; + +import { isTokenExpired } from '@documenso/lib/utils/token-verification'; +import { prisma } from '@documenso/prisma'; +import { Button } from '@documenso/ui/primitives/button'; + +type VerifyTeamEmailPageProps = { + params: { + token: string; + }; +}; + +export default async function VerifyTeamEmailPage({ params: { token } }: VerifyTeamEmailPageProps) { + const teamEmailVerification = await prisma.teamEmailVerification.findUnique({ + where: { + token, + }, + include: { + team: true, + }, + }); + + if (!teamEmailVerification || isTokenExpired(teamEmailVerification.expiresAt)) { + return ( +
+

Invalid link

+ +

+ This link is invalid or has expired. Please contact your team to resend a verification. +

+ + +
+ ); + } + + const { team } = teamEmailVerification; + + let isTeamEmailVerificationError = false; + + try { + await prisma.$transaction([ + prisma.teamEmailVerification.deleteMany({ + where: { + teamId: team.id, + }, + }), + prisma.teamEmail.create({ + data: { + teamId: team.id, + email: teamEmailVerification.email, + name: teamEmailVerification.name, + }, + }), + ]); + } catch (e) { + console.error(e); + isTeamEmailVerificationError = true; + } + + if (isTeamEmailVerificationError) { + return ( +
+

Team email verification

+ +

+ Something went wrong while attempting to verify your email address for{' '} + {team.name}. Please try again later. +

+
+ ); + } + + return ( +
+

Team email verified!

+ +

+ You have verified your email address for {team.name}. +

+ + +
+ ); +} diff --git a/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx new file mode 100644 index 000000000..819b7e970 --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx @@ -0,0 +1,80 @@ +import Link from 'next/link'; + +import { transferTeamOwnership } from '@documenso/lib/server-only/team/transfer-team-ownership'; +import { isTokenExpired } from '@documenso/lib/utils/token-verification'; +import { prisma } from '@documenso/prisma'; +import { Button } from '@documenso/ui/primitives/button'; + +type VerifyTeamTransferPage = { + params: { + token: string; + }; +}; + +export default async function VerifyTeamTransferPage({ + params: { token }, +}: VerifyTeamTransferPage) { + const teamTransferVerification = await prisma.teamTransferVerification.findUnique({ + where: { + token, + }, + include: { + team: true, + }, + }); + + if (!teamTransferVerification || isTokenExpired(teamTransferVerification.expiresAt)) { + return ( +
+

Invalid link

+ +

+ This link is invalid or has expired. Please contact your team to resend a transfer + request. +

+ + +
+ ); + } + + const { team } = teamTransferVerification; + + let isTransferError = false; + + try { + await transferTeamOwnership({ token }); + } catch (e) { + console.error(e); + isTransferError = true; + } + + if (isTransferError) { + return ( +
+

Team ownership transfer

+ +

+ Something went wrong while attempting to transfer the ownership of team{' '} + {team.name} to your. Please try again later or contact support. +

+
+ ); + } + + return ( +
+

Team ownership transferred!

+ +

+ The ownership of team {team.name} has been successfully transferred to you. +

+ + +
+ ); +} diff --git a/apps/web/src/components/(dashboard)/common/command-menu.tsx b/apps/web/src/components/(dashboard)/common/command-menu.tsx index 0312a96d2..3fe42a4c4 100644 --- a/apps/web/src/components/(dashboard)/common/command-menu.tsx +++ b/apps/web/src/components/(dashboard)/common/command-menu.tsx @@ -197,20 +197,22 @@ export function CommandMenu({ open, onOpenChange }: CommandMenuProps) { )} {!currentPage && ( <> - + - + - + - - addPage('theme')}>Change theme + + addPage('theme')}> + Change theme + {searchResults.length > 0 && ( - + )} @@ -231,6 +233,7 @@ const Commands = ({ }) => { return pages.map((page, idx) => ( push(page.path)} @@ -255,7 +258,7 @@ const ThemeCommands = ({ setTheme }: { setTheme: (_theme: string) => void }) => setTheme(theme.theme)} - className="mx-2 first:mt-2 last:mb-2" + className="-my-1 mx-2 rounded-lg first:mt-2 last:mb-2" > {theme.label} diff --git a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx index e04bc2818..2b11c4be2 100644 --- a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx @@ -4,10 +4,11 @@ import type { HTMLAttributes } from 'react'; import { useEffect, useState } from 'react'; import Link from 'next/link'; -import { usePathname } from 'next/navigation'; +import { useParams, usePathname } from 'next/navigation'; import { Search } from 'lucide-react'; +import { getRootHref } from '@documenso/lib/utils/params'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -28,10 +29,13 @@ export type DesktopNavProps = HTMLAttributes; export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { const pathname = usePathname(); + const params = useParams(); const [open, setOpen] = useState(false); const [modifierKey, setModifierKey] = useState(() => 'Ctrl'); + const rootHref = getRootHref(params, { returnEmptyRootString: true }); + useEffect(() => { const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown'; const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent); @@ -48,20 +52,24 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { {...props} >
- {navigationLinks.map(({ href, label }) => ( - - {label} - - ))} + {navigationLinks + .filter(({ href }) => href !== '/templates' || rootHref === '') // Remove templates for team pages. + .map(({ href, label }) => ( + + {label} + + ))}
diff --git a/apps/web/src/components/(dashboard)/layout/header.tsx b/apps/web/src/components/(dashboard)/layout/header.tsx index ba35671e6..753f5fb11 100644 --- a/apps/web/src/components/(dashboard)/layout/header.tsx +++ b/apps/web/src/components/(dashboard)/layout/header.tsx @@ -1,23 +1,34 @@ 'use client'; -import type { HTMLAttributes } from 'react'; -import { useEffect, useState } from 'react'; +import { type HTMLAttributes, useEffect, useState } from 'react'; import Link from 'next/link'; +import { useParams } from 'next/navigation'; +import { MenuIcon, SearchIcon } from 'lucide-react'; + +import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; +import { getRootHref } from '@documenso/lib/utils/params'; import type { User } from '@documenso/prisma/client'; import { cn } from '@documenso/ui/lib/utils'; import { Logo } from '~/components/branding/logo'; +import { CommandMenu } from '../common/command-menu'; import { DesktopNav } from './desktop-nav'; -import { ProfileDropdown } from './profile-dropdown'; +import { MenuSwitcher } from './menu-switcher'; +import { MobileNavigation } from './mobile-navigation'; export type HeaderProps = HTMLAttributes & { user: User; + teams: GetTeamsResponse; }; -export const Header = ({ className, user, ...props }: HeaderProps) => { +export const Header = ({ className, user, teams, ...props }: HeaderProps) => { + const params = useParams(); + + const [isCommandMenuOpen, setIsCommandMenuOpen] = useState(false); + const [isHamburgerMenuOpen, setIsHamburgerMenuOpen] = useState(false); const [scrollY, setScrollY] = useState(0); useEffect(() => { @@ -41,8 +52,8 @@ export const Header = ({ className, user, ...props }: HeaderProps) => { >
@@ -50,11 +61,24 @@ export const Header = ({ className, user, ...props }: HeaderProps) => {
- + +
- {/* */} +
+ + + + + + +
diff --git a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx new file mode 100644 index 000000000..35a05baf2 --- /dev/null +++ b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx @@ -0,0 +1,214 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +import { CheckCircle2, ChevronsUpDown, Plus, Settings2 } from 'lucide-react'; +import { signOut } from 'next-auth/react'; + +import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; +import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; +import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; +import type { User } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { cn } from '@documenso/ui/lib/utils'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { Button } from '@documenso/ui/primitives/button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@documenso/ui/primitives/dropdown-menu'; + +export type MenuSwitcherProps = { + user: User; + teams: GetTeamsResponse; +}; + +export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProps) => { + const pathname = usePathname(); + + const isUserAdmin = isAdmin(user); + + const { data: teamsQueryResult } = trpc.team.getTeams.useQuery(undefined, { + initialData: initialTeamsData, + }); + + const teams = teamsQueryResult && teamsQueryResult.length > 0 ? teamsQueryResult : null; + + const isPathTeamUrl = (teamUrl: string) => { + if (!pathname || !pathname.startsWith(`/t/`)) { + return false; + } + + return pathname.split('/')[2] === teamUrl; + }; + + const selectedTeam = teams?.find((team) => isPathTeamUrl(team.url)); + + const formatAvatarFallback = (teamName?: string) => { + if (teamName !== undefined) { + return teamName.slice(0, 1).toUpperCase(); + } + + return user.name ? extractInitials(user.name) : user.email.slice(0, 1).toUpperCase(); + }; + + const formatSecondaryAvatarText = (team?: typeof selectedTeam) => { + if (!team) { + return 'Personal Account'; + } + + if (team.ownerUserId === user.id) { + return 'Owner'; + } + + return TEAM_MEMBER_ROLE_MAP[team.currentTeamMember.role]; + }; + + return ( + + + + + + + {teams ? ( + <> + Personal + + + + + ) + } + /> + + + + + + +
+

Teams

+ +
+ + + + + + + +
+
+
+ + {teams.map((team) => ( + + + + ) + } + /> + + + ))} + + ) : ( + + + Create team + + + + )} + + + + {isUserAdmin && ( + + Admin panel + + )} + + + User settings + + + {selectedTeam && + canExecuteTeamAction('MANAGE_TEAM', selectedTeam.currentTeamMember.role) && ( + + Team settings + + )} + + + signOut({ + callbackUrl: '/', + }) + } + > + Sign Out + +
+
+ ); +}; diff --git a/apps/web/src/components/(dashboard)/layout/mobile-nav.tsx b/apps/web/src/components/(dashboard)/layout/mobile-nav.tsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx new file mode 100644 index 000000000..7142de5dc --- /dev/null +++ b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx @@ -0,0 +1,96 @@ +'use client'; + +import Image from 'next/image'; +import Link from 'next/link'; +import { useParams } from 'next/navigation'; + +import { signOut } from 'next-auth/react'; + +import LogoImage from '@documenso/assets/logo.png'; +import { getRootHref } from '@documenso/lib/utils/params'; +import { Sheet, SheetContent } from '@documenso/ui/primitives/sheet'; +import { ThemeSwitcher } from '@documenso/ui/primitives/theme-switcher'; + +export type MobileNavigationProps = { + isMenuOpen: boolean; + onMenuOpenChange?: (_value: boolean) => void; +}; + +export const MobileNavigation = ({ isMenuOpen, onMenuOpenChange }: MobileNavigationProps) => { + const params = useParams(); + + const handleMenuItemClick = () => { + onMenuOpenChange?.(false); + }; + + const rootHref = getRootHref(params, { returnEmptyRootString: true }); + + const menuNavigationLinks = [ + { + href: `${rootHref}/documents`, + text: 'Documents', + }, + { + href: `${rootHref}/templates`, + text: 'Templates', + }, + { + href: '/settings/teams', + text: 'Teams', + }, + { + href: '/settings/profile', + text: 'Settings', + }, + ].filter(({ text, href }) => text !== 'Templates' || href === '/templates'); // Filter out templates for teams. + + return ( + + + + Documenso Logo + + +
+ {menuNavigationLinks.map(({ href, text }) => ( + handleMenuItemClick()} + > + {text} + + ))} + + +
+ +
+
+ +
+ +

+ © {new Date().getFullYear()} Documenso, Inc. All rights reserved. +

+
+
+
+ ); +}; diff --git a/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx b/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx deleted file mode 100644 index f2432c071..000000000 --- a/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx +++ /dev/null @@ -1,169 +0,0 @@ -'use client'; - -import Link from 'next/link'; - -import { - CreditCard, - FileSpreadsheet, - Lock, - LogOut, - User as LucideUser, - Monitor, - Moon, - Palette, - Sun, - UserCog, -} from 'lucide-react'; -import { signOut } from 'next-auth/react'; -import { useTheme } from 'next-themes'; -import { LuGithub } from 'react-icons/lu'; - -import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; -import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; -import { recipientInitials } from '@documenso/lib/utils/recipient-formatter'; -import type { User } from '@documenso/prisma/client'; -import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; -import { Button } from '@documenso/ui/primitives/button'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuPortal, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuSeparator, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuTrigger, -} from '@documenso/ui/primitives/dropdown-menu'; - -export type ProfileDropdownProps = { - user: User; -}; - -export const ProfileDropdown = ({ user }: ProfileDropdownProps) => { - const { getFlag } = useFeatureFlags(); - const { theme, setTheme } = useTheme(); - const isUserAdmin = isAdmin(user); - - const isBillingEnabled = getFlag('app_billing'); - - const avatarFallback = user.name - ? recipientInitials(user.name) - : user.email.slice(0, 1).toUpperCase(); - - return ( - - - - - - - Account - - {isUserAdmin && ( - <> - - - - Admin - - - - - - )} - - - - - Profile - - - - - - - Security - - - - {isBillingEnabled && ( - - - - Billing - - - )} - - - - - - Templates - - - - - - - - Themes - - - - - - Light - - - - Dark - - - - System - - - - - - - - - - Star on Github - - - - - - - void signOut({ - callbackUrl: '/', - }) - } - > - - Sign Out - - - - ); -}; diff --git a/apps/web/src/components/(dashboard)/period-selector/period-selector.tsx b/apps/web/src/components/(dashboard)/period-selector/period-selector.tsx index caeb780d0..a49e2f284 100644 --- a/apps/web/src/components/(dashboard)/period-selector/period-selector.tsx +++ b/apps/web/src/components/(dashboard)/period-selector/period-selector.tsx @@ -21,9 +21,9 @@ export const PeriodSelector = () => { const router = useRouter(); const period = useMemo(() => { - const p = searchParams?.get('period') ?? ''; + const p = searchParams?.get('period') ?? 'all'; - return isPeriodSelectorValue(p) ? p : ''; + return isPeriodSelectorValue(p) ? p : 'all'; }, [searchParams]); const onPeriodChange = (newPeriod: string) => { @@ -35,7 +35,7 @@ export const PeriodSelector = () => { params.set('period', newPeriod); - if (newPeriod === '') { + if (newPeriod === '' || newPeriod === 'all') { params.delete('period'); } @@ -49,7 +49,7 @@ export const PeriodSelector = () => { - All Time + All Time Last 7 days Last 14 days Last 30 days diff --git a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx index f4b2aae5e..c7ab61d8a 100644 --- a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx @@ -1,11 +1,11 @@ 'use client'; -import { HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import { CreditCard, Lock, User } from 'lucide-react'; +import { CreditCard, Lock, User, Users } from 'lucide-react'; import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import { cn } from '@documenso/ui/lib/utils'; @@ -35,6 +35,19 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { + + + + + + + + + )} + + + + + Add team email + + + A verification email will be sent to the provided email. + + + +
+ +
+ ( + + Name + + + + + + )} + /> + + ( + + Email + + + + + + )} + /> + + + + + + +
+
+ +
+ + ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx b/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx new file mode 100644 index 000000000..f7ee8ca51 --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx @@ -0,0 +1,177 @@ +import { useMemo, useState } from 'react'; + +import type * as DialogPrimitive from '@radix-ui/react-dialog'; +import { AnimatePresence, motion } from 'framer-motion'; +import { Loader, TagIcon } from 'lucide-react'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { Card, CardContent } from '@documenso/ui/primitives/card'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type CreateTeamCheckoutDialogProps = { + pendingTeamId: number | null; + onClose: () => void; +} & Omit; + +const MotionCard = motion(Card); + +export const CreateTeamCheckoutDialog = ({ + pendingTeamId, + onClose, + ...props +}: CreateTeamCheckoutDialogProps) => { + const { toast } = useToast(); + + const [interval, setInterval] = useState<'monthly' | 'yearly'>('monthly'); + + const { data, isLoading } = trpc.team.getTeamPrices.useQuery(); + + const { mutateAsync: createCheckout, isLoading: isCreatingCheckout } = + trpc.team.createTeamPendingCheckout.useMutation({ + onSuccess: (checkoutUrl) => { + window.open(checkoutUrl, '_blank'); + onClose(); + }, + onError: () => + toast({ + title: 'Something went wrong', + description: + 'We were unable to create a checkout session. Please try again, or contact support', + variant: 'destructive', + }), + }); + + const selectedPrice = useMemo(() => { + if (!data) { + return null; + } + + return data[interval]; + }, [data, interval]); + + const handleOnOpenChange = (open: boolean) => { + if (pendingTeamId === null) { + return; + } + + if (!open) { + onClose(); + } + }; + + if (pendingTeamId === null) { + return null; + } + + return ( + + + + Team checkout + + + Payment is required to finalise the creation of your team. + + + + {(isLoading || !data) && ( +
+ {isLoading ? ( + + ) : ( +

Something went wrong

+ )} +
+ )} + + {data && selectedPrice && !isLoading && ( +
+ setInterval(value as 'monthly' | 'yearly')} + value={interval} + className="mb-4" + > + + {[data.monthly, data.yearly].map((price) => ( + + {price.friendlyInterval} + + ))} + + + + + + + {selectedPrice.interval === 'monthly' ? ( +
+ $50 USD per month +
+ ) : ( +
+ + $480 USD per year + +
+ + 20% off +
+
+ )} + +
+

This price includes minimum 5 seats.

+ +

+ Adding and removing seats will adjust your invoice accordingly. +

+
+
+
+
+ + + + + + +
+ )} +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx new file mode 100644 index 000000000..283fd8dad --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/create-team-dialog.tsx @@ -0,0 +1,223 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { useRouter, useSearchParams } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import type * as DialogPrimitive from '@radix-ui/react-dialog'; +import { useForm } from 'react-hook-form'; +import type { z } from 'zod'; + +import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { trpc } from '@documenso/trpc/react'; +import { ZCreateTeamMutationSchema } from '@documenso/trpc/server/team-router/schema'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type CreateTeamDialogProps = { + trigger?: React.ReactNode; +} & Omit; + +const ZCreateTeamFormSchema = ZCreateTeamMutationSchema.pick({ + teamName: true, + teamUrl: true, +}); + +type TCreateTeamFormSchema = z.infer; + +export const CreateTeamDialog = ({ trigger, ...props }: CreateTeamDialogProps) => { + const { toast } = useToast(); + + const router = useRouter(); + const searchParams = useSearchParams(); + const updateSearchParams = useUpdateSearchParams(); + + const [open, setOpen] = useState(false); + + const actionSearchParam = searchParams?.get('action'); + + const form = useForm({ + resolver: zodResolver(ZCreateTeamFormSchema), + defaultValues: { + teamName: '', + teamUrl: '', + }, + }); + + const { mutateAsync: createTeam } = trpc.team.createTeam.useMutation(); + + const onFormSubmit = async ({ teamName, teamUrl }: TCreateTeamFormSchema) => { + try { + const response = await createTeam({ + teamName, + teamUrl, + }); + + setOpen(false); + + if (response.paymentRequired) { + router.push(`/settings/teams?tab=pending&checkout=${response.pendingTeamId}`); + return; + } + + toast({ + title: 'Success', + description: 'Your team has been created.', + duration: 5000, + }); + } catch (err) { + const error = AppError.parseError(err); + + if (error.code === AppErrorCode.ALREADY_EXISTS) { + form.setError('teamUrl', { + type: 'manual', + message: 'This URL is already in use.', + }); + + return; + } + + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to create a team. Please try again later.', + }); + } + }; + + const mapTextToUrl = (text: string) => { + return text.toLowerCase().replace(/\s+/g, '-'); + }; + + useEffect(() => { + if (actionSearchParam === 'add-team') { + setOpen(true); + updateSearchParams({ action: null }); + } + }, [actionSearchParam, open, setOpen, updateSearchParams]); + + useEffect(() => { + form.reset(); + }, [open, form]); + + return ( + !form.formState.isSubmitting && setOpen(value)} + > + e.stopPropagation()} asChild={true}> + {trigger ?? ( + + )} + + + + + Create team + + + Create a team to collaborate with your team members. + + + +
+ +
+ ( + + Team Name + + { + const oldGeneratedUrl = mapTextToUrl(field.value); + const newGeneratedUrl = mapTextToUrl(event.target.value); + + const urlField = form.getValues('teamUrl'); + if (urlField === oldGeneratedUrl) { + form.setValue('teamUrl', newGeneratedUrl); + } + + field.onChange(event); + }} + /> + + + + )} + /> + + ( + + Team URL + + + + {!form.formState.errors.teamUrl && ( + + {field.value + ? `${WEBAPP_BASE_URL}/t/${field.value}` + : 'A unique URL to identify your team'} + + )} + + + + )} + /> + + + + + + +
+
+ +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx new file mode 100644 index 000000000..99630e57c --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/delete-team-dialog.tsx @@ -0,0 +1,160 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { AppError } from '@documenso/lib/errors/app-error'; +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import type { Toast } from '@documenso/ui/primitives/use-toast'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type DeleteTeamDialogProps = { + teamId: number; + teamName: string; + trigger?: React.ReactNode; +}; + +export const DeleteTeamDialog = ({ trigger, teamId, teamName }: DeleteTeamDialogProps) => { + const router = useRouter(); + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const deleteMessage = `delete ${teamName}`; + + const ZDeleteTeamFormSchema = z.object({ + teamName: z.literal(deleteMessage, { + errorMap: () => ({ message: `You must enter '${deleteMessage}' to proceed` }), + }), + }); + + const form = useForm({ + resolver: zodResolver(ZDeleteTeamFormSchema), + defaultValues: { + teamName: '', + }, + }); + + const { mutateAsync: deleteTeam } = trpc.team.deleteTeam.useMutation(); + + const onFormSubmit = async () => { + try { + await deleteTeam({ teamId }); + + toast({ + title: 'Success', + description: 'Your team has been successfully deleted.', + duration: 5000, + }); + + setOpen(false); + + router.push('/settings/teams'); + } catch (err) { + const error = AppError.parseError(err); + + let toastError: Toast = { + title: 'An unknown error occurred', + variant: 'destructive', + duration: 10000, + description: + 'We encountered an unknown error while attempting to delete this team. Please try again later.', + }; + + if (error.code === 'resource_missing') { + toastError = { + title: 'Unable to delete team', + variant: 'destructive', + duration: 15000, + description: + 'Something went wrong while updating the team billing subscription, please contact support.', + }; + } + + toast(toastError); + } + }; + + useEffect(() => { + if (!open) { + form.reset(); + } + }, [open, form]); + + return ( + !form.formState.isSubmitting && setOpen(value)}> + + {trigger ?? } + + + + + Delete team + + + Are you sure? This is irreversable. + + + +
+ +
+ ( + + + Confirm by typing {deleteMessage} + + + + + + + )} + /> + + + + + + +
+
+ +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx b/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx new file mode 100644 index 000000000..7ae8ccf1c --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx @@ -0,0 +1,107 @@ +'use client'; + +import { useState } from 'react'; + +import { trpc } from '@documenso/trpc/react'; +import { Alert } from '@documenso/ui/primitives/alert'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type DeleteTeamMemberDialogProps = { + teamId: number; + teamName: string; + teamMemberId: number; + teamMemberName: string; + teamMemberEmail: string; + trigger?: React.ReactNode; +}; + +export const DeleteTeamMemberDialog = ({ + trigger, + teamId, + teamName, + teamMemberId, + teamMemberName, + teamMemberEmail, +}: DeleteTeamMemberDialogProps) => { + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const { mutateAsync: deleteTeamMembers, isLoading: isDeletingTeamMember } = + trpc.team.deleteTeamMembers.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'You have successfully removed this user from the team.', + duration: 5000, + }); + + setOpen(false); + }, + onError: () => { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + duration: 10000, + description: + 'We encountered an unknown error while attempting to remove this user. Please try again later.', + }); + }, + }); + + return ( + !isDeletingTeamMember && setOpen(value)}> + + {trigger ?? } + + + + + Are you sure? + + + You are about to remove the following user from{' '} + {teamName}. + + + + + {teamMemberName}} + secondaryText={teamMemberEmail} + /> + + +
+ + + + + +
+
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx b/apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx new file mode 100644 index 000000000..482142c99 --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx @@ -0,0 +1,244 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import type * as DialogPrimitive from '@radix-ui/react-dialog'; +import { Mail, PlusCircle, Trash } from 'lucide-react'; +import { useFieldArray, useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { TEAM_MEMBER_ROLE_HIERARCHY, TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { TeamMemberRole } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { ZCreateTeamMemberInvitesMutationSchema } from '@documenso/trpc/server/team-router/schema'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type InviteTeamMembersDialogProps = { + currentUserTeamRole: TeamMemberRole; + teamId: number; + trigger?: React.ReactNode; +} & Omit; + +const ZInviteTeamMembersFormSchema = z + .object({ + invitations: ZCreateTeamMemberInvitesMutationSchema.shape.invitations, + }) + .refine( + (schema) => { + const emails = schema.invitations.map((invitation) => invitation.email.toLowerCase()); + + return new Set(emails).size === emails.length; + }, + // Dirty hack to handle errors when .root is populated for an array type + { message: 'Members must have unique emails', path: ['members__root'] }, + ); + +type TInviteTeamMembersFormSchema = z.infer; + +export const InviteTeamMembersDialog = ({ + currentUserTeamRole, + teamId, + trigger, + ...props +}: InviteTeamMembersDialogProps) => { + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const form = useForm({ + resolver: zodResolver(ZInviteTeamMembersFormSchema), + defaultValues: { + invitations: [ + { + email: '', + role: TeamMemberRole.MEMBER, + }, + ], + }, + }); + + const { + append: appendTeamMemberInvite, + fields: teamMemberInvites, + remove: removeTeamMemberInvite, + } = useFieldArray({ + control: form.control, + name: 'invitations', + }); + + const { mutateAsync: createTeamMemberInvites } = trpc.team.createTeamMemberInvites.useMutation(); + + const onAddTeamMemberInvite = () => { + appendTeamMemberInvite({ + email: '', + role: TeamMemberRole.MEMBER, + }); + }; + + const onFormSubmit = async ({ invitations }: TInviteTeamMembersFormSchema) => { + try { + await createTeamMemberInvites({ + teamId, + invitations, + }); + + toast({ + title: 'Success', + description: 'Team invitations have been sent.', + duration: 5000, + }); + + setOpen(false); + } catch { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to invite team members. Please try again later.', + }); + } + }; + + useEffect(() => { + if (!open) { + form.reset(); + } + }, [open, form]); + + return ( + !form.formState.isSubmitting && setOpen(value)} + > + e.stopPropagation()} asChild> + {trigger ?? } + + + + + Invite team members + + + An email containing an invitation will be sent to each member. + + + +
+ +
+ {teamMemberInvites.map((teamMemberInvite, index) => ( +
+ ( + + {index === 0 && Email address} + + + + + + )} + /> + + ( + + {index === 0 && Role} + + + + + + )} + /> + + +
+ ))} + + + + + + + + +
+
+ +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx new file mode 100644 index 000000000..27384d680 --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/leave-team-dialog.tsx @@ -0,0 +1,98 @@ +'use client'; + +import { useState } from 'react'; + +import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import type { TeamMemberRole } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { Alert } from '@documenso/ui/primitives/alert'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type LeaveTeamDialogProps = { + teamId: number; + teamName: string; + role: TeamMemberRole; + trigger?: React.ReactNode; +}; + +export const LeaveTeamDialog = ({ trigger, teamId, teamName, role }: LeaveTeamDialogProps) => { + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const { mutateAsync: leaveTeam, isLoading: isLeavingTeam } = trpc.team.leaveTeam.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'You have successfully left this team.', + duration: 5000, + }); + + setOpen(false); + }, + onError: () => { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + duration: 10000, + description: + 'We encountered an unknown error while attempting to leave this team. Please try again later.', + }); + }, + }); + + return ( + !isLeavingTeam && setOpen(value)}> + + {trigger ?? } + + + + + Are you sure? + + + You are about to leave the following team. + + + + + + + +
+ + + + + +
+
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx new file mode 100644 index 000000000..e5dd8ca17 --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx @@ -0,0 +1,293 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { Loader } from 'lucide-react'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { trpc } from '@documenso/trpc/react'; +import { Alert, AlertDescription } from '@documenso/ui/primitives/alert'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type TransferTeamDialogProps = { + teamId: number; + teamName: string; + ownerUserId: number; + trigger?: React.ReactNode; +}; + +export const TransferTeamDialog = ({ + trigger, + teamId, + teamName, + ownerUserId, +}: TransferTeamDialogProps) => { + const router = useRouter(); + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const { mutateAsync: requestTeamOwnershipTransfer } = + trpc.team.requestTeamOwnershipTransfer.useMutation(); + + const { + data, + refetch: refetchTeamMembers, + isLoading: loadingTeamMembers, + isLoadingError: loadingTeamMembersError, + } = trpc.team.getTeamMembers.useQuery({ + teamId, + }); + + const confirmTransferMessage = `transfer ${teamName}`; + + const ZTransferTeamFormSchema = z.object({ + teamName: z.literal(confirmTransferMessage, { + errorMap: () => ({ message: `You must enter '${confirmTransferMessage}' to proceed` }), + }), + newOwnerUserId: z.string(), + clearPaymentMethods: z.boolean(), + }); + + const form = useForm>({ + resolver: zodResolver(ZTransferTeamFormSchema), + defaultValues: { + teamName: '', + clearPaymentMethods: false, + }, + }); + + const onFormSubmit = async ({ + newOwnerUserId, + clearPaymentMethods, + }: z.infer) => { + try { + await requestTeamOwnershipTransfer({ + teamId, + newOwnerUserId: Number.parseInt(newOwnerUserId), + clearPaymentMethods, + }); + + router.refresh(); + + toast({ + title: 'Success', + description: 'An email requesting the transfer of this team has been sent.', + duration: 5000, + }); + + setOpen(false); + } catch (err) { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + duration: 10000, + description: + 'We encountered an unknown error while attempting to request a transfer of this team. Please try again later.', + }); + } + }; + + useEffect(() => { + if (!open) { + form.reset(); + } + }, [open, form]); + + useEffect(() => { + if (open && loadingTeamMembersError) { + void refetchTeamMembers(); + } + }, [open, loadingTeamMembersError, refetchTeamMembers]); + + const teamMembers = data + ? data.filter((teamMember) => teamMember.userId !== ownerUserId) + : undefined; + + return ( + !form.formState.isSubmitting && setOpen(value)}> + + {trigger ?? ( + + )} + + + {teamMembers && teamMembers.length > 0 ? ( + + + Transfer team + + + Transfer ownership of this team to a selected team member. + + + +
+ +
+ ( + + New team owner + + + + + + )} + /> + + ( + + + Confirm by typing{' '} + {confirmTransferMessage} + + + + + + + )} + /> + + {/* Temporary removed. */} + {/* {IS_BILLING_ENABLED && ( + ( + +
+ + + +
+
+ )} + /> + )} */} + + + +
    + {IS_BILLING_ENABLED && ( + // Temporary removed. + //
  • + // {form.getValues('clearPaymentMethods') + // ? 'You will not be billed for any upcoming invoices' + // : 'We will continue to bill current payment methods if required'} + //
  • + +
  • + Any payment methods attached to this team will remain attached to this + team. Please contact us if you need to update this information. +
  • + )} +
  • + The selected team member will receive an email which they must accept before + the team is transferred +
  • +
+
+
+ + + + + + +
+
+ +
+ ) : ( + + {loadingTeamMembers ? ( + + ) : ( +

+ {loadingTeamMembersError + ? 'An error occurred while loading team members. Please try again later.' + : 'You must have at least one other team member to transfer ownership.'} +

+ )} +
+ )} +
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx b/apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx new file mode 100644 index 000000000..c6ab8890a --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/update-team-email-dialog.tsx @@ -0,0 +1,165 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import type * as DialogPrimitive from '@radix-ui/react-dialog'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import type { TeamEmail } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type UpdateTeamEmailDialogProps = { + teamEmail: TeamEmail; + trigger?: React.ReactNode; +} & Omit; + +const ZUpdateTeamEmailFormSchema = z.object({ + name: z.string().trim().min(1, { message: 'Please enter a valid name.' }), +}); + +type TUpdateTeamEmailFormSchema = z.infer; + +export const UpdateTeamEmailDialog = ({ + teamEmail, + trigger, + ...props +}: UpdateTeamEmailDialogProps) => { + const router = useRouter(); + + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const form = useForm({ + resolver: zodResolver(ZUpdateTeamEmailFormSchema), + defaultValues: { + name: teamEmail.name, + }, + }); + + const { mutateAsync: updateTeamEmail } = trpc.team.updateTeamEmail.useMutation(); + + const onFormSubmit = async ({ name }: TUpdateTeamEmailFormSchema) => { + try { + await updateTeamEmail({ + teamId: teamEmail.teamId, + data: { + name, + }, + }); + + toast({ + title: 'Success', + description: 'Team email was updated.', + duration: 5000, + }); + + router.refresh(); + + setOpen(false); + } catch (err) { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting update the team email. Please try again later.', + }); + } + }; + + useEffect(() => { + if (!open) { + form.reset(); + } + }, [open, form]); + + return ( + !form.formState.isSubmitting && setOpen(value)} + > + e.stopPropagation()} asChild> + {trigger ?? ( + + )} + + + + + Update team email + + + To change the email you must remove and add a new email address. + + + +
+ +
+ ( + + Name + + + + + + )} + /> + + + Email + + + + + + + + + + +
+
+ +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx b/apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx new file mode 100644 index 000000000..cc8ea675f --- /dev/null +++ b/apps/web/src/components/(teams)/dialogs/update-team-member-dialog.tsx @@ -0,0 +1,185 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import type * as DialogPrimitive from '@radix-ui/react-dialog'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { TEAM_MEMBER_ROLE_HIERARCHY, TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { isTeamRoleWithinUserHierarchy } from '@documenso/lib/utils/teams'; +import { TeamMemberRole } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@documenso/ui/primitives/select'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type UpdateTeamMemberDialogProps = { + currentUserTeamRole: TeamMemberRole; + trigger?: React.ReactNode; + teamId: number; + teamMemberId: number; + teamMemberName: string; + teamMemberRole: TeamMemberRole; +} & Omit; + +const ZUpdateTeamMemberFormSchema = z.object({ + role: z.nativeEnum(TeamMemberRole), +}); + +type ZUpdateTeamMemberSchema = z.infer; + +export const UpdateTeamMemberDialog = ({ + currentUserTeamRole, + trigger, + teamId, + teamMemberId, + teamMemberName, + teamMemberRole, + ...props +}: UpdateTeamMemberDialogProps) => { + const [open, setOpen] = useState(false); + + const { toast } = useToast(); + + const form = useForm({ + resolver: zodResolver(ZUpdateTeamMemberFormSchema), + defaultValues: { + role: teamMemberRole, + }, + }); + + const { mutateAsync: updateTeamMember } = trpc.team.updateTeamMember.useMutation(); + + const onFormSubmit = async ({ role }: ZUpdateTeamMemberSchema) => { + try { + await updateTeamMember({ + teamId, + teamMemberId, + data: { + role, + }, + }); + + toast({ + title: 'Success', + description: `You have updated ${teamMemberName}.`, + duration: 5000, + }); + + setOpen(false); + } catch { + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to update this team member. Please try again later.', + }); + } + }; + + useEffect(() => { + if (!open) { + return; + } + + form.reset(); + + if (!isTeamRoleWithinUserHierarchy(currentUserTeamRole, teamMemberRole)) { + setOpen(false); + + toast({ + title: 'You cannot modify a team member who has a higher role than you.', + variant: 'destructive', + }); + } + }, [open, currentUserTeamRole, teamMemberRole, form, toast]); + + return ( + !form.formState.isSubmitting && setOpen(value)} + > + e.stopPropagation()} asChild> + {trigger ?? } + + + + + Update team member + + + You are currently updating {teamMemberName}. + + + +
+ +
+ ( + + Role + + + + + + )} + /> + + + + + + +
+
+ +
+
+ ); +}; diff --git a/apps/web/src/components/(teams)/forms/update-team-form.tsx b/apps/web/src/components/(teams)/forms/update-team-form.tsx new file mode 100644 index 000000000..142914b8c --- /dev/null +++ b/apps/web/src/components/(teams)/forms/update-team-form.tsx @@ -0,0 +1,173 @@ +'use client'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { AnimatePresence, motion } from 'framer-motion'; +import { useForm } from 'react-hook-form'; +import type { z } from 'zod'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { trpc } from '@documenso/trpc/react'; +import { ZUpdateTeamMutationSchema } from '@documenso/trpc/server/team-router/schema'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type UpdateTeamDialogProps = { + teamId: number; + teamName: string; + teamUrl: string; +}; + +const ZUpdateTeamFormSchema = ZUpdateTeamMutationSchema.shape.data.pick({ + name: true, + url: true, +}); + +type TUpdateTeamFormSchema = z.infer; + +export const UpdateTeamForm = ({ teamId, teamName, teamUrl }: UpdateTeamDialogProps) => { + const router = useRouter(); + + const { toast } = useToast(); + + const form = useForm({ + resolver: zodResolver(ZUpdateTeamFormSchema), + defaultValues: { + name: teamName, + url: teamUrl, + }, + }); + + const { mutateAsync: updateTeam } = trpc.team.updateTeam.useMutation(); + + const onFormSubmit = async ({ name, url }: TUpdateTeamFormSchema) => { + try { + await updateTeam({ + data: { + name, + url, + }, + teamId, + }); + + toast({ + title: 'Success', + description: 'Your team has been successfully updated.', + duration: 5000, + }); + + form.reset({ + name, + url, + }); + + if (url !== teamUrl) { + router.push(`${WEBAPP_BASE_URL}/t/${url}/settings`); + } + } catch (err) { + const error = AppError.parseError(err); + + if (error.code === AppErrorCode.ALREADY_EXISTS) { + form.setError('url', { + type: 'manual', + message: 'This URL is already in use.', + }); + + return; + } + + toast({ + title: 'An unknown error occurred', + variant: 'destructive', + description: + 'We encountered an unknown error while attempting to update your team. Please try again later.', + }); + } + }; + + return ( +
+ +
+ ( + + Team Name + + + + + + )} + /> + + ( + + Team URL + + + + {!form.formState.errors.url && ( + + {field.value + ? `${WEBAPP_BASE_URL}/t/${field.value}` + : 'A unique URL to identify your team'} + + )} + + + + )} + /> + +
+ + {form.formState.isDirty && ( + + + + )} + + + +
+
+
+ + ); +}; diff --git a/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx new file mode 100644 index 000000000..be68f6c03 --- /dev/null +++ b/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx @@ -0,0 +1,67 @@ +'use client'; + +import type { HTMLAttributes } from 'react'; + +import Link from 'next/link'; +import { useParams, usePathname } from 'next/navigation'; + +import { CreditCard, Settings, Users } from 'lucide-react'; + +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; + +export type DesktopNavProps = HTMLAttributes; + +export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { + const pathname = usePathname(); + const params = useParams(); + + const teamUrl = typeof params?.teamUrl === 'string' ? params?.teamUrl : ''; + + const settingsPath = `/t/${teamUrl}/settings`; + const membersPath = `/t/${teamUrl}/settings/members`; + const billingPath = `/t/${teamUrl}/settings/billing`; + + return ( +
+ + + + + + + + + {IS_BILLING_ENABLED && ( + + + + )} +
+ ); +}; diff --git a/apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx b/apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx new file mode 100644 index 000000000..de01ca9bf --- /dev/null +++ b/apps/web/src/components/(teams)/settings/layout/mobile-nav.tsx @@ -0,0 +1,75 @@ +'use client'; + +import type { HTMLAttributes } from 'react'; + +import Link from 'next/link'; +import { useParams, usePathname } from 'next/navigation'; + +import { CreditCard, Key, User } from 'lucide-react'; + +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; + +export type MobileNavProps = HTMLAttributes; + +export const MobileNav = ({ className, ...props }: MobileNavProps) => { + const pathname = usePathname(); + const params = useParams(); + + const teamUrl = typeof params?.teamUrl === 'string' ? params?.teamUrl : ''; + + const settingsPath = `/t/${teamUrl}/settings`; + const membersPath = `/t/${teamUrl}/settings/members`; + const billingPath = `/t/${teamUrl}/settings/billing`; + + return ( +
+ + + + + + + + + {IS_BILLING_ENABLED && ( + + + + )} +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx b/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx new file mode 100644 index 000000000..0dd4bcf4c --- /dev/null +++ b/apps/web/src/components/(teams)/tables/current-user-teams-data-table.tsx @@ -0,0 +1,158 @@ +'use client'; + +import Link from 'next/link'; +import { useSearchParams } from 'next/navigation'; + +import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params'; +import { canExecuteTeamAction } from '@documenso/lib/utils/teams'; +import { trpc } from '@documenso/trpc/react'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { Button } from '@documenso/ui/primitives/button'; +import { DataTable } from '@documenso/ui/primitives/data-table'; +import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { Skeleton } from '@documenso/ui/primitives/skeleton'; +import { TableCell } from '@documenso/ui/primitives/table'; + +import { LocaleDate } from '~/components/formatter/locale-date'; + +import { LeaveTeamDialog } from '../dialogs/leave-team-dialog'; + +export const CurrentUserTeamsDataTable = () => { + const searchParams = useSearchParams(); + const updateSearchParams = useUpdateSearchParams(); + + const parsedSearchParams = ZBaseTableSearchParamsSchema.parse( + Object.fromEntries(searchParams ?? []), + ); + + const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeams.useQuery( + { + term: parsedSearchParams.query, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + keepPreviousData: true, + }, + ); + + const onPaginationChange = (page: number, perPage: number) => { + updateSearchParams({ + page, + perPage, + }); + }; + + const results = data ?? { + data: [], + perPage: 10, + currentPage: 1, + totalPages: 1, + }; + + return ( + ( + + {row.original.name} + } + secondaryText={`${WEBAPP_BASE_URL}/t/${row.original.url}`} + /> + + ), + }, + { + header: 'Role', + accessorKey: 'role', + cell: ({ row }) => + row.original.ownerUserId === row.original.currentTeamMember.userId + ? 'Owner' + : TEAM_MEMBER_ROLE_MAP[row.original.currentTeamMember.role], + }, + { + header: 'Member Since', + accessorKey: 'createdAt', + cell: ({ row }) => , + }, + { + id: 'actions', + cell: ({ row }) => ( +
+ {canExecuteTeamAction('MANAGE_TEAM', row.original.currentTeamMember.role) && ( + + )} + + e.preventDefault()} + > + Leave + + } + /> +
+ ), + }, + ]} + data={results.data} + perPage={results.perPage} + currentPage={results.currentPage} + totalPages={results.totalPages} + onPaginationChange={onPaginationChange} + error={{ + enable: isLoadingError, + }} + skeleton={{ + enable: isLoading && isInitialLoading, + rows: 3, + component: ( + <> + +
+ + +
+ + +
+
+
+ + + + + + + +
+ + +
+
+ + ), + }} + > + {(table) => } +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx new file mode 100644 index 000000000..64a58375c --- /dev/null +++ b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx @@ -0,0 +1,53 @@ +import { trpc } from '@documenso/trpc/react'; +import { cn } from '@documenso/ui/lib/utils'; +import { Button } from '@documenso/ui/primitives/button'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type PendingUserTeamsDataTableActionsProps = { + className?: string; + pendingTeamId: number; + onPayClick: (pendingTeamId: number) => void; +}; + +export const PendingUserTeamsDataTableActions = ({ + className, + pendingTeamId, + onPayClick, +}: PendingUserTeamsDataTableActionsProps) => { + const { toast } = useToast(); + + const { mutateAsync: deleteTeamPending, isLoading: deletingTeam } = + trpc.team.deleteTeamPending.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Pending team deleted.', + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + description: + 'We encountered an unknown error while attempting to delete the pending team. Please try again later.', + duration: 10000, + variant: 'destructive', + }); + }, + }); + + return ( +
+ + + +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx new file mode 100644 index 000000000..84d4e38df --- /dev/null +++ b/apps/web/src/components/(teams)/tables/pending-user-teams-data-table.tsx @@ -0,0 +1,145 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { useSearchParams } from 'next/navigation'; + +import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params'; +import { trpc } from '@documenso/trpc/react'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { DataTable } from '@documenso/ui/primitives/data-table'; +import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { Skeleton } from '@documenso/ui/primitives/skeleton'; +import { TableCell } from '@documenso/ui/primitives/table'; + +import { LocaleDate } from '~/components/formatter/locale-date'; + +import { CreateTeamCheckoutDialog } from '../dialogs/create-team-checkout-dialog'; +import { PendingUserTeamsDataTableActions } from './pending-user-teams-data-table-actions'; + +export const PendingUserTeamsDataTable = () => { + const searchParams = useSearchParams(); + const updateSearchParams = useUpdateSearchParams(); + + const parsedSearchParams = ZBaseTableSearchParamsSchema.parse( + Object.fromEntries(searchParams ?? []), + ); + + const [checkoutPendingTeamId, setCheckoutPendingTeamId] = useState(null); + + const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamsPending.useQuery( + { + term: parsedSearchParams.query, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + keepPreviousData: true, + }, + ); + + const onPaginationChange = (page: number, perPage: number) => { + updateSearchParams({ + page, + perPage, + }); + }; + + const results = data ?? { + data: [], + perPage: 10, + currentPage: 1, + totalPages: 1, + }; + + useEffect(() => { + const searchParamCheckout = searchParams?.get('checkout'); + + if (searchParamCheckout && !isNaN(parseInt(searchParamCheckout))) { + setCheckoutPendingTeamId(parseInt(searchParamCheckout)); + updateSearchParams({ checkout: null }); + } + }, [searchParams, updateSearchParams]); + + return ( + <> + ( + {row.original.name} + } + secondaryText={`${WEBAPP_BASE_URL}/t/${row.original.url}`} + /> + ), + }, + { + header: 'Created on', + accessorKey: 'createdAt', + cell: ({ row }) => , + }, + { + id: 'actions', + cell: ({ row }) => ( + + ), + }, + ]} + data={results.data} + perPage={results.perPage} + currentPage={results.currentPage} + totalPages={results.totalPages} + onPaginationChange={onPaginationChange} + error={{ + enable: isLoadingError, + }} + skeleton={{ + enable: isLoading && isInitialLoading, + rows: 3, + component: ( + <> + +
+ + +
+ + +
+
+
+ + + + +
+ + +
+
+ + ), + }} + > + {(table) => } +
+ + setCheckoutPendingTeamId(null)} + /> + + ); +}; diff --git a/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx b/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx new file mode 100644 index 000000000..a860ac6d9 --- /dev/null +++ b/apps/web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx @@ -0,0 +1,152 @@ +'use client'; + +import Link from 'next/link'; + +import { File } from 'lucide-react'; +import { DateTime } from 'luxon'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { DataTable } from '@documenso/ui/primitives/data-table'; +import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { Skeleton } from '@documenso/ui/primitives/skeleton'; +import { TableCell } from '@documenso/ui/primitives/table'; + +export type TeamBillingInvoicesDataTableProps = { + teamId: number; +}; + +export const TeamBillingInvoicesDataTable = ({ teamId }: TeamBillingInvoicesDataTableProps) => { + const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamInvoices.useQuery( + { + teamId, + }, + { + keepPreviousData: true, + }, + ); + + const formatCurrency = (currency: string, amount: number) => { + const formatter = new Intl.NumberFormat('en-US', { + style: 'currency', + currency, + }); + + return formatter.format(amount); + }; + + const results = { + data: data?.data ?? [], + perPage: 100, + currentPage: 1, + totalPages: 1, + }; + + return ( + ( +
+ + +
+ + {DateTime.fromSeconds(row.original.created).toFormat('MMMM yyyy')} + + + {row.original.quantity} {row.original.quantity > 1 ? 'Seats' : 'Seat'} + +
+
+ ), + }, + { + header: 'Status', + accessorKey: 'status', + cell: ({ row }) => { + const { status, paid } = row.original; + + if (!status) { + return paid ? 'Paid' : 'Unpaid'; + } + + return status.charAt(0).toUpperCase() + status.slice(1); + }, + }, + { + header: 'Amount', + accessorKey: 'total', + cell: ({ row }) => formatCurrency(row.original.currency, row.original.total / 100), + }, + { + id: 'actions', + cell: ({ row }) => ( +
+ + + +
+ ), + }, + ]} + data={results.data} + perPage={results.perPage} + currentPage={results.currentPage} + totalPages={results.totalPages} + error={{ + enable: isLoadingError, + }} + skeleton={{ + enable: isLoading && isInitialLoading, + rows: 3, + component: ( + <> + +
+ + +
+ + +
+
+
+ + + + + + + +
+ + +
+
+ + ), + }} + > + {(table) => } +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx b/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx new file mode 100644 index 000000000..f0e3580e3 --- /dev/null +++ b/apps/web/src/components/(teams)/tables/team-member-invites-data-table.tsx @@ -0,0 +1,203 @@ +'use client'; + +import { useSearchParams } from 'next/navigation'; + +import { History, MoreHorizontal, Trash2 } from 'lucide-react'; + +import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params'; +import { trpc } from '@documenso/trpc/react'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { DataTable } from '@documenso/ui/primitives/data-table'; +import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, +} from '@documenso/ui/primitives/dropdown-menu'; +import { Skeleton } from '@documenso/ui/primitives/skeleton'; +import { TableCell } from '@documenso/ui/primitives/table'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { LocaleDate } from '~/components/formatter/locale-date'; + +export type TeamMemberInvitesDataTableProps = { + teamId: number; +}; + +export const TeamMemberInvitesDataTable = ({ teamId }: TeamMemberInvitesDataTableProps) => { + const searchParams = useSearchParams(); + const updateSearchParams = useUpdateSearchParams(); + + const { toast } = useToast(); + + const parsedSearchParams = ZBaseTableSearchParamsSchema.parse( + Object.fromEntries(searchParams ?? []), + ); + + const { data, isLoading, isInitialLoading, isLoadingError } = + trpc.team.findTeamMemberInvites.useQuery( + { + teamId, + term: parsedSearchParams.query, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + keepPreviousData: true, + }, + ); + + const { mutateAsync: resendTeamMemberInvitation } = + trpc.team.resendTeamMemberInvitation.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Invitation has been resent', + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + description: 'Unable to resend invitation. Please try again.', + variant: 'destructive', + }); + }, + }); + + const { mutateAsync: deleteTeamMemberInvitations } = + trpc.team.deleteTeamMemberInvitations.useMutation({ + onSuccess: () => { + toast({ + title: 'Success', + description: 'Invitation has been deleted', + }); + }, + onError: () => { + toast({ + title: 'Something went wrong', + description: 'Unable to delete invitation. Please try again.', + variant: 'destructive', + }); + }, + }); + + const onPaginationChange = (page: number, perPage: number) => { + updateSearchParams({ + page, + perPage, + }); + }; + + const results = data ?? { + data: [], + perPage: 10, + currentPage: 1, + totalPages: 1, + }; + + return ( + { + return ( + {row.original.email} + } + /> + ); + }, + }, + { + header: 'Role', + accessorKey: 'role', + cell: ({ row }) => TEAM_MEMBER_ROLE_MAP[row.original.role] ?? row.original.role, + }, + { + header: 'Invited At', + accessorKey: 'createdAt', + cell: ({ row }) => , + }, + { + header: 'Actions', + cell: ({ row }) => ( + + + + + + + Actions + + + resendTeamMemberInvitation({ + teamId, + invitationId: row.original.id, + }) + } + > + + Resend + + + + deleteTeamMemberInvitations({ + teamId, + invitationIds: [row.original.id], + }) + } + > + + Remove + + + + ), + }, + ]} + data={results.data} + perPage={results.perPage} + currentPage={results.currentPage} + totalPages={results.totalPages} + onPaginationChange={onPaginationChange} + error={{ + enable: isLoadingError, + }} + skeleton={{ + enable: isLoading && isInitialLoading, + rows: 3, + component: ( + <> + +
+ + +
+
+ + + + + + + + + + + ), + }} + > + {(table) => } +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/team-members-data-table.tsx b/apps/web/src/components/(teams)/tables/team-members-data-table.tsx new file mode 100644 index 000000000..3002ecbb0 --- /dev/null +++ b/apps/web/src/components/(teams)/tables/team-members-data-table.tsx @@ -0,0 +1,209 @@ +'use client'; + +import { useSearchParams } from 'next/navigation'; + +import { Edit, MoreHorizontal, Trash2 } from 'lucide-react'; + +import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { ZBaseTableSearchParamsSchema } from '@documenso/lib/types/search-params'; +import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; +import { isTeamRoleWithinUserHierarchy } from '@documenso/lib/utils/teams'; +import type { TeamMemberRole } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; +import { AvatarWithText } from '@documenso/ui/primitives/avatar'; +import { DataTable } from '@documenso/ui/primitives/data-table'; +import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuTrigger, +} from '@documenso/ui/primitives/dropdown-menu'; +import { Skeleton } from '@documenso/ui/primitives/skeleton'; +import { TableCell } from '@documenso/ui/primitives/table'; + +import { LocaleDate } from '~/components/formatter/locale-date'; + +import { DeleteTeamMemberDialog } from '../dialogs/delete-team-member-dialog'; +import { UpdateTeamMemberDialog } from '../dialogs/update-team-member-dialog'; + +export type TeamMembersDataTableProps = { + currentUserTeamRole: TeamMemberRole; + teamOwnerUserId: number; + teamId: number; + teamName: string; +}; + +export const TeamMembersDataTable = ({ + currentUserTeamRole, + teamOwnerUserId, + teamId, + teamName, +}: TeamMembersDataTableProps) => { + const searchParams = useSearchParams(); + const updateSearchParams = useUpdateSearchParams(); + + const parsedSearchParams = ZBaseTableSearchParamsSchema.parse( + Object.fromEntries(searchParams ?? []), + ); + + const { data, isLoading, isInitialLoading, isLoadingError } = trpc.team.findTeamMembers.useQuery( + { + teamId, + term: parsedSearchParams.query, + page: parsedSearchParams.page, + perPage: parsedSearchParams.perPage, + }, + { + keepPreviousData: true, + }, + ); + + const onPaginationChange = (page: number, perPage: number) => { + updateSearchParams({ + page, + perPage, + }); + }; + + const results = data ?? { + data: [], + perPage: 10, + currentPage: 1, + totalPages: 1, + }; + + return ( + { + const avatarFallbackText = row.original.user.name + ? extractInitials(row.original.user.name) + : row.original.user.email.slice(0, 1).toUpperCase(); + + return ( + {row.original.user.name} + } + secondaryText={row.original.user.email} + /> + ); + }, + }, + { + header: 'Role', + accessorKey: 'role', + cell: ({ row }) => + teamOwnerUserId === row.original.userId + ? 'Owner' + : TEAM_MEMBER_ROLE_MAP[row.original.role], + }, + { + header: 'Member Since', + accessorKey: 'createdAt', + cell: ({ row }) => , + }, + { + header: 'Actions', + cell: ({ row }) => ( + + + + + + + Actions + + e.preventDefault()} + title="Update team member role" + > + + Update role + + } + /> + + e.preventDefault()} + disabled={ + teamOwnerUserId === row.original.userId || + !isTeamRoleWithinUserHierarchy(currentUserTeamRole, row.original.role) + } + title="Remove team member" + > + + Remove + + } + /> + + + ), + }, + ]} + data={results.data} + perPage={results.perPage} + currentPage={results.currentPage} + totalPages={results.totalPages} + onPaginationChange={onPaginationChange} + error={{ + enable: isLoadingError, + }} + skeleton={{ + enable: isLoading && isInitialLoading, + rows: 3, + component: ( + <> + +
+ + +
+ + +
+
+
+ + + + + + + + + + + ), + }} + > + {(table) => } +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx b/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx new file mode 100644 index 000000000..316c4373f --- /dev/null +++ b/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx @@ -0,0 +1,93 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import Link from 'next/link'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; + +import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; +import type { TeamMemberRole } from '@documenso/prisma/client'; +import { Input } from '@documenso/ui/primitives/input'; +import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; + +import { TeamMemberInvitesDataTable } from '~/components/(teams)/tables/team-member-invites-data-table'; +import { TeamMembersDataTable } from '~/components/(teams)/tables/team-members-data-table'; + +export type TeamsMemberPageDataTableProps = { + currentUserTeamRole: TeamMemberRole; + teamId: number; + teamName: string; + teamOwnerUserId: number; +}; + +export const TeamsMemberPageDataTable = ({ + currentUserTeamRole, + teamId, + teamName, + teamOwnerUserId, +}: TeamsMemberPageDataTableProps) => { + const searchParams = useSearchParams(); + const router = useRouter(); + const pathname = usePathname(); + + const [searchQuery, setSearchQuery] = useState(() => searchParams?.get('query') ?? ''); + + const debouncedSearchQuery = useDebouncedValue(searchQuery, 500); + + const currentTab = searchParams?.get('tab') === 'invites' ? 'invites' : 'members'; + + /** + * Handle debouncing the search query. + */ + useEffect(() => { + if (!pathname) { + return; + } + + const params = new URLSearchParams(searchParams?.toString()); + + params.set('query', debouncedSearchQuery); + + if (debouncedSearchQuery === '') { + params.delete('query'); + } + + router.push(`${pathname}?${params.toString()}`); + }, [debouncedSearchQuery, pathname, router, searchParams]); + + return ( +
+
+ setSearchQuery(e.target.value)} + placeholder="Search" + /> + + + + + All + + + + Pending + + + +
+ + {currentTab === 'invites' ? ( + + ) : ( + + )} +
+ ); +}; diff --git a/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx b/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx new file mode 100644 index 000000000..277421263 --- /dev/null +++ b/apps/web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx @@ -0,0 +1,83 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import Link from 'next/link'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; + +import { useDebouncedValue } from '@documenso/lib/client-only/hooks/use-debounced-value'; +import { trpc } from '@documenso/trpc/react'; +import { Input } from '@documenso/ui/primitives/input'; +import { Tabs, TabsList, TabsTrigger } from '@documenso/ui/primitives/tabs'; + +import { CurrentUserTeamsDataTable } from './current-user-teams-data-table'; +import { PendingUserTeamsDataTable } from './pending-user-teams-data-table'; + +export const UserSettingsTeamsPageDataTable = () => { + const searchParams = useSearchParams(); + const router = useRouter(); + const pathname = usePathname(); + + const [searchQuery, setSearchQuery] = useState(() => searchParams?.get('query') ?? ''); + + const debouncedSearchQuery = useDebouncedValue(searchQuery, 500); + + const currentTab = searchParams?.get('tab') === 'pending' ? 'pending' : 'active'; + + const { data } = trpc.team.findTeamsPending.useQuery( + {}, + { + keepPreviousData: true, + }, + ); + + /** + * Handle debouncing the search query. + */ + useEffect(() => { + if (!pathname) { + return; + } + + const params = new URLSearchParams(searchParams?.toString()); + + params.set('query', debouncedSearchQuery); + + if (debouncedSearchQuery === '') { + params.delete('query'); + } + + router.push(`${pathname}?${params.toString()}`); + }, [debouncedSearchQuery, pathname, router, searchParams]); + + return ( +
+
+ setSearchQuery(e.target.value)} + placeholder="Search" + /> + + + + + Active + + + + + Pending + {data && data.count > 0 && ( + {data.count} + )} + + + + +
+ + {currentTab === 'pending' ? : } +
+ ); +}; diff --git a/apps/web/src/components/(teams)/team-billing-portal-button.tsx b/apps/web/src/components/(teams)/team-billing-portal-button.tsx new file mode 100644 index 000000000..808b9b9ba --- /dev/null +++ b/apps/web/src/components/(teams)/team-billing-portal-button.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type TeamBillingPortalButtonProps = { + buttonProps?: React.ComponentProps; + teamId: number; +}; + +export const TeamBillingPortalButton = ({ buttonProps, teamId }: TeamBillingPortalButtonProps) => { + const { toast } = useToast(); + + const { mutateAsync: createBillingPortal, isLoading } = + trpc.team.createBillingPortal.useMutation(); + + const handleCreatePortal = async () => { + try { + const sessionUrl = await createBillingPortal({ teamId }); + + window.open(sessionUrl, '_blank'); + } catch (err) { + toast({ + title: 'Something went wrong', + description: + 'We are unable to proceed to the billing portal at this time. Please try again, or contact support.', + variant: 'destructive', + duration: 10000, + }); + } + }; + + return ( + + ); +}; diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index b3e4ea019..b21e9621b 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -55,10 +55,11 @@ export type TSignInFormSchema = z.infer; export type SignInFormProps = { className?: string; + initialEmail?: string; isGoogleSSOEnabled?: boolean; }; -export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) => { +export const SignInForm = ({ className, initialEmail, isGoogleSSOEnabled }: SignInFormProps) => { const { toast } = useToast(); const [isTwoFactorAuthenticationDialogOpen, setIsTwoFactorAuthenticationDialogOpen] = useState(false); @@ -69,7 +70,7 @@ export const SignInForm = ({ className, isGoogleSSOEnabled }: SignInFormProps) = const form = useForm({ values: { - email: '', + email: initialEmail ?? '', password: '', totpCode: '', backupCode: '', diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index f38ab15d1..430c7ebdf 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -48,17 +48,18 @@ export type TSignUpFormSchema = z.infer; export type SignUpFormProps = { className?: string; + initialEmail?: string; isGoogleSSOEnabled?: boolean; }; -export const SignUpForm = ({ className, isGoogleSSOEnabled }: SignUpFormProps) => { +export const SignUpForm = ({ className, initialEmail, isGoogleSSOEnabled }: SignUpFormProps) => { const { toast } = useToast(); const analytics = useAnalytics(); const form = useForm({ values: { name: '', - email: '', + email: initialEmail ?? '', password: '', signature: '', }, diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts index 25bfbbb40..46ee93fdf 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/middleware.ts @@ -1,14 +1,62 @@ -import { NextRequest, NextResponse } from 'next/server'; +import { cookies } from 'next/headers'; +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; import { getToken } from 'next-auth/jwt'; +import { TEAM_URL_ROOT_REGEX } from '@documenso/lib/constants/teams'; +import { formatDocumentsPath } from '@documenso/lib/utils/teams'; + export default async function middleware(req: NextRequest) { + const preferredTeamUrl = cookies().get('preferred-team-url'); + + const referrer = req.headers.get('referer'); + const referrerUrl = referrer ? new URL(referrer) : null; + const referrerPathname = referrerUrl ? referrerUrl.pathname : null; + + // Whether to reset the preferred team url cookie if the user accesses a non team page from a team page. + const resetPreferredTeamUrl = + referrerPathname && + referrerPathname.startsWith('/t/') && + (!req.nextUrl.pathname.startsWith('/t/') || req.nextUrl.pathname === '/'); + + // Redirect root page to `/documents` or `/t/{preferredTeamUrl}/documents`. if (req.nextUrl.pathname === '/') { - const redirectUrl = new URL('/documents', req.url); + const redirectUrlPath = formatDocumentsPath( + resetPreferredTeamUrl ? undefined : preferredTeamUrl?.value, + ); + + const redirectUrl = new URL(redirectUrlPath, req.url); + const response = NextResponse.redirect(redirectUrl); + + return response; + } + + // Redirect `/t` to `/settings/teams`. + if (req.nextUrl.pathname === '/t') { + const redirectUrl = new URL('/settings/teams', req.url); return NextResponse.redirect(redirectUrl); } + // Redirect `/t/` to `/t//documents`. + if (TEAM_URL_ROOT_REGEX.test(req.nextUrl.pathname)) { + const redirectUrl = new URL(`${req.nextUrl.pathname}/documents`, req.url); + + const response = NextResponse.redirect(redirectUrl); + response.cookies.set('preferred-team-url', req.nextUrl.pathname.replace('/t/', '')); + + return response; + } + + // Set the preferred team url cookie if user accesses a team page. + if (req.nextUrl.pathname.startsWith('/t/')) { + const response = NextResponse.next(); + response.cookies.set('preferred-team-url', req.nextUrl.pathname.split('/')[2]); + + return response; + } + if (req.nextUrl.pathname.startsWith('/signin')) { const token = await getToken({ req }); @@ -19,5 +67,34 @@ export default async function middleware(req: NextRequest) { } } + // Clear preferred team url cookie if user accesses a non team page from a team page. + if (resetPreferredTeamUrl || req.nextUrl.pathname === '/documents') { + const response = NextResponse.next(); + response.cookies.set('preferred-team-url', ''); + + return response; + } + return NextResponse.next(); } + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + * - ingest (analytics) + * - site.webmanifest + */ + { + source: '/((?!api|_next/static|_next/image|ingest|favicon|site.webmanifest).*)', + missing: [ + { type: 'header', key: 'next-router-prefetch' }, + { type: 'header', key: 'purpose', value: 'prefetch' }, + ], + }, + ], +}; diff --git a/package-lock.json b/package-lock.json index 9012d3f29..aae034c57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4886,9 +4886,9 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", - "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", + "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/number": "1.0.1", @@ -4897,12 +4897,12 @@ "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-direction": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-focus-scope": "1.0.4", "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-popper": "1.1.2", - "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-use-callback-ref": "1.0.1", @@ -4928,113 +4928,6 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", - "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", - "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-popper": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", - "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.0.3", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1", - "@radix-ui/react-use-rect": "1.0.1", - "@radix-ui/react-use-size": "1.0.1", - "@radix-ui/rect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-portal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", - "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-separator": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", @@ -19750,13 +19643,19 @@ "@prisma/client": "5.4.2", "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", - "prisma": "5.4.2" + "prisma": "5.4.2", + "ts-pattern": "^5.0.6" }, "devDependencies": { "ts-node": "^10.9.1", "typescript": "5.2.2" } }, + "packages/prisma/node_modules/ts-pattern": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.0.6.tgz", + "integrity": "sha512-Y+jOjihlFriWzcBjncPCf2/am+Hgz7LtsWs77pWg5vQQKLQj07oNrJryo/wK2G0ndNaoVn2ownFMeoeAuReu3Q==" + }, "packages/prisma/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -19864,7 +19763,7 @@ "@radix-ui/react-checkbox": "^1.0.3", "@radix-ui/react-collapsible": "^1.0.2", "@radix-ui/react-context-menu": "^2.1.3", - "@radix-ui/react-dialog": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.4", "@radix-ui/react-hover-card": "^1.0.5", "@radix-ui/react-label": "^2.0.1", @@ -19874,7 +19773,7 @@ "@radix-ui/react-progress": "^1.0.2", "@radix-ui/react-radio-group": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.3", - "@radix-ui/react-select": "^1.2.1", + "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.2", "@radix-ui/react-slider": "^1.1.1", "@radix-ui/react-slot": "^1.0.2", diff --git a/packages/app-tests/e2e/fixtures/authentication.ts b/packages/app-tests/e2e/fixtures/authentication.ts new file mode 100644 index 000000000..f1926fb2a --- /dev/null +++ b/packages/app-tests/e2e/fixtures/authentication.ts @@ -0,0 +1,40 @@ +import type { Page } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; + +type ManualLoginOptions = { + page: Page; + email?: string; + password?: string; + + /** + * Where to navigate after login. + */ + redirectPath?: string; +}; + +export const manualLogin = async ({ + page, + email = 'example@documenso.com', + password = 'password', + redirectPath, +}: ManualLoginOptions) => { + await page.goto(`${WEBAPP_BASE_URL}/signin`); + + await page.getByLabel('Email').click(); + await page.getByLabel('Email').fill(email); + + await page.getByLabel('Password', { exact: true }).fill(password); + await page.getByLabel('Password', { exact: true }).press('Enter'); + + if (redirectPath) { + await page.waitForURL(`${WEBAPP_BASE_URL}/documents`); + await page.goto(`${WEBAPP_BASE_URL}${redirectPath}`); + } +}; + +export const manualSignout = async ({ page }: ManualLoginOptions) => { + await page.getByTestId('menu-switcher').click(); + await page.getByRole('menuitem', { name: 'Sign Out' }).click(); + await page.waitForURL(`${WEBAPP_BASE_URL}/signin`); +}; diff --git a/packages/app-tests/e2e/pr-711-deletion-of-documents.spec.ts b/packages/app-tests/e2e/pr-711-deletion-of-documents.spec.ts index 12a099bbf..da95c66f0 100644 --- a/packages/app-tests/e2e/pr-711-deletion-of-documents.spec.ts +++ b/packages/app-tests/e2e/pr-711-deletion-of-documents.spec.ts @@ -2,6 +2,8 @@ import { expect, test } from '@playwright/test'; import { TEST_USERS } from '@documenso/prisma/seed/pr-711-deletion-of-documents'; +import { manualLogin, manualSignout } from './fixtures/authentication'; + test.describe.configure({ mode: 'serial' }); test('[PR-711]: seeded documents should be visible', async ({ page }) => { @@ -19,17 +21,11 @@ test('[PR-711]: seeded documents should be visible', async ({ page }) => { await expect(page.getByRole('link', { name: 'Document 1 - Pending' })).toBeVisible(); await expect(page.getByRole('link', { name: 'Document 1 - Draft' })).toBeVisible(); - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); for (const recipient of recipients) { - await page.goto('/signin'); - - await page.getByLabel('Email').fill(recipient.email); - await page.getByLabel('Password', { exact: true }).fill(recipient.password); - await page.getByRole('button', { name: 'Sign In' }).click(); + await page.waitForURL('/signin'); + await manualLogin({ page, email: recipient.email, password: recipient.password }); await page.waitForURL('/documents'); @@ -38,10 +34,7 @@ test('[PR-711]: seeded documents should be visible', async ({ page }) => { await expect(page.getByRole('link', { name: 'Document 1 - Draft' })).not.toBeVisible(); - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); } }); @@ -74,13 +67,10 @@ test('[PR-711]: deleting a completed document should not remove it from recipien await expect(page.getByRole('row', { name: /Document 1 - Completed/ })).not.toBeVisible(); - // signout - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); for (const recipient of recipients) { + await page.waitForURL('/signin'); await page.goto('/signin'); // sign in @@ -96,11 +86,7 @@ test('[PR-711]: deleting a completed document should not remove it from recipien await expect(page.getByText('Everyone has signed').nth(0)).toBeVisible(); await page.goto('/documents'); - - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); } }); @@ -115,11 +101,7 @@ test('[PR-711]: deleting a pending document should remove it from recipients', a await page.goto('/signin'); - // sign in - await page.getByLabel('Email').fill(sender.email); - await page.getByLabel('Password', { exact: true }).fill(sender.password); - await page.getByRole('button', { name: 'Sign In' }).click(); - + await manualLogin({ page, email: sender.email, password: sender.password }); await page.waitForURL('/documents'); // open actions menu @@ -133,19 +115,12 @@ test('[PR-711]: deleting a pending document should remove it from recipients', a await expect(page.getByRole('row', { name: /Document 1 - Pending/ })).not.toBeVisible(); // signout - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); for (const recipient of recipients) { - await page.goto('/signin'); - - // sign in - await page.getByLabel('Email').fill(recipient.email); - await page.getByLabel('Password', { exact: true }).fill(recipient.password); - await page.getByRole('button', { name: 'Sign In' }).click(); + await page.waitForURL('/signin'); + await manualLogin({ page, email: recipient.email, password: recipient.password }); await page.waitForURL('/documents'); await expect(page.getByRole('link', { name: 'Document 1 - Pending' })).not.toBeVisible(); @@ -154,11 +129,9 @@ test('[PR-711]: deleting a pending document should remove it from recipients', a await expect(page.getByText(/document.*cancelled/i).nth(0)).toBeVisible(); await page.goto('/documents'); + await page.waitForURL('/documents'); - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); - - await page.waitForURL('/signin'); + await manualSignout({ page }); } }); @@ -167,13 +140,7 @@ test('[PR-711]: deleting a draft document should remove it without additional pr }) => { const [sender] = TEST_USERS; - await page.goto('/signin'); - - // sign in - await page.getByLabel('Email').fill(sender.email); - await page.getByLabel('Password', { exact: true }).fill(sender.password); - await page.getByRole('button', { name: 'Sign In' }).click(); - + await manualLogin({ page, email: sender.email, password: sender.password }); await page.waitForURL('/documents'); // open actions menu diff --git a/packages/app-tests/e2e/pr-713-add-document-search-to-command-menu.spec.ts b/packages/app-tests/e2e/pr-713-add-document-search-to-command-menu.spec.ts index e9ae60d0e..160113f95 100644 --- a/packages/app-tests/e2e/pr-713-add-document-search-to-command-menu.spec.ts +++ b/packages/app-tests/e2e/pr-713-add-document-search-to-command-menu.spec.ts @@ -17,12 +17,6 @@ test('[PR-713]: should see sent documents', async ({ page }) => { await page.getByPlaceholder('Type a command or search...').fill('sent'); await expect(page.getByRole('option', { name: '[713] Document - Sent' })).toBeVisible(); - - await page.keyboard.press('Escape'); - - // signout - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); }); test('[PR-713]: should see received documents', async ({ page }) => { @@ -40,12 +34,6 @@ test('[PR-713]: should see received documents', async ({ page }) => { await page.getByPlaceholder('Type a command or search...').fill('received'); await expect(page.getByRole('option', { name: '[713] Document - Received' })).toBeVisible(); - - await page.keyboard.press('Escape'); - - // signout - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); }); test('[PR-713]: should be able to search by recipient', async ({ page }) => { @@ -63,10 +51,4 @@ test('[PR-713]: should be able to search by recipient', async ({ page }) => { await page.getByPlaceholder('Type a command or search...').fill(recipient.email); await expect(page.getByRole('option', { name: '[713] Document - Sent' })).toBeVisible(); - - await page.keyboard.press('Escape'); - - // signout - await page.getByTitle('Profile Dropdown').click(); - await page.getByRole('menuitem', { name: 'Sign Out' }).click(); }); diff --git a/packages/app-tests/e2e/teams/manage-team.spec.ts b/packages/app-tests/e2e/teams/manage-team.spec.ts new file mode 100644 index 000000000..aed56b2bc --- /dev/null +++ b/packages/app-tests/e2e/teams/manage-team.spec.ts @@ -0,0 +1,87 @@ +import { test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, unseedTeam } from '@documenso/prisma/seed/teams'; +import { seedUser } from '@documenso/prisma/seed/users'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEAMS]: create team', async ({ page }) => { + const user = await seedUser(); + + await manualLogin({ + page, + email: user.email, + redirectPath: '/settings/teams', + }); + + const teamId = `team-${Date.now()}`; + + // Create team. + await page.getByRole('button', { name: 'Create team' }).click(); + await page.getByLabel('Team Name*').fill(teamId); + await page.getByTestId('dialog-create-team-button').click(); + + await page.getByTestId('dialog-create-team-button').waitFor({ state: 'hidden' }); + + const isCheckoutRequired = page.url().includes('pending'); + test.skip(isCheckoutRequired, 'Test skipped because billing is enabled.'); + + // Goto new team settings page. + await page.getByRole('row').filter({ hasText: teamId }).getByRole('link').nth(1).click(); + + await unseedTeam(teamId); +}); + +test('[TEAMS]: delete team', async ({ page }) => { + const team = await seedTeam(); + + await manualLogin({ + page, + email: team.owner.email, + redirectPath: `/t/${team.url}/settings`, + }); + + // Delete team. + await page.getByRole('button', { name: 'Delete team' }).click(); + await page.getByLabel(`Confirm by typing delete ${team.url}`).fill(`delete ${team.url}`); + await page.getByRole('button', { name: 'Delete' }).click(); + + // Check that we have been redirected to the teams page. + await page.waitForURL(`${WEBAPP_BASE_URL}/settings/teams`); +}); + +test('[TEAMS]: update team', async ({ page }) => { + const team = await seedTeam(); + + await manualLogin({ + page, + email: team.owner.email, + }); + + // Navigate to create team page. + await page.getByTestId('menu-switcher').click(); + await page.getByRole('menuitem', { name: 'Manage teams' }).click(); + + // Goto team settings page. + await page.getByRole('row').filter({ hasText: team.url }).getByRole('link').nth(1).click(); + + const updatedTeamId = `team-${Date.now()}`; + + // Update team. + await page.getByLabel('Team Name*').click(); + await page.getByLabel('Team Name*').clear(); + await page.getByLabel('Team Name*').fill(updatedTeamId); + await page.getByLabel('Team URL*').click(); + await page.getByLabel('Team URL*').clear(); + await page.getByLabel('Team URL*').fill(updatedTeamId); + + await page.getByRole('button', { name: 'Update team' }).click(); + + // Check we have been redirected to the new team URL and the name is updated. + await page.waitForURL(`${WEBAPP_BASE_URL}/t/${updatedTeamId}/settings`); + + await unseedTeam(updatedTeamId); +}); diff --git a/packages/app-tests/e2e/teams/team-documents.spec.ts b/packages/app-tests/e2e/teams/team-documents.spec.ts new file mode 100644 index 000000000..210189ca7 --- /dev/null +++ b/packages/app-tests/e2e/teams/team-documents.spec.ts @@ -0,0 +1,282 @@ +import type { Page } from '@playwright/test'; +import { expect, test } from '@playwright/test'; + +import { DocumentStatus } from '@documenso/prisma/client'; +import { seedDocuments, seedTeamDocuments } from '@documenso/prisma/seed/documents'; +import { seedTeamEmail, unseedTeam, unseedTeamEmail } from '@documenso/prisma/seed/teams'; +import { seedUser } from '@documenso/prisma/seed/users'; + +import { manualLogin, manualSignout } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +const checkDocumentTabCount = async (page: Page, tabName: string, count: number) => { + await page.getByRole('tab', { name: tabName }).click(); + + if (tabName !== 'All') { + await expect(page.getByRole('tab', { name: tabName })).toContainText(count.toString()); + } + + if (count === 0) { + await expect(page.getByRole('main')).toContainText(`Nothing to do`); + return; + } + + await expect(page.getByRole('main')).toContainText(`Showing ${count}`); +}; + +test('[TEAMS]: check team documents count', async ({ page }) => { + const { team, teamMember2 } = await seedTeamDocuments(); + + // Run the test twice, once with the team owner and once with a team member to ensure the counts are the same. + for (const user of [team.owner, teamMember2]) { + await manualLogin({ + page, + email: user.email, + redirectPath: `/t/${team.url}/documents`, + }); + + // Check document counts. + await checkDocumentTabCount(page, 'Inbox', 0); + await checkDocumentTabCount(page, 'Pending', 2); + await checkDocumentTabCount(page, 'Completed', 1); + await checkDocumentTabCount(page, 'Draft', 2); + await checkDocumentTabCount(page, 'All', 5); + + // Apply filter. + await page.locator('button').filter({ hasText: 'Sender: All' }).click(); + await page.getByRole('option', { name: teamMember2.name ?? '' }).click(); + await page.waitForURL(/senderIds/); + + // Check counts after filtering. + await checkDocumentTabCount(page, 'Inbox', 0); + await checkDocumentTabCount(page, 'Pending', 2); + await checkDocumentTabCount(page, 'Completed', 0); + await checkDocumentTabCount(page, 'Draft', 1); + await checkDocumentTabCount(page, 'All', 3); + + await manualSignout({ page }); + } + + await unseedTeam(team.url); +}); + +test('[TEAMS]: check team documents count with internal team email', async ({ page }) => { + const { team, teamMember2, teamMember4 } = await seedTeamDocuments(); + const { team: team2, teamMember2: team2Member2 } = await seedTeamDocuments(); + + const teamEmailMember = teamMember4; + + await seedTeamEmail({ + email: teamEmailMember.email, + teamId: team.id, + }); + + const testUser1 = await seedUser(); + + await seedDocuments([ + // Documents sent from the team email account. + { + sender: teamEmailMember, + recipients: [testUser1], + type: DocumentStatus.COMPLETED, + documentOptions: { + teamId: team.id, + }, + }, + { + sender: teamEmailMember, + recipients: [testUser1], + type: DocumentStatus.PENDING, + documentOptions: { + teamId: team.id, + }, + }, + { + sender: teamMember4, + recipients: [testUser1], + type: DocumentStatus.DRAFT, + }, + // Documents sent to the team email account. + { + sender: testUser1, + recipients: [teamEmailMember], + type: DocumentStatus.COMPLETED, + }, + { + sender: testUser1, + recipients: [teamEmailMember], + type: DocumentStatus.PENDING, + }, + { + sender: testUser1, + recipients: [teamEmailMember], + type: DocumentStatus.DRAFT, + }, + // Document sent to the team email account from another team. + { + sender: team2Member2, + recipients: [teamEmailMember], + type: DocumentStatus.PENDING, + documentOptions: { + teamId: team2.id, + }, + }, + ]); + + // Run the test twice, one with the team owner and once with the team member email to ensure the counts are the same. + for (const user of [team.owner, teamEmailMember]) { + await manualLogin({ + page, + email: user.email, + redirectPath: `/t/${team.url}/documents`, + }); + + // Check document counts. + await checkDocumentTabCount(page, 'Inbox', 2); + await checkDocumentTabCount(page, 'Pending', 3); + await checkDocumentTabCount(page, 'Completed', 3); + await checkDocumentTabCount(page, 'Draft', 3); + await checkDocumentTabCount(page, 'All', 11); + + // Apply filter. + await page.locator('button').filter({ hasText: 'Sender: All' }).click(); + await page.getByRole('option', { name: teamMember2.name ?? '' }).click(); + await page.waitForURL(/senderIds/); + + // Check counts after filtering. + await checkDocumentTabCount(page, 'Inbox', 0); + await checkDocumentTabCount(page, 'Pending', 2); + await checkDocumentTabCount(page, 'Completed', 0); + await checkDocumentTabCount(page, 'Draft', 1); + await checkDocumentTabCount(page, 'All', 3); + + await manualSignout({ page }); + } + + await unseedTeamEmail({ teamId: team.id }); + await unseedTeam(team.url); +}); + +test('[TEAMS]: check team documents count with external team email', async ({ page }) => { + const { team, teamMember2 } = await seedTeamDocuments(); + const { team: team2, teamMember2: team2Member2 } = await seedTeamDocuments(); + + const teamEmail = `external-team-email-${team.id}@test.documenso.com`; + + await seedTeamEmail({ + email: teamEmail, + teamId: team.id, + }); + + const testUser1 = await seedUser(); + + await seedDocuments([ + // Documents sent to the team email account. + { + sender: testUser1, + recipients: [teamEmail], + type: DocumentStatus.COMPLETED, + }, + { + sender: testUser1, + recipients: [teamEmail], + type: DocumentStatus.PENDING, + }, + { + sender: testUser1, + recipients: [teamEmail], + type: DocumentStatus.DRAFT, + }, + // Document sent to the team email account from another team. + { + sender: team2Member2, + recipients: [teamEmail], + type: DocumentStatus.PENDING, + documentOptions: { + teamId: team2.id, + }, + }, + // Document sent to the team email account from an individual user. + { + sender: testUser1, + recipients: [teamEmail], + type: DocumentStatus.PENDING, + documentOptions: { + teamId: team2.id, + }, + }, + { + sender: testUser1, + recipients: [teamEmail], + type: DocumentStatus.DRAFT, + documentOptions: { + teamId: team2.id, + }, + }, + ]); + + await manualLogin({ + page, + email: teamMember2.email, + redirectPath: `/t/${team.url}/documents`, + }); + + // Check document counts. + await checkDocumentTabCount(page, 'Inbox', 3); + await checkDocumentTabCount(page, 'Pending', 2); + await checkDocumentTabCount(page, 'Completed', 2); + await checkDocumentTabCount(page, 'Draft', 2); + await checkDocumentTabCount(page, 'All', 9); + + // Apply filter. + await page.locator('button').filter({ hasText: 'Sender: All' }).click(); + await page.getByRole('option', { name: teamMember2.name ?? '' }).click(); + await page.waitForURL(/senderIds/); + + // Check counts after filtering. + await checkDocumentTabCount(page, 'Inbox', 0); + await checkDocumentTabCount(page, 'Pending', 2); + await checkDocumentTabCount(page, 'Completed', 0); + await checkDocumentTabCount(page, 'Draft', 1); + await checkDocumentTabCount(page, 'All', 3); + + await unseedTeamEmail({ teamId: team.id }); + await unseedTeam(team.url); +}); + +test('[TEAMS]: delete pending team document', async ({ page }) => { + const { team, teamMember2: currentUser } = await seedTeamDocuments(); + + await manualLogin({ + page, + email: currentUser.email, + redirectPath: `/t/${team.url}/documents?status=PENDING`, + }); + + await page.getByRole('row').getByRole('button').nth(1).click(); + + await page.getByRole('menuitem', { name: 'Delete' }).click(); + await page.getByPlaceholder("Type 'delete' to confirm").fill('delete'); + await page.getByRole('button', { name: 'Delete' }).click(); + + await checkDocumentTabCount(page, 'Pending', 1); +}); + +test('[TEAMS]: resend pending team document', async ({ page }) => { + const { team, teamMember2: currentUser } = await seedTeamDocuments(); + + await manualLogin({ + page, + email: currentUser.email, + redirectPath: `/t/${team.url}/documents?status=PENDING`, + }); + + await page.getByRole('row').getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Resend' }).click(); + + await page.getByLabel('test.documenso.com').first().click(); + await page.getByRole('button', { name: 'Send reminder' }).click(); + + await expect(page.getByRole('status')).toContainText('Document re-sent'); +}); diff --git a/packages/app-tests/e2e/teams/team-email.spec.ts b/packages/app-tests/e2e/teams/team-email.spec.ts new file mode 100644 index 000000000..953be5aaf --- /dev/null +++ b/packages/app-tests/e2e/teams/team-email.spec.ts @@ -0,0 +1,102 @@ +import { expect, test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, seedTeamEmailVerification, unseedTeam } from '@documenso/prisma/seed/teams'; +import { seedUser, unseedUser } from '@documenso/prisma/seed/users'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEAMS]: send team email request', async ({ page }) => { + const team = await seedTeam(); + + await manualLogin({ + page, + email: team.owner.email, + password: 'password', + redirectPath: `/t/${team.url}/settings`, + }); + + await page.getByRole('button', { name: 'Add email' }).click(); + await page.getByPlaceholder('eg. Legal').click(); + await page.getByPlaceholder('eg. Legal').fill('test@test.documenso.com'); + await page.getByPlaceholder('example@example.com').click(); + await page.getByPlaceholder('example@example.com').fill('test@test.documenso.com'); + await page.getByRole('button', { name: 'Add' }).click(); + + await expect( + page + .getByRole('status') + .filter({ hasText: 'We have sent a confirmation email for verification.' }) + .first(), + ).toBeVisible(); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: accept team email request', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const teamEmailVerification = await seedTeamEmailVerification({ + email: 'team-email-verification@test.documenso.com', + teamId: team.id, + }); + + await page.goto(`${WEBAPP_BASE_URL}/team/verify/email/${teamEmailVerification.token}`); + await expect(page.getByRole('heading')).toContainText('Team email verified!'); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: delete team email', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + createTeamEmail: true, + }); + + await manualLogin({ + page, + email: team.owner.email, + redirectPath: `/t/${team.url}/settings`, + }); + + await page.locator('section div').filter({ hasText: 'Team email' }).getByRole('button').click(); + + await page.getByRole('menuitem', { name: 'Remove' }).click(); + + await expect(page.getByText('Team email has been removed').first()).toBeVisible(); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: team email owner removes access', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + createTeamEmail: true, + }); + + if (!team.teamEmail) { + throw new Error('Not possible'); + } + + const teamEmailOwner = await seedUser({ + email: team.teamEmail.email, + }); + + await manualLogin({ + page, + email: teamEmailOwner.email, + redirectPath: `/settings/teams`, + }); + + await page.getByRole('button', { name: 'Revoke access' }).click(); + await page.getByRole('button', { name: 'Revoke' }).click(); + + await expect(page.getByText('You have successfully revoked').first()).toBeVisible(); + + await unseedTeam(team.url); + await unseedUser(teamEmailOwner.id); +}); diff --git a/packages/app-tests/e2e/teams/team-members.spec.ts b/packages/app-tests/e2e/teams/team-members.spec.ts new file mode 100644 index 000000000..05f096c09 --- /dev/null +++ b/packages/app-tests/e2e/teams/team-members.spec.ts @@ -0,0 +1,110 @@ +import { expect, test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, seedTeamInvite, unseedTeam } from '@documenso/prisma/seed/teams'; +import { seedUser } from '@documenso/prisma/seed/users'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEAMS]: update team member role', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + await manualLogin({ + page, + email: team.owner.email, + password: 'password', + redirectPath: `/t/${team.url}/settings/members`, + }); + + const teamMemberToUpdate = team.members[1]; + + await page + .getByRole('row') + .filter({ hasText: teamMemberToUpdate.user.email }) + .getByRole('button') + .click(); + + await page.getByRole('menuitem', { name: 'Update role' }).click(); + await page.getByRole('combobox').click(); + await page.getByLabel('Manager').click(); + await page.getByRole('button', { name: 'Update' }).click(); + await expect( + page.getByRole('row').filter({ hasText: teamMemberToUpdate.user.email }), + ).toContainText('Manager'); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: accept team invitation without account', async ({ page }) => { + const team = await seedTeam(); + + const teamInvite = await seedTeamInvite({ + email: `team-invite-test-${Date.now()}@test.documenso.com`, + teamId: team.id, + }); + + await page.goto(`${WEBAPP_BASE_URL}/team/invite/${teamInvite.token}`); + await expect(page.getByRole('heading')).toContainText('Team invitation'); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: accept team invitation with account', async ({ page }) => { + const team = await seedTeam(); + const user = await seedUser(); + + const teamInvite = await seedTeamInvite({ + email: user.email, + teamId: team.id, + }); + + await page.goto(`${WEBAPP_BASE_URL}/team/invite/${teamInvite.token}`); + await expect(page.getByRole('heading')).toContainText('Invitation accepted!'); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: member can leave team', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const teamMember = team.members[1]; + + await manualLogin({ + page, + email: teamMember.user.email, + password: 'password', + redirectPath: `/settings/teams`, + }); + + await page.getByRole('button', { name: 'Leave' }).click(); + await page.getByRole('button', { name: 'Leave' }).click(); + + await expect(page.getByRole('status').first()).toContainText( + 'You have successfully left this team.', + ); + + await unseedTeam(team.url); +}); + +test('[TEAMS]: owner cannot leave team', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + await manualLogin({ + page, + email: team.owner.email, + password: 'password', + redirectPath: `/settings/teams`, + }); + + await expect(page.getByRole('button').getByText('Leave')).toBeDisabled(); + + await unseedTeam(team.url); +}); diff --git a/packages/app-tests/e2e/teams/transfer-team.spec.ts b/packages/app-tests/e2e/teams/transfer-team.spec.ts new file mode 100644 index 000000000..a5d95b720 --- /dev/null +++ b/packages/app-tests/e2e/teams/transfer-team.spec.ts @@ -0,0 +1,69 @@ +import { expect, test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, seedTeamTransfer, unseedTeam } from '@documenso/prisma/seed/teams'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEAMS]: initiate and cancel team transfer', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const teamMember = team.members[1]; + + await manualLogin({ + page, + email: team.owner.email, + password: 'password', + redirectPath: `/t/${team.url}/settings`, + }); + + await page.getByRole('button', { name: 'Transfer team' }).click(); + + await page.getByRole('combobox').click(); + await page.getByLabel(teamMember.user.name ?? '').click(); + await page.getByLabel('Confirm by typing transfer').click(); + await page.getByLabel('Confirm by typing transfer').fill('transfer'); + await page.getByRole('button', { name: 'Transfer' }).click(); + + await expect(page.locator('[id="\\:r2\\:-form-item-message"]')).toContainText( + `You must enter 'transfer ${team.name}' to proceed`, + ); + + await page.getByLabel('Confirm by typing transfer').click(); + await page.getByLabel('Confirm by typing transfer').fill(`transfer ${team.name}`); + await page.getByRole('button', { name: 'Transfer' }).click(); + + await expect(page.getByRole('heading', { name: 'Team transfer in progress' })).toBeVisible(); + await page.getByRole('button', { name: 'Cancel' }).click(); + + await expect(page.getByRole('status').first()).toContainText( + 'The team transfer invitation has been successfully deleted.', + ); + + await unseedTeam(team.url); +}); + +/** + * Current skipped until we disable billing during tests. + */ +test.skip('[TEAMS]: accept team transfer', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const newOwnerMember = team.members[1]; + + const teamTransferRequest = await seedTeamTransfer({ + teamId: team.id, + newOwnerUserId: newOwnerMember.userId, + }); + + await page.goto(`${WEBAPP_BASE_URL}/team/verify/transfer/${teamTransferRequest.token}`); + await expect(page.getByRole('heading')).toContainText('Team ownership transferred!'); + + await unseedTeam(team.url); +}); diff --git a/packages/app-tests/e2e/test-auth-flow.spec.ts b/packages/app-tests/e2e/test-auth-flow.spec.ts index 45b6dea03..40ee5e768 100644 --- a/packages/app-tests/e2e/test-auth-flow.spec.ts +++ b/packages/app-tests/e2e/test-auth-flow.spec.ts @@ -30,7 +30,7 @@ test('user can sign up with email and password', async ({ page }: { page: Page } await page.mouse.up(); } - await page.getByRole('button', { name: 'Sign Up' }).click(); + await page.getByRole('button', { name: 'Sign Up', exact: true }).click(); await page.waitForURL('/documents'); await expect(page).toHaveURL('/documents'); diff --git a/packages/ee/server-only/limits/client.ts b/packages/ee/server-only/limits/client.ts index 7f48e6856..9a36928b1 100644 --- a/packages/ee/server-only/limits/client.ts +++ b/packages/ee/server-only/limits/client.ts @@ -1,17 +1,23 @@ import { APP_BASE_URL } from '@documenso/lib/constants/app'; import { FREE_PLAN_LIMITS } from './constants'; -import { TLimitsResponseSchema, ZLimitsResponseSchema } from './schema'; +import type { TLimitsResponseSchema } from './schema'; +import { ZLimitsResponseSchema } from './schema'; export type GetLimitsOptions = { headers?: Record; + teamId?: number | null; }; -export const getLimits = async ({ headers }: GetLimitsOptions = {}) => { +export const getLimits = async ({ headers, teamId }: GetLimitsOptions = {}) => { const requestHeaders = headers ?? {}; const url = new URL(`${APP_BASE_URL}/api/limits`); + if (teamId) { + requestHeaders['team-id'] = teamId.toString(); + } + return fetch(url, { headers: { ...requestHeaders, diff --git a/packages/ee/server-only/limits/constants.ts b/packages/ee/server-only/limits/constants.ts index 71ff29d9d..4c428f34f 100644 --- a/packages/ee/server-only/limits/constants.ts +++ b/packages/ee/server-only/limits/constants.ts @@ -1,10 +1,15 @@ -import { TLimitsSchema } from './schema'; +import type { TLimitsSchema } from './schema'; export const FREE_PLAN_LIMITS: TLimitsSchema = { documents: 5, recipients: 10, }; +export const TEAM_PLAN_LIMITS: TLimitsSchema = { + documents: Infinity, + recipients: Infinity, +}; + export const SELFHOSTED_PLAN_LIMITS: TLimitsSchema = { documents: Infinity, recipients: Infinity, diff --git a/packages/ee/server-only/limits/handler.ts b/packages/ee/server-only/limits/handler.ts index 69f77db75..a497b2314 100644 --- a/packages/ee/server-only/limits/handler.ts +++ b/packages/ee/server-only/limits/handler.ts @@ -1,10 +1,10 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import type { NextApiRequest, NextApiResponse } from 'next'; import { getToken } from 'next-auth/jwt'; import { match } from 'ts-pattern'; import { ERROR_CODES } from './errors'; -import { TLimitsErrorResponseSchema, TLimitsResponseSchema } from './schema'; +import type { TLimitsErrorResponseSchema, TLimitsResponseSchema } from './schema'; import { getServerLimits } from './server'; export const limitsHandler = async ( @@ -14,7 +14,19 @@ export const limitsHandler = async ( try { const token = await getToken({ req }); - const limits = await getServerLimits({ email: token?.email }); + const rawTeamId = req.headers['team-id']; + + let teamId: number | null = null; + + if (typeof rawTeamId === 'string' && !isNaN(parseInt(rawTeamId, 10))) { + teamId = parseInt(rawTeamId, 10); + } + + if (!teamId && rawTeamId) { + throw new Error(ERROR_CODES.INVALID_TEAM_ID); + } + + const limits = await getServerLimits({ email: token?.email, teamId }); return res.status(200).json(limits); } catch (err) { diff --git a/packages/ee/server-only/limits/provider/client.tsx b/packages/ee/server-only/limits/provider/client.tsx index 07a085750..fdc00b439 100644 --- a/packages/ee/server-only/limits/provider/client.tsx +++ b/packages/ee/server-only/limits/provider/client.tsx @@ -6,7 +6,7 @@ import { equals } from 'remeda'; import { getLimits } from '../client'; import { FREE_PLAN_LIMITS } from '../constants'; -import { TLimitsResponseSchema } from '../schema'; +import type { TLimitsResponseSchema } from '../schema'; export type LimitsContextValue = TLimitsResponseSchema; @@ -24,19 +24,22 @@ export const useLimits = () => { export type LimitsProviderProps = { initialValue?: LimitsContextValue; + teamId?: number; children?: React.ReactNode; }; -export const LimitsProvider = ({ initialValue, children }: LimitsProviderProps) => { - const defaultValue: TLimitsResponseSchema = { +export const LimitsProvider = ({ + initialValue = { quota: FREE_PLAN_LIMITS, remaining: FREE_PLAN_LIMITS, - }; - - const [limits, setLimits] = useState(() => initialValue ?? defaultValue); + }, + teamId, + children, +}: LimitsProviderProps) => { + const [limits, setLimits] = useState(() => initialValue); const refreshLimits = async () => { - const newLimits = await getLimits(); + const newLimits = await getLimits({ teamId }); setLimits((oldLimits) => { if (equals(oldLimits, newLimits)) { diff --git a/packages/ee/server-only/limits/provider/server.tsx b/packages/ee/server-only/limits/provider/server.tsx index c9295483a..b7cde3573 100644 --- a/packages/ee/server-only/limits/provider/server.tsx +++ b/packages/ee/server-only/limits/provider/server.tsx @@ -3,16 +3,22 @@ import { headers } from 'next/headers'; import { getLimits } from '../client'; +import type { LimitsContextValue } from './client'; import { LimitsProvider as ClientLimitsProvider } from './client'; export type LimitsProviderProps = { children?: React.ReactNode; + teamId?: number; }; -export const LimitsProvider = async ({ children }: LimitsProviderProps) => { +export const LimitsProvider = async ({ children, teamId }: LimitsProviderProps) => { const requestHeaders = Object.fromEntries(headers().entries()); - const limits = await getLimits({ headers: requestHeaders }); + const limits: LimitsContextValue = await getLimits({ headers: requestHeaders, teamId }); - return {children}; + return ( + + {children} + + ); }; diff --git a/packages/ee/server-only/limits/server.ts b/packages/ee/server-only/limits/server.ts index f256c6356..e48eb7187 100644 --- a/packages/ee/server-only/limits/server.ts +++ b/packages/ee/server-only/limits/server.ts @@ -1,22 +1,22 @@ import { DateTime } from 'luxon'; -import { getFlag } from '@documenso/lib/universal/get-feature-flag'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { prisma } from '@documenso/prisma'; import { SubscriptionStatus } from '@documenso/prisma/client'; -import { getPricesByType } from '../stripe/get-prices-by-type'; -import { FREE_PLAN_LIMITS, SELFHOSTED_PLAN_LIMITS } from './constants'; +import { getPricesByPlan } from '../stripe/get-prices-by-plan'; +import { FREE_PLAN_LIMITS, SELFHOSTED_PLAN_LIMITS, TEAM_PLAN_LIMITS } from './constants'; import { ERROR_CODES } from './errors'; import { ZLimitsSchema } from './schema'; export type GetServerLimitsOptions = { email?: string | null; + teamId?: number | null; }; -export const getServerLimits = async ({ email }: GetServerLimitsOptions) => { - const isBillingEnabled = await getFlag('app_billing'); - - if (!isBillingEnabled) { +export const getServerLimits = async ({ email, teamId }: GetServerLimitsOptions) => { + if (!IS_BILLING_ENABLED) { return { quota: SELFHOSTED_PLAN_LIMITS, remaining: SELFHOSTED_PLAN_LIMITS, @@ -27,6 +27,14 @@ export const getServerLimits = async ({ email }: GetServerLimitsOptions) => { throw new Error(ERROR_CODES.UNAUTHORIZED); } + return teamId ? handleTeamLimits({ email, teamId }) : handleUserLimits({ email }); +}; + +type HandleUserLimitsOptions = { + email: string; +}; + +const handleUserLimits = async ({ email }: HandleUserLimitsOptions) => { const user = await prisma.user.findFirst({ where: { email, @@ -48,10 +56,10 @@ export const getServerLimits = async ({ email }: GetServerLimitsOptions) => { ); if (activeSubscriptions.length > 0) { - const individualPrices = await getPricesByType('individual'); + const communityPlanPrices = await getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY); for (const subscription of activeSubscriptions) { - const price = individualPrices.find((price) => price.id === subscription.priceId); + const price = communityPlanPrices.find((price) => price.id === subscription.priceId); if (!price || typeof price.product === 'string' || price.product.deleted) { continue; } @@ -71,6 +79,7 @@ export const getServerLimits = async ({ email }: GetServerLimitsOptions) => { const documents = await prisma.document.count({ where: { userId: user.id, + teamId: null, createdAt: { gte: DateTime.utc().startOf('month').toJSDate(), }, @@ -84,3 +93,50 @@ export const getServerLimits = async ({ email }: GetServerLimitsOptions) => { remaining, }; }; + +type HandleTeamLimitsOptions = { + email: string; + teamId: number; +}; + +const handleTeamLimits = async ({ email, teamId }: HandleTeamLimitsOptions) => { + const team = await prisma.team.findFirst({ + where: { + id: teamId, + members: { + some: { + user: { + email, + }, + }, + }, + }, + include: { + subscription: true, + }, + }); + + if (!team) { + throw new Error('Team not found'); + } + + const { subscription } = team; + + if (subscription && subscription.status === SubscriptionStatus.INACTIVE) { + return { + quota: { + documents: 0, + recipients: 0, + }, + remaining: { + documents: 0, + recipients: 0, + }, + }; + } + + return { + quota: structuredClone(TEAM_PLAN_LIMITS), + remaining: structuredClone(TEAM_PLAN_LIMITS), + }; +}; diff --git a/packages/ee/server-only/stripe/create-team-customer.ts b/packages/ee/server-only/stripe/create-team-customer.ts new file mode 100644 index 000000000..591c445af --- /dev/null +++ b/packages/ee/server-only/stripe/create-team-customer.ts @@ -0,0 +1,20 @@ +import { STRIPE_CUSTOMER_TYPE } from '@documenso/lib/constants/billing'; +import { stripe } from '@documenso/lib/server-only/stripe'; + +type CreateTeamCustomerOptions = { + name: string; + email: string; +}; + +/** + * Create a Stripe customer for a given team. + */ +export const createTeamCustomer = async ({ name, email }: CreateTeamCustomerOptions) => { + return await stripe.customers.create({ + name, + email, + metadata: { + type: STRIPE_CUSTOMER_TYPE.TEAM, + }, + }); +}; diff --git a/packages/ee/server-only/stripe/delete-customer-payment-methods.ts b/packages/ee/server-only/stripe/delete-customer-payment-methods.ts new file mode 100644 index 000000000..749c15763 --- /dev/null +++ b/packages/ee/server-only/stripe/delete-customer-payment-methods.ts @@ -0,0 +1,22 @@ +import { stripe } from '@documenso/lib/server-only/stripe'; + +type DeleteCustomerPaymentMethodsOptions = { + customerId: string; +}; + +/** + * Delete all attached payment methods for a given customer. + */ +export const deleteCustomerPaymentMethods = async ({ + customerId, +}: DeleteCustomerPaymentMethodsOptions) => { + const paymentMethods = await stripe.paymentMethods.list({ + customer: customerId, + }); + + await Promise.all( + paymentMethods.data.map(async (paymentMethod) => + stripe.paymentMethods.detach(paymentMethod.id), + ), + ); +}; diff --git a/packages/ee/server-only/stripe/get-checkout-session.ts b/packages/ee/server-only/stripe/get-checkout-session.ts index fd15d538a..7c89c1f8c 100644 --- a/packages/ee/server-only/stripe/get-checkout-session.ts +++ b/packages/ee/server-only/stripe/get-checkout-session.ts @@ -1,17 +1,21 @@ 'use server'; +import type Stripe from 'stripe'; + import { stripe } from '@documenso/lib/server-only/stripe'; export type GetCheckoutSessionOptions = { customerId: string; priceId: string; returnUrl: string; + subscriptionMetadata?: Stripe.Metadata; }; export const getCheckoutSession = async ({ customerId, priceId, returnUrl, + subscriptionMetadata, }: GetCheckoutSessionOptions) => { 'use server'; @@ -26,6 +30,9 @@ export const getCheckoutSession = async ({ ], success_url: `${returnUrl}?success=true`, cancel_url: `${returnUrl}?canceled=true`, + subscription_data: { + metadata: subscriptionMetadata, + }, }); return session.url; diff --git a/packages/ee/server-only/stripe/get-community-plan-prices.ts b/packages/ee/server-only/stripe/get-community-plan-prices.ts new file mode 100644 index 000000000..86c7f61bd --- /dev/null +++ b/packages/ee/server-only/stripe/get-community-plan-prices.ts @@ -0,0 +1,13 @@ +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +export const getCommunityPlanPrices = async () => { + return await getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY); +}; + +export const getCommunityPlanPriceIds = async () => { + const prices = await getCommunityPlanPrices(); + + return prices.map((price) => price.id); +}; diff --git a/packages/ee/server-only/stripe/get-customer.ts b/packages/ee/server-only/stripe/get-customer.ts index c85488e6f..6e2d4f088 100644 --- a/packages/ee/server-only/stripe/get-customer.ts +++ b/packages/ee/server-only/stripe/get-customer.ts @@ -1,15 +1,19 @@ +import { STRIPE_CUSTOMER_TYPE } from '@documenso/lib/constants/billing'; import { stripe } from '@documenso/lib/server-only/stripe'; import { prisma } from '@documenso/prisma'; import type { User } from '@documenso/prisma/client'; import { onSubscriptionUpdated } from './webhook/on-subscription-updated'; +/** + * Get a non team Stripe customer by email. + */ export const getStripeCustomerByEmail = async (email: string) => { const foundStripeCustomers = await stripe.customers.list({ email, }); - return foundStripeCustomers.data[0] ?? null; + return foundStripeCustomers.data.find((customer) => customer.metadata.type !== 'team') ?? null; }; export const getStripeCustomerById = async (stripeCustomerId: string) => { @@ -51,6 +55,7 @@ export const getStripeCustomerByUser = async (user: User) => { email: user.email, metadata: { userId: user.id, + type: STRIPE_CUSTOMER_TYPE.INDIVIDUAL, }, }); } @@ -78,6 +83,14 @@ export const getStripeCustomerByUser = async (user: User) => { }; }; +export const getStripeCustomerIdByUser = async (user: User) => { + if (user.customerId !== null) { + return user.customerId; + } + + return await getStripeCustomerByUser(user).then((session) => session.stripeCustomer.id); +}; + const syncStripeCustomerSubscriptions = async (userId: number, stripeCustomerId: string) => { const stripeSubscriptions = await stripe.subscriptions.list({ customer: stripeCustomerId, diff --git a/packages/ee/server-only/stripe/get-invoices.ts b/packages/ee/server-only/stripe/get-invoices.ts new file mode 100644 index 000000000..f8f383921 --- /dev/null +++ b/packages/ee/server-only/stripe/get-invoices.ts @@ -0,0 +1,11 @@ +import { stripe } from '@documenso/lib/server-only/stripe'; + +export type GetInvoicesOptions = { + customerId: string; +}; + +export const getInvoices = async ({ customerId }: GetInvoicesOptions) => { + return await stripe.invoices.list({ + customer: customerId, + }); +}; diff --git a/packages/ee/server-only/stripe/get-portal-session.ts b/packages/ee/server-only/stripe/get-portal-session.ts index 310cc1e47..275d166d8 100644 --- a/packages/ee/server-only/stripe/get-portal-session.ts +++ b/packages/ee/server-only/stripe/get-portal-session.ts @@ -4,7 +4,7 @@ import { stripe } from '@documenso/lib/server-only/stripe'; export type GetPortalSessionOptions = { customerId: string; - returnUrl: string; + returnUrl?: string; }; export const getPortalSession = async ({ customerId, returnUrl }: GetPortalSessionOptions) => { diff --git a/packages/ee/server-only/stripe/get-prices-by-interval.ts b/packages/ee/server-only/stripe/get-prices-by-interval.ts index a5578a813..1b528706a 100644 --- a/packages/ee/server-only/stripe/get-prices-by-interval.ts +++ b/packages/ee/server-only/stripe/get-prices-by-interval.ts @@ -9,12 +9,12 @@ export type PriceIntervals = Record { +export const getPricesByInterval = async ({ plan }: GetPricesByIntervalOptions = {}) => { let { data: prices } = await stripe.prices.search({ query: `active:'true' type:'recurring'`, expand: ['data.product'], @@ -26,7 +26,7 @@ export const getPricesByInterval = async ({ type }: GetPricesByIntervalOptions = // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const product = price.product as Stripe.Product; - const filter = !type || product.metadata?.type === type; + const filter = !plan || product.metadata?.plan === plan; // Filter out prices for products that are not active. return product.active && filter; diff --git a/packages/ee/server-only/stripe/get-prices-by-plan.ts b/packages/ee/server-only/stripe/get-prices-by-plan.ts new file mode 100644 index 000000000..5c390b35a --- /dev/null +++ b/packages/ee/server-only/stripe/get-prices-by-plan.ts @@ -0,0 +1,14 @@ +import type { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; +import { stripe } from '@documenso/lib/server-only/stripe'; + +export const getPricesByPlan = async ( + plan: (typeof STRIPE_PLAN_TYPE)[keyof typeof STRIPE_PLAN_TYPE], +) => { + const { data: prices } = await stripe.prices.search({ + query: `metadata['plan']:'${plan}' type:'recurring'`, + expand: ['data.product'], + limit: 100, + }); + + return prices; +}; diff --git a/packages/ee/server-only/stripe/get-prices-by-type.ts b/packages/ee/server-only/stripe/get-prices-by-type.ts deleted file mode 100644 index 22124562c..000000000 --- a/packages/ee/server-only/stripe/get-prices-by-type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { stripe } from '@documenso/lib/server-only/stripe'; - -export const getPricesByType = async (type: 'individual') => { - const { data: prices } = await stripe.prices.search({ - query: `metadata['type']:'${type}' type:'recurring'`, - expand: ['data.product'], - limit: 100, - }); - - return prices; -}; diff --git a/packages/ee/server-only/stripe/get-team-prices.ts b/packages/ee/server-only/stripe/get-team-prices.ts new file mode 100644 index 000000000..5c3021b78 --- /dev/null +++ b/packages/ee/server-only/stripe/get-team-prices.ts @@ -0,0 +1,43 @@ +import type Stripe from 'stripe'; + +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; +import { AppError } from '@documenso/lib/errors/app-error'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +export const getTeamPrices = async () => { + const prices = (await getPricesByPlan(STRIPE_PLAN_TYPE.TEAM)).filter((price) => price.active); + + const monthlyPrice = prices.find((price) => price.recurring?.interval === 'month'); + const yearlyPrice = prices.find((price) => price.recurring?.interval === 'year'); + const priceIds = prices.map((price) => price.id); + + if (!monthlyPrice || !yearlyPrice) { + throw new AppError('INVALID_CONFIG', 'Missing monthly or yearly price'); + } + + return { + monthly: { + friendlyInterval: 'Monthly', + interval: 'monthly', + ...extractPriceData(monthlyPrice), + }, + yearly: { + friendlyInterval: 'Yearly', + interval: 'yearly', + ...extractPriceData(yearlyPrice), + }, + priceIds, + } as const; +}; + +const extractPriceData = (price: Stripe.Price) => { + const product = + typeof price.product !== 'string' && !price.product.deleted ? price.product : null; + + return { + priceId: price.id, + description: product?.description ?? '', + features: product?.features ?? [], + }; +}; diff --git a/packages/ee/server-only/stripe/transfer-team-subscription.ts b/packages/ee/server-only/stripe/transfer-team-subscription.ts new file mode 100644 index 000000000..b4e0bd59a --- /dev/null +++ b/packages/ee/server-only/stripe/transfer-team-subscription.ts @@ -0,0 +1,126 @@ +import type Stripe from 'stripe'; + +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { stripe } from '@documenso/lib/server-only/stripe'; +import { subscriptionsContainsActiveCommunityPlan } from '@documenso/lib/utils/billing'; +import { prisma } from '@documenso/prisma'; +import { type Subscription, type Team, type User } from '@documenso/prisma/client'; + +import { deleteCustomerPaymentMethods } from './delete-customer-payment-methods'; +import { getCommunityPlanPriceIds } from './get-community-plan-prices'; +import { getTeamPrices } from './get-team-prices'; + +type TransferStripeSubscriptionOptions = { + /** + * The user to transfer the subscription to. + */ + user: User & { Subscription: Subscription[] }; + + /** + * The team the subscription is associated with. + */ + team: Team & { subscription?: Subscription | null }; + + /** + * Whether to clear any current payment methods attached to the team. + */ + clearPaymentMethods: boolean; +}; + +/** + * Transfer the Stripe Team seats subscription from one user to another. + * + * Will create a new subscription for the new owner and cancel the old one. + * + * Returns the subscription that should be associated with the team, null if + * no subscription is needed (for community plan). + */ +export const transferTeamSubscription = async ({ + user, + team, + clearPaymentMethods, +}: TransferStripeSubscriptionOptions) => { + const teamCustomerId = team.customerId; + + if (!teamCustomerId) { + throw new AppError(AppErrorCode.NOT_FOUND, 'Missing customer ID.'); + } + + const [communityPlanIds, teamSeatPrices] = await Promise.all([ + getCommunityPlanPriceIds(), + getTeamPrices(), + ]); + + const teamSubscriptionRequired = !subscriptionsContainsActiveCommunityPlan( + user.Subscription, + communityPlanIds, + ); + + let teamSubscription: Stripe.Subscription | null = null; + + if (team.subscription) { + teamSubscription = await stripe.subscriptions.retrieve(team.subscription.planId); + + if (!teamSubscription) { + throw new Error('Could not find the current subscription.'); + } + + if (clearPaymentMethods) { + await deleteCustomerPaymentMethods({ customerId: teamCustomerId }); + } + } + + await stripe.customers.update(teamCustomerId, { + name: user.name ?? team.name, + email: user.email, + }); + + // If team subscription is required and the team does not have a subscription, create one. + if (teamSubscriptionRequired && !teamSubscription) { + const numberOfSeats = await prisma.teamMember.count({ + where: { + teamId: team.id, + }, + }); + + const teamSeatPriceId = teamSeatPrices.monthly.priceId; + + teamSubscription = await stripe.subscriptions.create({ + customer: teamCustomerId, + items: [ + { + price: teamSeatPriceId, + quantity: numberOfSeats, + }, + ], + metadata: { + teamId: team.id.toString(), + }, + }); + } + + // If no team subscription is required, cancel the current team subscription if it exists. + if (!teamSubscriptionRequired && teamSubscription) { + try { + // Set the quantity to 0 so we can refund/charge the old Stripe customer the prorated amount. + await stripe.subscriptions.update(teamSubscription.id, { + items: teamSubscription.items.data.map((item) => ({ + id: item.id, + quantity: 0, + })), + }); + + await stripe.subscriptions.cancel(teamSubscription.id, { + invoice_now: true, + prorate: false, + }); + } catch (e) { + // Do not error out since we can't easily undo the transfer. + // Todo: Teams - Alert us. + } + + return null; + } + + return teamSubscription; +}; diff --git a/packages/ee/server-only/stripe/update-customer.ts b/packages/ee/server-only/stripe/update-customer.ts new file mode 100644 index 000000000..78e223b48 --- /dev/null +++ b/packages/ee/server-only/stripe/update-customer.ts @@ -0,0 +1,18 @@ +import { stripe } from '@documenso/lib/server-only/stripe'; + +type UpdateCustomerOptions = { + customerId: string; + name?: string; + email?: string; +}; + +export const updateCustomer = async ({ customerId, name, email }: UpdateCustomerOptions) => { + if (!name && !email) { + return; + } + + return await stripe.customers.update(customerId, { + name, + email, + }); +}; diff --git a/packages/ee/server-only/stripe/update-subscription-item-quantity.ts b/packages/ee/server-only/stripe/update-subscription-item-quantity.ts new file mode 100644 index 000000000..e0fa95f3d --- /dev/null +++ b/packages/ee/server-only/stripe/update-subscription-item-quantity.ts @@ -0,0 +1,44 @@ +import type Stripe from 'stripe'; + +import { stripe } from '@documenso/lib/server-only/stripe'; + +export type UpdateSubscriptionItemQuantityOptions = { + subscriptionId: string; + quantity: number; + priceId: string; +}; + +export const updateSubscriptionItemQuantity = async ({ + subscriptionId, + quantity, + priceId, +}: UpdateSubscriptionItemQuantityOptions) => { + const subscription = await stripe.subscriptions.retrieve(subscriptionId); + + const items = subscription.items.data.filter((item) => item.price.id === priceId); + + if (items.length !== 1) { + throw new Error('Subscription does not contain required item'); + } + + const hasYearlyItem = items.find((item) => item.price.recurring?.interval === 'year'); + const oldQuantity = items[0].quantity; + + if (oldQuantity === quantity) { + return; + } + + const subscriptionUpdatePayload: Stripe.SubscriptionUpdateParams = { + items: items.map((item) => ({ + id: item.id, + quantity, + })), + }; + + // Only invoice immediately when changing the quantity of yearly item. + if (hasYearlyItem) { + subscriptionUpdatePayload.proration_behavior = 'always_invoice'; + } + + await stripe.subscriptions.update(subscriptionId, subscriptionUpdatePayload); +}; diff --git a/packages/ee/server-only/stripe/webhook/handler.ts b/packages/ee/server-only/stripe/webhook/handler.ts index 047de7962..23705438a 100644 --- a/packages/ee/server-only/stripe/webhook/handler.ts +++ b/packages/ee/server-only/stripe/webhook/handler.ts @@ -3,8 +3,10 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { buffer } from 'micro'; import { match } from 'ts-pattern'; +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import type { Stripe } from '@documenso/lib/server-only/stripe'; import { stripe } from '@documenso/lib/server-only/stripe'; +import { createTeamFromPendingTeam } from '@documenso/lib/server-only/team/create-team'; import { getFlag } from '@documenso/lib/universal/get-feature-flag'; import { prisma } from '@documenso/prisma'; @@ -84,14 +86,9 @@ export const stripeWebhookHandler = async ( }, }); - if (!result?.id) { - return res.status(500).json({ - success: false, - message: 'User not found', - }); + if (result?.id) { + userId = result.id; } - - userId = result.id; } const subscriptionId = @@ -99,7 +96,7 @@ export const stripeWebhookHandler = async ( ? session.subscription : session.subscription?.id; - if (!subscriptionId || Number.isNaN(userId)) { + if (!subscriptionId) { return res.status(500).json({ success: false, message: 'Invalid session', @@ -108,6 +105,24 @@ export const stripeWebhookHandler = async ( const subscription = await stripe.subscriptions.retrieve(subscriptionId); + // Handle team creation after seat checkout. + if (subscription.items.data[0].price.metadata.plan === STRIPE_PLAN_TYPE.TEAM) { + await handleTeamSeatCheckout({ subscription }); + + return res.status(200).json({ + success: true, + message: 'Webhook received', + }); + } + + // Validate user ID. + if (!userId || Number.isNaN(userId)) { + return res.status(500).json({ + success: false, + message: 'Invalid session or missing user ID', + }); + } + await onSubscriptionUpdated({ userId, subscription }); return res.status(200).json({ @@ -124,6 +139,28 @@ export const stripeWebhookHandler = async ( ? subscription.customer : subscription.customer.id; + if (subscription.items.data[0].price.metadata.plan === STRIPE_PLAN_TYPE.TEAM) { + const team = await prisma.team.findFirst({ + where: { + customerId, + }, + }); + + if (!team) { + return res.status(500).json({ + success: false, + message: 'No team associated with subscription found', + }); + } + + await onSubscriptionUpdated({ teamId: team.id, subscription }); + + return res.status(200).json({ + success: true, + message: 'Webhook received', + }); + } + const result = await prisma.user.findFirst({ select: { id: true, @@ -182,6 +219,28 @@ export const stripeWebhookHandler = async ( }); } + if (subscription.items.data[0].price.metadata.plan === STRIPE_PLAN_TYPE.TEAM) { + const team = await prisma.team.findFirst({ + where: { + customerId, + }, + }); + + if (!team) { + return res.status(500).json({ + success: false, + message: 'No team associated with subscription found', + }); + } + + await onSubscriptionUpdated({ teamId: team.id, subscription }); + + return res.status(200).json({ + success: true, + message: 'Webhook received', + }); + } + const result = await prisma.user.findFirst({ select: { id: true, @@ -233,6 +292,28 @@ export const stripeWebhookHandler = async ( }); } + if (subscription.items.data[0].price.metadata.plan === STRIPE_PLAN_TYPE.TEAM) { + const team = await prisma.team.findFirst({ + where: { + customerId, + }, + }); + + if (!team) { + return res.status(500).json({ + success: false, + message: 'No team associated with subscription found', + }); + } + + await onSubscriptionUpdated({ teamId: team.id, subscription }); + + return res.status(200).json({ + success: true, + message: 'Webhook received', + }); + } + const result = await prisma.user.findFirst({ select: { id: true, @@ -282,3 +363,21 @@ export const stripeWebhookHandler = async ( }); } }; + +export type HandleTeamSeatCheckoutOptions = { + subscription: Stripe.Subscription; +}; + +const handleTeamSeatCheckout = async ({ subscription }: HandleTeamSeatCheckoutOptions) => { + if (subscription.metadata?.pendingTeamId === undefined) { + throw new Error('Missing pending team ID'); + } + + const pendingTeamId = Number(subscription.metadata.pendingTeamId); + + if (Number.isNaN(pendingTeamId)) { + throw new Error('Invalid pending team ID'); + } + + return await createTeamFromPendingTeam({ pendingTeamId, subscription }).then((team) => team.id); +}; diff --git a/packages/ee/server-only/stripe/webhook/on-subscription-updated.ts b/packages/ee/server-only/stripe/webhook/on-subscription-updated.ts index d7ce7b062..8e2f00df8 100644 --- a/packages/ee/server-only/stripe/webhook/on-subscription-updated.ts +++ b/packages/ee/server-only/stripe/webhook/on-subscription-updated.ts @@ -2,23 +2,40 @@ import { match } from 'ts-pattern'; import type { Stripe } from '@documenso/lib/server-only/stripe'; import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; import { SubscriptionStatus } from '@documenso/prisma/client'; export type OnSubscriptionUpdatedOptions = { - userId: number; + userId?: number; + teamId?: number; subscription: Stripe.Subscription; }; export const onSubscriptionUpdated = async ({ userId, + teamId, subscription, }: OnSubscriptionUpdatedOptions) => { + await prisma.subscription.upsert( + mapStripeSubscriptionToPrismaUpsertAction(subscription, userId, teamId), + ); +}; + +export const mapStripeSubscriptionToPrismaUpsertAction = ( + subscription: Stripe.Subscription, + userId?: number, + teamId?: number, +): Prisma.SubscriptionUpsertArgs => { + if ((!userId && !teamId) || (userId && teamId)) { + throw new Error('Either userId or teamId must be provided.'); + } + const status = match(subscription.status) .with('active', () => SubscriptionStatus.ACTIVE) .with('past_due', () => SubscriptionStatus.PAST_DUE) .otherwise(() => SubscriptionStatus.INACTIVE); - await prisma.subscription.upsert({ + return { where: { planId: subscription.id, }, @@ -27,7 +44,8 @@ export const onSubscriptionUpdated = async ({ planId: subscription.id, priceId: subscription.items.data[0].price.id, periodEnd: new Date(subscription.current_period_end * 1000), - userId, + userId: userId ?? null, + teamId: teamId ?? null, cancelAtPeriodEnd: subscription.cancel_at_period_end, }, update: { @@ -37,5 +55,5 @@ export const onSubscriptionUpdated = async ({ periodEnd: new Date(subscription.current_period_end * 1000), cancelAtPeriodEnd: subscription.cancel_at_period_end, }, - }); + }; }; diff --git a/packages/email/static/add-user.png b/packages/email/static/add-user.png new file mode 100644 index 0000000000000000000000000000000000000000..abd337ceb70d306c70f31d07f1c74e2ca34399be GIT binary patch literal 3361 zcmV++4c_vJP)Gv`oIefP1`wEzQaL0KGNQ&`y?Uh=78W#-p`*s);-W_U zGcz;iRRRbdVk;eN}Y;suHZD8npcaxE1d`GfO#C`k`2XJ3-i082610B20TR31@FMaS~g zQ2n%>OiOwhAenH=G)1|T;zU(6q<3Os!Yh?ZBXrnj3OF?w?a@cZ9`b|AoI8>eBbe3w z`1rV{f*rztIUFe(LL2ogqL9@TWB63kXP#&vne&=xGTl}U0F_VW5Q$sS#)4i{83OWy%E!lf zlHx?(gKc$;0>$`j7Jz&pKd|m`Z1%aaw!Av7xBRfIqRoHwL66e$fA;R(8_A%4v%vHo zOa`DleSh%a!70vPT<`yBpq2zj^`PAL`Uf=l{y*$#*iNMhOx6QPitqEYq9R7AqA}Jz zGc)sxN(o5~Hk8#LwxdUnE>a;*fBN)Er3q9pdd8`tp`o{`Qkz94!K9%u)%TQ235mRj zaz&Ab484Qif{LWRV3h_Sy&#zOzd?FY@q{Ja8S8!`?Abx#p)z@9u)(``@7``|ix=L# zd#BR?=6)f4>NXul-Z)=6VBuLSpfrlKJym&zRdD`(Y;0`Pix)2@W@l&hmoHy*l0bTx zfQQ28if5CoB0|~(C(;>g43`aUIvF4TBC&aY(X~lZ)v=L`co9F+IdtgIgv^($aCsY1N^CTVyRzhx8)VlMN$i+8pD>_kq#BI8i6eHPM4%eMKcdpRW)AMg_W?f=yWO5#iHhRDI_Y?=Z zMgL0H`ZT3czQ;DMgnbaH2!mkSojGvez_3aIH9f*a{lF&93RTG3n+f1ObwZpaV*d`J zF(`p4HXxeG#yP};UMXxO@rtC@?;WG_)3l$wa^=b-r^E5GF%XcCn$L>9`x>*2$PU3iTu6bk<$wK{p>!iD4X z&?jm86Ll|+hD5zcao;DB|4&ifrm#~Wl;ZLbmoex(*c1PV_R*@^RR?(+_<6bYb>Qah|le5^QA-PRfj)?xkPc}2PtlT}$gmRYu?kBJ1iT5s%yV3JLx&_PC&B$Y{4 zIhuFXHqh(dS#ellgxSM-s3CBt*I^@Wq@GJ0>Q*Q zLpG%PhrBo{jeW`vmQGSU=OL-^Ntu@8vwFburj7IPTzm>3HVH;M+uPd<*ZiX(7Owf* z1?*RvaDQcGklM z4f7d*QF`72j@v=o^=ev0%WE*MI)Pxoc!@v8bGNgurd#&WVTSoe@@ib!Fa#Iy6SM{@YiQQntX!Fg zSEN;ZO)T$iFu=}SXgqoM(9n?IKb_@;Y)yHa<+;e%N~Kakbs(^EU#~lF$!uHPl($(o zJ#`Jj$46!hq^W7Ma;SIoXgM5}@hRbuRD`wNBW;LRrfa!c3UaL^osxEmbLB9_fbS~ll-)B$ zf_gg9g9<^3LM#S2F4LA@D_zAemaGJV_ze!ybbuqYpmddRre^jkEKQEfzOLGt)J9Q_ zps@d8(hx>+(Q?0Ejl7`i*7?8>b=joam8)Y325hNRRY(XTL|H`0LbVAF(-1+Vif~G) zP!D-w6+~HiQ|+jhW6P*6d(Gd_8Sjbf8-nrmAVV(beAsZEWdH?T*Rlz+9j)m~r)#+# zIg7Lc$O5gBhF8b`y6)E*9;bD1h#yV@@{i847CQ}2f*o=R`C4S33%ft;dQcqI?zh7P r9fzHBaBy&NaBy&NaBy&NsEOYJQ|7+=Yxnzq00000NkvXXu0mjfB)pO| literal 0 HcmV?d00001 diff --git a/packages/email/static/mail-open-alert.png b/packages/email/static/mail-open-alert.png new file mode 100644 index 0000000000000000000000000000000000000000..1511f0bc539302bf3fc9de7e18283d8882861ffb GIT binary patch literal 3818 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 BjST<* literal 0 HcmV?d00001 diff --git a/packages/email/template-components/template-image.tsx b/packages/email/template-components/template-image.tsx new file mode 100644 index 000000000..8f821c10f --- /dev/null +++ b/packages/email/template-components/template-image.tsx @@ -0,0 +1,17 @@ +import { Img } from '../components'; + +export interface TemplateImageProps { + assetBaseUrl: string; + className?: string; + staticAsset: string; +} + +export const TemplateImage = ({ assetBaseUrl, className, staticAsset }: TemplateImageProps) => { + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ; +}; + +export default TemplateImage; diff --git a/packages/email/templates/confirm-email.tsx b/packages/email/templates/confirm-email.tsx index b3acd1ecd..59c7add10 100644 --- a/packages/email/templates/confirm-email.tsx +++ b/packages/email/templates/confirm-email.tsx @@ -7,7 +7,7 @@ import { TemplateFooter } from '../template-components/template-footer'; export const ConfirmEmailTemplate = ({ confirmationLink, - assetBaseUrl, + assetBaseUrl = 'http://localhost:3002', }: TemplateConfirmationEmailProps) => { const previewText = `Please confirm your email address`; @@ -55,3 +55,5 @@ export const ConfirmEmailTemplate = ({ ); }; + +export default ConfirmEmailTemplate; diff --git a/packages/email/templates/confirm-team-email.tsx b/packages/email/templates/confirm-team-email.tsx new file mode 100644 index 000000000..5752f806d --- /dev/null +++ b/packages/email/templates/confirm-team-email.tsx @@ -0,0 +1,127 @@ +import { formatTeamUrl } from '@documenso/lib/utils/teams'; +import config from '@documenso/tailwind-config'; + +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Link, + Preview, + Section, + Tailwind, + Text, +} from '../components'; +import { TemplateFooter } from '../template-components/template-footer'; +import TemplateImage from '../template-components/template-image'; + +export type ConfirmTeamEmailProps = { + assetBaseUrl: string; + baseUrl: string; + teamName: string; + teamUrl: string; + token: string; +}; + +export const ConfirmTeamEmailTemplate = ({ + assetBaseUrl = 'http://localhost:3002', + baseUrl = 'https://documenso.com', + teamName = 'Team Name', + teamUrl = 'demo', + token = '', +}: ConfirmTeamEmailProps) => { + const previewText = `Accept team email request for ${teamName} on Documenso`; + + return ( + + + {previewText} + + +
+ + + +
+ +
+ +
+ + Verify your team email address + + + + {teamName} has requested to use your email + address for their team on Documenso. + + +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+ +
+ + By accepting this request, you will be granting {teamName}{' '} + access to: + + +
    +
  • + View all documents sent to and from this email address +
  • +
  • + Allow document recipients to reply directly to this email address +
  • +
+ + + You can revoke access at any time in your team settings on Documenso{' '} + here. + +
+ +
+ +
+
+ + Link expires in 1 hour. +
+ +
+ + + + +
+ +
+ + ); +}; + +export default ConfirmTeamEmailTemplate; diff --git a/packages/email/templates/team-email-removed.tsx b/packages/email/templates/team-email-removed.tsx new file mode 100644 index 000000000..0a143d1b9 --- /dev/null +++ b/packages/email/templates/team-email-removed.tsx @@ -0,0 +1,83 @@ +import { formatTeamUrl } from '@documenso/lib/utils/teams'; +import config from '@documenso/tailwind-config'; + +import { Body, Container, Head, Hr, Html, Preview, Section, Tailwind, Text } from '../components'; +import { TemplateFooter } from '../template-components/template-footer'; +import TemplateImage from '../template-components/template-image'; + +export type TeamEmailRemovedTemplateProps = { + assetBaseUrl: string; + baseUrl: string; + teamEmail: string; + teamName: string; + teamUrl: string; +}; + +export const TeamEmailRemovedTemplate = ({ + assetBaseUrl = 'http://localhost:3002', + baseUrl = 'https://documenso.com', + teamEmail = 'example@documenso.com', + teamName = 'Team Name', + teamUrl = 'demo', +}: TeamEmailRemovedTemplateProps) => { + const previewText = `Team email removed for ${teamName} on Documenso`; + + return ( + + + {previewText} + + +
+ + + +
+ +
+ +
+ + Team email removed + + + + The team email {teamEmail} has been removed + from the following team + + +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+
+
+ +
+ + + + +
+ +
+ + ); +}; + +export default TeamEmailRemovedTemplate; diff --git a/packages/email/templates/team-invite.tsx b/packages/email/templates/team-invite.tsx new file mode 100644 index 000000000..4602b7382 --- /dev/null +++ b/packages/email/templates/team-invite.tsx @@ -0,0 +1,108 @@ +import { formatTeamUrl } from '@documenso/lib/utils/teams'; +import config from '@documenso/tailwind-config'; + +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Preview, + Section, + Tailwind, + Text, +} from '../components'; +import { TemplateFooter } from '../template-components/template-footer'; +import TemplateImage from '../template-components/template-image'; + +export type TeamInviteEmailProps = { + assetBaseUrl: string; + baseUrl: string; + senderName: string; + teamName: string; + teamUrl: string; + token: string; +}; + +export const TeamInviteEmailTemplate = ({ + assetBaseUrl = 'http://localhost:3002', + baseUrl = 'https://documenso.com', + senderName = 'John Doe', + teamName = 'Team Name', + teamUrl = 'demo', + token = '', +}: TeamInviteEmailProps) => { + const previewText = `Accept invitation to join a team on Documenso`; + + return ( + + + {previewText} + + +
+ + + +
+ +
+ +
+ + Join {teamName} on Documenso + + + + You have been invited to join the following team + + +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+ + + by {senderName} + + +
+ +
+
+
+ +
+ + + + +
+ +
+ + ); +}; + +export default TeamInviteEmailTemplate; diff --git a/packages/email/templates/team-transfer-request.tsx b/packages/email/templates/team-transfer-request.tsx new file mode 100644 index 000000000..82723226c --- /dev/null +++ b/packages/email/templates/team-transfer-request.tsx @@ -0,0 +1,112 @@ +import { formatTeamUrl } from '@documenso/lib/utils/teams'; +import config from '@documenso/tailwind-config'; + +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Preview, + Section, + Tailwind, + Text, +} from '../components'; +import { TemplateFooter } from '../template-components/template-footer'; +import TemplateImage from '../template-components/template-image'; + +export type TeamTransferRequestTemplateProps = { + assetBaseUrl: string; + baseUrl: string; + senderName: string; + teamName: string; + teamUrl: string; + token: string; +}; + +export const TeamTransferRequestTemplate = ({ + assetBaseUrl = 'http://localhost:3002', + baseUrl = 'https://documenso.com', + senderName = 'John Doe', + teamName = 'Team Name', + teamUrl = 'demo', + token = '', +}: TeamTransferRequestTemplateProps) => { + const previewText = 'Accept team transfer request on Documenso'; + + return ( + + + {previewText} + + +
+ + + +
+ +
+ +
+ + {teamName} ownership transfer request + + + + {senderName} has requested that you take + ownership of the following team + + +
+ {formatTeamUrl(teamUrl, baseUrl)} +
+ + + By accepting this request, you will take responsibility for any billing items + associated with this team. + + +
+ +
+
+ + Link expires in 1 hour. +
+ +
+ + + + +
+ +
+ + ); +}; + +export default TeamTransferRequestTemplate; diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index a19d2bb0d..6c4d056d0 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -1,5 +1,9 @@ export const IS_APP_MARKETING = process.env.NEXT_PUBLIC_PROJECT === 'marketing'; export const IS_APP_WEB = process.env.NEXT_PUBLIC_PROJECT === 'web'; +export const IS_BILLING_ENABLED = process.env.NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true'; + +export const APP_DOCUMENT_UPLOAD_SIZE_LIMIT = + Number(process.env.NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT) || 50; export const APP_FOLDER = IS_APP_MARKETING ? 'marketing' : 'web'; @@ -7,5 +11,6 @@ export const APP_BASE_URL = IS_APP_WEB ? process.env.NEXT_PUBLIC_WEBAPP_URL : process.env.NEXT_PUBLIC_MARKETING_URL; -export const APP_DOCUMENT_UPLOAD_SIZE_LIMIT = - Number(process.env.NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT) || 50; +export const WEBAPP_BASE_URL = process.env.NEXT_PUBLIC_WEBAPP_URL ?? 'http://localhost:3000'; + +export const MARKETING_BASE_URL = process.env.NEXT_PUBLIC_MARKETING_URL ?? 'http://localhost:3001'; diff --git a/packages/lib/constants/billing.ts b/packages/lib/constants/billing.ts new file mode 100644 index 000000000..e6d897af8 --- /dev/null +++ b/packages/lib/constants/billing.ts @@ -0,0 +1,11 @@ +export enum STRIPE_CUSTOMER_TYPE { + INDIVIDUAL = 'individual', + TEAM = 'team', +} + +export enum STRIPE_PLAN_TYPE { + TEAM = 'team', + COMMUNITY = 'community', +} + +export const TEAM_BILLING_DOMAIN = 'billing.team.documenso.com'; diff --git a/packages/lib/constants/teams.ts b/packages/lib/constants/teams.ts new file mode 100644 index 000000000..47705bb14 --- /dev/null +++ b/packages/lib/constants/teams.ts @@ -0,0 +1,102 @@ +import { TeamMemberRole } from '@documenso/prisma/client'; + +export const TEAM_URL_ROOT_REGEX = new RegExp('^/t/[^/]+$'); + +export const TEAM_MEMBER_ROLE_MAP: Record = { + ADMIN: 'Admin', + MANAGER: 'Manager', + MEMBER: 'Member', +}; + +export const TEAM_MEMBER_ROLE_PERMISSIONS_MAP = { + /** + * Includes permissions to: + * - Manage team members + * - Manage team settings, changing name, url, etc. + */ + MANAGE_TEAM: [TeamMemberRole.ADMIN, TeamMemberRole.MANAGER], + MANAGE_BILLING: [TeamMemberRole.ADMIN], + DELETE_TEAM_TRANSFER_REQUEST: [TeamMemberRole.ADMIN], +} satisfies Record; + +/** + * A hierarchy of team member roles to determine which role has higher permission than another. + */ +export const TEAM_MEMBER_ROLE_HIERARCHY = { + [TeamMemberRole.ADMIN]: [TeamMemberRole.ADMIN, TeamMemberRole.MANAGER, TeamMemberRole.MEMBER], + [TeamMemberRole.MANAGER]: [TeamMemberRole.MANAGER, TeamMemberRole.MEMBER], + [TeamMemberRole.MEMBER]: [TeamMemberRole.MEMBER], +} satisfies Record; + +export const PROTECTED_TEAM_URLS = [ + '403', + '404', + '500', + '502', + '503', + '504', + 'about', + 'account', + 'admin', + 'administrator', + 'api', + 'app', + 'archive', + 'auth', + 'backup', + 'config', + 'configure', + 'contact', + 'contact-us', + 'copyright', + 'crime', + 'criminal', + 'dashboard', + 'docs', + 'documenso', + 'documentation', + 'document', + 'documents', + 'error', + 'exploit', + 'exploitation', + 'exploiter', + 'feedback', + 'finance', + 'forgot-password', + 'fraud', + 'fraudulent', + 'hack', + 'hacker', + 'harassment', + 'help', + 'helpdesk', + 'illegal', + 'internal', + 'legal', + 'login', + 'logout', + 'maintenance', + 'malware', + 'newsletter', + 'policy', + 'privacy', + 'profile', + 'public', + 'reset-password', + 'scam', + 'scammer', + 'settings', + 'setup', + 'sign', + 'signin', + 'signout', + 'signup', + 'spam', + 'support', + 'system', + 'team', + 'terms', + 'virus', + 'webhook', +]; diff --git a/packages/lib/errors/app-error.ts b/packages/lib/errors/app-error.ts new file mode 100644 index 000000000..3337bab4c --- /dev/null +++ b/packages/lib/errors/app-error.ts @@ -0,0 +1,144 @@ +import { TRPCError } from '@trpc/server'; +import { z } from 'zod'; + +import { TRPCClientError } from '@documenso/trpc/client'; + +/** + * Generic application error codes. + */ +export enum AppErrorCode { + 'ALREADY_EXISTS' = 'AlreadyExists', + 'EXPIRED_CODE' = 'ExpiredCode', + 'INVALID_BODY' = 'InvalidBody', + 'INVALID_REQUEST' = 'InvalidRequest', + 'NOT_FOUND' = 'NotFound', + 'NOT_SETUP' = 'NotSetup', + 'UNAUTHORIZED' = 'Unauthorized', + 'UNKNOWN_ERROR' = 'UnknownError', + 'RETRY_EXCEPTION' = 'RetryException', + 'SCHEMA_FAILED' = 'SchemaFailed', + 'TOO_MANY_REQUESTS' = 'TooManyRequests', +} + +const genericErrorCodeToTrpcErrorCodeMap: Record = { + [AppErrorCode.ALREADY_EXISTS]: 'BAD_REQUEST', + [AppErrorCode.EXPIRED_CODE]: 'BAD_REQUEST', + [AppErrorCode.INVALID_BODY]: 'BAD_REQUEST', + [AppErrorCode.INVALID_REQUEST]: 'BAD_REQUEST', + [AppErrorCode.NOT_FOUND]: 'NOT_FOUND', + [AppErrorCode.NOT_SETUP]: 'BAD_REQUEST', + [AppErrorCode.UNAUTHORIZED]: 'UNAUTHORIZED', + [AppErrorCode.UNKNOWN_ERROR]: 'INTERNAL_SERVER_ERROR', + [AppErrorCode.RETRY_EXCEPTION]: 'INTERNAL_SERVER_ERROR', + [AppErrorCode.SCHEMA_FAILED]: 'INTERNAL_SERVER_ERROR', + [AppErrorCode.TOO_MANY_REQUESTS]: 'TOO_MANY_REQUESTS', +}; + +export const ZAppErrorJsonSchema = z.object({ + code: z.string(), + message: z.string().optional(), + userMessage: z.string().optional(), +}); + +export type TAppErrorJsonSchema = z.infer; + +export class AppError extends Error { + /** + * The error code. + */ + code: string; + + /** + * An error message which can be displayed to the user. + */ + userMessage?: string; + + /** + * Create a new AppError. + * + * @param errorCode A string representing the error code. + * @param message An internal error message. + * @param userMessage A error message which can be displayed to the user. + */ + public constructor(errorCode: string, message?: string, userMessage?: string) { + super(message || errorCode); + this.code = errorCode; + this.userMessage = userMessage; + } + + /** + * Parse an unknown value into an AppError. + * + * @param error An unknown type. + */ + static parseError(error: unknown): AppError { + if (error instanceof AppError) { + return error; + } + + // Handle TRPC errors. + if (error instanceof TRPCClientError) { + const parsedJsonError = AppError.parseFromJSONString(error.message); + return parsedJsonError || new AppError('UnknownError', error.message); + } + + // Handle completely unknown errors. + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const { code, message, userMessage } = error as { + code: unknown; + message: unknown; + status: unknown; + userMessage: unknown; + }; + + const validCode: string | null = typeof code === 'string' ? code : AppErrorCode.UNKNOWN_ERROR; + const validMessage: string | undefined = typeof message === 'string' ? message : undefined; + const validUserMessage: string | undefined = + typeof userMessage === 'string' ? userMessage : undefined; + + return new AppError(validCode, validMessage, validUserMessage); + } + + static parseErrorToTRPCError(error: unknown): TRPCError { + const appError = AppError.parseError(error); + + return new TRPCError({ + code: genericErrorCodeToTrpcErrorCodeMap[appError.code] || 'BAD_REQUEST', + message: AppError.toJSONString(appError), + }); + } + + /** + * Convert an AppError into a JSON object which represents the error. + * + * @param appError The AppError to convert to JSON. + * @returns A JSON object representing the AppError. + */ + static toJSON({ code, message, userMessage }: AppError): TAppErrorJsonSchema { + return { + code, + message, + userMessage, + }; + } + + /** + * Convert an AppError into a JSON string containing the relevant information. + * + * @param appError The AppError to stringify. + * @returns A JSON string representing the AppError. + */ + static toJSONString(appError: AppError): string { + return JSON.stringify(AppError.toJSON(appError)); + } + + static parseFromJSONString(jsonString: string): AppError | null { + const parsed = ZAppErrorJsonSchema.safeParse(JSON.parse(jsonString)); + + if (!parsed.success) { + return null; + } + + return new AppError(parsed.data.code, parsed.data.message, parsed.data.userMessage); + } +} diff --git a/packages/lib/server-only/crypto/decrypt.ts b/packages/lib/server-only/crypto/decrypt.ts index 7b4db9894..de7b82c4b 100644 --- a/packages/lib/server-only/crypto/decrypt.ts +++ b/packages/lib/server-only/crypto/decrypt.ts @@ -13,21 +13,25 @@ export const decryptSecondaryData = (encryptedData: string): string | null => { throw new Error('Missing encryption key'); } - const decryptedBufferValue = symmetricDecrypt({ - key: DOCUMENSO_ENCRYPTION_SECONDARY_KEY, - data: encryptedData, - }); + try { + const decryptedBufferValue = symmetricDecrypt({ + key: DOCUMENSO_ENCRYPTION_SECONDARY_KEY, + data: encryptedData, + }); - const decryptedValue = Buffer.from(decryptedBufferValue).toString('utf-8'); - const result = ZEncryptedDataSchema.safeParse(JSON.parse(decryptedValue)); + const decryptedValue = Buffer.from(decryptedBufferValue).toString('utf-8'); + const result = ZEncryptedDataSchema.safeParse(JSON.parse(decryptedValue)); - if (!result.success) { + if (!result.success) { + return null; + } + + if (result.data.expiresAt !== undefined && result.data.expiresAt < Date.now()) { + return null; + } + + return result.data.data; + } catch { return null; } - - if (result.data.expiresAt !== undefined && result.data.expiresAt < Date.now()) { - return null; - } - - return result.data.data; }; diff --git a/packages/lib/server-only/document-meta/upsert-document-meta.ts b/packages/lib/server-only/document-meta/upsert-document-meta.ts index b67c6848b..3e6cd75be 100644 --- a/packages/lib/server-only/document-meta/upsert-document-meta.ts +++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts @@ -24,7 +24,20 @@ export const upsertDocumentMeta = async ({ await prisma.document.findFirstOrThrow({ where: { id: documentId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/document/create-document.ts b/packages/lib/server-only/document/create-document.ts index b84f8e46e..93307a7b4 100644 --- a/packages/lib/server-only/document/create-document.ts +++ b/packages/lib/server-only/document/create-document.ts @@ -5,15 +5,37 @@ import { prisma } from '@documenso/prisma'; export type CreateDocumentOptions = { title: string; userId: number; + teamId?: number; documentDataId: string; }; -export const createDocument = async ({ userId, title, documentDataId }: CreateDocumentOptions) => { - return await prisma.document.create({ - data: { - title, - documentDataId, - userId, - }, +export const createDocument = async ({ + userId, + title, + documentDataId, + teamId, +}: CreateDocumentOptions) => { + return await prisma.$transaction(async (tx) => { + if (teamId !== undefined) { + await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }); + } + + return await tx.document.create({ + data: { + title, + documentDataId, + userId, + teamId, + }, + }); }); }; diff --git a/packages/lib/server-only/document/duplicate-document-by-id.ts b/packages/lib/server-only/document/duplicate-document-by-id.ts index ddb70b1cb..5ca848bb3 100644 --- a/packages/lib/server-only/document/duplicate-document-by-id.ts +++ b/packages/lib/server-only/document/duplicate-document-by-id.ts @@ -1,16 +1,27 @@ import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; + +import { getDocumentWhereInput } from './get-document-by-id'; export interface DuplicateDocumentByIdOptions { id: number; userId: number; + teamId?: number; } -export const duplicateDocumentById = async ({ id, userId }: DuplicateDocumentByIdOptions) => { +export const duplicateDocumentById = async ({ + id, + userId, + teamId, +}: DuplicateDocumentByIdOptions) => { + const documentWhereInput = await getDocumentWhereInput({ + documentId: id, + userId, + teamId, + }); + const document = await prisma.document.findUniqueOrThrow({ - where: { - id, - userId: userId, - }, + where: documentWhereInput, select: { title: true, userId: true, @@ -33,7 +44,7 @@ export const duplicateDocumentById = async ({ id, userId }: DuplicateDocumentByI }, }); - const createdDocument = await prisma.document.create({ + const createDocumentArguments: Prisma.DocumentCreateArgs = { data: { title: document.title, User: { @@ -53,7 +64,17 @@ export const duplicateDocumentById = async ({ id, userId }: DuplicateDocumentByI }, }, }, - }); + }; + + if (teamId !== undefined) { + createDocumentArguments.data.team = { + connect: { + id: teamId, + }, + }; + } + + const createdDocument = await prisma.document.create(createDocumentArguments); return createdDocument.id; }; diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 8d367dbe4..f34cc4c2c 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -2,8 +2,8 @@ import { DateTime } from 'luxon'; import { P, match } from 'ts-pattern'; import { prisma } from '@documenso/prisma'; -import type { Document, Prisma } from '@documenso/prisma/client'; import { RecipientRole, SigningStatus } from '@documenso/prisma/client'; +import type { Document, Prisma, Team, TeamEmail, User } from '@documenso/prisma/client'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import type { FindResultSet } from '../../types/find-result-set'; @@ -13,6 +13,7 @@ export type PeriodSelectorValue = '' | '7d' | '14d' | '30d'; export type FindDocumentsOptions = { userId: number; + teamId?: number; term?: string; status?: ExtendedDocumentStatus; page?: number; @@ -22,21 +23,49 @@ export type FindDocumentsOptions = { direction: 'asc' | 'desc'; }; period?: PeriodSelectorValue; + senderIds?: number[]; }; export const findDocuments = async ({ userId, + teamId, term, status = ExtendedDocumentStatus.ALL, page = 1, perPage = 10, orderBy, period, + senderIds, }: FindDocumentsOptions) => { - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, + const { user, team } = await prisma.$transaction(async (tx) => { + const user = await tx.user.findFirstOrThrow({ + where: { + id: userId, + }, + }); + + let team = null; + + if (teamId !== undefined) { + team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + include: { + teamEmail: true, + }, + }); + } + + return { + user, + team, + }; }); const orderByColumn = orderBy?.column ?? 'createdAt'; @@ -53,96 +82,34 @@ export const findDocuments = async ({ }) .otherwise(() => undefined); - const filters = match(status) - .with(ExtendedDocumentStatus.ALL, () => ({ - OR: [ - { - userId, - deletedAt: null, - }, - { - status: ExtendedDocumentStatus.COMPLETED, - Recipient: { - some: { - email: user.email, - }, - }, - }, - { - status: ExtendedDocumentStatus.PENDING, - Recipient: { - some: { - email: user.email, - }, - }, - deletedAt: null, - }, - ], - })) - .with(ExtendedDocumentStatus.INBOX, () => ({ - status: { - not: ExtendedDocumentStatus.DRAFT, - }, - Recipient: { - some: { - email: user.email, - signingStatus: SigningStatus.NOT_SIGNED, - role: { - not: RecipientRole.CC, - }, - }, - }, - deletedAt: null, - })) - .with(ExtendedDocumentStatus.DRAFT, () => ({ - userId, - status: ExtendedDocumentStatus.DRAFT, - deletedAt: null, - })) - .with(ExtendedDocumentStatus.PENDING, () => ({ - OR: [ - { - userId, - status: ExtendedDocumentStatus.PENDING, - deletedAt: null, - }, - { - status: ExtendedDocumentStatus.PENDING, - Recipient: { - some: { - email: user.email, - signingStatus: SigningStatus.SIGNED, - role: { - not: RecipientRole.CC, - }, - }, - }, - deletedAt: null, - }, - ], - })) - .with(ExtendedDocumentStatus.COMPLETED, () => ({ - OR: [ - { - userId, - status: ExtendedDocumentStatus.COMPLETED, - deletedAt: null, - }, - { - status: ExtendedDocumentStatus.COMPLETED, - Recipient: { - some: { - email: user.email, - }, - }, - }, - ], - })) - .exhaustive(); + const filters = team ? findTeamDocumentsFilter(status, team) : findDocumentsFilter(status, user); - const whereClause = { + if (filters === null) { + return { + data: [], + count: 0, + currentPage: 1, + perPage, + totalPages: 0, + }; + } + + const whereClause: Prisma.DocumentWhereInput = { ...termFilters, ...filters, + AND: { + OR: [ + { + status: ExtendedDocumentStatus.COMPLETED, + }, + { + status: { + not: ExtendedDocumentStatus.COMPLETED, + }, + deletedAt: null, + }, + ], + }, }; if (period) { @@ -155,6 +122,12 @@ export const findDocuments = async ({ }; } + if (senderIds && senderIds.length > 0) { + whereClause.userId = { + in: senderIds, + }; + } + const [data, count] = await Promise.all([ prisma.document.findMany({ where: whereClause, @@ -172,13 +145,16 @@ export const findDocuments = async ({ }, }, Recipient: true, + team: { + select: { + id: true, + url: true, + }, + }, }, }), prisma.document.count({ - where: { - ...termFilters, - ...filters, - }, + where: whereClause, }), ]); @@ -197,3 +173,268 @@ export const findDocuments = async ({ totalPages: Math.ceil(count / perPage), } satisfies FindResultSet; }; + +const findDocumentsFilter = (status: ExtendedDocumentStatus, user: User) => { + return match(status) + .with(ExtendedDocumentStatus.ALL, () => ({ + OR: [ + { + userId: user.id, + teamId: null, + }, + { + status: ExtendedDocumentStatus.COMPLETED, + Recipient: { + some: { + email: user.email, + }, + }, + }, + { + status: ExtendedDocumentStatus.PENDING, + Recipient: { + some: { + email: user.email, + }, + }, + }, + ], + })) + .with(ExtendedDocumentStatus.INBOX, () => ({ + status: { + not: ExtendedDocumentStatus.DRAFT, + }, + Recipient: { + some: { + email: user.email, + signingStatus: SigningStatus.NOT_SIGNED, + role: { + not: RecipientRole.CC, + }, + }, + }, + })) + .with(ExtendedDocumentStatus.DRAFT, () => ({ + userId: user.id, + teamId: null, + status: ExtendedDocumentStatus.DRAFT, + })) + .with(ExtendedDocumentStatus.PENDING, () => ({ + OR: [ + { + userId: user.id, + teamId: null, + status: ExtendedDocumentStatus.PENDING, + }, + { + status: ExtendedDocumentStatus.PENDING, + Recipient: { + some: { + email: user.email, + signingStatus: SigningStatus.SIGNED, + role: { + not: RecipientRole.CC, + }, + }, + }, + }, + ], + })) + .with(ExtendedDocumentStatus.COMPLETED, () => ({ + OR: [ + { + userId: user.id, + teamId: null, + status: ExtendedDocumentStatus.COMPLETED, + }, + { + status: ExtendedDocumentStatus.COMPLETED, + Recipient: { + some: { + email: user.email, + }, + }, + }, + ], + })) + .exhaustive(); +}; + +/** + * Create a Prisma filter for the Document schema to find documents for a team. + * + * Status All: + * - Documents that belong to the team + * - Documents that have been sent by the team email + * - Non draft documents that have been sent to the team email + * + * Status Inbox: + * - Non draft documents that have been sent to the team email that have not been signed + * + * Status Draft: + * - Documents that belong to the team that are draft + * - Documents that belong to the team email that are draft + * + * Status Pending: + * - Documents that belong to the team that are pending + * - Documents that have been sent by the team email that is pending to be signed by someone else + * - Documents that have been sent to the team email that is pending to be signed by someone else + * + * Status Completed: + * - Documents that belong to the team that are completed + * - Documents that have been sent to the team email that are completed + * - Documents that have been sent by the team email that are completed + * + * @param status The status of the documents to find. + * @param team The team to find the documents for. + * @returns A filter which can be applied to the Prisma Document schema. + */ +const findTeamDocumentsFilter = ( + status: ExtendedDocumentStatus, + team: Team & { teamEmail: TeamEmail | null }, +) => { + const teamEmail = team.teamEmail?.email ?? null; + + return match(status) + .with(ExtendedDocumentStatus.ALL, () => { + const filter: Prisma.DocumentWhereInput = { + // Filter to display all documents that belong to the team. + OR: [ + { + teamId: team.id, + }, + ], + }; + + if (teamEmail && filter.OR) { + // Filter to display all documents received by the team email that are not draft. + filter.OR.push({ + status: { + not: ExtendedDocumentStatus.DRAFT, + }, + Recipient: { + some: { + email: teamEmail, + }, + }, + }); + + // Filter to display all documents that have been sent by the team email. + filter.OR.push({ + User: { + email: teamEmail, + }, + }); + } + + return filter; + }) + .with(ExtendedDocumentStatus.INBOX, () => { + // Return a filter that will return nothing. + if (!teamEmail) { + return null; + } + + return { + status: { + not: ExtendedDocumentStatus.DRAFT, + }, + Recipient: { + some: { + email: teamEmail, + signingStatus: SigningStatus.NOT_SIGNED, + role: { + not: RecipientRole.CC, + }, + }, + }, + }; + }) + .with(ExtendedDocumentStatus.DRAFT, () => { + const filter: Prisma.DocumentWhereInput = { + OR: [ + { + teamId: team.id, + status: ExtendedDocumentStatus.DRAFT, + }, + ], + }; + + if (teamEmail && filter.OR) { + filter.OR.push({ + status: ExtendedDocumentStatus.DRAFT, + User: { + email: teamEmail, + }, + }); + } + + return filter; + }) + .with(ExtendedDocumentStatus.PENDING, () => { + const filter: Prisma.DocumentWhereInput = { + OR: [ + { + teamId: team.id, + status: ExtendedDocumentStatus.PENDING, + }, + ], + }; + + if (teamEmail && filter.OR) { + filter.OR.push({ + status: ExtendedDocumentStatus.PENDING, + OR: [ + { + Recipient: { + some: { + email: teamEmail, + signingStatus: SigningStatus.SIGNED, + role: { + not: RecipientRole.CC, + }, + }, + }, + }, + { + User: { + email: teamEmail, + }, + }, + ], + }); + } + + return filter; + }) + .with(ExtendedDocumentStatus.COMPLETED, () => { + const filter: Prisma.DocumentWhereInput = { + status: ExtendedDocumentStatus.COMPLETED, + OR: [ + { + teamId: team.id, + }, + ], + }; + + if (teamEmail && filter.OR) { + filter.OR.push( + { + Recipient: { + some: { + email: teamEmail, + }, + }, + }, + { + User: { + email: teamEmail, + }, + }, + ); + } + + return filter; + }) + .exhaustive(); +}; diff --git a/packages/lib/server-only/document/get-document-by-id.ts b/packages/lib/server-only/document/get-document-by-id.ts index 0b599a71c..71b614976 100644 --- a/packages/lib/server-only/document/get-document-by-id.ts +++ b/packages/lib/server-only/document/get-document-by-id.ts @@ -1,19 +1,106 @@ import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; -export interface GetDocumentByIdOptions { +import { getTeamById } from '../team/get-team'; + +export type GetDocumentByIdOptions = { id: number; userId: number; -} + teamId?: number; +}; + +export const getDocumentById = async ({ id, userId, teamId }: GetDocumentByIdOptions) => { + const documentWhereInput = await getDocumentWhereInput({ + documentId: id, + userId, + teamId, + }); -export const getDocumentById = async ({ id, userId }: GetDocumentByIdOptions) => { return await prisma.document.findFirstOrThrow({ - where: { - id, - userId, - }, + where: documentWhereInput, include: { documentData: true, documentMeta: true, }, }); }; + +export type GetDocumentWhereInputOptions = { + documentId: number; + userId: number; + teamId?: number; + + /** + * Whether to return a filter that allows access to both the user and team documents. + * This only applies if `teamId` is passed in. + * + * If true, and `teamId` is passed in, the filter will allow both team and user documents. + * If false, and `teamId` is passed in, the filter will only allow team documents. + * + * Defaults to false. + */ + overlapUserTeamScope?: boolean; +}; + +/** + * Generate the where input for a given Prisma document query. + * + * This will return a query that allows a user to get a document if they have valid access to it. + */ +export const getDocumentWhereInput = async ({ + documentId, + userId, + teamId, + overlapUserTeamScope = false, +}: GetDocumentWhereInputOptions) => { + const documentWhereInput: Prisma.DocumentWhereUniqueInput = { + id: documentId, + OR: [ + { + userId, + }, + ], + }; + + if (teamId === undefined || !documentWhereInput.OR) { + return documentWhereInput; + } + + const team = await getTeamById({ teamId, userId }); + + // Allow access to team and user documents. + if (overlapUserTeamScope) { + documentWhereInput.OR.push({ + teamId: team.id, + }); + } + + // Allow access to only team documents. + if (!overlapUserTeamScope) { + documentWhereInput.OR = [ + { + teamId: team.id, + }, + ]; + } + + // Allow access to documents sent to or from the team email. + if (team.teamEmail) { + documentWhereInput.OR.push( + { + Recipient: { + some: { + email: team.teamEmail.email, + }, + }, + }, + { + User: { + email: team.teamEmail.email, + }, + }, + ); + } + + return documentWhereInput; +}; diff --git a/packages/lib/server-only/document/get-stats.ts b/packages/lib/server-only/document/get-stats.ts index 6aaa9a596..db38fa79d 100644 --- a/packages/lib/server-only/document/get-stats.ts +++ b/packages/lib/server-only/document/get-stats.ts @@ -1,19 +1,19 @@ import { DateTime } from 'luxon'; +import type { PeriodSelectorValue } from '@documenso/lib/server-only/document/find-documents'; import { prisma } from '@documenso/prisma'; import type { Prisma, User } from '@documenso/prisma/client'; import { SigningStatus } from '@documenso/prisma/client'; import { isExtendedDocumentStatus } from '@documenso/prisma/guards/is-extended-document-status'; import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; -import type { PeriodSelectorValue } from './find-documents'; - export type GetStatsInput = { user: User; + team?: Omit; period?: PeriodSelectorValue; }; -export const getStats = async ({ user, period }: GetStatsInput) => { +export const getStats = async ({ user, period, ...options }: GetStatsInput) => { let createdAt: Prisma.DocumentWhereInput['createdAt']; if (period) { @@ -26,7 +26,52 @@ export const getStats = async ({ user, period }: GetStatsInput) => { }; } - const [ownerCounts, notSignedCounts, hasSignedCounts] = await Promise.all([ + const [ownerCounts, notSignedCounts, hasSignedCounts] = await (options.team + ? getTeamCounts({ ...options.team, createdAt }) + : getCounts({ user, createdAt })); + + const stats: Record = { + [ExtendedDocumentStatus.DRAFT]: 0, + [ExtendedDocumentStatus.PENDING]: 0, + [ExtendedDocumentStatus.COMPLETED]: 0, + [ExtendedDocumentStatus.INBOX]: 0, + [ExtendedDocumentStatus.ALL]: 0, + }; + + ownerCounts.forEach((stat) => { + stats[stat.status] = stat._count._all; + }); + + notSignedCounts.forEach((stat) => { + stats[ExtendedDocumentStatus.INBOX] += stat._count._all; + }); + + hasSignedCounts.forEach((stat) => { + if (stat.status === ExtendedDocumentStatus.COMPLETED) { + stats[ExtendedDocumentStatus.COMPLETED] += stat._count._all; + } + + if (stat.status === ExtendedDocumentStatus.PENDING) { + stats[ExtendedDocumentStatus.PENDING] += stat._count._all; + } + }); + + Object.keys(stats).forEach((key) => { + if (key !== ExtendedDocumentStatus.ALL && isExtendedDocumentStatus(key)) { + stats[ExtendedDocumentStatus.ALL] += stats[key]; + } + }); + + return stats; +}; + +type GetCountsOption = { + user: User; + createdAt: Prisma.DocumentWhereInput['createdAt']; +}; + +const getCounts = async ({ user, createdAt }: GetCountsOption) => { + return Promise.all([ prisma.document.groupBy({ by: ['status'], _count: { @@ -35,6 +80,7 @@ export const getStats = async ({ user, period }: GetStatsInput) => { where: { userId: user.id, createdAt, + teamId: null, deletedAt: null, }, }), @@ -91,38 +137,116 @@ export const getStats = async ({ user, period }: GetStatsInput) => { }, }), ]); +}; - const stats: Record = { - [ExtendedDocumentStatus.DRAFT]: 0, - [ExtendedDocumentStatus.PENDING]: 0, - [ExtendedDocumentStatus.COMPLETED]: 0, - [ExtendedDocumentStatus.INBOX]: 0, - [ExtendedDocumentStatus.ALL]: 0, +type GetTeamCountsOption = { + teamId: number; + teamEmail?: string; + senderIds?: number[]; + createdAt: Prisma.DocumentWhereInput['createdAt']; +}; + +const getTeamCounts = async (options: GetTeamCountsOption) => { + const { createdAt, teamId, teamEmail } = options; + + const senderIds = options.senderIds ?? []; + + const userIdWhereClause: Prisma.DocumentWhereInput['userId'] = + senderIds.length > 0 + ? { + in: senderIds, + } + : undefined; + + let ownerCountsWhereInput: Prisma.DocumentWhereInput = { + userId: userIdWhereClause, + createdAt, + teamId, + deletedAt: null, }; - ownerCounts.forEach((stat) => { - stats[stat.status] = stat._count._all; - }); + let notSignedCountsGroupByArgs = null; + let hasSignedCountsGroupByArgs = null; - notSignedCounts.forEach((stat) => { - stats[ExtendedDocumentStatus.INBOX] += stat._count._all; - }); + if (teamEmail) { + ownerCountsWhereInput = { + userId: userIdWhereClause, + createdAt, + OR: [ + { + teamId, + }, + { + User: { + email: teamEmail, + }, + }, + ], + deletedAt: null, + }; - hasSignedCounts.forEach((stat) => { - if (stat.status === ExtendedDocumentStatus.COMPLETED) { - stats[ExtendedDocumentStatus.COMPLETED] += stat._count._all; - } + notSignedCountsGroupByArgs = { + by: ['status'], + _count: { + _all: true, + }, + where: { + userId: userIdWhereClause, + createdAt, + status: ExtendedDocumentStatus.PENDING, + Recipient: { + some: { + email: teamEmail, + signingStatus: SigningStatus.NOT_SIGNED, + }, + }, + deletedAt: null, + }, + } satisfies Prisma.DocumentGroupByArgs; - if (stat.status === ExtendedDocumentStatus.PENDING) { - stats[ExtendedDocumentStatus.PENDING] += stat._count._all; - } - }); + hasSignedCountsGroupByArgs = { + by: ['status'], + _count: { + _all: true, + }, + where: { + userId: userIdWhereClause, + createdAt, + OR: [ + { + status: ExtendedDocumentStatus.PENDING, + Recipient: { + some: { + email: teamEmail, + signingStatus: SigningStatus.SIGNED, + }, + }, + deletedAt: null, + }, + { + status: ExtendedDocumentStatus.COMPLETED, + Recipient: { + some: { + email: teamEmail, + signingStatus: SigningStatus.SIGNED, + }, + }, + deletedAt: null, + }, + ], + }, + } satisfies Prisma.DocumentGroupByArgs; + } - Object.keys(stats).forEach((key) => { - if (key !== ExtendedDocumentStatus.ALL && isExtendedDocumentStatus(key)) { - stats[ExtendedDocumentStatus.ALL] += stats[key]; - } - }); - - return stats; + return Promise.all([ + prisma.document.groupBy({ + by: ['status'], + _count: { + _all: true, + }, + where: ownerCountsWhereInput, + }), + notSignedCountsGroupByArgs ? prisma.document.groupBy(notSignedCountsGroupByArgs) : [], + hasSignedCountsGroupByArgs ? prisma.document.groupBy(hasSignedCountsGroupByArgs) : [], + ]); }; diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index 4c7b66be8..d72da3a8d 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -7,27 +7,38 @@ import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-email-template'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; +import type { Prisma } from '@documenso/prisma/client'; import { RECIPIENT_ROLES_DESCRIPTION } from '../../constants/recipient-roles'; +import { getDocumentWhereInput } from './get-document-by-id'; export type ResendDocumentOptions = { documentId: number; userId: number; recipients: number[]; + teamId?: number; }; -export const resendDocument = async ({ documentId, userId, recipients }: ResendDocumentOptions) => { +export const resendDocument = async ({ + documentId, + userId, + recipients, + teamId, +}: ResendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { id: userId, }, }); + const documentWhereInput: Prisma.DocumentWhereUniqueInput = await getDocumentWhereInput({ + documentId, + userId, + teamId, + }); + const document = await prisma.document.findUnique({ - where: { - id: documentId, - userId, - }, + where: documentWhereInput, include: { Recipient: { where: { diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 82b37852b..312b30462 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -25,7 +25,20 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) const document = await prisma.document.findUnique({ where: { id: documentId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, include: { Recipient: true, diff --git a/packages/lib/server-only/document/update-title.ts b/packages/lib/server-only/document/update-title.ts index ba086b9cb..19a902930 100644 --- a/packages/lib/server-only/document/update-title.ts +++ b/packages/lib/server-only/document/update-title.ts @@ -12,7 +12,20 @@ export const updateTitle = async ({ userId, documentId, title }: UpdateTitleOpti return await prisma.document.update({ where: { id: documentId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, data: { title, diff --git a/packages/lib/server-only/field/get-fields-for-document.ts b/packages/lib/server-only/field/get-fields-for-document.ts index ddc35b503..72a16c3f7 100644 --- a/packages/lib/server-only/field/get-fields-for-document.ts +++ b/packages/lib/server-only/field/get-fields-for-document.ts @@ -10,7 +10,20 @@ export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForD where: { documentId, Document: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index bd14d49b2..2ba592f31 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -25,7 +25,20 @@ export const setFieldsForDocument = async ({ const document = await prisma.document.findFirst({ where: { id: documentId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/recipient/get-recipients-for-document.ts b/packages/lib/server-only/recipient/get-recipients-for-document.ts index 21d198d3e..80e408acc 100644 --- a/packages/lib/server-only/recipient/get-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/get-recipients-for-document.ts @@ -13,7 +13,20 @@ export const getRecipientsForDocument = async ({ where: { documentId, Document: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts index 4917b213d..d42d1d707 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts @@ -23,7 +23,20 @@ export const setRecipientsForDocument = async ({ const document = await prisma.document.findFirst({ where: { id: documentId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/team/accept-team-invitation.ts b/packages/lib/server-only/team/accept-team-invitation.ts new file mode 100644 index 000000000..a69a79ecd --- /dev/null +++ b/packages/lib/server-only/team/accept-team-invitation.ts @@ -0,0 +1,63 @@ +import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity'; +import { prisma } from '@documenso/prisma'; + +import { IS_BILLING_ENABLED } from '../../constants/app'; + +export type AcceptTeamInvitationOptions = { + userId: number; + teamId: number; +}; + +export const acceptTeamInvitation = async ({ userId, teamId }: AcceptTeamInvitationOptions) => { + await prisma.$transaction(async (tx) => { + const user = await tx.user.findFirstOrThrow({ + where: { + id: userId, + }, + }); + + const teamMemberInvite = await tx.teamMemberInvite.findFirstOrThrow({ + where: { + teamId, + email: user.email, + }, + include: { + team: { + include: { + subscription: true, + }, + }, + }, + }); + + const { team } = teamMemberInvite; + + await tx.teamMember.create({ + data: { + teamId: teamMemberInvite.teamId, + userId: user.id, + role: teamMemberInvite.role, + }, + }); + + await tx.teamMemberInvite.delete({ + where: { + id: teamMemberInvite.id, + }, + }); + + if (IS_BILLING_ENABLED && team.subscription) { + const numberOfSeats = await tx.teamMember.count({ + where: { + teamId: teamMemberInvite.teamId, + }, + }); + + await updateSubscriptionItemQuantity({ + priceId: team.subscription.priceId, + subscriptionId: team.subscription.planId, + quantity: numberOfSeats, + }); + } + }); +}; diff --git a/packages/lib/server-only/team/create-team-billing-portal.ts b/packages/lib/server-only/team/create-team-billing-portal.ts new file mode 100644 index 000000000..d394f2720 --- /dev/null +++ b/packages/lib/server-only/team/create-team-billing-portal.ts @@ -0,0 +1,47 @@ +import { getPortalSession } from '@documenso/ee/server-only/stripe/get-portal-session'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { prisma } from '@documenso/prisma'; + +export type CreateTeamBillingPortalOptions = { + userId: number; + teamId: number; +}; + +export const createTeamBillingPortal = async ({ + userId, + teamId, +}: CreateTeamBillingPortalOptions) => { + if (!IS_BILLING_ENABLED) { + throw new Error('Billing is not enabled'); + } + + const team = await prisma.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_BILLING'], + }, + }, + }, + }, + include: { + subscription: true, + }, + }); + + if (!team.subscription) { + throw new Error('Team has no subscription'); + } + + if (!team.customerId) { + throw new Error('Team has no customerId'); + } + + return getPortalSession({ + customerId: team.customerId, + }); +}; diff --git a/packages/lib/server-only/team/create-team-checkout-session.ts b/packages/lib/server-only/team/create-team-checkout-session.ts new file mode 100644 index 000000000..b80fc260b --- /dev/null +++ b/packages/lib/server-only/team/create-team-checkout-session.ts @@ -0,0 +1,52 @@ +import { getCheckoutSession } from '@documenso/ee/server-only/stripe/get-checkout-session'; +import { getTeamPrices } from '@documenso/ee/server-only/stripe/get-team-prices'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { prisma } from '@documenso/prisma'; + +export type CreateTeamPendingCheckoutSession = { + userId: number; + pendingTeamId: number; + interval: 'monthly' | 'yearly'; +}; + +export const createTeamPendingCheckoutSession = async ({ + userId, + pendingTeamId, + interval, +}: CreateTeamPendingCheckoutSession) => { + const teamPendingCreation = await prisma.teamPending.findFirstOrThrow({ + where: { + id: pendingTeamId, + ownerUserId: userId, + }, + include: { + owner: true, + }, + }); + + const prices = await getTeamPrices(); + const priceId = prices[interval].priceId; + + try { + const stripeCheckoutSession = await getCheckoutSession({ + customerId: teamPendingCreation.customerId, + priceId, + returnUrl: `${WEBAPP_BASE_URL}/settings/teams`, + subscriptionMetadata: { + pendingTeamId: pendingTeamId.toString(), + }, + }); + + if (!stripeCheckoutSession) { + throw new AppError(AppErrorCode.UNKNOWN_ERROR); + } + + return stripeCheckoutSession; + } catch (e) { + console.error(e); + + // Absorb all the errors incase Stripe throws something sensitive. + throw new AppError(AppErrorCode.UNKNOWN_ERROR, 'Something went wrong.'); + } +}; diff --git a/packages/lib/server-only/team/create-team-email-verification.ts b/packages/lib/server-only/team/create-team-email-verification.ts new file mode 100644 index 000000000..28e1538d0 --- /dev/null +++ b/packages/lib/server-only/team/create-team-email-verification.ts @@ -0,0 +1,132 @@ +import { createElement } from 'react'; + +import { z } from 'zod'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import { ConfirmTeamEmailTemplate } from '@documenso/email/templates/confirm-team-email'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { createTokenVerification } from '@documenso/lib/utils/token-verification'; +import { prisma } from '@documenso/prisma'; +import { Prisma } from '@documenso/prisma/client'; + +export type CreateTeamEmailVerificationOptions = { + userId: number; + teamId: number; + data: { + email: string; + name: string; + }; +}; + +export const createTeamEmailVerification = async ({ + userId, + teamId, + data, +}: CreateTeamEmailVerificationOptions) => { + try { + await prisma.$transaction(async (tx) => { + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + include: { + teamEmail: true, + emailVerification: true, + }, + }); + + if (team.teamEmail || team.emailVerification) { + throw new AppError( + AppErrorCode.INVALID_REQUEST, + 'Team already has an email or existing email verification.', + ); + } + + const existingTeamEmail = await tx.teamEmail.findFirst({ + where: { + email: data.email, + }, + }); + + if (existingTeamEmail) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Email already taken by another team.'); + } + + const { token, expiresAt } = createTokenVerification({ hours: 1 }); + + await tx.teamEmailVerification.create({ + data: { + token, + expiresAt, + email: data.email, + name: data.name, + teamId, + }, + }); + + await sendTeamEmailVerificationEmail(data.email, token, team.name, team.url); + }); + } catch (err) { + console.error(err); + + if (!(err instanceof Prisma.PrismaClientKnownRequestError)) { + throw err; + } + + const target = z.array(z.string()).safeParse(err.meta?.target); + + if (err.code === 'P2002' && target.success && target.data.includes('email')) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Email already taken by another team.'); + } + + throw err; + } +}; + +/** + * Send an email to a user asking them to accept a team email request. + * + * @param email The email address to use for the team. + * @param token The token used to authenticate that the user has granted access. + * @param teamName The name of the team the user is being invited to. + * @param teamUrl The url of the team the user is being invited to. + */ +export const sendTeamEmailVerificationEmail = async ( + email: string, + token: string, + teamName: string, + teamUrl: string, +) => { + const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + + const template = createElement(ConfirmTeamEmailTemplate, { + assetBaseUrl, + baseUrl: WEBAPP_BASE_URL, + teamName, + teamUrl, + token, + }); + + await mailer.sendMail({ + to: email, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: `A request to use your email has been initiated by ${teamName} on Documenso`, + html: render(template), + text: render(template, { plainText: true }), + }); +}; diff --git a/packages/lib/server-only/team/create-team-member-invites.ts b/packages/lib/server-only/team/create-team-member-invites.ts new file mode 100644 index 000000000..f167d2112 --- /dev/null +++ b/packages/lib/server-only/team/create-team-member-invites.ts @@ -0,0 +1,161 @@ +import { createElement } from 'react'; + +import { nanoid } from 'nanoid'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import type { TeamInviteEmailProps } from '@documenso/email/templates/team-invite'; +import { TeamInviteEmailTemplate } from '@documenso/email/templates/team-invite'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { isTeamRoleWithinUserHierarchy } from '@documenso/lib/utils/teams'; +import { prisma } from '@documenso/prisma'; +import { TeamMemberInviteStatus } from '@documenso/prisma/client'; +import type { TCreateTeamMemberInvitesMutationSchema } from '@documenso/trpc/server/team-router/schema'; + +export type CreateTeamMemberInvitesOptions = { + userId: number; + userName: string; + teamId: number; + invitations: TCreateTeamMemberInvitesMutationSchema['invitations']; +}; + +/** + * Invite team members via email to join a team. + */ +export const createTeamMemberInvites = async ({ + userId, + userName, + teamId, + invitations, +}: CreateTeamMemberInvitesOptions) => { + const team = await prisma.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + include: { + members: { + select: { + role: true, + user: { + select: { + id: true, + email: true, + }, + }, + }, + }, + invites: true, + }, + }); + + const teamMemberEmails = team.members.map((member) => member.user.email); + const teamMemberInviteEmails = team.invites.map((invite) => invite.email); + const currentTeamMember = team.members.find((member) => member.user.id === userId); + + if (!currentTeamMember) { + throw new AppError(AppErrorCode.UNAUTHORIZED, 'User not part of team.'); + } + + const usersToInvite = invitations.filter((invitation) => { + // Filter out users that are already members of the team. + if (teamMemberEmails.includes(invitation.email)) { + return false; + } + + // Filter out users that have already been invited to the team. + if (teamMemberInviteEmails.includes(invitation.email)) { + return false; + } + + return true; + }); + + const unauthorizedRoleAccess = usersToInvite.some( + ({ role }) => !isTeamRoleWithinUserHierarchy(currentTeamMember.role, role), + ); + + if (unauthorizedRoleAccess) { + throw new AppError( + AppErrorCode.UNAUTHORIZED, + 'User does not have permission to set high level roles', + ); + } + + const teamMemberInvites = usersToInvite.map(({ email, role }) => ({ + email, + teamId, + role, + status: TeamMemberInviteStatus.PENDING, + token: nanoid(32), + })); + + await prisma.teamMemberInvite.createMany({ + data: teamMemberInvites, + }); + + const sendEmailResult = await Promise.allSettled( + teamMemberInvites.map(async ({ email, token }) => + sendTeamMemberInviteEmail({ + email, + token, + teamName: team.name, + teamUrl: team.url, + senderName: userName, + }), + ), + ); + + const sendEmailResultErrorList = sendEmailResult.filter( + (result): result is PromiseRejectedResult => result.status === 'rejected', + ); + + if (sendEmailResultErrorList.length > 0) { + console.error(JSON.stringify(sendEmailResultErrorList)); + + throw new AppError( + 'EmailDeliveryFailed', + 'Failed to send invite emails to one or more users.', + `Failed to send invites to ${sendEmailResultErrorList.length}/${teamMemberInvites.length} users.`, + ); + } +}; + +type SendTeamMemberInviteEmailOptions = Omit & { + email: string; +}; + +/** + * Send an email to a user inviting them to join a team. + */ +export const sendTeamMemberInviteEmail = async ({ + email, + ...emailTemplateOptions +}: SendTeamMemberInviteEmailOptions) => { + const template = createElement(TeamInviteEmailTemplate, { + assetBaseUrl: WEBAPP_BASE_URL, + baseUrl: WEBAPP_BASE_URL, + ...emailTemplateOptions, + }); + + await mailer.sendMail({ + to: email, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: `You have been invited to join ${emailTemplateOptions.teamName} on Documenso`, + html: render(template), + text: render(template, { plainText: true }), + }); +}; diff --git a/packages/lib/server-only/team/create-team.ts b/packages/lib/server-only/team/create-team.ts new file mode 100644 index 000000000..f1d245523 --- /dev/null +++ b/packages/lib/server-only/team/create-team.ts @@ -0,0 +1,207 @@ +import type Stripe from 'stripe'; +import { z } from 'zod'; + +import { createTeamCustomer } from '@documenso/ee/server-only/stripe/create-team-customer'; +import { getCommunityPlanPriceIds } from '@documenso/ee/server-only/stripe/get-community-plan-prices'; +import { mapStripeSubscriptionToPrismaUpsertAction } from '@documenso/ee/server-only/stripe/webhook/on-subscription-updated'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { subscriptionsContainsActiveCommunityPlan } from '@documenso/lib/utils/billing'; +import { prisma } from '@documenso/prisma'; +import { Prisma, TeamMemberRole } from '@documenso/prisma/client'; + +import { stripe } from '../stripe'; + +export type CreateTeamOptions = { + /** + * ID of the user creating the Team. + */ + userId: number; + + /** + * Name of the team to display. + */ + teamName: string; + + /** + * Unique URL of the team. + * + * Used as the URL path, example: https://documenso.com/t/{teamUrl}/settings + */ + teamUrl: string; +}; + +export type CreateTeamResponse = + | { + paymentRequired: false; + } + | { + paymentRequired: true; + pendingTeamId: number; + }; + +/** + * Create a team or pending team depending on the user's subscription or application's billing settings. + */ +export const createTeam = async ({ + userId, + teamName, + teamUrl, +}: CreateTeamOptions): Promise => { + const user = await prisma.user.findUniqueOrThrow({ + where: { + id: userId, + }, + include: { + Subscription: true, + }, + }); + + let isPaymentRequired = IS_BILLING_ENABLED; + let customerId: string | null = null; + + if (IS_BILLING_ENABLED) { + const communityPlanPriceIds = await getCommunityPlanPriceIds(); + + isPaymentRequired = !subscriptionsContainsActiveCommunityPlan( + user.Subscription, + communityPlanPriceIds, + ); + + customerId = await createTeamCustomer({ + name: user.name ?? teamName, + email: user.email, + }).then((customer) => customer.id); + } + + try { + // Create the team directly if no payment is required. + if (!isPaymentRequired) { + await prisma.team.create({ + data: { + name: teamName, + url: teamUrl, + ownerUserId: user.id, + customerId, + members: { + create: [ + { + userId, + role: TeamMemberRole.ADMIN, + }, + ], + }, + }, + }); + + return { + paymentRequired: false, + }; + } + + // Create a pending team if payment is required. + const pendingTeam = await prisma.$transaction(async (tx) => { + const existingTeamWithUrl = await tx.team.findUnique({ + where: { + url: teamUrl, + }, + }); + + if (existingTeamWithUrl) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Team URL already exists.'); + } + + if (!customerId) { + throw new AppError(AppErrorCode.UNKNOWN_ERROR, 'Missing customer ID for pending teams.'); + } + + return await tx.teamPending.create({ + data: { + name: teamName, + url: teamUrl, + ownerUserId: user.id, + customerId, + }, + }); + }); + + return { + paymentRequired: true, + pendingTeamId: pendingTeam.id, + }; + } catch (err) { + console.error(err); + + if (!(err instanceof Prisma.PrismaClientKnownRequestError)) { + throw err; + } + + const target = z.array(z.string()).safeParse(err.meta?.target); + + if (err.code === 'P2002' && target.success && target.data.includes('url')) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Team URL already exists.'); + } + + throw err; + } +}; + +export type CreateTeamFromPendingTeamOptions = { + pendingTeamId: number; + subscription: Stripe.Subscription; +}; + +export const createTeamFromPendingTeam = async ({ + pendingTeamId, + subscription, +}: CreateTeamFromPendingTeamOptions) => { + return await prisma.$transaction(async (tx) => { + const pendingTeam = await tx.teamPending.findUniqueOrThrow({ + where: { + id: pendingTeamId, + }, + }); + + await tx.teamPending.delete({ + where: { + id: pendingTeamId, + }, + }); + + const team = await tx.team.create({ + data: { + name: pendingTeam.name, + url: pendingTeam.url, + ownerUserId: pendingTeam.ownerUserId, + customerId: pendingTeam.customerId, + members: { + create: [ + { + userId: pendingTeam.ownerUserId, + role: TeamMemberRole.ADMIN, + }, + ], + }, + }, + }); + + await tx.subscription.upsert( + mapStripeSubscriptionToPrismaUpsertAction(subscription, undefined, team.id), + ); + + // Attach the team ID to the subscription metadata for sanity reasons. + await stripe.subscriptions + .update(subscription.id, { + metadata: { + teamId: team.id.toString(), + }, + }) + .catch((e) => { + console.error(e); + // Non-critical error, but we want to log it so we can rectify it. + // Todo: Teams - Alert us. + }); + + return team; + }); +}; diff --git a/packages/lib/server-only/team/delete-team-email-verification.ts b/packages/lib/server-only/team/delete-team-email-verification.ts new file mode 100644 index 000000000..fee39553f --- /dev/null +++ b/packages/lib/server-only/team/delete-team-email-verification.ts @@ -0,0 +1,34 @@ +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { prisma } from '@documenso/prisma'; + +export type DeleteTeamEmailVerificationOptions = { + userId: number; + teamId: number; +}; + +export const deleteTeamEmailVerification = async ({ + userId, + teamId, +}: DeleteTeamEmailVerificationOptions) => { + await prisma.$transaction(async (tx) => { + await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + }); + + await tx.teamEmailVerification.delete({ + where: { + teamId, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/delete-team-email.ts b/packages/lib/server-only/team/delete-team-email.ts new file mode 100644 index 000000000..c5139a971 --- /dev/null +++ b/packages/lib/server-only/team/delete-team-email.ts @@ -0,0 +1,93 @@ +import { createElement } from 'react'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import { TeamEmailRemovedTemplate } from '@documenso/email/templates/team-email-removed'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { prisma } from '@documenso/prisma'; + +export type DeleteTeamEmailOptions = { + userId: number; + userEmail: string; + teamId: number; +}; + +/** + * Delete a team email. + * + * The user must either be part of the team with the required permissions, or the owner of the email. + */ +export const deleteTeamEmail = async ({ userId, userEmail, teamId }: DeleteTeamEmailOptions) => { + const team = await prisma.$transaction(async (tx) => { + const foundTeam = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + OR: [ + { + teamEmail: { + email: userEmail, + }, + }, + { + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + ], + }, + include: { + teamEmail: true, + owner: { + select: { + name: true, + email: true, + }, + }, + }, + }); + + await tx.teamEmail.delete({ + where: { + teamId, + }, + }); + + return foundTeam; + }); + + try { + const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + + const template = createElement(TeamEmailRemovedTemplate, { + assetBaseUrl, + baseUrl: WEBAPP_BASE_URL, + teamEmail: team.teamEmail?.email ?? '', + teamName: team.name, + teamUrl: team.url, + }); + + await mailer.sendMail({ + to: { + address: team.owner.email, + name: team.owner.name ?? '', + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: `Team email has been revoked for ${team.name}`, + html: render(template), + text: render(template, { plainText: true }), + }); + } catch (e) { + // Todo: Teams - Alert us. + // We don't want to prevent a user from revoking access because an email could not be sent. + } +}; diff --git a/packages/lib/server-only/team/delete-team-invitations.ts b/packages/lib/server-only/team/delete-team-invitations.ts new file mode 100644 index 000000000..a2baf8352 --- /dev/null +++ b/packages/lib/server-only/team/delete-team-invitations.ts @@ -0,0 +1,47 @@ +import { prisma } from '@documenso/prisma'; + +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../../constants/teams'; + +export type DeleteTeamMemberInvitationsOptions = { + /** + * The ID of the user who is initiating this action. + */ + userId: number; + + /** + * The ID of the team to remove members from. + */ + teamId: number; + + /** + * The IDs of the invitations to remove. + */ + invitationIds: number[]; +}; + +export const deleteTeamMemberInvitations = async ({ + userId, + teamId, + invitationIds, +}: DeleteTeamMemberInvitationsOptions) => { + await prisma.$transaction(async (tx) => { + await tx.teamMember.findFirstOrThrow({ + where: { + userId, + teamId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }); + + await tx.teamMemberInvite.deleteMany({ + where: { + id: { + in: invitationIds, + }, + teamId, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/delete-team-members.ts b/packages/lib/server-only/team/delete-team-members.ts new file mode 100644 index 000000000..7e282af5a --- /dev/null +++ b/packages/lib/server-only/team/delete-team-members.ts @@ -0,0 +1,102 @@ +import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { isTeamRoleWithinUserHierarchy } from '@documenso/lib/utils/teams'; +import { prisma } from '@documenso/prisma'; + +export type DeleteTeamMembersOptions = { + /** + * The ID of the user who is initiating this action. + */ + userId: number; + + /** + * The ID of the team to remove members from. + */ + teamId: number; + + /** + * The IDs of the team members to remove. + */ + teamMemberIds: number[]; +}; + +export const deleteTeamMembers = async ({ + userId, + teamId, + teamMemberIds, +}: DeleteTeamMembersOptions) => { + await prisma.$transaction(async (tx) => { + // Find the team and validate that the user is allowed to remove members. + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + include: { + members: { + select: { + id: true, + userId: true, + role: true, + }, + }, + subscription: true, + }, + }); + + const currentTeamMember = team.members.find((member) => member.userId === userId); + const teamMembersToRemove = team.members.filter((member) => teamMemberIds.includes(member.id)); + + if (!currentTeamMember) { + throw new AppError(AppErrorCode.NOT_FOUND, 'Team member record does not exist'); + } + + if (teamMembersToRemove.find((member) => member.userId === team.ownerUserId)) { + throw new AppError(AppErrorCode.UNAUTHORIZED, 'Cannot remove the team owner'); + } + + const isMemberToRemoveHigherRole = teamMembersToRemove.some( + (member) => !isTeamRoleWithinUserHierarchy(currentTeamMember.role, member.role), + ); + + if (isMemberToRemoveHigherRole) { + throw new AppError(AppErrorCode.UNAUTHORIZED, 'Cannot remove a member with a higher role'); + } + + // Remove the team members. + await tx.teamMember.deleteMany({ + where: { + id: { + in: teamMemberIds, + }, + teamId, + userId: { + not: team.ownerUserId, + }, + }, + }); + + if (IS_BILLING_ENABLED && team.subscription) { + const numberOfSeats = await tx.teamMember.count({ + where: { + teamId, + }, + }); + + await updateSubscriptionItemQuantity({ + priceId: team.subscription.priceId, + subscriptionId: team.subscription.planId, + quantity: numberOfSeats, + }); + } + }); +}; diff --git a/packages/lib/server-only/team/delete-team-pending.ts b/packages/lib/server-only/team/delete-team-pending.ts new file mode 100644 index 000000000..b339fd862 --- /dev/null +++ b/packages/lib/server-only/team/delete-team-pending.ts @@ -0,0 +1,15 @@ +import { prisma } from '@documenso/prisma'; + +export type DeleteTeamPendingOptions = { + userId: number; + pendingTeamId: number; +}; + +export const deleteTeamPending = async ({ userId, pendingTeamId }: DeleteTeamPendingOptions) => { + await prisma.teamPending.delete({ + where: { + id: pendingTeamId, + ownerUserId: userId, + }, + }); +}; diff --git a/packages/lib/server-only/team/delete-team-transfer-request.ts b/packages/lib/server-only/team/delete-team-transfer-request.ts new file mode 100644 index 000000000..245a72b5a --- /dev/null +++ b/packages/lib/server-only/team/delete-team-transfer-request.ts @@ -0,0 +1,42 @@ +import { prisma } from '@documenso/prisma'; + +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../../constants/teams'; + +export type DeleteTeamTransferRequestOptions = { + /** + * The ID of the user deleting the transfer. + */ + userId: number; + + /** + * The ID of the team whose team transfer request should be deleted. + */ + teamId: number; +}; + +export const deleteTeamTransferRequest = async ({ + userId, + teamId, +}: DeleteTeamTransferRequestOptions) => { + await prisma.$transaction(async (tx) => { + await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['DELETE_TEAM_TRANSFER_REQUEST'], + }, + }, + }, + }, + }); + + await tx.teamTransferVerification.delete({ + where: { + teamId, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/delete-team.ts b/packages/lib/server-only/team/delete-team.ts new file mode 100644 index 000000000..dffc044d8 --- /dev/null +++ b/packages/lib/server-only/team/delete-team.ts @@ -0,0 +1,42 @@ +import { prisma } from '@documenso/prisma'; + +import { AppError } from '../../errors/app-error'; +import { stripe } from '../stripe'; + +export type DeleteTeamOptions = { + userId: number; + teamId: number; +}; + +export const deleteTeam = async ({ userId, teamId }: DeleteTeamOptions) => { + await prisma.$transaction(async (tx) => { + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + ownerUserId: userId, + }, + include: { + subscription: true, + }, + }); + + if (team.subscription) { + await stripe.subscriptions + .cancel(team.subscription.planId, { + prorate: false, + invoice_now: true, + }) + .catch((err) => { + console.error(err); + throw AppError.parseError(err); + }); + } + + await tx.team.delete({ + where: { + id: teamId, + ownerUserId: userId, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/find-team-invoices.ts b/packages/lib/server-only/team/find-team-invoices.ts new file mode 100644 index 000000000..bbc84f3fd --- /dev/null +++ b/packages/lib/server-only/team/find-team-invoices.ts @@ -0,0 +1,52 @@ +import { getInvoices } from '@documenso/ee/server-only/stripe/get-invoices'; +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { prisma } from '@documenso/prisma'; + +export interface FindTeamInvoicesOptions { + userId: number; + teamId: number; +} + +export const findTeamInvoices = async ({ userId, teamId }: FindTeamInvoicesOptions) => { + const team = await prisma.team.findUniqueOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + }); + + if (!team.customerId) { + throw new AppError(AppErrorCode.NOT_FOUND, 'Team has no customer ID.'); + } + + const results = await getInvoices({ customerId: team.customerId }); + + if (!results) { + return null; + } + + return { + ...results, + data: results.data.map((invoice) => ({ + invoicePdf: invoice.invoice_pdf, + hostedInvoicePdf: invoice.hosted_invoice_url, + status: invoice.status, + subtotal: invoice.subtotal, + total: invoice.total, + amountPaid: invoice.amount_paid, + amountDue: invoice.amount_due, + created: invoice.created, + paid: invoice.paid, + quantity: invoice.lines.data[0].quantity ?? 0, + currency: invoice.currency, + })), + }; +}; diff --git a/packages/lib/server-only/team/find-team-member-invites.ts b/packages/lib/server-only/team/find-team-member-invites.ts new file mode 100644 index 000000000..8100008b8 --- /dev/null +++ b/packages/lib/server-only/team/find-team-member-invites.ts @@ -0,0 +1,91 @@ +import { P, match } from 'ts-pattern'; + +import { prisma } from '@documenso/prisma'; +import type { TeamMemberInvite } from '@documenso/prisma/client'; +import { Prisma } from '@documenso/prisma/client'; + +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../../constants/teams'; +import type { FindResultSet } from '../../types/find-result-set'; + +export interface FindTeamMemberInvitesOptions { + userId: number; + teamId: number; + term?: string; + page?: number; + perPage?: number; + orderBy?: { + column: keyof TeamMemberInvite; + direction: 'asc' | 'desc'; + }; +} + +export const findTeamMemberInvites = async ({ + userId, + teamId, + term, + page = 1, + perPage = 10, + orderBy, +}: FindTeamMemberInvitesOptions) => { + const orderByColumn = orderBy?.column ?? 'email'; + const orderByDirection = orderBy?.direction ?? 'desc'; + + // Check that the user belongs to the team they are trying to find invites in. + const userTeam = await prisma.team.findUniqueOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + }); + + const termFilters: Prisma.TeamMemberInviteWhereInput | undefined = match(term) + .with(P.string.minLength(1), () => ({ + email: { + contains: term, + mode: Prisma.QueryMode.insensitive, + }, + })) + .otherwise(() => undefined); + + const whereClause: Prisma.TeamMemberInviteWhereInput = { + ...termFilters, + teamId: userTeam.id, + }; + + const [data, count] = await Promise.all([ + prisma.teamMemberInvite.findMany({ + where: whereClause, + skip: Math.max(page - 1, 0) * perPage, + take: perPage, + orderBy: { + [orderByColumn]: orderByDirection, + }, + // Exclude token attribute. + select: { + id: true, + teamId: true, + email: true, + role: true, + createdAt: true, + }, + }), + prisma.teamMemberInvite.count({ + where: whereClause, + }), + ]); + + return { + data, + count, + currentPage: Math.max(page, 1), + perPage, + totalPages: Math.ceil(count / perPage), + } satisfies FindResultSet; +}; diff --git a/packages/lib/server-only/team/find-team-members.ts b/packages/lib/server-only/team/find-team-members.ts new file mode 100644 index 000000000..4a1ab8511 --- /dev/null +++ b/packages/lib/server-only/team/find-team-members.ts @@ -0,0 +1,100 @@ +import { P, match } from 'ts-pattern'; + +import { prisma } from '@documenso/prisma'; +import type { TeamMember } from '@documenso/prisma/client'; +import { Prisma } from '@documenso/prisma/client'; + +import type { FindResultSet } from '../../types/find-result-set'; + +export interface FindTeamMembersOptions { + userId: number; + teamId: number; + term?: string; + page?: number; + perPage?: number; + orderBy?: { + column: keyof TeamMember | 'name'; + direction: 'asc' | 'desc'; + }; +} + +export const findTeamMembers = async ({ + userId, + teamId, + term, + page = 1, + perPage = 10, + orderBy, +}: FindTeamMembersOptions) => { + const orderByColumn = orderBy?.column ?? 'name'; + const orderByDirection = orderBy?.direction ?? 'desc'; + + // Check that the user belongs to the team they are trying to find members in. + const userTeam = await prisma.team.findUniqueOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }); + + const termFilters: Prisma.TeamMemberWhereInput | undefined = match(term) + .with(P.string.minLength(1), () => ({ + user: { + name: { + contains: term, + mode: Prisma.QueryMode.insensitive, + }, + }, + })) + .otherwise(() => undefined); + + const whereClause: Prisma.TeamMemberWhereInput = { + ...termFilters, + teamId: userTeam.id, + }; + + let orderByClause: Prisma.TeamMemberOrderByWithRelationInput = { + [orderByColumn]: orderByDirection, + }; + + // Name field is nested in the user so we have to handle it differently. + if (orderByColumn === 'name') { + orderByClause = { + user: { + name: orderByDirection, + }, + }; + } + + const [data, count] = await Promise.all([ + prisma.teamMember.findMany({ + where: whereClause, + skip: Math.max(page - 1, 0) * perPage, + take: perPage, + orderBy: orderByClause, + include: { + user: { + select: { + name: true, + email: true, + }, + }, + }, + }), + prisma.teamMember.count({ + where: whereClause, + }), + ]); + + return { + data, + count, + currentPage: Math.max(page, 1), + perPage, + totalPages: Math.ceil(count / perPage), + } satisfies FindResultSet; +}; diff --git a/packages/lib/server-only/team/find-teams-pending.ts b/packages/lib/server-only/team/find-teams-pending.ts new file mode 100644 index 000000000..d079c6f5f --- /dev/null +++ b/packages/lib/server-only/team/find-teams-pending.ts @@ -0,0 +1,58 @@ +import { prisma } from '@documenso/prisma'; +import type { Team } from '@documenso/prisma/client'; +import { Prisma } from '@documenso/prisma/client'; + +export interface FindTeamsPendingOptions { + userId: number; + term?: string; + page?: number; + perPage?: number; + orderBy?: { + column: keyof Team; + direction: 'asc' | 'desc'; + }; +} + +export const findTeamsPending = async ({ + userId, + term, + page = 1, + perPage = 10, + orderBy, +}: FindTeamsPendingOptions) => { + const orderByColumn = orderBy?.column ?? 'name'; + const orderByDirection = orderBy?.direction ?? 'desc'; + + const whereClause: Prisma.TeamPendingWhereInput = { + ownerUserId: userId, + }; + + if (term && term.length > 0) { + whereClause.name = { + contains: term, + mode: Prisma.QueryMode.insensitive, + }; + } + + const [data, count] = await Promise.all([ + prisma.teamPending.findMany({ + where: whereClause, + skip: Math.max(page - 1, 0) * perPage, + take: perPage, + orderBy: { + [orderByColumn]: orderByDirection, + }, + }), + prisma.teamPending.count({ + where: whereClause, + }), + ]); + + return { + data, + count, + currentPage: Math.max(page, 1), + perPage, + totalPages: Math.ceil(count / perPage), + }; +}; diff --git a/packages/lib/server-only/team/find-teams.ts b/packages/lib/server-only/team/find-teams.ts new file mode 100644 index 000000000..f5376a65d --- /dev/null +++ b/packages/lib/server-only/team/find-teams.ts @@ -0,0 +1,76 @@ +import type { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { prisma } from '@documenso/prisma'; +import type { Team } from '@documenso/prisma/client'; +import { Prisma } from '@documenso/prisma/client'; + +export interface FindTeamsOptions { + userId: number; + term?: string; + page?: number; + perPage?: number; + orderBy?: { + column: keyof Team; + direction: 'asc' | 'desc'; + }; +} + +export const findTeams = async ({ + userId, + term, + page = 1, + perPage = 10, + orderBy, +}: FindTeamsOptions) => { + const orderByColumn = orderBy?.column ?? 'name'; + const orderByDirection = orderBy?.direction ?? 'desc'; + + const whereClause: Prisma.TeamWhereInput = { + members: { + some: { + userId, + }, + }, + }; + + if (term && term.length > 0) { + whereClause.name = { + contains: term, + mode: Prisma.QueryMode.insensitive, + }; + } + + const [data, count] = await Promise.all([ + prisma.team.findMany({ + where: whereClause, + skip: Math.max(page - 1, 0) * perPage, + take: perPage, + orderBy: { + [orderByColumn]: orderByDirection, + }, + include: { + members: { + where: { + userId, + }, + }, + }, + }), + prisma.team.count({ + where: whereClause, + }), + ]); + + const maskedData = data.map((team) => ({ + ...team, + currentTeamMember: team.members[0], + members: undefined, + })); + + return { + data: maskedData, + count, + currentPage: Math.max(page, 1), + perPage, + totalPages: Math.ceil(count / perPage), + } satisfies FindResultSet; +}; diff --git a/packages/lib/server-only/team/get-team-email-by-email.ts b/packages/lib/server-only/team/get-team-email-by-email.ts new file mode 100644 index 000000000..665694db4 --- /dev/null +++ b/packages/lib/server-only/team/get-team-email-by-email.ts @@ -0,0 +1,22 @@ +import { prisma } from '@documenso/prisma'; + +export type GetTeamEmailByEmailOptions = { + email: string; +}; + +export const getTeamEmailByEmail = async ({ email }: GetTeamEmailByEmailOptions) => { + return await prisma.teamEmail.findFirst({ + where: { + email, + }, + include: { + team: { + select: { + id: true, + name: true, + url: true, + }, + }, + }, + }); +}; diff --git a/packages/lib/server-only/team/get-team-invitations.ts b/packages/lib/server-only/team/get-team-invitations.ts new file mode 100644 index 000000000..737f1b3f7 --- /dev/null +++ b/packages/lib/server-only/team/get-team-invitations.ts @@ -0,0 +1,22 @@ +import { prisma } from '@documenso/prisma'; + +export type GetTeamInvitationsOptions = { + email: string; +}; + +export const getTeamInvitations = async ({ email }: GetTeamInvitationsOptions) => { + return await prisma.teamMemberInvite.findMany({ + where: { + email, + }, + include: { + team: { + select: { + id: true, + name: true, + url: true, + }, + }, + }, + }); +}; diff --git a/packages/lib/server-only/team/get-team-members.ts b/packages/lib/server-only/team/get-team-members.ts new file mode 100644 index 000000000..a29ed6e1d --- /dev/null +++ b/packages/lib/server-only/team/get-team-members.ts @@ -0,0 +1,33 @@ +import { prisma } from '@documenso/prisma'; + +export type GetTeamMembersOptions = { + userId: number; + teamId: number; +}; + +/** + * Get all team members for a given team. + */ +export const getTeamMembers = async ({ userId, teamId }: GetTeamMembersOptions) => { + return await prisma.teamMember.findMany({ + where: { + team: { + id: teamId, + members: { + some: { + userId: userId, + }, + }, + }, + }, + include: { + user: { + select: { + id: true, + email: true, + name: true, + }, + }, + }, + }); +}; diff --git a/packages/lib/server-only/team/get-team.ts b/packages/lib/server-only/team/get-team.ts new file mode 100644 index 000000000..59331202e --- /dev/null +++ b/packages/lib/server-only/team/get-team.ts @@ -0,0 +1,95 @@ +import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; + +export type GetTeamByIdOptions = { + userId?: number; + teamId: number; +}; + +/** + * Get a team given a teamId. + * + * Provide an optional userId to check that the user is a member of the team. + */ +export const getTeamById = async ({ userId, teamId }: GetTeamByIdOptions) => { + const whereFilter: Prisma.TeamWhereUniqueInput = { + id: teamId, + }; + + if (userId !== undefined) { + whereFilter['members'] = { + some: { + userId, + }, + }; + } + + const result = await prisma.team.findUniqueOrThrow({ + where: whereFilter, + include: { + teamEmail: true, + members: { + where: { + userId, + }, + select: { + role: true, + }, + }, + }, + }); + + const { members, ...team } = result; + + return { + ...team, + currentTeamMember: userId !== undefined ? members[0] : null, + }; +}; + +export type GetTeamByUrlOptions = { + userId: number; + teamUrl: string; +}; + +/** + * Get a team given a team URL. + */ +export const getTeamByUrl = async ({ userId, teamUrl }: GetTeamByUrlOptions) => { + const whereFilter: Prisma.TeamWhereUniqueInput = { + url: teamUrl, + }; + + if (userId !== undefined) { + whereFilter['members'] = { + some: { + userId, + }, + }; + } + + const result = await prisma.team.findUniqueOrThrow({ + where: whereFilter, + include: { + teamEmail: true, + emailVerification: true, + transferVerification: true, + subscription: true, + members: { + where: { + userId, + }, + select: { + role: true, + }, + }, + }, + }); + + const { members, ...team } = result; + + return { + ...team, + currentTeamMember: members[0], + }; +}; diff --git a/packages/lib/server-only/team/get-teams.ts b/packages/lib/server-only/team/get-teams.ts new file mode 100644 index 000000000..57a9fb83e --- /dev/null +++ b/packages/lib/server-only/team/get-teams.ts @@ -0,0 +1,33 @@ +import { prisma } from '@documenso/prisma'; + +export type GetTeamsOptions = { + userId: number; +}; +export type GetTeamsResponse = Awaited>; + +export const getTeams = async ({ userId }: GetTeamsOptions) => { + const teams = await prisma.team.findMany({ + where: { + members: { + some: { + userId, + }, + }, + }, + include: { + members: { + where: { + userId, + }, + select: { + role: true, + }, + }, + }, + }); + + return teams.map(({ members, ...team }) => ({ + ...team, + currentTeamMember: members[0], + })); +}; diff --git a/packages/lib/server-only/team/leave-team.ts b/packages/lib/server-only/team/leave-team.ts new file mode 100644 index 000000000..d0c6fe145 --- /dev/null +++ b/packages/lib/server-only/team/leave-team.ts @@ -0,0 +1,59 @@ +import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { prisma } from '@documenso/prisma'; + +export type LeaveTeamOptions = { + /** + * The ID of the user who is leaving the team. + */ + userId: number; + + /** + * The ID of the team the user is leaving. + */ + teamId: number; +}; + +export const leaveTeam = async ({ userId, teamId }: LeaveTeamOptions) => { + await prisma.$transaction(async (tx) => { + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + ownerUserId: { + not: userId, + }, + }, + include: { + subscription: true, + }, + }); + + await tx.teamMember.delete({ + where: { + userId_teamId: { + userId, + teamId, + }, + team: { + ownerUserId: { + not: userId, + }, + }, + }, + }); + + if (IS_BILLING_ENABLED && team.subscription) { + const numberOfSeats = await tx.teamMember.count({ + where: { + teamId, + }, + }); + + await updateSubscriptionItemQuantity({ + priceId: team.subscription.priceId, + subscriptionId: team.subscription.planId, + quantity: numberOfSeats, + }); + } + }); +}; diff --git a/packages/lib/server-only/team/request-team-ownership-transfer.ts b/packages/lib/server-only/team/request-team-ownership-transfer.ts new file mode 100644 index 000000000..7da976ee1 --- /dev/null +++ b/packages/lib/server-only/team/request-team-ownership-transfer.ts @@ -0,0 +1,106 @@ +import { createElement } from 'react'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import { TeamTransferRequestTemplate } from '@documenso/email/templates/team-transfer-request'; +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { createTokenVerification } from '@documenso/lib/utils/token-verification'; +import { prisma } from '@documenso/prisma'; + +export type RequestTeamOwnershipTransferOptions = { + /** + * The ID of the user initiating the transfer. + */ + userId: number; + + /** + * The name of the user initiating the transfer. + */ + userName: string; + + /** + * The ID of the team whose ownership is being transferred. + */ + teamId: number; + + /** + * The user ID of the new owner. + */ + newOwnerUserId: number; + + /** + * Whether to clear any current payment methods attached to the team. + */ + clearPaymentMethods: boolean; +}; + +export const requestTeamOwnershipTransfer = async ({ + userId, + userName, + teamId, + newOwnerUserId, +}: RequestTeamOwnershipTransferOptions) => { + // Todo: Clear payment methods disabled for now. + const clearPaymentMethods = false; + + await prisma.$transaction(async (tx) => { + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + ownerUserId: userId, + members: { + some: { + userId: newOwnerUserId, + }, + }, + }, + }); + + const newOwnerUser = await tx.user.findFirstOrThrow({ + where: { + id: newOwnerUserId, + }, + }); + + const { token, expiresAt } = createTokenVerification({ minute: 10 }); + + const teamVerificationPayload = { + teamId, + token, + expiresAt, + userId: newOwnerUserId, + name: newOwnerUser.name ?? '', + email: newOwnerUser.email, + clearPaymentMethods, + }; + + await tx.teamTransferVerification.upsert({ + where: { + teamId, + }, + create: teamVerificationPayload, + update: teamVerificationPayload, + }); + + const template = createElement(TeamTransferRequestTemplate, { + assetBaseUrl: WEBAPP_BASE_URL, + baseUrl: WEBAPP_BASE_URL, + senderName: userName, + teamName: team.name, + teamUrl: team.url, + token, + }); + + await mailer.sendMail({ + to: newOwnerUser.email, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: `You have been requested to take ownership of team ${team.name} on Documenso`, + html: render(template), + text: render(template, { plainText: true }), + }); + }); +}; diff --git a/packages/lib/server-only/team/resend-team-email-verification.ts b/packages/lib/server-only/team/resend-team-email-verification.ts new file mode 100644 index 000000000..55afe61ce --- /dev/null +++ b/packages/lib/server-only/team/resend-team-email-verification.ts @@ -0,0 +1,65 @@ +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError } from '@documenso/lib/errors/app-error'; +import { createTokenVerification } from '@documenso/lib/utils/token-verification'; +import { prisma } from '@documenso/prisma'; + +import { sendTeamEmailVerificationEmail } from './create-team-email-verification'; + +export type ResendTeamMemberInvitationOptions = { + userId: number; + teamId: number; +}; + +/** + * Resend a team email verification with a new token. + */ +export const resendTeamEmailVerification = async ({ + userId, + teamId, +}: ResendTeamMemberInvitationOptions) => { + await prisma.$transaction(async (tx) => { + const team = await tx.team.findUniqueOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + include: { + emailVerification: true, + }, + }); + + if (!team) { + throw new AppError('TeamNotFound', 'User is not a member of the team.'); + } + + const { emailVerification } = team; + + if (!emailVerification) { + throw new AppError( + 'VerificationNotFound', + 'No team email verification exists for this team.', + ); + } + + const { token, expiresAt } = createTokenVerification({ hours: 1 }); + + await tx.teamEmailVerification.update({ + where: { + teamId, + }, + data: { + token, + expiresAt, + }, + }); + + await sendTeamEmailVerificationEmail(emailVerification.email, token, team.name, team.url); + }); +}; diff --git a/packages/lib/server-only/team/resend-team-member-invitation.ts b/packages/lib/server-only/team/resend-team-member-invitation.ts new file mode 100644 index 000000000..fb860ccc0 --- /dev/null +++ b/packages/lib/server-only/team/resend-team-member-invitation.ts @@ -0,0 +1,76 @@ +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError } from '@documenso/lib/errors/app-error'; +import { prisma } from '@documenso/prisma'; + +import { sendTeamMemberInviteEmail } from './create-team-member-invites'; + +export type ResendTeamMemberInvitationOptions = { + /** + * The ID of the user who is initiating this action. + */ + userId: number; + + /** + * The name of the user who is initiating this action. + */ + userName: string; + + /** + * The ID of the team. + */ + teamId: number; + + /** + * The IDs of the invitations to resend. + */ + invitationId: number; +}; + +/** + * Resend an email for a given team member invite. + */ +export const resendTeamMemberInvitation = async ({ + userId, + userName, + teamId, + invitationId, +}: ResendTeamMemberInvitationOptions) => { + await prisma.$transaction(async (tx) => { + const team = await tx.team.findUniqueOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + }); + + if (!team) { + throw new AppError('TeamNotFound', 'User is not a valid member of the team.'); + } + + const teamMemberInvite = await tx.teamMemberInvite.findUniqueOrThrow({ + where: { + id: invitationId, + teamId, + }, + }); + + if (!teamMemberInvite) { + throw new AppError('InviteNotFound', 'No invite exists for this user.'); + } + + await sendTeamMemberInviteEmail({ + email: teamMemberInvite.email, + token: teamMemberInvite.token, + teamName: team.name, + teamUrl: team.url, + senderName: userName, + }); + }); +}; diff --git a/packages/lib/server-only/team/transfer-team-ownership.ts b/packages/lib/server-only/team/transfer-team-ownership.ts new file mode 100644 index 000000000..bb14eec55 --- /dev/null +++ b/packages/lib/server-only/team/transfer-team-ownership.ts @@ -0,0 +1,88 @@ +import type Stripe from 'stripe'; + +import { transferTeamSubscription } from '@documenso/ee/server-only/stripe/transfer-team-subscription'; +import { mapStripeSubscriptionToPrismaUpsertAction } from '@documenso/ee/server-only/stripe/webhook/on-subscription-updated'; +import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; +import { prisma } from '@documenso/prisma'; +import { TeamMemberRole } from '@documenso/prisma/client'; + +export type TransferTeamOwnershipOptions = { + token: string; +}; + +export const transferTeamOwnership = async ({ token }: TransferTeamOwnershipOptions) => { + await prisma.$transaction(async (tx) => { + const teamTransferVerification = await tx.teamTransferVerification.findFirstOrThrow({ + where: { + token, + }, + include: { + team: { + include: { + subscription: true, + }, + }, + }, + }); + + const { team, userId: newOwnerUserId } = teamTransferVerification; + + await tx.teamTransferVerification.delete({ + where: { + teamId: team.id, + }, + }); + + const newOwnerUser = await tx.user.findFirstOrThrow({ + where: { + id: newOwnerUserId, + teamMembers: { + some: { + teamId: team.id, + }, + }, + }, + include: { + Subscription: true, + }, + }); + + let teamSubscription: Stripe.Subscription | null = null; + + if (IS_BILLING_ENABLED) { + teamSubscription = await transferTeamSubscription({ + user: newOwnerUser, + team, + clearPaymentMethods: teamTransferVerification.clearPaymentMethods, + }); + } + + if (teamSubscription) { + await tx.subscription.upsert( + mapStripeSubscriptionToPrismaUpsertAction(teamSubscription, undefined, team.id), + ); + } + + await tx.team.update({ + where: { + id: team.id, + }, + data: { + ownerUserId: newOwnerUserId, + members: { + update: { + where: { + userId_teamId: { + teamId: team.id, + userId: newOwnerUserId, + }, + }, + data: { + role: TeamMemberRole.ADMIN, + }, + }, + }, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/update-team-email.ts b/packages/lib/server-only/team/update-team-email.ts new file mode 100644 index 000000000..05023efc7 --- /dev/null +++ b/packages/lib/server-only/team/update-team-email.ts @@ -0,0 +1,42 @@ +import { prisma } from '@documenso/prisma'; + +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../../constants/teams'; + +export type UpdateTeamEmailOptions = { + userId: number; + teamId: number; + data: { + name: string; + }; +}; + +export const updateTeamEmail = async ({ userId, teamId, data }: UpdateTeamEmailOptions) => { + await prisma.$transaction(async (tx) => { + await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + teamEmail: { + isNot: null, + }, + }, + }); + + await tx.teamEmail.update({ + where: { + teamId, + }, + data: { + // Note: Never allow the email to be updated without re-verifying via email. + name: data.name, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/update-team-member.ts b/packages/lib/server-only/team/update-team-member.ts new file mode 100644 index 000000000..9a4a85f85 --- /dev/null +++ b/packages/lib/server-only/team/update-team-member.ts @@ -0,0 +1,92 @@ +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { isTeamRoleWithinUserHierarchy } from '@documenso/lib/utils/teams'; +import { prisma } from '@documenso/prisma'; +import type { TeamMemberRole } from '@documenso/prisma/client'; + +export type UpdateTeamMemberOptions = { + userId: number; + teamId: number; + teamMemberId: number; + data: { + role: TeamMemberRole; + }; +}; + +export const updateTeamMember = async ({ + userId, + teamId, + teamMemberId, + data, +}: UpdateTeamMemberOptions) => { + await prisma.$transaction(async (tx) => { + // Find the team and validate that the user is allowed to update members. + const team = await tx.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + include: { + members: { + select: { + id: true, + userId: true, + role: true, + }, + }, + }, + }); + + const currentTeamMember = team.members.find((member) => member.userId === userId); + const teamMemberToUpdate = team.members.find((member) => member.id === teamMemberId); + + if (!teamMemberToUpdate || !currentTeamMember) { + throw new AppError(AppErrorCode.NOT_FOUND, 'Team member does not exist'); + } + + if (teamMemberToUpdate.userId === team.ownerUserId) { + throw new AppError(AppErrorCode.UNAUTHORIZED, 'Cannot update the owner'); + } + + const isMemberToUpdateHigherRole = !isTeamRoleWithinUserHierarchy( + currentTeamMember.role, + teamMemberToUpdate.role, + ); + + if (isMemberToUpdateHigherRole) { + throw new AppError(AppErrorCode.UNAUTHORIZED, 'Cannot update a member with a higher role'); + } + + const isNewMemberRoleHigherThanCurrentRole = !isTeamRoleWithinUserHierarchy( + currentTeamMember.role, + data.role, + ); + + if (isNewMemberRoleHigherThanCurrentRole) { + throw new AppError( + AppErrorCode.UNAUTHORIZED, + 'Cannot give a member a role higher than the user initating the update', + ); + } + + return await tx.teamMember.update({ + where: { + id: teamMemberId, + teamId, + userId: { + not: team.ownerUserId, + }, + }, + data: { + role: data.role, + }, + }); + }); +}; diff --git a/packages/lib/server-only/team/update-team.ts b/packages/lib/server-only/team/update-team.ts new file mode 100644 index 000000000..b172d3359 --- /dev/null +++ b/packages/lib/server-only/team/update-team.ts @@ -0,0 +1,65 @@ +import { z } from 'zod'; + +import { TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '@documenso/lib/constants/teams'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { prisma } from '@documenso/prisma'; +import { Prisma } from '@documenso/prisma/client'; + +export type UpdateTeamOptions = { + userId: number; + teamId: number; + data: { + name?: string; + url?: string; + }; +}; + +export const updateTeam = async ({ userId, teamId, data }: UpdateTeamOptions) => { + try { + await prisma.$transaction(async (tx) => { + const foundPendingTeamWithUrl = await tx.teamPending.findFirst({ + where: { + url: data.url, + }, + }); + + if (foundPendingTeamWithUrl) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Team URL already exists.'); + } + + const team = await tx.team.update({ + where: { + id: teamId, + members: { + some: { + userId, + role: { + in: TEAM_MEMBER_ROLE_PERMISSIONS_MAP['MANAGE_TEAM'], + }, + }, + }, + }, + data: { + url: data.url, + name: data.name, + }, + }); + + return team; + }); + } catch (err) { + console.error(err); + + if (!(err instanceof Prisma.PrismaClientKnownRequestError)) { + throw err; + } + + const target = z.array(z.string()).safeParse(err.meta?.target); + + if (err.code === 'P2002' && target.success && target.data.includes('url')) { + throw new AppError(AppErrorCode.ALREADY_EXISTS, 'Team URL already exists.'); + } + + throw err; + } +}; diff --git a/packages/lib/server-only/user/create-user.ts b/packages/lib/server-only/user/create-user.ts index f7db60c85..42a9f128c 100644 --- a/packages/lib/server-only/user/create-user.ts +++ b/packages/lib/server-only/user/create-user.ts @@ -1,11 +1,12 @@ import { hash } from 'bcrypt'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; +import { updateSubscriptionItemQuantity } from '@documenso/ee/server-only/stripe/update-subscription-item-quantity'; import { prisma } from '@documenso/prisma'; -import { IdentityProvider } from '@documenso/prisma/client'; +import { IdentityProvider, Prisma, TeamMemberInviteStatus } from '@documenso/prisma/client'; +import { IS_BILLING_ENABLED } from '../../constants/app'; import { SALT_ROUNDS } from '../../constants/auth'; -import { getFlag } from '../../universal/get-feature-flag'; export interface CreateUserOptions { name: string; @@ -15,8 +16,6 @@ export interface CreateUserOptions { } export const createUser = async ({ name, email, password, signature }: CreateUserOptions) => { - const isBillingEnabled = await getFlag('app_billing'); - const hashedPassword = await hash(password, SALT_ROUNDS); const userExists = await prisma.user.findFirst({ @@ -29,7 +28,7 @@ export const createUser = async ({ name, email, password, signature }: CreateUse throw new Error('User already exists'); } - let user = await prisma.user.create({ + const user = await prisma.user.create({ data: { name, email: email.toLowerCase(), @@ -39,12 +38,81 @@ export const createUser = async ({ name, email, password, signature }: CreateUse }, }); - if (isBillingEnabled) { + const acceptedTeamInvites = await prisma.teamMemberInvite.findMany({ + where: { + email: { + equals: email, + mode: Prisma.QueryMode.insensitive, + }, + status: TeamMemberInviteStatus.ACCEPTED, + }, + }); + + // For each team invite, add the user to the team and delete the team invite. + // If an error occurs, reset the invitation to not accepted. + await Promise.allSettled( + acceptedTeamInvites.map(async (invite) => + prisma + .$transaction(async (tx) => { + await tx.teamMember.create({ + data: { + teamId: invite.teamId, + userId: user.id, + role: invite.role, + }, + }); + + await tx.teamMemberInvite.delete({ + where: { + id: invite.id, + }, + }); + + if (!IS_BILLING_ENABLED) { + return; + } + + const team = await tx.team.findFirstOrThrow({ + where: { + id: invite.teamId, + }, + include: { + members: { + select: { + id: true, + }, + }, + subscription: true, + }, + }); + + if (team.subscription) { + await updateSubscriptionItemQuantity({ + priceId: team.subscription.priceId, + subscriptionId: team.subscription.planId, + quantity: team.members.length, + }); + } + }) + .catch(async () => { + await prisma.teamMemberInvite.update({ + where: { + id: invite.id, + }, + data: { + status: TeamMemberInviteStatus.PENDING, + }, + }); + }), + ), + ); + + // Update the user record with a new or existing Stripe customer record. + if (IS_BILLING_ENABLED) { try { - const stripeSession = await getStripeCustomerByUser(user); - user = stripeSession.user; - } catch (e) { - console.error(e); + return await getStripeCustomerByUser(user).then((session) => session.user); + } catch (err) { + console.error(err); } } diff --git a/packages/lib/utils/billing.ts b/packages/lib/utils/billing.ts new file mode 100644 index 000000000..ca85addbb --- /dev/null +++ b/packages/lib/utils/billing.ts @@ -0,0 +1,16 @@ +import type { Subscription } from '.prisma/client'; +import { SubscriptionStatus } from '.prisma/client'; + +/** + * Returns true if there is a subscription that is active and is a community plan. + */ +export const subscriptionsContainsActiveCommunityPlan = ( + subscriptions: Subscription[], + communityPlanPriceIds: string[], +) => { + return subscriptions.some( + (subscription) => + subscription.status === SubscriptionStatus.ACTIVE && + communityPlanPriceIds.includes(subscription.priceId), + ); +}; diff --git a/packages/lib/utils/params.ts b/packages/lib/utils/params.ts new file mode 100644 index 000000000..a8d799400 --- /dev/null +++ b/packages/lib/utils/params.ts @@ -0,0 +1,30 @@ +/** + * From an unknown string, parse it into an integer array. + * + * Filter out unknown values. + */ +export const parseToIntegerArray = (value: unknown): number[] => { + if (typeof value !== 'string') { + return []; + } + + return value + .split(',') + .map((value) => parseInt(value, 10)) + .filter((value) => !isNaN(value)); +}; + +type GetRootHrefOptions = { + returnEmptyRootString?: boolean; +}; + +export const getRootHref = ( + params: Record | null, + options: GetRootHrefOptions = {}, +) => { + if (typeof params?.teamUrl === 'string') { + return `/t/${params.teamUrl}`; + } + + return options.returnEmptyRootString ? '' : '/'; +}; diff --git a/packages/lib/utils/recipient-formatter.ts b/packages/lib/utils/recipient-formatter.ts index 2e2bace3b..5fad45399 100644 --- a/packages/lib/utils/recipient-formatter.ts +++ b/packages/lib/utils/recipient-formatter.ts @@ -1,6 +1,6 @@ import type { Recipient } from '@documenso/prisma/client'; -export const recipientInitials = (text: string) => +export const extractInitials = (text: string) => text .split(' ') .map((name: string) => name.slice(0, 1).toUpperCase()) @@ -8,5 +8,5 @@ export const recipientInitials = (text: string) => .join(''); export const recipientAbbreviation = (recipient: Recipient) => { - return recipientInitials(recipient.name) || recipient.email.slice(0, 1).toUpperCase(); + return extractInitials(recipient.name) || recipient.email.slice(0, 1).toUpperCase(); }; diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts new file mode 100644 index 000000000..eb9be2c2b --- /dev/null +++ b/packages/lib/utils/teams.ts @@ -0,0 +1,42 @@ +import { WEBAPP_BASE_URL } from '../constants/app'; +import type { TEAM_MEMBER_ROLE_MAP } from '../constants/teams'; +import { TEAM_MEMBER_ROLE_HIERARCHY, TEAM_MEMBER_ROLE_PERMISSIONS_MAP } from '../constants/teams'; + +export const formatTeamUrl = (teamUrl: string, baseUrl?: string) => { + const formattedBaseUrl = (baseUrl ?? WEBAPP_BASE_URL).replace(/https?:\/\//, ''); + + return `${formattedBaseUrl}/t/${teamUrl}`; +}; + +export const formatDocumentsPath = (teamUrl?: string) => { + return teamUrl ? `/t/${teamUrl}/documents` : '/documents'; +}; + +/** + * Determines whether a team member can execute a given action. + * + * @param action The action the user is trying to execute. + * @param role The current role of the user. + * @returns Whether the user can execute the action. + */ +export const canExecuteTeamAction = ( + action: keyof typeof TEAM_MEMBER_ROLE_PERMISSIONS_MAP, + role: keyof typeof TEAM_MEMBER_ROLE_MAP, +) => { + return TEAM_MEMBER_ROLE_PERMISSIONS_MAP[action].some((i) => i === role); +}; + +/** + * Compares the provided `currentUserRole` with the provided `roleToCheck` to determine + * whether the `currentUserRole` has permission to modify the `roleToCheck`. + * + * @param currentUserRole Role of the current user + * @param roleToCheck Role of another user to see if the current user can modify + * @returns True if the current user can modify the other user, false otherwise + */ +export const isTeamRoleWithinUserHierarchy = ( + currentUserRole: keyof typeof TEAM_MEMBER_ROLE_MAP, + roleToCheck: keyof typeof TEAM_MEMBER_ROLE_MAP, +) => { + return TEAM_MEMBER_ROLE_HIERARCHY[currentUserRole].some((i) => i === roleToCheck); +}; diff --git a/packages/lib/utils/token-verification.ts b/packages/lib/utils/token-verification.ts new file mode 100644 index 000000000..c57ddd1e5 --- /dev/null +++ b/packages/lib/utils/token-verification.ts @@ -0,0 +1,21 @@ +import type { DurationLike } from 'luxon'; +import { DateTime } from 'luxon'; +import { nanoid } from 'nanoid'; + +/** + * Create a token verification object. + * + * @param expiry The date the token expires, or the duration until the token expires. + */ +export const createTokenVerification = (expiry: Date | DurationLike) => { + const expiresAt = expiry instanceof Date ? expiry : DateTime.now().plus(expiry).toJSDate(); + + return { + expiresAt, + token: nanoid(32), + }; +}; + +export const isTokenExpired = (expiresAt: Date) => { + return expiresAt < new Date(); +}; diff --git a/packages/prisma/migrations/20240205040421_add_teams/migration.sql b/packages/prisma/migrations/20240205040421_add_teams/migration.sql new file mode 100644 index 000000000..f80799aab --- /dev/null +++ b/packages/prisma/migrations/20240205040421_add_teams/migration.sql @@ -0,0 +1,187 @@ +/* + Warnings: + + - A unique constraint covering the columns `[teamId]` on the table `Subscription` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateEnum +CREATE TYPE "TeamMemberRole" AS ENUM ('ADMIN', 'MANAGER', 'MEMBER'); + +-- CreateEnum +CREATE TYPE "TeamMemberInviteStatus" AS ENUM ('ACCEPTED', 'PENDING'); + +-- AlterTable +ALTER TABLE "Document" ADD COLUMN "teamId" INTEGER; + +-- AlterTable +ALTER TABLE "Subscription" ADD COLUMN "teamId" INTEGER, +ALTER COLUMN "userId" DROP NOT NULL; + +-- CreateTable +CREATE TABLE "Team" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "customerId" TEXT, + "ownerUserId" INTEGER NOT NULL, + + CONSTRAINT "Team_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TeamPending" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "customerId" TEXT NOT NULL, + "ownerUserId" INTEGER NOT NULL, + + CONSTRAINT "TeamPending_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TeamMember" ( + "id" SERIAL NOT NULL, + "teamId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "role" "TeamMemberRole" NOT NULL, + "userId" INTEGER NOT NULL, + + CONSTRAINT "TeamMember_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TeamEmail" ( + "teamId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + + CONSTRAINT "TeamEmail_pkey" PRIMARY KEY ("teamId") +); + +-- CreateTable +CREATE TABLE "TeamEmailVerification" ( + "teamId" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "TeamEmailVerification_pkey" PRIMARY KEY ("teamId") +); + +-- CreateTable +CREATE TABLE "TeamTransferVerification" ( + "teamId" INTEGER NOT NULL, + "userId" INTEGER NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "clearPaymentMethods" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "TeamTransferVerification_pkey" PRIMARY KEY ("teamId") +); + +-- CreateTable +CREATE TABLE "TeamMemberInvite" ( + "id" SERIAL NOT NULL, + "teamId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "email" TEXT NOT NULL, + "status" "TeamMemberInviteStatus" NOT NULL DEFAULT 'PENDING', + "role" "TeamMemberRole" NOT NULL, + "token" TEXT NOT NULL, + + CONSTRAINT "TeamMemberInvite_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Team_url_key" ON "Team"("url"); + +-- CreateIndex +CREATE UNIQUE INDEX "Team_customerId_key" ON "Team"("customerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamPending_url_key" ON "TeamPending"("url"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamPending_customerId_key" ON "TeamPending"("customerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamMember_userId_teamId_key" ON "TeamMember"("userId", "teamId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamEmail_teamId_key" ON "TeamEmail"("teamId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamEmail_email_key" ON "TeamEmail"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamEmailVerification_teamId_key" ON "TeamEmailVerification"("teamId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamEmailVerification_token_key" ON "TeamEmailVerification"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamTransferVerification_teamId_key" ON "TeamTransferVerification"("teamId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamTransferVerification_token_key" ON "TeamTransferVerification"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamMemberInvite_token_key" ON "TeamMemberInvite"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "TeamMemberInvite_teamId_email_key" ON "TeamMemberInvite"("teamId", "email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Subscription_teamId_key" ON "Subscription"("teamId"); + +-- AddForeignKey +ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Document" ADD CONSTRAINT "Document_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Team" ADD CONSTRAINT "Team_ownerUserId_fkey" FOREIGN KEY ("ownerUserId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamPending" ADD CONSTRAINT "TeamPending_ownerUserId_fkey" FOREIGN KEY ("ownerUserId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamMember" ADD CONSTRAINT "TeamMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamMember" ADD CONSTRAINT "TeamMember_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamEmail" ADD CONSTRAINT "TeamEmail_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamEmailVerification" ADD CONSTRAINT "TeamEmailVerification_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamTransferVerification" ADD CONSTRAINT "TeamTransferVerification_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TeamMemberInvite" ADD CONSTRAINT "TeamMemberInvite_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +ALTER TABLE "Subscription" +ADD CONSTRAINT teamId_or_userId_check +CHECK ( + ( + "teamId" IS NOT NULL + AND "userId" IS NULL + ) + OR ( + "teamId" IS NULL + AND "userId" IS NOT NULL + ) +); diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 2fb01a6ac..301b51dba 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -21,7 +21,8 @@ "@prisma/client": "5.4.2", "dotenv": "^16.3.1", "dotenv-cli": "^7.3.0", - "prisma": "5.4.2" + "prisma": "5.4.2", + "ts-pattern": "^5.0.6" }, "devDependencies": { "ts-node": "^10.9.1", diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 87d29d6b2..79dcdf6aa 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -37,6 +37,9 @@ model User { Document Document[] Subscription Subscription[] PasswordResetToken PasswordResetToken[] + ownedTeams Team[] + ownedPendingTeams TeamPending[] + teamMembers TeamMember[] twoFactorSecret String? twoFactorEnabled Boolean @default(false) twoFactorBackupCodes String? @@ -103,12 +106,14 @@ model Subscription { planId String @unique priceId String periodEnd DateTime? - userId Int + userId Int? + teamId Int? @unique createdAt DateTime @default(now()) updatedAt DateTime @updatedAt cancelAtPeriodEnd Boolean @default(false) - User User @relation(fields: [userId], references: [id], onDelete: Cascade) + team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) + User User? @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } @@ -162,6 +167,8 @@ model Document { updatedAt DateTime @default(now()) @updatedAt completedAt DateTime? deletedAt DateTime? + teamId Int? + team Team? @relation(fields: [teamId], references: [id]) @@unique([documentDataId]) @@index([userId]) @@ -300,6 +307,104 @@ model DocumentShareLink { @@unique([documentId, email]) } +enum TeamMemberRole { + ADMIN + MANAGER + MEMBER +} + +enum TeamMemberInviteStatus { + ACCEPTED + PENDING +} + +model Team { + id Int @id @default(autoincrement()) + name String + url String @unique + createdAt DateTime @default(now()) + customerId String? @unique + ownerUserId Int + members TeamMember[] + invites TeamMemberInvite[] + teamEmail TeamEmail? + emailVerification TeamEmailVerification? + transferVerification TeamTransferVerification? + + owner User @relation(fields: [ownerUserId], references: [id]) + subscription Subscription? + + document Document[] +} + +model TeamPending { + id Int @id @default(autoincrement()) + name String + url String @unique + createdAt DateTime @default(now()) + customerId String @unique + ownerUserId Int + + owner User @relation(fields: [ownerUserId], references: [id], onDelete: Cascade) +} + +model TeamMember { + id Int @id @default(autoincrement()) + teamId Int + createdAt DateTime @default(now()) + role TeamMemberRole + userId Int + user User @relation(fields: [userId], references: [id]) + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) + + @@unique([userId, teamId]) +} + +model TeamEmail { + teamId Int @id @unique + createdAt DateTime @default(now()) + name String + email String @unique + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) +} + +model TeamEmailVerification { + teamId Int @id @unique + name String + email String + token String @unique + expiresAt DateTime + createdAt DateTime @default(now()) + + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) +} + +model TeamTransferVerification { + teamId Int @id @unique + userId Int + name String + email String + token String @unique + expiresAt DateTime + createdAt DateTime @default(now()) + clearPaymentMethods Boolean @default(false) + + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) +} + +model TeamMemberInvite { + id Int @id @default(autoincrement()) + teamId Int + createdAt DateTime @default(now()) + email String + status TeamMemberInviteStatus @default(PENDING) + role TeamMemberRole + token String @unique + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) + + @@unique([teamId, email]) +} + enum TemplateType { PUBLIC PRIVATE diff --git a/packages/prisma/seed/documents.ts b/packages/prisma/seed/documents.ts new file mode 100644 index 000000000..1f1f5cab8 --- /dev/null +++ b/packages/prisma/seed/documents.ts @@ -0,0 +1,375 @@ +import type { User } from '@prisma/client'; +import { nanoid } from 'nanoid'; +import fs from 'node:fs'; +import path from 'node:path'; +import { match } from 'ts-pattern'; + +import { prisma } from '..'; +import { + DocumentDataType, + DocumentStatus, + FieldType, + Prisma, + ReadStatus, + SendStatus, + SigningStatus, +} from '../client'; +import { seedTeam } from './teams'; +import { seedUser } from './users'; + +const examplePdf = fs + .readFileSync(path.join(__dirname, '../../../assets/example.pdf')) + .toString('base64'); + +type DocumentToSeed = { + sender: User; + recipients: (User | string)[]; + type: DocumentStatus; + documentOptions?: Partial; +}; + +export const seedDocuments = async (documents: DocumentToSeed[]) => { + await Promise.all( + documents.map(async (document, i) => + match(document.type) + .with(DocumentStatus.DRAFT, async () => + createDraftDocument(document.sender, document.recipients, { + key: i, + createDocumentOptions: document.documentOptions, + }), + ) + .with(DocumentStatus.PENDING, async () => + createPendingDocument(document.sender, document.recipients, { + key: i, + createDocumentOptions: document.documentOptions, + }), + ) + .with(DocumentStatus.COMPLETED, async () => + createCompletedDocument(document.sender, document.recipients, { + key: i, + createDocumentOptions: document.documentOptions, + }), + ) + .exhaustive(), + ), + ); +}; + +const createDraftDocument = async ( + sender: User, + recipients: (User | string)[], + options: CreateDocumentOptions = {}, +) => { + const { key, createDocumentOptions = {} } = options; + + const documentData = await prisma.documentData.create({ + data: { + type: DocumentDataType.BYTES_64, + data: examplePdf, + initialData: examplePdf, + }, + }); + + const document = await prisma.document.create({ + data: { + title: `[TEST] Document ${key} - Draft`, + status: DocumentStatus.DRAFT, + documentDataId: documentData.id, + userId: sender.id, + ...createDocumentOptions, + }, + }); + + for (const recipient of recipients) { + const email = typeof recipient === 'string' ? recipient : recipient.email; + const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + + await prisma.recipient.create({ + data: { + email, + name, + token: nanoid(), + readStatus: ReadStatus.NOT_OPENED, + sendStatus: SendStatus.NOT_SENT, + signingStatus: SigningStatus.NOT_SIGNED, + signedAt: new Date(), + Document: { + connect: { + id: document.id, + }, + }, + Field: { + create: { + page: 1, + type: FieldType.NAME, + inserted: true, + customText: name, + positionX: new Prisma.Decimal(1), + positionY: new Prisma.Decimal(1), + width: new Prisma.Decimal(1), + height: new Prisma.Decimal(1), + documentId: document.id, + }, + }, + }, + }); + } +}; + +type CreateDocumentOptions = { + key?: string | number; + createDocumentOptions?: Partial; +}; + +const createPendingDocument = async ( + sender: User, + recipients: (User | string)[], + options: CreateDocumentOptions = {}, +) => { + const { key, createDocumentOptions = {} } = options; + + const documentData = await prisma.documentData.create({ + data: { + type: DocumentDataType.BYTES_64, + data: examplePdf, + initialData: examplePdf, + }, + }); + + const document = await prisma.document.create({ + data: { + title: `[TEST] Document ${key} - Pending`, + status: DocumentStatus.PENDING, + documentDataId: documentData.id, + userId: sender.id, + ...createDocumentOptions, + }, + }); + + for (const recipient of recipients) { + const email = typeof recipient === 'string' ? recipient : recipient.email; + const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + + await prisma.recipient.create({ + data: { + email, + name, + token: nanoid(), + readStatus: ReadStatus.OPENED, + sendStatus: SendStatus.SENT, + signingStatus: SigningStatus.NOT_SIGNED, + signedAt: new Date(), + Document: { + connect: { + id: document.id, + }, + }, + Field: { + create: { + page: 1, + type: FieldType.NAME, + inserted: true, + customText: name, + positionX: new Prisma.Decimal(1), + positionY: new Prisma.Decimal(1), + width: new Prisma.Decimal(1), + height: new Prisma.Decimal(1), + documentId: document.id, + }, + }, + }, + }); + } +}; + +const createCompletedDocument = async ( + sender: User, + recipients: (User | string)[], + options: CreateDocumentOptions = {}, +) => { + const { key, createDocumentOptions = {} } = options; + + const documentData = await prisma.documentData.create({ + data: { + type: DocumentDataType.BYTES_64, + data: examplePdf, + initialData: examplePdf, + }, + }); + + const document = await prisma.document.create({ + data: { + title: `[TEST] Document ${key} - Completed`, + status: DocumentStatus.COMPLETED, + documentDataId: documentData.id, + userId: sender.id, + ...createDocumentOptions, + }, + }); + + for (const recipient of recipients) { + const email = typeof recipient === 'string' ? recipient : recipient.email; + const name = typeof recipient === 'string' ? recipient : recipient.name ?? ''; + + await prisma.recipient.create({ + data: { + email, + name, + token: nanoid(), + readStatus: ReadStatus.OPENED, + sendStatus: SendStatus.SENT, + signingStatus: SigningStatus.SIGNED, + signedAt: new Date(), + Document: { + connect: { + id: document.id, + }, + }, + Field: { + create: { + page: 1, + type: FieldType.NAME, + inserted: true, + customText: name, + positionX: new Prisma.Decimal(1), + positionY: new Prisma.Decimal(1), + width: new Prisma.Decimal(1), + height: new Prisma.Decimal(1), + documentId: document.id, + }, + }, + }, + }); + } +}; + +/** + * Create 5 team documents: + * - Completed document with 2 recipients. + * - Pending document with 1 recipient. + * - Pending document with 4 recipients. + * - Draft document with 3 recipients. + * - Draft document with 2 recipients. + * + * Create 3 non team documents where the user is a team member: + * - Completed document with 2 recipients. + * - Pending document with 1 recipient. + * - Draft document with 2 recipients. + * + * Create 3 non team documents where the user is not a team member, but the recipient is: + * - Completed document with 2 recipients. + * - Pending document with 1 recipient. + * - Draft document with 2 recipients. + * + * This should result in the following team document dashboard counts: + * - 0 Inbox + * - 2 Pending + * - 1 Completed + * - 2 Draft + * - 5 All + */ +export const seedTeamDocuments = async () => { + const team = await seedTeam({ + createTeamMembers: 4, + }); + + const documentOptions = { + teamId: team.id, + }; + + const teamMember1 = team.members[1].user; + const teamMember2 = team.members[2].user; + const teamMember3 = team.members[3].user; + const teamMember4 = team.members[4].user; + + const [testUser1, testUser2, testUser3, testUser4] = await Promise.all([ + seedUser(), + seedUser(), + seedUser(), + seedUser(), + ]); + + await seedDocuments([ + /** + * Team documents. + */ + { + sender: teamMember1, + recipients: [testUser1, testUser2], + type: DocumentStatus.COMPLETED, + documentOptions, + }, + { + sender: teamMember2, + recipients: [testUser1], + type: DocumentStatus.PENDING, + documentOptions, + }, + { + sender: teamMember2, + recipients: [testUser1, testUser2, testUser3, testUser4], + type: DocumentStatus.PENDING, + documentOptions, + }, + { + sender: teamMember2, + recipients: [testUser1, testUser2, teamMember1], + type: DocumentStatus.DRAFT, + documentOptions, + }, + { + sender: team.owner, + recipients: [testUser1, testUser2], + type: DocumentStatus.DRAFT, + documentOptions, + }, + /** + * Non team documents where the sender is a team member and recipient is not. + */ + { + sender: teamMember1, + recipients: [testUser1, testUser2], + type: DocumentStatus.COMPLETED, + }, + { + sender: teamMember2, + recipients: [testUser1], + type: DocumentStatus.PENDING, + }, + { + sender: teamMember3, + recipients: [testUser1, testUser2], + type: DocumentStatus.DRAFT, + }, + /** + * Non team documents where the sender is not a team member and recipient is. + */ + { + sender: testUser1, + recipients: [teamMember1, teamMember2], + type: DocumentStatus.COMPLETED, + }, + { + sender: testUser2, + recipients: [teamMember1], + type: DocumentStatus.PENDING, + }, + { + sender: testUser3, + recipients: [teamMember1, teamMember2], + type: DocumentStatus.DRAFT, + }, + ]); + + return { + team, + teamMember1, + teamMember2, + teamMember3, + teamMember4, + testUser1, + testUser2, + testUser3, + testUser4, + }; +}; diff --git a/packages/prisma/seed/teams.ts b/packages/prisma/seed/teams.ts new file mode 100644 index 000000000..99b0df8d5 --- /dev/null +++ b/packages/prisma/seed/teams.ts @@ -0,0 +1,177 @@ +import { prisma } from '..'; +import { TeamMemberInviteStatus, TeamMemberRole } from '../client'; +import { seedUser } from './users'; + +const EMAIL_DOMAIN = `test.documenso.com`; + +type SeedTeamOptions = { + createTeamMembers?: number; + createTeamEmail?: true | string; +}; + +export const seedTeam = async ({ + createTeamMembers = 0, + createTeamEmail, +}: SeedTeamOptions = {}) => { + const teamUrl = `team-${Date.now()}`; + const teamEmail = createTeamEmail === true ? `${teamUrl}@${EMAIL_DOMAIN}` : createTeamEmail; + + const teamOwner = await seedUser({ + name: `${teamUrl}-original-owner`, + email: `${teamUrl}-original-owner@${EMAIL_DOMAIN}`, + }); + + const teamMembers = await Promise.all( + Array.from({ length: createTeamMembers }).map(async (_, i) => { + return seedUser({ + name: `${teamUrl}-member-${i + 1}`, + email: `${teamUrl}-member-${i + 1}@${EMAIL_DOMAIN}`, + }); + }), + ); + + const team = await prisma.team.create({ + data: { + name: teamUrl, + url: teamUrl, + ownerUserId: teamOwner.id, + members: { + createMany: { + data: [teamOwner, ...teamMembers].map((user) => ({ + userId: user.id, + role: TeamMemberRole.ADMIN, + })), + }, + }, + teamEmail: teamEmail + ? { + create: { + email: teamEmail, + name: teamEmail, + }, + } + : undefined, + }, + }); + + return await prisma.team.findFirstOrThrow({ + where: { + id: team.id, + }, + include: { + owner: true, + members: { + include: { + user: true, + }, + }, + teamEmail: true, + }, + }); +}; + +export const unseedTeam = async (teamUrl: string) => { + const team = await prisma.team.findUnique({ + where: { + url: teamUrl, + }, + include: { + members: true, + }, + }); + + if (!team) { + return; + } + + await prisma.team.delete({ + where: { + url: teamUrl, + }, + }); + + await prisma.user.deleteMany({ + where: { + id: { + in: team.members.map((member) => member.userId), + }, + }, + }); +}; + +export const seedTeamTransfer = async (options: { newOwnerUserId: number; teamId: number }) => { + return await prisma.teamTransferVerification.create({ + data: { + teamId: options.teamId, + token: Date.now().toString(), + expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24), + userId: options.newOwnerUserId, + name: '', + email: '', + }, + }); +}; + +export const seedTeamEmail = async ({ email, teamId }: { email: string; teamId: number }) => { + return await prisma.teamEmail.create({ + data: { + name: email, + email, + teamId, + }, + }); +}; + +export const unseedTeamEmail = async ({ teamId }: { teamId: number }) => { + return await prisma.teamEmail.delete({ + where: { + teamId, + }, + }); +}; + +export const seedTeamInvite = async ({ + email, + teamId, + role = TeamMemberRole.ADMIN, +}: { + email: string; + teamId: number; + role?: TeamMemberRole; +}) => { + return await prisma.teamMemberInvite.create({ + data: { + email, + teamId, + role, + status: TeamMemberInviteStatus.PENDING, + token: Date.now().toString(), + }, + }); +}; + +export const seedTeamEmailVerification = async ({ + email, + teamId, +}: { + email: string; + teamId: number; +}) => { + return await prisma.teamEmailVerification.create({ + data: { + teamId, + email, + name: email, + expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24), + token: Date.now().toString(), + }, + }); +}; + +export const unseedTeamEmailVerification = async ({ teamId }: { teamId: number }) => { + return await prisma.teamEmailVerification.delete({ + where: { + teamId, + }, + }); +}; diff --git a/packages/prisma/seed/users.ts b/packages/prisma/seed/users.ts new file mode 100644 index 000000000..ce3858bc6 --- /dev/null +++ b/packages/prisma/seed/users.ts @@ -0,0 +1,34 @@ +import { hashSync } from '@documenso/lib/server-only/auth/hash'; + +import { prisma } from '..'; + +type SeedUserOptions = { + name?: string; + email?: string; + password?: string; + verified?: boolean; +}; + +export const seedUser = async ({ + name = `user-${Date.now()}`, + email = `user-${Date.now()}@test.documenso.com`, + password = 'password', + verified = true, +}: SeedUserOptions = {}) => { + return await prisma.user.create({ + data: { + name, + email, + password: hashSync(password), + emailVerified: verified ? new Date() : undefined, + }, + }); +}; + +export const unseedUser = async (userId: number) => { + await prisma.user.delete({ + where: { + id: userId, + }, + }); +}; diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index 9dba63797..5940d971d 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -36,10 +36,8 @@ export const documentRouter = router({ .input(ZGetDocumentByIdQuerySchema) .query(async ({ input, ctx }) => { try { - const { id } = input; - return await getDocumentById({ - id, + ...input, userId: ctx.user.id, }); } catch (err) { @@ -73,9 +71,9 @@ export const documentRouter = router({ .input(ZCreateDocumentMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { title, documentDataId } = input; + const { title, documentDataId, teamId } = input; - const { remaining } = await getServerLimits({ email: ctx.user.email }); + const { remaining } = await getServerLimits({ email: ctx.user.email, teamId }); if (remaining.documents <= 0) { throw new TRPCError({ @@ -87,6 +85,7 @@ export const documentRouter = router({ return await createDocument({ userId: ctx.user.id, + teamId, title, documentDataId, }); @@ -245,12 +244,9 @@ export const documentRouter = router({ .input(ZResendDocumentMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { documentId, recipients } = input; - return await resendDocument({ userId: ctx.user.id, - documentId, - recipients, + ...input, }); } catch (err) { console.error(err); @@ -266,14 +262,13 @@ export const documentRouter = router({ .input(ZGetDocumentByIdQuerySchema) .mutation(async ({ input, ctx }) => { try { - const { id } = input; - return await duplicateDocumentById({ - id, userId: ctx.user.id, + ...input, }); } catch (err) { console.log(err); + throw new TRPCError({ code: 'BAD_REQUEST', message: 'We are unable to duplicate this document. Please try again later.', diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 5d8c23c27..f8d008f50 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -4,6 +4,7 @@ import { DocumentStatus, FieldType, RecipientRole } from '@documenso/prisma/clie export const ZGetDocumentByIdQuerySchema = z.object({ id: z.number().min(1), + teamId: z.number().min(1).optional(), }); export type TGetDocumentByIdQuerySchema = z.infer; @@ -17,6 +18,7 @@ export type TGetDocumentByTokenQuerySchema = z.infer; @@ -86,6 +88,7 @@ export type TSetPasswordForDocumentMutationSchema = z.infer< export const ZResendDocumentMutationSchema = z.object({ documentId: z.number(), recipients: z.array(z.number()).min(1), + teamId: z.number().min(1).optional(), }); export type TSendDocumentMutationSchema = z.infer; diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index 3ed2a0d05..aec70fd63 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -7,6 +7,7 @@ import { profileRouter } from './profile-router/router'; import { recipientRouter } from './recipient-router/router'; import { shareLinkRouter } from './share-link-router/router'; import { singleplayerRouter } from './singleplayer-router/router'; +import { teamRouter } from './team-router/router'; import { templateRouter } from './template-router/router'; import { router } from './trpc'; import { twoFactorAuthenticationRouter } from './two-factor-authentication-router/router'; @@ -21,8 +22,9 @@ export const appRouter = router({ admin: adminRouter, shareLink: shareLinkRouter, singleplayer: singleplayerRouter, - twoFactorAuthentication: twoFactorAuthenticationRouter, + team: teamRouter, template: templateRouter, + twoFactorAuthentication: twoFactorAuthenticationRouter, }); export type AppRouter = typeof appRouter; diff --git a/packages/trpc/server/team-router/router.ts b/packages/trpc/server/team-router/router.ts new file mode 100644 index 000000000..dd2032daf --- /dev/null +++ b/packages/trpc/server/team-router/router.ts @@ -0,0 +1,508 @@ +import { getTeamPrices } from '@documenso/ee/server-only/stripe/get-team-prices'; +import { AppError } from '@documenso/lib/errors/app-error'; +import { acceptTeamInvitation } from '@documenso/lib/server-only/team/accept-team-invitation'; +import { createTeam } from '@documenso/lib/server-only/team/create-team'; +import { createTeamBillingPortal } from '@documenso/lib/server-only/team/create-team-billing-portal'; +import { createTeamPendingCheckoutSession } from '@documenso/lib/server-only/team/create-team-checkout-session'; +import { createTeamEmailVerification } from '@documenso/lib/server-only/team/create-team-email-verification'; +import { createTeamMemberInvites } from '@documenso/lib/server-only/team/create-team-member-invites'; +import { deleteTeam } from '@documenso/lib/server-only/team/delete-team'; +import { deleteTeamEmail } from '@documenso/lib/server-only/team/delete-team-email'; +import { deleteTeamEmailVerification } from '@documenso/lib/server-only/team/delete-team-email-verification'; +import { deleteTeamMemberInvitations } from '@documenso/lib/server-only/team/delete-team-invitations'; +import { deleteTeamMembers } from '@documenso/lib/server-only/team/delete-team-members'; +import { deleteTeamPending } from '@documenso/lib/server-only/team/delete-team-pending'; +import { deleteTeamTransferRequest } from '@documenso/lib/server-only/team/delete-team-transfer-request'; +import { findTeamInvoices } from '@documenso/lib/server-only/team/find-team-invoices'; +import { findTeamMemberInvites } from '@documenso/lib/server-only/team/find-team-member-invites'; +import { findTeamMembers } from '@documenso/lib/server-only/team/find-team-members'; +import { findTeams } from '@documenso/lib/server-only/team/find-teams'; +import { findTeamsPending } from '@documenso/lib/server-only/team/find-teams-pending'; +import { getTeamById } from '@documenso/lib/server-only/team/get-team'; +import { getTeamEmailByEmail } from '@documenso/lib/server-only/team/get-team-email-by-email'; +import { getTeamInvitations } from '@documenso/lib/server-only/team/get-team-invitations'; +import { getTeamMembers } from '@documenso/lib/server-only/team/get-team-members'; +import { getTeams } from '@documenso/lib/server-only/team/get-teams'; +import { leaveTeam } from '@documenso/lib/server-only/team/leave-team'; +import { requestTeamOwnershipTransfer } from '@documenso/lib/server-only/team/request-team-ownership-transfer'; +import { resendTeamEmailVerification } from '@documenso/lib/server-only/team/resend-team-email-verification'; +import { resendTeamMemberInvitation } from '@documenso/lib/server-only/team/resend-team-member-invitation'; +import { updateTeam } from '@documenso/lib/server-only/team/update-team'; +import { updateTeamEmail } from '@documenso/lib/server-only/team/update-team-email'; +import { updateTeamMember } from '@documenso/lib/server-only/team/update-team-member'; + +import { authenticatedProcedure, router } from '../trpc'; +import { + ZAcceptTeamInvitationMutationSchema, + ZCreateTeamBillingPortalMutationSchema, + ZCreateTeamEmailVerificationMutationSchema, + ZCreateTeamMemberInvitesMutationSchema, + ZCreateTeamMutationSchema, + ZCreateTeamPendingCheckoutMutationSchema, + ZDeleteTeamEmailMutationSchema, + ZDeleteTeamEmailVerificationMutationSchema, + ZDeleteTeamMemberInvitationsMutationSchema, + ZDeleteTeamMembersMutationSchema, + ZDeleteTeamMutationSchema, + ZDeleteTeamPendingMutationSchema, + ZDeleteTeamTransferRequestMutationSchema, + ZFindTeamInvoicesQuerySchema, + ZFindTeamMemberInvitesQuerySchema, + ZFindTeamMembersQuerySchema, + ZFindTeamsPendingQuerySchema, + ZFindTeamsQuerySchema, + ZGetTeamMembersQuerySchema, + ZGetTeamQuerySchema, + ZLeaveTeamMutationSchema, + ZRequestTeamOwnerhsipTransferMutationSchema, + ZResendTeamEmailVerificationMutationSchema, + ZResendTeamMemberInvitationMutationSchema, + ZUpdateTeamEmailMutationSchema, + ZUpdateTeamMemberMutationSchema, + ZUpdateTeamMutationSchema, +} from './schema'; + +export const teamRouter = router({ + acceptTeamInvitation: authenticatedProcedure + .input(ZAcceptTeamInvitationMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await acceptTeamInvitation({ + teamId: input.teamId, + userId: ctx.user.id, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + createBillingPortal: authenticatedProcedure + .input(ZCreateTeamBillingPortalMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await createTeamBillingPortal({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + createTeam: authenticatedProcedure + .input(ZCreateTeamMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await createTeam({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + createTeamEmailVerification: authenticatedProcedure + .input(ZCreateTeamEmailVerificationMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await createTeamEmailVerification({ + teamId: input.teamId, + userId: ctx.user.id, + data: { + email: input.email, + name: input.name, + }, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + createTeamMemberInvites: authenticatedProcedure + .input(ZCreateTeamMemberInvitesMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await createTeamMemberInvites({ + userId: ctx.user.id, + userName: ctx.user.name ?? '', + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + createTeamPendingCheckout: authenticatedProcedure + .input(ZCreateTeamPendingCheckoutMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await createTeamPendingCheckoutSession({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeam: authenticatedProcedure + .input(ZDeleteTeamMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeam({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamEmail: authenticatedProcedure + .input(ZDeleteTeamEmailMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamEmail({ + userId: ctx.user.id, + userEmail: ctx.user.email, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamEmailVerification: authenticatedProcedure + .input(ZDeleteTeamEmailVerificationMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamEmailVerification({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamMemberInvitations: authenticatedProcedure + .input(ZDeleteTeamMemberInvitationsMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamMemberInvitations({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamMembers: authenticatedProcedure + .input(ZDeleteTeamMembersMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamMembers({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamPending: authenticatedProcedure + .input(ZDeleteTeamPendingMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamPending({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + deleteTeamTransferRequest: authenticatedProcedure + .input(ZDeleteTeamTransferRequestMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await deleteTeamTransferRequest({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + findTeamInvoices: authenticatedProcedure + .input(ZFindTeamInvoicesQuerySchema) + .query(async ({ input, ctx }) => { + try { + return await findTeamInvoices({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + findTeamMemberInvites: authenticatedProcedure + .input(ZFindTeamMemberInvitesQuerySchema) + .query(async ({ input, ctx }) => { + try { + return await findTeamMemberInvites({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + findTeamMembers: authenticatedProcedure + .input(ZFindTeamMembersQuerySchema) + .query(async ({ input, ctx }) => { + try { + return await findTeamMembers({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + findTeams: authenticatedProcedure.input(ZFindTeamsQuerySchema).query(async ({ input, ctx }) => { + try { + return await findTeams({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + findTeamsPending: authenticatedProcedure + .input(ZFindTeamsPendingQuerySchema) + .query(async ({ input, ctx }) => { + try { + return await findTeamsPending({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeam: authenticatedProcedure.input(ZGetTeamQuerySchema).query(async ({ input, ctx }) => { + try { + return await getTeamById({ teamId: input.teamId, userId: ctx.user.id }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeamEmailByEmail: authenticatedProcedure.query(async ({ ctx }) => { + try { + return await getTeamEmailByEmail({ email: ctx.user.email }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeamInvitations: authenticatedProcedure.query(async ({ ctx }) => { + try { + return await getTeamInvitations({ email: ctx.user.email }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeamMembers: authenticatedProcedure + .input(ZGetTeamMembersQuerySchema) + .query(async ({ input, ctx }) => { + try { + return await getTeamMembers({ teamId: input.teamId, userId: ctx.user.id }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeamPrices: authenticatedProcedure.query(async () => { + try { + return await getTeamPrices(); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + getTeams: authenticatedProcedure.query(async ({ ctx }) => { + try { + return await getTeams({ userId: ctx.user.id }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + leaveTeam: authenticatedProcedure + .input(ZLeaveTeamMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await leaveTeam({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + updateTeam: authenticatedProcedure + .input(ZUpdateTeamMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await updateTeam({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + updateTeamEmail: authenticatedProcedure + .input(ZUpdateTeamEmailMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await updateTeamEmail({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + updateTeamMember: authenticatedProcedure + .input(ZUpdateTeamMemberMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await updateTeamMember({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + requestTeamOwnershipTransfer: authenticatedProcedure + .input(ZRequestTeamOwnerhsipTransferMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + return await requestTeamOwnershipTransfer({ + userId: ctx.user.id, + userName: ctx.user.name ?? '', + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + resendTeamEmailVerification: authenticatedProcedure + .input(ZResendTeamEmailVerificationMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + await resendTeamEmailVerification({ + userId: ctx.user.id, + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), + + resendTeamMemberInvitation: authenticatedProcedure + .input(ZResendTeamMemberInvitationMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + await resendTeamMemberInvitation({ + userId: ctx.user.id, + userName: ctx.user.name ?? '', + ...input, + }); + } catch (err) { + console.error(err); + + throw AppError.parseErrorToTRPCError(err); + } + }), +}); diff --git a/packages/trpc/server/team-router/schema.ts b/packages/trpc/server/team-router/schema.ts new file mode 100644 index 000000000..953b12490 --- /dev/null +++ b/packages/trpc/server/team-router/schema.ts @@ -0,0 +1,213 @@ +import { z } from 'zod'; + +import { PROTECTED_TEAM_URLS } from '@documenso/lib/constants/teams'; +import { TeamMemberRole } from '@documenso/prisma/client'; + +const GenericFindQuerySchema = z.object({ + term: z.string().optional(), + page: z.number().optional(), + perPage: z.number().optional(), +}); + +/** + * Restrict team URLs schema. + * + * Allowed characters: + * - Alphanumeric + * - Lowercase + * - Dashes + * - Underscores + * + * Conditions: + * - 3-30 characters + * - Cannot start and end with underscores or dashes. + * - Cannot contain consecutive underscores or dashes. + * - Cannot be a reserved URL in the PROTECTED_TEAM_URLS list + */ +export const ZTeamUrlSchema = z + .string() + .trim() + .min(3, { message: 'Team URL must be at least 3 characters long.' }) + .max(30, { message: 'Team URL must not exceed 30 characters.' }) + .toLowerCase() + .regex(/^[a-z0-9].*[^_-]$/, 'Team URL cannot start or end with dashes or underscores.') + .regex(/^(?!.*[-_]{2})/, 'Team URL cannot contain consecutive dashes or underscores.') + .regex( + /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/, + 'Team URL can only contain letters, numbers, dashes and underscores.', + ) + .refine((value) => !PROTECTED_TEAM_URLS.includes(value), { + message: 'This URL is already in use.', + }); + +export const ZTeamNameSchema = z + .string() + .trim() + .min(3, { message: 'Team name must be at least 3 characters long.' }) + .max(30, { message: 'Team name must not exceed 30 characters.' }); + +export const ZAcceptTeamInvitationMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZCreateTeamBillingPortalMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZCreateTeamMutationSchema = z.object({ + teamName: ZTeamNameSchema, + teamUrl: ZTeamUrlSchema, +}); + +export const ZCreateTeamEmailVerificationMutationSchema = z.object({ + teamId: z.number(), + name: z.string().trim().min(1, { message: 'Please enter a valid name.' }), + email: z.string().trim().email().toLowerCase().min(1, 'Please enter a valid email.'), +}); + +export const ZCreateTeamMemberInvitesMutationSchema = z.object({ + teamId: z.number(), + invitations: z.array( + z.object({ + email: z.string().email().toLowerCase(), + role: z.nativeEnum(TeamMemberRole), + }), + ), +}); + +export const ZCreateTeamPendingCheckoutMutationSchema = z.object({ + interval: z.union([z.literal('monthly'), z.literal('yearly')]), + pendingTeamId: z.number(), +}); + +export const ZDeleteTeamEmailMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZDeleteTeamEmailVerificationMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZDeleteTeamMembersMutationSchema = z.object({ + teamId: z.number(), + teamMemberIds: z.array(z.number()), +}); + +export const ZDeleteTeamMemberInvitationsMutationSchema = z.object({ + teamId: z.number(), + invitationIds: z.array(z.number()), +}); + +export const ZDeleteTeamMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZDeleteTeamPendingMutationSchema = z.object({ + pendingTeamId: z.number(), +}); + +export const ZDeleteTeamTransferRequestMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZFindTeamInvoicesQuerySchema = z.object({ + teamId: z.number(), +}); + +export const ZFindTeamMemberInvitesQuerySchema = GenericFindQuerySchema.extend({ + teamId: z.number(), +}); + +export const ZFindTeamMembersQuerySchema = GenericFindQuerySchema.extend({ + teamId: z.number(), +}); + +export const ZFindTeamsQuerySchema = GenericFindQuerySchema; + +export const ZFindTeamsPendingQuerySchema = GenericFindQuerySchema; + +export const ZGetTeamQuerySchema = z.object({ + teamId: z.number(), +}); + +export const ZGetTeamMembersQuerySchema = z.object({ + teamId: z.number(), +}); + +export const ZLeaveTeamMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZUpdateTeamMutationSchema = z.object({ + teamId: z.number(), + data: z.object({ + name: ZTeamNameSchema, + url: ZTeamUrlSchema, + }), +}); + +export const ZUpdateTeamEmailMutationSchema = z.object({ + teamId: z.number(), + data: z.object({ + name: z.string().trim().min(1), + }), +}); + +export const ZUpdateTeamMemberMutationSchema = z.object({ + teamId: z.number(), + teamMemberId: z.number(), + data: z.object({ + role: z.nativeEnum(TeamMemberRole), + }), +}); + +export const ZRequestTeamOwnerhsipTransferMutationSchema = z.object({ + teamId: z.number(), + newOwnerUserId: z.number(), + clearPaymentMethods: z.boolean(), +}); + +export const ZResendTeamEmailVerificationMutationSchema = z.object({ + teamId: z.number(), +}); + +export const ZResendTeamMemberInvitationMutationSchema = z.object({ + teamId: z.number(), + invitationId: z.number(), +}); + +export type TCreateTeamMutationSchema = z.infer; +export type TCreateTeamEmailVerificationMutationSchema = z.infer< + typeof ZCreateTeamEmailVerificationMutationSchema +>; +export type TCreateTeamMemberInvitesMutationSchema = z.infer< + typeof ZCreateTeamMemberInvitesMutationSchema +>; +export type TCreateTeamPendingCheckoutMutationSchema = z.infer< + typeof ZCreateTeamPendingCheckoutMutationSchema +>; +export type TDeleteTeamEmailMutationSchema = z.infer; +export type TDeleteTeamMembersMutationSchema = z.infer; +export type TDeleteTeamMutationSchema = z.infer; +export type TDeleteTeamPendingMutationSchema = z.infer; +export type TDeleteTeamTransferRequestMutationSchema = z.infer< + typeof ZDeleteTeamTransferRequestMutationSchema +>; +export type TFindTeamMemberInvitesQuerySchema = z.infer; +export type TFindTeamMembersQuerySchema = z.infer; +export type TFindTeamsQuerySchema = z.infer; +export type TFindTeamsPendingQuerySchema = z.infer; +export type TGetTeamQuerySchema = z.infer; +export type TGetTeamMembersQuerySchema = z.infer; +export type TLeaveTeamMutationSchema = z.infer; +export type TUpdateTeamMutationSchema = z.infer; +export type TUpdateTeamEmailMutationSchema = z.infer; +export type TRequestTeamOwnerhsipTransferMutationSchema = z.infer< + typeof ZRequestTeamOwnerhsipTransferMutationSchema +>; +export type TResendTeamEmailVerificationMutationSchema = z.infer< + typeof ZResendTeamEmailVerificationMutationSchema +>; +export type TResendTeamMemberInvitationMutationSchema = z.infer< + typeof ZResendTeamMemberInvitationMutationSchema +>; diff --git a/packages/ui/components/animate/animate-generic-fade-in-out.tsx b/packages/ui/components/animate/animate-generic-fade-in-out.tsx new file mode 100644 index 000000000..5f57c96df --- /dev/null +++ b/packages/ui/components/animate/animate-generic-fade-in-out.tsx @@ -0,0 +1,27 @@ +'use client'; + +import { motion } from 'framer-motion'; + +type AnimateGenericFadeInOutProps = { + children: React.ReactNode; + className?: string; +}; + +export const AnimateGenericFadeInOut = ({ children, className }: AnimateGenericFadeInOutProps) => { + return ( + + {children} + + ); +}; diff --git a/packages/ui/package.json b/packages/ui/package.json index 34675ba89..44d14cb82 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -35,7 +35,7 @@ "@radix-ui/react-checkbox": "^1.0.3", "@radix-ui/react-collapsible": "^1.0.2", "@radix-ui/react-context-menu": "^2.1.3", - "@radix-ui/react-dialog": "^1.0.3", + "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.4", "@radix-ui/react-hover-card": "^1.0.5", "@radix-ui/react-label": "^2.0.1", @@ -45,7 +45,7 @@ "@radix-ui/react-progress": "^1.0.2", "@radix-ui/react-radio-group": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.3", - "@radix-ui/react-select": "^1.2.1", + "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-separator": "^1.0.2", "@radix-ui/react-slider": "^1.1.1", "@radix-ui/react-slot": "^1.0.2", diff --git a/packages/ui/primitives/avatar.tsx b/packages/ui/primitives/avatar.tsx index 0039ad4eb..c80e3a658 100644 --- a/packages/ui/primitives/avatar.tsx +++ b/packages/ui/primitives/avatar.tsx @@ -48,4 +48,37 @@ const AvatarFallback = React.forwardRef< AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; -export { Avatar, AvatarImage, AvatarFallback }; +type AvatarWithTextProps = { + avatarClass?: string; + avatarFallback: string; + className?: string; + primaryText: React.ReactNode; + secondaryText?: React.ReactNode; + rightSideComponent?: React.ReactNode; +}; + +const AvatarWithText = ({ + avatarClass, + avatarFallback, + className, + primaryText, + secondaryText, + rightSideComponent, +}: AvatarWithTextProps) => ( +
+ + {avatarFallback} + + +
+ {primaryText} + {secondaryText} +
+ + {rightSideComponent} +
+); + +export { Avatar, AvatarImage, AvatarFallback, AvatarWithText }; diff --git a/packages/ui/primitives/badge.tsx b/packages/ui/primitives/badge.tsx index 1ff153f79..fd56bc1ce 100644 --- a/packages/ui/primitives/badge.tsx +++ b/packages/ui/primitives/badge.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; -import { VariantProps, cva } from 'class-variance-authority'; +import type { VariantProps } from 'class-variance-authority'; +import { cva } from 'class-variance-authority'; import { cn } from '../lib/utils'; diff --git a/packages/ui/primitives/button.tsx b/packages/ui/primitives/button.tsx index 5754b35a5..5fc3fc1bb 100644 --- a/packages/ui/primitives/button.tsx +++ b/packages/ui/primitives/button.tsx @@ -18,6 +18,7 @@ const buttonVariants = cva( secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80', ghost: 'hover:bg-accent hover:text-accent-foreground', link: 'underline-offset-4 hover:underline text-primary', + none: '', }, size: { default: 'h-10 py-2 px-4', diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index 65f88fc4e..fee5321cd 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -92,7 +92,7 @@ const CommandGroup = React.forwardRef< ) => (
); diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index 74764df80..9c8db7918 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -403,7 +403,7 @@ export const AddFieldsFormPartial = ({ {recipients.map((recipient) => ( { @@ -439,7 +439,7 @@ export const AddFieldsFormPartial = ({ ) : ( - + diff --git a/packages/ui/primitives/multi-select-combobox.tsx b/packages/ui/primitives/multi-select-combobox.tsx new file mode 100644 index 000000000..62e5fa2cf --- /dev/null +++ b/packages/ui/primitives/multi-select-combobox.tsx @@ -0,0 +1,165 @@ +'use client'; + +import * as React from 'react'; + +import { AnimatePresence } from 'framer-motion'; +import { Check, ChevronsUpDown, Loader, XIcon } from 'lucide-react'; + +import { AnimateGenericFadeInOut } from '@documenso/ui/components/animate/animate-generic-fade-in-out'; + +import { cn } from '../lib/utils'; +import { Button } from './button'; +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from './command'; +import { Popover, PopoverContent, PopoverTrigger } from './popover'; + +type OptionValue = string | number | boolean | null; + +type ComboBoxOption = { + label: string; + value: T; + disabled?: boolean; +}; + +type MultiSelectComboboxProps = { + emptySelectionPlaceholder?: React.ReactNode | string; + enableClearAllButton?: boolean; + loading?: boolean; + inputPlaceholder?: string; + onChange: (_values: T[]) => void; + options: ComboBoxOption[]; + selectedValues: T[]; +}; + +/** + * Multi select combo box component which supports: + * + * - Label/value pairs + * - Loading state + * - Clear all button + */ +export function MultiSelectCombobox({ + emptySelectionPlaceholder = 'Select values...', + enableClearAllButton, + inputPlaceholder, + loading, + onChange, + options, + selectedValues, +}: MultiSelectComboboxProps) { + const [open, setOpen] = React.useState(false); + + const handleSelect = (selectedOption: T) => { + let newSelectedOptions = [...selectedValues, selectedOption]; + + if (selectedValues.includes(selectedOption)) { + newSelectedOptions = selectedValues.filter((v) => v !== selectedOption); + } + + onChange(newSelectedOptions); + + setOpen(false); + }; + + const selectedOptions = React.useMemo(() => { + return selectedValues.map((value): ComboBoxOption => { + const foundOption = options.find((option) => option.value === value); + + if (foundOption) { + return foundOption; + } + + let label = ''; + + if (typeof value === 'string' || typeof value === 'number') { + label = value.toString(); + } + + return { + label, + value, + }; + }); + }, [selectedValues, options]); + + const buttonLabel = React.useMemo(() => { + if (loading) { + return ''; + } + + if (selectedOptions.length === 0) { + return emptySelectionPlaceholder; + } + + return selectedOptions.map((option) => option.label).join(', '); + }, [selectedOptions, emptySelectionPlaceholder, loading]); + + const showClearButton = enableClearAllButton && selectedValues.length > 0; + + return ( + +
+ + + + + {/* This is placed outside the trigger since we can't have nested buttons. */} + {showClearButton && !loading && ( +
+ +
+ )} +
+ + + + + No value found. + + {options.map((option, i) => ( + handleSelect(option.value)}> + + {option.label} + + ))} + + + +
+ ); +} diff --git a/turbo.json b/turbo.json index b0a7a0fc6..4ea966a4d 100644 --- a/turbo.json +++ b/turbo.json @@ -43,7 +43,6 @@ "NEXT_PUBLIC_POSTHOG_KEY", "NEXT_PUBLIC_FEATURE_BILLING_ENABLED", "NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID", - "NEXT_PUBLIC_STRIPE_FREE_PLAN_ID", "NEXT_PUBLIC_DISABLE_SIGNUP", "NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT", "NEXT_PRIVATE_DATABASE_URL", From fe4345eeb9f3cfc891469d901ebde22554b9f634 Mon Sep 17 00:00:00 2001 From: rajesh <71485855+rajesh-1252@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:15:46 +0530 Subject: [PATCH 26/61] fix: add responsive for blog preview mobile view (#906) This Issue https://github.com/documenso/documenso/issues/904 --- apps/marketing/src/app/(marketing)/layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/src/app/(marketing)/layout.tsx b/apps/marketing/src/app/(marketing)/layout.tsx index 248414b33..dd1a46418 100644 --- a/apps/marketing/src/app/(marketing)/layout.tsx +++ b/apps/marketing/src/app/(marketing)/layout.tsx @@ -41,7 +41,7 @@ export default function MarketingLayout({ children }: MarketingLayoutProps) {
-
{children}
+
{children}
From 2636d5fd16b53c45d8e8664f96d514160bfe60ae Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Tue, 6 Feb 2024 18:04:56 +0530 Subject: [PATCH 27/61] chore: finish and clean-up redirect post signing Signed-off-by: Adithya Krishna --- .../src/app/(signing)/sign/[token]/form.tsx | 10 +- .../src/app/(signing)/sign/[token]/page.tsx | 17 +- apps/web/src/middleware.ts | 3 +- package-lock.json | 13 +- packages/email/package.json | 4 +- packages/lib/constants/url-regex.ts | 2 + .../document/duplicate-document-by-id.ts | 1 + .../document/get-document-by-token.ts | 1 + .../migration.sql | 0 packages/prisma/schema.prisma | 2 +- .../trpc/server/document-router/schema.ts | 8 +- .../primitives/document-flow/add-subject.tsx | 151 ++++++++++-------- .../document-flow/add-subject.types.ts | 8 +- 13 files changed, 128 insertions(+), 92 deletions(-) create mode 100644 packages/lib/constants/url-regex.ts rename packages/prisma/migrations/{20240131120410_add_document_meta_redirect_url => 20240206111230_add_document_meta_redirect_url}/migration.sql (100%) diff --git a/apps/web/src/app/(signing)/sign/[token]/form.tsx b/apps/web/src/app/(signing)/sign/[token]/form.tsx index f7b96be71..7e6cf26b8 100644 --- a/apps/web/src/app/(signing)/sign/[token]/form.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/form.tsx @@ -8,7 +8,6 @@ import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; -import { getDocumentMetaByDocumentId } from '@documenso/lib/server-only/document/get-document-meta-by-document-id'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; import { type Document, type Field, type Recipient, RecipientRole } from '@documenso/prisma/client'; import { trpc } from '@documenso/trpc/react'; @@ -27,9 +26,10 @@ export type SigningFormProps = { document: Document; recipient: Recipient; fields: Field[]; + redirectUrl?: string | null; }; -export const SigningForm = ({ document, recipient, fields }: SigningFormProps) => { +export const SigningForm = ({ document, recipient, fields, redirectUrl }: SigningFormProps) => { const router = useRouter(); const analytics = useAnalytics(); const { data: session } = useSession(); @@ -56,7 +56,6 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) = }; const onFormSubmit = async () => { - const documentMeta = await getDocumentMetaByDocumentId({ id: document!.id }).catch(() => null); setValidateUninsertedFields(true); const isFieldsValid = validateFieldsInserted(fields); @@ -75,9 +74,8 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) = documentId: document.id, timestamp: new Date().toISOString(), }); - documentMeta?.redirectUrl - ? router.push(documentMeta.redirectUrl) - : router.push(`/sign/${recipient.token}/complete`); + + redirectUrl ? router.push(redirectUrl) : router.push(`/sign/${recipient.token}/complete`); }; return ( diff --git a/apps/web/src/app/(signing)/sign/[token]/page.tsx b/apps/web/src/app/(signing)/sign/[token]/page.tsx index a1e1388cd..9a7e8acbe 100644 --- a/apps/web/src/app/(signing)/sign/[token]/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/page.tsx @@ -8,7 +8,6 @@ import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones'; import { getServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token'; -import { getDocumentMetaByDocumentId } from '@documenso/lib/server-only/document/get-document-meta-by-document-id'; import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document'; import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token'; import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token'; @@ -49,15 +48,13 @@ export default async function SigningPage({ params: { token } }: SigningPageProp viewedDocument({ token }).catch(() => null), ]); - const documentMeta = await getDocumentMetaByDocumentId({ id: document!.id }).catch(() => null); - if (!document || !document.documentData || !recipient) { return notFound(); } const truncatedTitle = truncateTitle(document.title); - const { documentData } = document; + const { documentData, documentMeta } = document; const { user } = await getServerComponentSession(); @@ -65,8 +62,9 @@ export default async function SigningPage({ params: { token } }: SigningPageProp document.status === DocumentStatus.COMPLETED || recipient.signingStatus === SigningStatus.SIGNED ) { - // - redirect(`/sign/${token}/complete`); + documentMeta?.redirectUrl + ? redirect(documentMeta.redirectUrl) + : redirect(`/sign/${token}/complete`); } if (documentMeta?.password) { @@ -134,7 +132,12 @@ export default async function SigningPage({ params: { token } }: SigningPageProp
- +
diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts index 25bfbbb40..23c0a38c0 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/middleware.ts @@ -1,4 +1,5 @@ -import { NextRequest, NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; import { getToken } from 'next-auth/jwt'; diff --git a/package-lock.json b/package-lock.json index 9012d3f29..618dc4ce1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14610,6 +14610,7 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", + "peer": true, "engines": { "node": ">=6.0.0" } @@ -19602,14 +19603,14 @@ "@react-email/section": "0.0.10", "@react-email/tailwind": "0.0.9", "@react-email/text": "0.0.6", - "nodemailer": "^6.9.3", + "nodemailer": "^6.9.9", "react-email": "^1.9.5", "resend": "^2.0.0" }, "devDependencies": { "@documenso/tailwind-config": "*", "@documenso/tsconfig": "*", - "@types/nodemailer": "^6.4.8", + "@types/nodemailer": "^6.4.14", "tsup": "^7.1.0" } }, @@ -19627,6 +19628,14 @@ "node": ">=16.0.0" } }, + "packages/email/node_modules/nodemailer": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.9.tgz", + "integrity": "sha512-dexTll8zqQoVJEZPwQAKzxxtFn0qTnjdQTchoU6Re9BUUGBJiOy3YMn/0ShTW6J5M0dfQ1NeDeRTTl4oIWgQMA==", + "engines": { + "node": ">=6.0.0" + } + }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", diff --git a/packages/email/package.json b/packages/email/package.json index d41a4c24c..984ea3d4c 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -35,14 +35,14 @@ "@react-email/section": "0.0.10", "@react-email/tailwind": "0.0.9", "@react-email/text": "0.0.6", - "nodemailer": "^6.9.3", + "nodemailer": "^6.9.9", "react-email": "^1.9.5", "resend": "^2.0.0" }, "devDependencies": { "@documenso/tailwind-config": "*", "@documenso/tsconfig": "*", - "@types/nodemailer": "^6.4.8", + "@types/nodemailer": "^6.4.14", "tsup": "^7.1.0" } } diff --git a/packages/lib/constants/url-regex.ts b/packages/lib/constants/url-regex.ts new file mode 100644 index 000000000..259ce070d --- /dev/null +++ b/packages/lib/constants/url-regex.ts @@ -0,0 +1,2 @@ +export const URL_REGEX = + /^(https?):\/\/(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z0-9()]{2,}(?:\/[a-zA-Z0-9-._?&=/]*)?$/i; diff --git a/packages/lib/server-only/document/duplicate-document-by-id.ts b/packages/lib/server-only/document/duplicate-document-by-id.ts index ddb70b1cb..146d9d8fa 100644 --- a/packages/lib/server-only/document/duplicate-document-by-id.ts +++ b/packages/lib/server-only/document/duplicate-document-by-id.ts @@ -28,6 +28,7 @@ export const duplicateDocumentById = async ({ id, userId }: DuplicateDocumentByI dateFormat: true, password: true, timezone: true, + redirectUrl: true, }, }, }, diff --git a/packages/lib/server-only/document/get-document-by-token.ts b/packages/lib/server-only/document/get-document-by-token.ts index 62c8a5ca1..18f9a5161 100644 --- a/packages/lib/server-only/document/get-document-by-token.ts +++ b/packages/lib/server-only/document/get-document-by-token.ts @@ -27,6 +27,7 @@ export const getDocumentAndSenderByToken = async ({ include: { User: true, documentData: true, + documentMeta: true, }, }); diff --git a/packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql b/packages/prisma/migrations/20240206111230_add_document_meta_redirect_url/migration.sql similarity index 100% rename from packages/prisma/migrations/20240131120410_add_document_meta_redirect_url/migration.sql rename to packages/prisma/migrations/20240206111230_add_document_meta_redirect_url/migration.sql diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 5e9706b74..7096769b8 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -192,7 +192,7 @@ model DocumentMeta { dateFormat String? @default("yyyy-MM-dd hh:mm a") @db.Text documentId Int @unique document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) - redirectUrl String? @db.Text + redirectUrl String? } enum ReadStatus { diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index 8f63ebb9d..ff2c83a48 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; +import { URL_REGEX } from '@documenso/lib/constants/url-regex'; import { DocumentStatus, FieldType, RecipientRole } from '@documenso/prisma/client'; export const ZGetDocumentByIdQuerySchema = z.object({ @@ -71,7 +72,12 @@ export const ZSendDocumentMutationSchema = z.object({ message: z.string(), timezone: z.string(), dateFormat: z.string(), - redirectUrl: z.string().optional(), + redirectUrl: z + .string() + .optional() + .refine((value) => value === undefined || URL_REGEX.test(value), { + message: 'Please enter a valid URL', + }), }), }); diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index 740dad6c4..7ce77710c 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -2,6 +2,7 @@ import { useEffect } from 'react'; +import { Info } from 'lucide-react'; import { Controller, useForm } from 'react-hook-form'; import { DATE_FORMATS, DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; @@ -23,6 +24,7 @@ import { SelectTrigger, SelectValue, } from '@documenso/ui/primitives/select'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; import { Combobox } from '../combobox'; import { FormErrorMessage } from '../form/form-error-message'; @@ -69,7 +71,6 @@ export const AddSubjectFormPartial = ({ message: document.documentMeta?.message ?? '', timezone: document.documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, dateFormat: document.documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, - redirectUrl: document.documentMeta?.redirectUrl ?? '', }, }, }); @@ -164,86 +165,94 @@ export const AddSubjectFormPartial = ({
- {hasDateField && ( - - - - Advanced Options - + + + + Advanced Options + - -
- + + {hasDateField && ( + <> +
+ - ( - + + + - - {DATE_FORMATS.map((format) => ( - - {format.label} - - ))} - - - )} - /> -
+ + {DATE_FORMATS.map((format) => ( + + {format.label} + + ))} + + + )} + /> +
-
- +
+ - ( - value && onChange(value)} - disabled={documentHasBeenSent} - /> - )} - /> -
+ ( + value && onChange(value)} + disabled={documentHasBeenSent} + /> + )} + /> +
+ + )} -
-
-
- +
+
+
+ - -
+ + +
- - - - )} +
+ + +
diff --git a/packages/ui/primitives/document-flow/add-subject.types.ts b/packages/ui/primitives/document-flow/add-subject.types.ts index 285b8f813..fd4175368 100644 --- a/packages/ui/primitives/document-flow/add-subject.types.ts +++ b/packages/ui/primitives/document-flow/add-subject.types.ts @@ -2,6 +2,7 @@ import { z } from 'zod'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '@documenso/lib/constants/date-formats'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '@documenso/lib/constants/time-zones'; +import { URL_REGEX } from '@documenso/lib/constants/url-regex'; export const ZAddSubjectFormSchema = z.object({ meta: z.object({ @@ -9,7 +10,12 @@ export const ZAddSubjectFormSchema = z.object({ message: z.string(), timezone: z.string().optional().default(DEFAULT_DOCUMENT_TIME_ZONE), dateFormat: z.string().optional().default(DEFAULT_DOCUMENT_DATE_FORMAT), - redirectUrl: z.string().optional(), + redirectUrl: z + .string() + .optional() + .refine((value) => value === undefined || URL_REGEX.test(value), { + message: 'Please enter a valid URL', + }), }), }); From 2f696ddd13c245c9943e3b01ce69000609a95a86 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Tue, 6 Feb 2024 18:55:16 +0100 Subject: [PATCH 28/61] feat: blog article why i started documenso --- .../content/blog/why-i-started-documenso.mdx | 67 ++++++++++++++++++ apps/marketing/public/blog/burgers.jpeg | Bin 0 -> 166613 bytes 2 files changed, 67 insertions(+) create mode 100644 apps/marketing/content/blog/why-i-started-documenso.mdx create mode 100644 apps/marketing/public/blog/burgers.jpeg diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx new file mode 100644 index 000000000..58da0956e --- /dev/null +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -0,0 +1,67 @@ +--- +title: Why I started Documenso +description: TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. +authorName: 'Timur Ercan' +authorImage: '/blog/blog-author-timur.jpeg' +authorRole: 'Co-Founder' +date: 2024-02-06 +Tags: + - Founders + - Mission + - Open Source +--- + +
+ + +
+ No the burger from the story. But it could be as well, the place is pretty generic. +
+
+ +> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open + +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with @FelixM while discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. + +Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: + +- An entrepreneurial space, that was big enough opportunity +- A huge macro trend, lifting everything in it’s space +- A mode of working that fits my personal flow (which luckily for me, pretty close to the modern startup/ tech scene) +- An bigger impact to be made, that just earning lots of money (though there is nothing wrong with that) + +Quick shoutout to everyone feeling even a pinch of imposter syndrom while calling themselves a founder. It was after 10 years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I’ve been doing this, I guess I would have earned the internal title sooner and so do you probably. So after grappeling with my identity for second, as is customary for founders, my decision to start this journey came pretty quickly. + +Aside from the personal dimension, I had a pretty clear mindset of what I was looking for. The criteria I go on describing happend to click into place one after another, in no particular order. Having experienced no market demand and a very grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market, deeply rooted in the growing digitalization of the world. + +And to be honest, I just always liked digital signature tools. It’s a product, easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It’s a product you can build very product-driven since the market and domain are well understood at this point. So when asked about what’s next for me, I literally said “digital, um, let’s say… signatures”. As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all criteria and personal preferences I described above, it’s pretty amazing actually: + +- The global signing market is huge and rapidly growing +- The signing space is huge dominated by one outdated player, to put it bluntly. Outdated in terms of tech, pricing and ecosystem +- The signing space is also ridiculously opaque for a space that is based on open web tech, open encryption tech and open signing standards. Even by closed source standards +- We are currently seeing a renaissance for commercial open source startups, combining venture founder financial with open source mechanics +- Rebuilding a fundamental infrastructure as open source with a meaningful scale, has a profoundly transformative effect for a space +- Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy +- Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone + +Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynmamics it the best founders can do in my humble opinion. After these fundamental decisions you are (almost) just along for the ride and need to focus on solving the “convential” problems of starting a company the best you can. With digital signatures hitting so many point of my personal and professional checklist, this already was a great fit. What got me exited at first though, apart from the perspective of drinking caffeine and coding, was this: + +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. + +I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. + +Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. + +I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. + +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my personal interests and passions. Creating a company people actually want to work for longterm while tackleing these issues is critical side quest of Documenso. This is not only about building the next generation signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, tackling relevant problems. + +As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. + +Best from Hamburg\ +Timur diff --git a/apps/marketing/public/blog/burgers.jpeg b/apps/marketing/public/blog/burgers.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4fd897e759cc088eed32481a498824eeb52b48dd GIT binary patch literal 166613 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⋘wh|Ug#R0FT_^yAf}%J4zTm;y4FN&ZDwp<` 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 LF`i2+hJXLrIGefV literal 0 HcmV?d00001 From 94ddb0252b099ad47579d3a009c140b39d0fd5eb Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Tue, 6 Feb 2024 19:09:27 +0100 Subject: [PATCH 29/61] fix: stuff --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 58da0956e..31d29a1a6 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -26,7 +26,7 @@ Tags: > TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with @FelixM while discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: From 58e2eda5e9929c91fd5ab0a904cbbec2ecb8208f Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 7 Feb 2024 14:40:15 +1100 Subject: [PATCH 30/61] fix: update field remove logic --- packages/lib/server-only/field/set-fields-for-document.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index 2ba592f31..ecb45d461 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -56,11 +56,7 @@ export const setFieldsForDocument = async ({ }); const removedFields = existingFields.filter( - (existingField) => - !fields.find( - (field) => - field.id === existingField.id || field.signerEmail === existingField.Recipient?.email, - ), + (existingField) => !fields.find((field) => field.id === existingField.id), ); const linkedFields = fields From bf26f2cb9d972d17c2419f9a747d7e26b7e2f74e Mon Sep 17 00:00:00 2001 From: Sumit Bisht <75713174+sumitbishti@users.noreply.github.com> Date: Wed, 7 Feb 2024 10:55:39 +0530 Subject: [PATCH 31/61] fix: empty document titles (#917) fixes: #909 --- packages/ui/primitives/document-flow/add-title.tsx | 5 ++++- packages/ui/primitives/document-flow/add-title.types.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 730c4248f..a6390fd3a 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -1,5 +1,6 @@ 'use client'; +import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import type { Field, Recipient } from '@documenso/prisma/client'; @@ -10,6 +11,7 @@ import { Input } from '../input'; import { Label } from '../label'; import { useStep } from '../stepper'; import type { TAddTitleFormSchema } from './add-title.types'; +import { ZAddTitleFormSchema } from './add-title.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, @@ -40,6 +42,7 @@ export const AddTitleFormPartial = ({ handleSubmit, formState: { errors, isSubmitting }, } = useForm({ + resolver: zodResolver(ZAddTitleFormSchema), defaultValues: { title: document.title, }, @@ -71,7 +74,7 @@ export const AddTitleFormPartial = ({ id="title" className="bg-background my-2" disabled={isSubmitting} - {...register('title', { required: "Title can't be empty" })} + {...register('title')} /> diff --git a/packages/ui/primitives/document-flow/add-title.types.ts b/packages/ui/primitives/document-flow/add-title.types.ts index aaa8c17e4..b910c060a 100644 --- a/packages/ui/primitives/document-flow/add-title.types.ts +++ b/packages/ui/primitives/document-flow/add-title.types.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; export const ZAddTitleFormSchema = z.object({ - title: z.string().min(1), + title: z.string().trim().min(1, { message: "Title can't be empty" }), }); export type TAddTitleFormSchema = z.infer; From 7d39e3d0658206b34b3f1dc85a3457783c9f09ea Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 7 Feb 2024 21:32:44 +1100 Subject: [PATCH 32/61] feat: add team feature flag (#915) ## Description Add the ability to feature flag the teams feature via UI. Also added minor UI changes ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [X] I have followed the project's coding style guidelines. --- .../components/(dashboard)/layout/header.tsx | 38 +++- .../(dashboard)/layout/mobile-navigation.tsx | 2 +- .../(dashboard)/layout/profile-dropdown.tsx | 169 ++++++++++++++++++ .../settings/layout/desktop-nav.tsx | 27 +-- .../settings/layout/mobile-nav.tsx | 27 +-- .../dialogs/create-team-checkout-dialog.tsx | 3 +- .../forms/2fa/authenticator-app.tsx | 2 - packages/lib/constants/feature-flags.ts | 1 + packages/ui/primitives/sheet.tsx | 9 +- 9 files changed, 244 insertions(+), 34 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx diff --git a/apps/web/src/components/(dashboard)/layout/header.tsx b/apps/web/src/components/(dashboard)/layout/header.tsx index 753f5fb11..65bb63230 100644 --- a/apps/web/src/components/(dashboard)/layout/header.tsx +++ b/apps/web/src/components/(dashboard)/layout/header.tsx @@ -7,6 +7,7 @@ import { useParams } from 'next/navigation'; import { MenuIcon, SearchIcon } from 'lucide-react'; +import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; import { getRootHref } from '@documenso/lib/utils/params'; import type { User } from '@documenso/prisma/client'; @@ -18,6 +19,7 @@ import { CommandMenu } from '../common/command-menu'; import { DesktopNav } from './desktop-nav'; import { MenuSwitcher } from './menu-switcher'; import { MobileNavigation } from './mobile-navigation'; +import { ProfileDropdown } from './profile-dropdown'; export type HeaderProps = HTMLAttributes & { user: User; @@ -27,6 +29,10 @@ export type HeaderProps = HTMLAttributes & { export const Header = ({ className, user, teams, ...props }: HeaderProps) => { const params = useParams(); + const { getFlag } = useFeatureFlags(); + + const isTeamsEnabled = getFlag('app_teams'); + const [isCommandMenuOpen, setIsCommandMenuOpen] = useState(false); const [isHamburgerMenuOpen, setIsHamburgerMenuOpen] = useState(false); const [scrollY, setScrollY] = useState(0); @@ -41,6 +47,34 @@ export const Header = ({ className, user, teams, ...props }: HeaderProps) => { return () => window.removeEventListener('scroll', onScroll); }, []); + if (!isTeamsEnabled) { + return ( +
5 && 'border-b-border', + className, + )} + {...props} + > +
+ + + + + + +
+ +
+
+
+ ); + } + return (
{
diff --git a/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx index 7142de5dc..a77300d9e 100644 --- a/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx +++ b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx @@ -47,7 +47,7 @@ export const MobileNavigation = ({ isMenuOpen, onMenuOpenChange }: MobileNavigat return ( - + Documenso Logo { + const { getFlag } = useFeatureFlags(); + const { theme, setTheme } = useTheme(); + const isUserAdmin = isAdmin(user); + + const isBillingEnabled = getFlag('app_billing'); + + const avatarFallback = user.name + ? extractInitials(user.name) + : user.email.slice(0, 1).toUpperCase(); + + return ( + + + + + + + Account + + {isUserAdmin && ( + <> + + + + Admin + + + + + + )} + + + + + Profile + + + + + + + Security + + + + {isBillingEnabled && ( + + + + Billing + + + )} + + + + + + Templates + + + + + + + + Themes + + + + + + Light + + + + Dark + + + + System + + + + + + + + + + Star on Github + + + + + + + void signOut({ + callbackUrl: '/', + }) + } + > + + Sign Out + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx index c7ab61d8a..572c91c76 100644 --- a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx @@ -19,6 +19,7 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { const { getFlag } = useFeatureFlags(); const isBillingEnabled = getFlag('app_billing'); + const isTeamsEnabled = getFlag('app_teams'); return (
@@ -35,18 +36,20 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { - - - + {isTeamsEnabled && ( + + + + )} - - - + {isTeamsEnabled && ( + + + + )}
diff --git a/apps/web/src/components/forms/2fa/authenticator-app.tsx b/apps/web/src/components/forms/2fa/authenticator-app.tsx index 316272e34..3aa0e123e 100644 --- a/apps/web/src/components/forms/2fa/authenticator-app.tsx +++ b/apps/web/src/components/forms/2fa/authenticator-app.tsx @@ -30,13 +30,11 @@ export const AuthenticatorApp = ({ isTwoFactorEnabled }: AuthenticatorAppProps)
!open && setModalState(null)} /> !open && setModalState(null)} /> diff --git a/packages/lib/constants/feature-flags.ts b/packages/lib/constants/feature-flags.ts index e972b47c2..947409be1 100644 --- a/packages/lib/constants/feature-flags.ts +++ b/packages/lib/constants/feature-flags.ts @@ -17,6 +17,7 @@ export const FEATURE_FLAG_POLL_INTERVAL = 30000; */ export const LOCAL_FEATURE_FLAGS: Record = { app_billing: process.env.NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true', + app_teams: true, marketing_header_single_player_mode: false, } as const; diff --git a/packages/ui/primitives/sheet.tsx b/packages/ui/primitives/sheet.tsx index e9f1b4401..a6326de0f 100644 --- a/packages/ui/primitives/sheet.tsx +++ b/packages/ui/primitives/sheet.tsx @@ -3,7 +3,8 @@ import * as React from 'react'; import * as SheetPrimitive from '@radix-ui/react-dialog'; -import { VariantProps, cva } from 'class-variance-authority'; +import type { VariantProps } from 'class-variance-authority'; +import { cva } from 'class-variance-authority'; import { X } from 'lucide-react'; import { cn } from '../lib/utils'; @@ -12,7 +13,7 @@ const Sheet = SheetPrimitive.Root; const SheetTrigger = SheetPrimitive.Trigger; -const portalVariants = cva('fixed inset-0 z-50 flex', { +const portalVariants = cva('fixed inset-0 z-[61] flex', { variants: { position: { top: 'items-start', @@ -42,7 +43,7 @@ const SheetOverlay = React.forwardRef< >(({ className, children: _children, ...props }, ref) => ( Date: Wed, 7 Feb 2024 11:40:11 +0100 Subject: [PATCH 33/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 31d29a1a6..eb7a492fe 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -20,7 +20,7 @@ Tags: />
- No the burger from the story. But it could be as well, the place is pretty generic. + Not the burger from the story. But it could be as well, the place is pretty generic.
From 2431db06f56ae1150b5e4509459fa73982f515f4 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:14 +0100 Subject: [PATCH 34/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index eb7a492fe..f270208c3 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -26,7 +26,7 @@ Tags: > TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after I sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: From 2e719288ffa811a1bfb3948653e487f30bd8b637 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:32 +0100 Subject: [PATCH 35/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index f270208c3..dc165dad5 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -49,7 +49,7 @@ And to be honest, I just always liked digital signature tools. It’s a product, - Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy - Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone -Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynmamics it the best founders can do in my humble opinion. After these fundamental decisions you are (almost) just along for the ride and need to focus on solving the “convential” problems of starting a company the best you can. With digital signatures hitting so many point of my personal and professional checklist, this already was a great fit. What got me exited at first though, apart from the perspective of drinking caffeine and coding, was this: +Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. From 58477e060aba7a5f97e1aa981c79000b827cf5aa Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:40 +0100 Subject: [PATCH 36/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index dc165dad5..13db38209 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -51,7 +51,7 @@ And to be honest, I just always liked digital signature tools. It’s a product, Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: -Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. From 718f5664ac9ca6b38514f0a1bb1735c2681aa8f1 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:00:01 +0100 Subject: [PATCH 37/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 13db38209..95f750e9b 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -53,7 +53,7 @@ Building a company is so complex, it can’t be planned out. Basing it on great Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. -I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. +I had forgotten all about that story until I realized, this is where signing is today. A global need, fulfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another to-do on the [longterm roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. From b6bdbf72a71b59c3ebc54119b36edf5ca7e2375f Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:00:12 +0100 Subject: [PATCH 38/61] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 95f750e9b..228efdc0f 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -59,7 +59,7 @@ Apart from my personal gripes with the coporate certificate industry, I always f I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. -To wrap this up, Documenso happens to be the perfect storm of market opportunity, my personal interests and passions. Creating a company people actually want to work for longterm while tackleing these issues is critical side quest of Documenso. This is not only about building the next generation signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, tackling relevant problems. +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, and tackling relevant problems. As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. From 33ab8797a556a5388bb38b0c55daec6c930cf214 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:22:07 +0100 Subject: [PATCH 39/61] chore: text --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 228efdc0f..458a4823a 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -1,6 +1,6 @@ --- title: Why I started Documenso -description: TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. +description: I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. authorName: 'Timur Ercan' authorImage: '/blog/blog-author-timur.jpeg' authorRole: 'Co-Founder' From e2a5638f50cdb51eb32c9070faebfbce52f67be1 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 13:07:22 +0100 Subject: [PATCH 40/61] chore: fixed --- .../content/blog/why-i-started-documenso.mdx | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 458a4823a..2fceddd25 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -24,44 +24,45 @@ Tags: -> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open +> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption, and wanted to help make the world/ Internet more open. -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after I sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It's hard to pinpoint when I decided to start Documenso. I first uttered the word "Documenso" while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what's next in late 2022. Shortly after, I sat down with a can of caffeine and started building [Documenso 0.9](https://github.com/documenso/documenso/releases/tag/0.9-developer-preview). Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. -Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: +Looking at the personal side, I've had some time off and was actively looking for my next move. Looking back, I stumbled into my first company. Less so with the second one, but I joined my co-founders and did not develop the core concept myself. While coming up with Documenso, I was deliberately looking for a few things, based on my previous experiences: -- An entrepreneurial space, that was big enough opportunity -- A huge macro trend, lifting everything in it’s space -- A mode of working that fits my personal flow (which luckily for me, pretty close to the modern startup/ tech scene) -- An bigger impact to be made, that just earning lots of money (though there is nothing wrong with that) +- An entrepreneurial space that was a big enough opportunity +- A huge macro trend, lifting everything in it's space +- A mode of working that fits my flow (which, luckily for me, is pretty close to the modern startup/ tech scene) +- A more significant impact to be made than just earning lots of money (though there is nothing wrong with that) -Quick shoutout to everyone feeling even a pinch of imposter syndrom while calling themselves a founder. It was after 10 years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I’ve been doing this, I guess I would have earned the internal title sooner and so do you probably. So after grappeling with my identity for second, as is customary for founders, my decision to start this journey came pretty quickly. +Quick shoutout to everyone feeling even a pinch of imposter syndrome while calling themselves a founder. It was after ten years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I've been doing this, I would have earned the internal title sooner, and so do you. After grappling with my identity for a second, as is customary for founders, my decision to start this journey came quickly. -Aside from the personal dimension, I had a pretty clear mindset of what I was looking for. The criteria I go on describing happend to click into place one after another, in no particular order. Having experienced no market demand and a very grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market, deeply rooted in the growing digitalization of the world. +Aside from the personal dimension, I had a clear mindset of what I wanted. The criteria I describe below clicked into place one after another, in no particular order. Having experienced no market demand and a very gritty, grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market deeply rooted in the ever-increasing digitalization of the world. -And to be honest, I just always liked digital signature tools. It’s a product, easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It’s a product you can build very product-driven since the market and domain are well understood at this point. So when asked about what’s next for me, I literally said “digital, um, let’s say… signatures”. As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all criteria and personal preferences I described above, it’s pretty amazing actually: +And to be honest, I just always liked digital signature tools. It's a product that is easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It's a product you can build very product-driven since the market and domain are well understood. So when asked about what's next for me, I literally said, "Digital, um, let's say… signatures". As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all the criteria and personal preferences I described above; it's pretty amazing, actually: -- The global signing market is huge and rapidly growing -- The signing space is huge dominated by one outdated player, to put it bluntly. Outdated in terms of tech, pricing and ecosystem -- The signing space is also ridiculously opaque for a space that is based on open web tech, open encryption tech and open signing standards. Even by closed source standards -- We are currently seeing a renaissance for commercial open source startups, combining venture founder financial with open source mechanics -- Rebuilding a fundamental infrastructure as open source with a meaningful scale, has a profoundly transformative effect for a space -- Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy -- Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone +- The global signing market is enormous and rapidly growing +- To put it bluntly, the signing space is vast and dominated by one outdated player. Outdated in terms of tech, pricing, and ecosystem +- The signing space is also ridiculously opaque for a space based on open web tech, open encryption tech, and open signing standards. Even by closed-source standards +- We are currently seeing a renaissance for commercial open source startups, combining venture founder financials with open source mechanics +- Rebuilding a fundamental infrastructure as open source with a meaningful scale has a profoundly transformative effect on any space +- Working in open source requires being open, cooperative, and inclusive. It also requires quite a bit of context jumping, "going with the flow," and empathy +- Apart from fixing the signing space, making Documenso successful would be another domino tile toward open source eating the world, which is great for everyone -Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: +Building a company is so complex it can't be planned out. Basing it on great fundamentals and the expected dynamics is the best founders can do, in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the "conventional" problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first, though, apart from the perspective of drinking caffeine and coding, was this: -Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, two years validity, from VeriSign, I think. Apart from it being ridiculously complicated to get, it bothered me that we had basically paid $200 for what is essentially a long number someone generated. SSL wasn't even that widespread back then because it was mainly considered important for e-commerce, no wonder considering it cost so much. "Why would I encrypt a blog?". Fast forward to today, and everyone can get a free SSL cert courtesy of [Let's Encrypt](https://letsencrypt.org/) and browsers are basically blocking unencrypted sites. Mostly, it is even built into hosting platforms, so you barely even notice as a developer. -I had forgotten all about that story until I realized, this is where signing is today. A global need, fulfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another to-do on the [longterm roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. +I had forgotten all about that story until I realized this is where signing is today. A global need fulfilled only by a closed ecosystem, not really state-of-the-art companies, leading to, let's call it, steep prices. I had considered Let's Encrypt a pillar of the open internet for so long that I forgot that they weren't always there. One day, someone said, let's make the internet better. Signing is another domain that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the "pre-Let's Encrypt world." Free document signing certificates via "Let's Sign" are now another to-do on the [long-term roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. -Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. +Apart from my personal gripes with the corporate certificate industry, I have always found encryption fascinating. It's such a fundamental force in society when you think about it: Secure Communication, Secure Commerce, and even [internet native, open source money (Bitcoin)](https://github.com/bitcoin/bitcoin) were created using a bit of smart math. All these examples are expressions of very fundamental human behaviors that should be enabled and protected by open infrastructures. -I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. +I never told rthis to anyone before, but since starting Documenso, I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of "yeah, open source is nice, but the great, commercially successful products used in the real world are built by closed companies (aka Microsoft)" _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly, over time, that I realized that open web standards are superior to closed ones, and even later, I understood the same holds true for all software. Open source fixes something in the economy I find hard to articulate. I did my best in [Commodifying Signing](https://documenso.com/blog/commodifying-signing). -To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, and tackling relevant problems. +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company in which people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech; it's also about doing our part to normalize open, healthy, efficient working cultures and tackling relevant problems. -As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. +As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions, comments, thoughts or feelings. +\ Best from Hamburg\ Timur From e97b9b4f1cd9a200e169059593737853fc351957 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 8 Feb 2024 12:33:20 +1100 Subject: [PATCH 41/61] feat: add team templates (#912) --- .../documents/[id]/document-page-view.tsx | 4 +- .../app/(dashboard)/documents/[id]/page.tsx | 2 +- .../documents/documents-page-view.tsx | 7 +- .../src/app/(dashboard)/documents/page.tsx | 2 +- .../templates/[id]/edit-template.tsx | 4 +- .../app/(dashboard)/templates/[id]/page.tsx | 81 +------ .../templates/[id]/template-page-view.tsx | 86 ++++++++ .../templates/data-table-action-dropdown.tsx | 25 ++- .../templates/data-table-templates.tsx | 15 +- .../templates/delete-template-dialog.tsx | 35 ++- .../templates/duplicate-template-dialog.tsx | 56 ++--- .../templates/new-template-dialog.tsx | 11 +- .../src/app/(dashboard)/templates/page.tsx | 50 +---- .../templates/templates-page-view.tsx | 73 +++++++ .../t/[teamUrl]/documents/[id]/page.tsx | 4 +- .../(teams)/t/[teamUrl]/documents/page.tsx | 2 +- .../t/[teamUrl]/templates/[id]/page.tsx | 22 ++ .../(teams)/t/[teamUrl]/templates/page.tsx | 26 +++ .../(dashboard)/layout/desktop-nav.tsx | 34 ++- .../(dashboard)/layout/menu-switcher.tsx | 22 +- .../(dashboard)/layout/mobile-navigation.tsx | 2 +- .../e2e/templates/manage-templates.spec.ts | 205 ++++++++++++++++++ packages/lib/constants/teams.ts | 1 + .../field/get-fields-for-template.ts | 15 +- .../field/set-fields-for-template.ts | 15 +- .../recipient/get-recipients-for-template.ts | 15 +- .../recipient/set-recipients-for-template.ts | 15 +- .../template/create-document-from-template.ts | 19 +- .../server-only/template/create-template.ts | 18 +- .../server-only/template/delete-template.ts | 20 +- .../template/duplicate-template.ts | 30 ++- .../server-only/template/find-templates.ts | 56 +++++ .../template/get-template-by-id.ts | 24 +- .../lib/server-only/template/get-templates.ts | 35 --- packages/lib/utils/teams.ts | 4 + .../migration.sql | 5 + packages/prisma/schema.prisma | 5 +- packages/prisma/seed/templates.ts | 36 +++ packages/trpc/server/field-router/router.ts | 2 +- .../trpc/server/recipient-router/router.ts | 4 +- .../trpc/server/template-router/router.ts | 12 +- .../trpc/server/template-router/schema.ts | 4 +- 42 files changed, 831 insertions(+), 272 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx create mode 100644 apps/web/src/app/(dashboard)/templates/templates-page-view.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx create mode 100644 packages/app-tests/e2e/templates/manage-templates.spec.ts create mode 100644 packages/lib/server-only/template/find-templates.ts delete mode 100644 packages/lib/server-only/template/get-templates.ts create mode 100644 packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql create mode 100644 packages/prisma/seed/templates.ts diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx index 3a46ed5e7..6759d91ac 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx @@ -25,7 +25,7 @@ export type DocumentPageViewProps = { team?: Team; }; -export default async function DocumentPageView({ params, team }: DocumentPageViewProps) { +export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) => { const { id } = params; const documentId = Number(id); @@ -128,4 +128,4 @@ export default async function DocumentPageView({ params, team }: DocumentPageVie )}

); -} +}; diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index e7a34889e..5ad224737 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -1,4 +1,4 @@ -import DocumentPageView from './document-page-view'; +import { DocumentPageView } from './document-page-view'; export type DocumentPageProps = { params: { diff --git a/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx b/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx index ead3e8f4f..9059b8e88 100644 --- a/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx @@ -33,10 +33,7 @@ export type DocumentsPageViewProps = { team?: Team & { teamEmail?: TeamEmail | null }; }; -export default async function DocumentsPageView({ - searchParams = {}, - team, -}: DocumentsPageViewProps) { +export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPageViewProps) => { const { user } = await getRequiredServerComponentSession(); const status = isExtendedDocumentStatus(searchParams.status) ? searchParams.status : 'ALL'; @@ -155,4 +152,4 @@ export default async function DocumentsPageView({
); -} +}; diff --git a/apps/web/src/app/(dashboard)/documents/page.tsx b/apps/web/src/app/(dashboard)/documents/page.tsx index b67ed6f02..67f432a13 100644 --- a/apps/web/src/app/(dashboard)/documents/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from 'next'; import type { DocumentsPageViewProps } from './documents-page-view'; -import DocumentsPageView from './documents-page-view'; +import { DocumentsPageView } from './documents-page-view'; export type DocumentsPageProps = { searchParams?: DocumentsPageViewProps['searchParams']; diff --git a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx index bdc769e79..f8c7f9a43 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx @@ -28,6 +28,7 @@ export type EditTemplateFormProps = { recipients: Recipient[]; fields: Field[]; documentData: DocumentData; + templateRootPath: string; }; type EditTemplateStep = 'signers' | 'fields'; @@ -40,6 +41,7 @@ export const EditTemplateForm = ({ fields, user: _user, documentData, + templateRootPath, }: EditTemplateFormProps) => { const { toast } = useToast(); const router = useRouter(); @@ -98,7 +100,7 @@ export const EditTemplateForm = ({ duration: 5000, }); - router.push('/templates'); + router.push(templateRootPath); } catch (err) { toast({ title: 'Error', diff --git a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx index 6d234eff2..aa55d1943 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx @@ -1,81 +1,10 @@ import React from 'react'; -import Link from 'next/link'; -import { redirect } from 'next/navigation'; +import type { TemplatePageViewProps } from './template-page-view'; +import { TemplatePageView } from './template-page-view'; -import { ChevronLeft } from 'lucide-react'; +type TemplatePageProps = Pick; -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { getFieldsForTemplate } from '@documenso/lib/server-only/field/get-fields-for-template'; -import { getRecipientsForTemplate } from '@documenso/lib/server-only/recipient/get-recipients-for-template'; -import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; - -import { TemplateType } from '~/components/formatter/template-type'; - -import { EditTemplateForm } from './edit-template'; - -export type TemplatePageProps = { - params: { - id: string; - }; -}; - -export default async function TemplatePage({ params }: TemplatePageProps) { - const { id } = params; - - const templateId = Number(id); - - if (!templateId || Number.isNaN(templateId)) { - redirect('/documents'); - } - - const { user } = await getRequiredServerComponentSession(); - - const template = await getTemplateById({ - id: templateId, - userId: user.id, - }).catch(() => null); - - if (!template || !template.templateDocumentData) { - redirect('/documents'); - } - - const { templateDocumentData } = template; - - const [templateRecipients, templateFields] = await Promise.all([ - getRecipientsForTemplate({ - templateId, - userId: user.id, - }), - getFieldsForTemplate({ - templateId, - userId: user.id, - }), - ]); - - return ( -
- - - Templates - - -

- {template.title} -

- -
- -
- - -
- ); +export default function TemplatePage({ params }: TemplatePageProps) { + return ; } diff --git a/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx b/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx new file mode 100644 index 000000000..899e600f1 --- /dev/null +++ b/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx @@ -0,0 +1,86 @@ +import React from 'react'; + +import Link from 'next/link'; +import { redirect } from 'next/navigation'; + +import { ChevronLeft } from 'lucide-react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getFieldsForTemplate } from '@documenso/lib/server-only/field/get-fields-for-template'; +import { getRecipientsForTemplate } from '@documenso/lib/server-only/recipient/get-recipients-for-template'; +import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; +import { formatTemplatesPath } from '@documenso/lib/utils/teams'; +import type { Team } from '@documenso/prisma/client'; + +import { TemplateType } from '~/components/formatter/template-type'; + +import { EditTemplateForm } from './edit-template'; + +export type TemplatePageViewProps = { + params: { + id: string; + }; + team?: Team; +}; + +export const TemplatePageView = async ({ params, team }: TemplatePageViewProps) => { + const { id } = params; + + const templateId = Number(id); + const templateRootPath = formatTemplatesPath(team?.url); + + if (!templateId || Number.isNaN(templateId)) { + redirect(templateRootPath); + } + + const { user } = await getRequiredServerComponentSession(); + + const template = await getTemplateById({ + id: templateId, + userId: user.id, + }).catch(() => null); + + if (!template || !template.templateDocumentData) { + redirect(templateRootPath); + } + + const { templateDocumentData } = template; + + const [templateRecipients, templateFields] = await Promise.all([ + getRecipientsForTemplate({ + templateId, + userId: user.id, + }), + getFieldsForTemplate({ + templateId, + userId: user.id, + }), + ]); + + return ( +
+ + + Templates + + +

+ {template.title} +

+ +
+ +
+ + +
+ ); +}; diff --git a/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx b/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx index 9f26d632c..eee32b920 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx @@ -21,9 +21,15 @@ import { DuplicateTemplateDialog } from './duplicate-template-dialog'; export type DataTableActionDropdownProps = { row: Template; + templateRootPath: string; + teamId?: number; }; -export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) => { +export const DataTableActionDropdown = ({ + row, + templateRootPath, + teamId, +}: DataTableActionDropdownProps) => { const { data: session } = useSession(); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); @@ -34,6 +40,7 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = } const isOwner = row.userId === session.user.id; + const isTeamTemplate = row.teamId === teamId; return ( @@ -44,20 +51,25 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = Action - - + + Edit - {/* onDuplicateButtonClick(row.id)}> */} - setDuplicateDialogOpen(true)}> + setDuplicateDialogOpen(true)} + > Duplicate - setDeleteDialogOpen(true)}> + setDeleteDialogOpen(true)} + > Delete @@ -65,6 +77,7 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = diff --git a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx index 0e8f822c2..309695c88 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx @@ -28,6 +28,9 @@ type TemplatesDataTableProps = { perPage: number; page: number; totalPages: number; + documentRootPath: string; + templateRootPath: string; + teamId?: number; }; export const TemplatesDataTable = ({ @@ -35,6 +38,9 @@ export const TemplatesDataTable = ({ perPage, page, totalPages, + documentRootPath, + templateRootPath, + teamId, }: TemplatesDataTableProps) => { const [isPending, startTransition] = useTransition(); const updateSearchParams = useUpdateSearchParams(); @@ -70,7 +76,7 @@ export const TemplatesDataTable = ({ duration: 5000, }); - router.push(`/documents/${id}`); + router.push(`${documentRootPath}/${id}`); } catch (err) { toast({ title: 'Error', @@ -131,7 +137,12 @@ export const TemplatesDataTable = ({ {!isRowLoading && } Use Template - + +
); }, diff --git a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx index 9075f4677..b31ad2048 100644 --- a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx @@ -35,20 +35,15 @@ export const DeleteTemplateDialog = ({ id, open, onOpenChange }: DeleteTemplateD onOpenChange(false); }, - }); - - const onDeleteTemplate = async () => { - try { - await deleteTemplate({ id }); - } catch { + onError: () => { toast({ title: 'Something went wrong', description: 'This template could not be deleted at this time. Please try again.', variant: 'destructive', duration: 7500, }); - } - }; + }, + }); return ( !isLoading && onOpenChange(value)}> @@ -63,20 +58,18 @@ export const DeleteTemplateDialog = ({ id, open, onOpenChange }: DeleteTemplateD -
- + - -
+
diff --git a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx index be743ff48..cdd3000c2 100644 --- a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx @@ -14,12 +14,14 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; type DuplicateTemplateDialogProps = { id: number; + teamId?: number; open: boolean; onOpenChange: (_open: boolean) => void; }; export const DuplicateTemplateDialog = ({ id, + teamId, open, onOpenChange, }: DuplicateTemplateDialogProps) => { @@ -40,22 +42,15 @@ export const DuplicateTemplateDialog = ({ onOpenChange(false); }, + onError: () => { + toast({ + title: 'Error', + description: 'An error occurred while duplicating template.', + variant: 'destructive', + }); + }, }); - const onDuplicate = async () => { - try { - await duplicateTemplate({ - templateId: id, - }); - } catch (err) { - toast({ - title: 'Error', - description: 'An error occurred while duplicating template.', - variant: 'destructive', - }); - } - }; - return ( !isLoading && onOpenChange(value)}> @@ -66,20 +61,27 @@ export const DuplicateTemplateDialog = ({ -
- + - -
+
diff --git a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx index a4aa9bce2..37d60f946 100644 --- a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx @@ -43,8 +43,14 @@ const ZCreateTemplateFormSchema = z.object({ type TCreateTemplateFormSchema = z.infer; -export const NewTemplateDialog = () => { +type NewTemplateDialogProps = { + teamId?: number; + templateRootPath: string; +}; + +export const NewTemplateDialog = ({ teamId, templateRootPath }: NewTemplateDialogProps) => { const router = useRouter(); + const { data: session } = useSession(); const { toast } = useToast(); @@ -99,6 +105,7 @@ export const NewTemplateDialog = () => { }); const { id } = await createTemplate({ + teamId, title: values.name ? values.name : file.name, templateDocumentDataId, }); @@ -112,7 +119,7 @@ export const NewTemplateDialog = () => { setShowNewTemplateDialog(false); - void router.push(`/templates/${id}`); + router.push(`${templateRootPath}/${id}`); } catch { toast({ title: 'Something went wrong', diff --git a/apps/web/src/app/(dashboard)/templates/page.tsx b/apps/web/src/app/(dashboard)/templates/page.tsx index d3dacd501..7c7bd4e4f 100644 --- a/apps/web/src/app/(dashboard)/templates/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/page.tsx @@ -2,57 +2,17 @@ import React from 'react'; import type { Metadata } from 'next'; -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { getTemplates } from '@documenso/lib/server-only/template/get-templates'; - -import { TemplatesDataTable } from './data-table-templates'; -import { EmptyTemplateState } from './empty-state'; -import { NewTemplateDialog } from './new-template-dialog'; +import { TemplatesPageView } from './templates-page-view'; +import type { TemplatesPageViewProps } from './templates-page-view'; type TemplatesPageProps = { - searchParams?: { - page?: number; - perPage?: number; - }; + searchParams?: TemplatesPageViewProps['searchParams']; }; export const metadata: Metadata = { title: 'Templates', }; -export default async function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { - const { user } = await getRequiredServerComponentSession(); - const page = Number(searchParams.page) || 1; - const perPage = Number(searchParams.perPage) || 10; - - const { templates, totalPages } = await getTemplates({ - userId: user.id, - page: page, - perPage: perPage, - }); - - return ( -
-
-

Templates

- -
- -
-
- -
- {templates.length > 0 ? ( - - ) : ( - - )} -
-
- ); +export default function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { + return ; } diff --git a/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx b/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx new file mode 100644 index 000000000..4736f4268 --- /dev/null +++ b/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { findTemplates } from '@documenso/lib/server-only/template/find-templates'; +import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams'; +import type { Team } from '@documenso/prisma/client'; +import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; + +import { TemplatesDataTable } from './data-table-templates'; +import { EmptyTemplateState } from './empty-state'; +import { NewTemplateDialog } from './new-template-dialog'; + +export type TemplatesPageViewProps = { + searchParams?: { + page?: number; + perPage?: number; + }; + team?: Team; +}; + +export const TemplatesPageView = async ({ searchParams = {}, team }: TemplatesPageViewProps) => { + const { user } = await getRequiredServerComponentSession(); + const page = Number(searchParams.page) || 1; + const perPage = Number(searchParams.perPage) || 10; + + const documentRootPath = formatDocumentsPath(team?.url); + const templateRootPath = formatTemplatesPath(team?.url); + + const { templates, totalPages } = await findTemplates({ + userId: user.id, + teamId: team?.id, + page: page, + perPage: perPage, + }); + + return ( +
+
+
+ {team && ( + + + {team.name.slice(0, 1)} + + + )} + +

Templates

+
+ +
+ +
+
+ +
+ {templates.length > 0 ? ( + + ) : ( + + )} +
+
+ ); +}; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx index b7f610cff..26b1d7c91 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx @@ -1,7 +1,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; -import DocumentPageComponent from '~/app/(dashboard)/documents/[id]/document-page-view'; +import { DocumentPageView } from '~/app/(dashboard)/documents/[id]/document-page-view'; export type DocumentPageProps = { params: { @@ -16,5 +16,5 @@ export default async function DocumentPage({ params }: DocumentPageProps) { const { user } = await getRequiredServerComponentSession(); const team = await getTeamByUrl({ userId: user.id, teamUrl }); - return ; + return ; } diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx index 952aeeeea..d3d5b5bee 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx @@ -2,7 +2,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get- import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; import type { DocumentsPageViewProps } from '~/app/(dashboard)/documents/documents-page-view'; -import DocumentsPageView from '~/app/(dashboard)/documents/documents-page-view'; +import { DocumentsPageView } from '~/app/(dashboard)/documents/documents-page-view'; export type TeamsDocumentPageProps = { params: { diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx new file mode 100644 index 000000000..3fe7cbf67 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import type { TemplatePageViewProps } from '~/app/(dashboard)/templates/[id]/template-page-view'; +import { TemplatePageView } from '~/app/(dashboard)/templates/[id]/template-page-view'; + +type TeamTemplatePageProps = { + params: TemplatePageViewProps['params'] & { + teamUrl: string; + }; +}; + +export default async function TeamTemplatePage({ params }: TeamTemplatePageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx new file mode 100644 index 000000000..6954d8e2d --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import type { TemplatesPageViewProps } from '~/app/(dashboard)/templates/templates-page-view'; +import { TemplatesPageView } from '~/app/(dashboard)/templates/templates-page-view'; + +type TeamTemplatesPageProps = { + searchParams?: TemplatesPageViewProps['searchParams']; + params: { + teamUrl: string; + }; +}; + +export default async function TeamTemplatesPage({ + searchParams = {}, + params, +}: TeamTemplatesPageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx index 2b11c4be2..9eef1f4bd 100644 --- a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx @@ -52,24 +52,22 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { {...props} >
- {navigationLinks - .filter(({ href }) => href !== '/templates' || rootHref === '') // Remove templates for team pages. - .map(({ href, label }) => ( - - {label} - - ))} + {navigationLinks.map(({ href, label }) => ( + + {label} + + ))}
diff --git a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx index 35a05baf2..195716d64 100644 --- a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx +++ b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx @@ -6,7 +6,7 @@ import { usePathname } from 'next/navigation'; import { CheckCircle2, ChevronsUpDown, Plus, Settings2 } from 'lucide-react'; import { signOut } from 'next-auth/react'; -import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { TEAM_MEMBER_ROLE_MAP, TEAM_URL_REGEX } from '@documenso/lib/constants/teams'; import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; @@ -71,6 +71,22 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp return TEAM_MEMBER_ROLE_MAP[team.currentTeamMember.role]; }; + /** + * Formats the redirect URL so we can switch between documents and templates page + * seemlessly between teams and personal accounts. + */ + const formatRedirectUrlOnSwitch = (teamUrl?: string) => { + const baseUrl = teamUrl ? `/t/${teamUrl}/` : '/'; + + const currentPathname = (pathname ?? '/').replace(TEAM_URL_REGEX, ''); + + if (currentPathname === '/templates') { + return `${baseUrl}templates`; + } + + return baseUrl; + }; + return ( @@ -100,7 +116,7 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp Personal - + ( - + text !== 'Templates' || href === '/templates'); // Filter out templates for teams. + ]; return ( diff --git a/packages/app-tests/e2e/templates/manage-templates.spec.ts b/packages/app-tests/e2e/templates/manage-templates.spec.ts new file mode 100644 index 000000000..53edc705d --- /dev/null +++ b/packages/app-tests/e2e/templates/manage-templates.spec.ts @@ -0,0 +1,205 @@ +import { expect, test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, unseedTeam } from '@documenso/prisma/seed/teams'; +import { seedTemplate } from '@documenso/prisma/seed/templates'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEMPLATES]: view templates', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: owner.id, + teamId: team.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 2', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Owner should see both team templates. + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + // Only should only see their personal template. + await page.goto(`${WEBAPP_BASE_URL}/templates`); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: delete template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: owner.id, + teamId: team.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 2', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Owner should be able to delete their personal template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Delete' }).click(); + await page.getByRole('button', { name: 'Delete' }).click(); + await expect(page.getByText('Template deleted').first()).toBeVisible(); + + // Team member should be able to delete all templates. + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + for (const template of ['Team template 1', 'Team template 2']) { + await page + .getByRole('row', { name: template }) + .getByRole('cell', { name: 'Use Template' }) + .getByRole('button') + .nth(1) + .click(); + + await page.getByRole('menuitem', { name: 'Delete' }).click(); + await page.getByRole('button', { name: 'Delete' }).click(); + await expect(page.getByText('Template deleted').first()).toBeVisible(); + } + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: duplicate template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Duplicate personal template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Duplicate' }).click(); + await page.getByRole('button', { name: 'Duplicate' }).click(); + await expect(page.getByText('Template duplicated').first()).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + // Duplicate team template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Duplicate' }).click(); + await page.getByRole('button', { name: 'Duplicate' }).click(); + await expect(page.getByText('Template duplicated').first()).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: use template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Use personal template. + await page.getByRole('button', { name: 'Use Template' }).click(); + await page.waitForURL(/documents/); + await page.getByRole('main').getByRole('link', { name: 'Documents' }).click(); + await page.waitForURL('/documents'); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + // Use team template. + await page.getByRole('button', { name: 'Use Template' }).click(); + await page.waitForURL(/\/t\/.+\/documents/); + await page.getByRole('main').getByRole('link', { name: 'Documents' }).click(); + await page.waitForURL(`/t/${team.url}/documents`); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await unseedTeam(team.url); +}); diff --git a/packages/lib/constants/teams.ts b/packages/lib/constants/teams.ts index 47705bb14..67f3ef16f 100644 --- a/packages/lib/constants/teams.ts +++ b/packages/lib/constants/teams.ts @@ -1,6 +1,7 @@ import { TeamMemberRole } from '@documenso/prisma/client'; export const TEAM_URL_ROOT_REGEX = new RegExp('^/t/[^/]+$'); +export const TEAM_URL_REGEX = new RegExp('^/t/[^/]+'); export const TEAM_MEMBER_ROLE_MAP: Record = { ADMIN: 'Admin', diff --git a/packages/lib/server-only/field/get-fields-for-template.ts b/packages/lib/server-only/field/get-fields-for-template.ts index c174d7eff..724ec75fb 100644 --- a/packages/lib/server-only/field/get-fields-for-template.ts +++ b/packages/lib/server-only/field/get-fields-for-template.ts @@ -10,7 +10,20 @@ export const getFieldsForTemplate = async ({ templateId, userId }: GetFieldsForT where: { templateId, Template: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/field/set-fields-for-template.ts b/packages/lib/server-only/field/set-fields-for-template.ts index 9431666bf..2062e06bc 100644 --- a/packages/lib/server-only/field/set-fields-for-template.ts +++ b/packages/lib/server-only/field/set-fields-for-template.ts @@ -27,7 +27,20 @@ export const setFieldsForTemplate = async ({ const template = await prisma.template.findFirst({ where: { id: templateId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/recipient/get-recipients-for-template.ts b/packages/lib/server-only/recipient/get-recipients-for-template.ts index ab6f860eb..4b393353d 100644 --- a/packages/lib/server-only/recipient/get-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/get-recipients-for-template.ts @@ -13,7 +13,20 @@ export const getRecipientsForTemplate = async ({ where: { templateId, Template: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/recipient/set-recipients-for-template.ts b/packages/lib/server-only/recipient/set-recipients-for-template.ts index c21c8cbf9..7c96bcf44 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/set-recipients-for-template.ts @@ -20,7 +20,20 @@ export const setRecipientsForTemplate = async ({ const template = await prisma.template.findFirst({ where: { id: templateId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts index 1c23d8f85..c520d4ce1 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -11,7 +11,23 @@ export const createDocumentFromTemplate = async ({ userId, }: CreateDocumentFromTemplateOptions) => { const template = await prisma.template.findUnique({ - where: { id: templateId, userId }, + where: { + id: templateId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }, include: { Recipient: true, Field: true, @@ -34,6 +50,7 @@ export const createDocumentFromTemplate = async ({ const document = await prisma.document.create({ data: { userId, + teamId: template.teamId, title: template.title, documentDataId: documentData.id, Recipient: { diff --git a/packages/lib/server-only/template/create-template.ts b/packages/lib/server-only/template/create-template.ts index d00526a64..e51d69485 100644 --- a/packages/lib/server-only/template/create-template.ts +++ b/packages/lib/server-only/template/create-template.ts @@ -1,20 +1,36 @@ import { prisma } from '@documenso/prisma'; -import { TCreateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; +import type { TCreateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; export type CreateTemplateOptions = TCreateTemplateMutationSchema & { userId: number; + teamId?: number; }; export const createTemplate = async ({ title, userId, + teamId, templateDocumentDataId, }: CreateTemplateOptions) => { + if (teamId) { + await prisma.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }); + } + return await prisma.template.create({ data: { title, userId, templateDocumentDataId, + teamId, }, }); }; diff --git a/packages/lib/server-only/template/delete-template.ts b/packages/lib/server-only/template/delete-template.ts index f693bcec0..c24cc1333 100644 --- a/packages/lib/server-only/template/delete-template.ts +++ b/packages/lib/server-only/template/delete-template.ts @@ -8,5 +8,23 @@ export type DeleteTemplateOptions = { }; export const deleteTemplate = async ({ id, userId }: DeleteTemplateOptions) => { - return await prisma.template.delete({ where: { id, userId } }); + return await prisma.template.delete({ + where: { + id, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }, + }); }; diff --git a/packages/lib/server-only/template/duplicate-template.ts b/packages/lib/server-only/template/duplicate-template.ts index 6078a1945..97b3f0a0b 100644 --- a/packages/lib/server-only/template/duplicate-template.ts +++ b/packages/lib/server-only/template/duplicate-template.ts @@ -1,14 +1,39 @@ import { nanoid } from '@documenso/lib/universal/id'; import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; import type { TDuplicateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; export type DuplicateTemplateOptions = TDuplicateTemplateMutationSchema & { userId: number; }; -export const duplicateTemplate = async ({ templateId, userId }: DuplicateTemplateOptions) => { +export const duplicateTemplate = async ({ + templateId, + userId, + teamId, +}: DuplicateTemplateOptions) => { + let templateWhereFilter: Prisma.TemplateWhereUniqueInput = { + id: templateId, + userId, + teamId: null, + }; + + if (teamId !== undefined) { + templateWhereFilter = { + id: templateId, + teamId, + team: { + members: { + some: { + userId, + }, + }, + }, + }; + } + const template = await prisma.template.findUnique({ - where: { id: templateId, userId }, + where: templateWhereFilter, include: { Recipient: true, Field: true, @@ -31,6 +56,7 @@ export const duplicateTemplate = async ({ templateId, userId }: DuplicateTemplat const duplicatedTemplate = await prisma.template.create({ data: { userId, + teamId, title: template.title + ' (copy)', templateDocumentDataId: documentData.id, Recipient: { diff --git a/packages/lib/server-only/template/find-templates.ts b/packages/lib/server-only/template/find-templates.ts new file mode 100644 index 000000000..d453d28a0 --- /dev/null +++ b/packages/lib/server-only/template/find-templates.ts @@ -0,0 +1,56 @@ +import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; + +export type FindTemplatesOptions = { + userId: number; + teamId?: number; + page: number; + perPage: number; +}; + +export const findTemplates = async ({ + userId, + teamId, + page = 1, + perPage = 10, +}: FindTemplatesOptions) => { + let whereFilter: Prisma.TemplateWhereInput = { + userId, + teamId: null, + }; + + if (teamId !== undefined) { + whereFilter = { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }; + } + + const [templates, count] = await Promise.all([ + prisma.template.findMany({ + where: whereFilter, + include: { + templateDocumentData: true, + Field: true, + }, + skip: Math.max(page - 1, 0) * perPage, + orderBy: { + createdAt: 'desc', + }, + }), + prisma.template.count({ + where: whereFilter, + }), + ]); + + return { + templates, + totalPages: Math.ceil(count / perPage), + }; +}; diff --git a/packages/lib/server-only/template/get-template-by-id.ts b/packages/lib/server-only/template/get-template-by-id.ts index 56f959a9b..c4295c3c3 100644 --- a/packages/lib/server-only/template/get-template-by-id.ts +++ b/packages/lib/server-only/template/get-template-by-id.ts @@ -1,4 +1,5 @@ import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; export interface GetTemplateByIdOptions { id: number; @@ -6,11 +7,26 @@ export interface GetTemplateByIdOptions { } export const getTemplateById = async ({ id, userId }: GetTemplateByIdOptions) => { + const whereFilter: Prisma.TemplateWhereInput = { + id, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }; + return await prisma.template.findFirstOrThrow({ - where: { - id, - userId, - }, + where: whereFilter, include: { templateDocumentData: true, }, diff --git a/packages/lib/server-only/template/get-templates.ts b/packages/lib/server-only/template/get-templates.ts deleted file mode 100644 index 5f802d278..000000000 --- a/packages/lib/server-only/template/get-templates.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { prisma } from '@documenso/prisma'; - -export type GetTemplatesOptions = { - userId: number; - page: number; - perPage: number; -}; - -export const getTemplates = async ({ userId, page = 1, perPage = 10 }: GetTemplatesOptions) => { - const [templates, count] = await Promise.all([ - prisma.template.findMany({ - where: { - userId, - }, - include: { - templateDocumentData: true, - Field: true, - }, - skip: Math.max(page - 1, 0) * perPage, - orderBy: { - createdAt: 'desc', - }, - }), - prisma.template.count({ - where: { - userId, - }, - }), - ]); - - return { - templates, - totalPages: Math.ceil(count / perPage), - }; -}; diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts index eb9be2c2b..c6dfd27fd 100644 --- a/packages/lib/utils/teams.ts +++ b/packages/lib/utils/teams.ts @@ -12,6 +12,10 @@ export const formatDocumentsPath = (teamUrl?: string) => { return teamUrl ? `/t/${teamUrl}/documents` : '/documents'; }; +export const formatTemplatesPath = (teamUrl?: string) => { + return teamUrl ? `/t/${teamUrl}/templates` : '/templates'; +}; + /** * Determines whether a team member can execute a given action. * diff --git a/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql b/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql new file mode 100644 index 000000000..3a79168bf --- /dev/null +++ b/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Template" ADD COLUMN "teamId" INTEGER; + +-- AddForeignKey +ALTER TABLE "Template" ADD CONSTRAINT "Template_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 79dcdf6aa..fc128efc1 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -334,7 +334,8 @@ model Team { owner User @relation(fields: [ownerUserId], references: [id]) subscription Subscription? - document Document[] + document Document[] + templates Template[] } model TeamPending { @@ -415,10 +416,12 @@ model Template { type TemplateType @default(PRIVATE) title String userId Int + teamId Int? templateDocumentDataId String createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt + team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) templateDocumentData DocumentData @relation(fields: [templateDocumentDataId], references: [id], onDelete: Cascade) User User @relation(fields: [userId], references: [id], onDelete: Cascade) Recipient Recipient[] diff --git a/packages/prisma/seed/templates.ts b/packages/prisma/seed/templates.ts new file mode 100644 index 000000000..7f1b2f8e9 --- /dev/null +++ b/packages/prisma/seed/templates.ts @@ -0,0 +1,36 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { prisma } from '..'; +import { DocumentDataType } from '../client'; + +const examplePdf = fs + .readFileSync(path.join(__dirname, '../../../assets/example.pdf')) + .toString('base64'); + +type SeedTemplateOptions = { + title?: string; + userId: number; + teamId?: number; +}; + +export const seedTemplate = async (options: SeedTemplateOptions) => { + const { title = 'Untitled', userId, teamId } = options; + + const documentData = await prisma.documentData.create({ + data: { + type: DocumentDataType.BYTES_64, + data: examplePdf, + initialData: examplePdf, + }, + }); + + return await prisma.template.create({ + data: { + title, + templateDocumentDataId: documentData.id, + userId: userId, + teamId, + }, + }); +}; diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index 07cdcd347..5ae3cbe4b 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -39,7 +39,7 @@ export const fieldRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index 1ada3d0d3..9553a8aae 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -33,7 +33,7 @@ export const recipientRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), @@ -58,7 +58,7 @@ export const recipientRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index 28e919e92..7417e7d00 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -19,11 +19,12 @@ export const templateRouter = router({ .input(ZCreateTemplateMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { title, templateDocumentDataId } = input; + const { teamId, title, templateDocumentDataId } = input; return await createTemplate({ - title, userId: ctx.user.id, + teamId, + title, templateDocumentDataId, }); } catch (err) { @@ -64,11 +65,12 @@ export const templateRouter = router({ .input(ZDuplicateTemplateMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { templateId } = input; + const { teamId, templateId } = input; return await duplicateTemplate({ - templateId, userId: ctx.user.id, + teamId, + templateId, }); } catch (err) { console.error(err); @@ -88,7 +90,7 @@ export const templateRouter = router({ const userId = ctx.user.id; - return await deleteTemplate({ id, userId }); + return await deleteTemplate({ userId, id }); } catch (err) { console.error(err); diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index bc7161f74..3d87d4b4f 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -1,7 +1,8 @@ import { z } from 'zod'; export const ZCreateTemplateMutationSchema = z.object({ - title: z.string().min(1), + title: z.string().min(1).trim(), + teamId: z.number().optional(), templateDocumentDataId: z.string().min(1), }); @@ -11,6 +12,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({ export const ZDuplicateTemplateMutationSchema = z.object({ templateId: z.number(), + teamId: z.number().optional(), }); export const ZDeleteTemplateMutationSchema = z.object({ From 47b8cc598ca8daecfa0478f5c85435d44abda9d8 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 8 Feb 2024 04:28:16 +0000 Subject: [PATCH 42/61] fix: add validation and error message display --- packages/ui/primitives/document-flow/add-subject.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index 7ce77710c..40e42e3b3 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -2,6 +2,7 @@ import { useEffect } from 'react'; +import { zodResolver } from '@hookform/resolvers/zod'; import { Info } from 'lucide-react'; import { Controller, useForm } from 'react-hook-form'; @@ -32,7 +33,7 @@ import { Input } from '../input'; import { Label } from '../label'; import { useStep } from '../stepper'; import { Textarea } from '../textarea'; -import type { TAddSubjectFormSchema } from './add-subject.types'; +import { type TAddSubjectFormSchema, ZAddSubjectFormSchema } from './add-subject.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, @@ -71,8 +72,10 @@ export const AddSubjectFormPartial = ({ message: document.documentMeta?.message ?? '', timezone: document.documentMeta?.timezone ?? DEFAULT_DOCUMENT_TIME_ZONE, dateFormat: document.documentMeta?.dateFormat ?? DEFAULT_DOCUMENT_DATE_FORMAT, + redirectUrl: document.documentMeta?.redirectUrl ?? '', }, }, + resolver: zodResolver(ZAddSubjectFormSchema), }); const onFormSubmit = handleSubmit(onSubmit); @@ -171,10 +174,10 @@ export const AddSubjectFormPartial = ({ Advanced Options - + {hasDateField && ( <> -
+
@@ -246,7 +249,7 @@ export const AddSubjectFormPartial = ({ {...register('meta.redirectUrl')} /> - +
From 748bf6de6b4a37ce42de728c2ad99085959ba550 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 8 Feb 2024 22:12:04 +1100 Subject: [PATCH 43/61] fix: add dropped constants from merge --- packages/lib/constants/app.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 71f227764..2355c4b07 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -9,6 +9,7 @@ export const NEXT_PUBLIC_MARKETING_URL = () => env('NEXT_PUBLIC_MARKETING_URL'); export const IS_APP_MARKETING = () => NEXT_PUBLIC_PROJECT() === 'marketing'; export const IS_APP_WEB = () => NEXT_PUBLIC_PROJECT() === 'web'; +export const IS_BILLING_ENABLED = () => env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED'); export const APP_FOLDER = () => (IS_APP_MARKETING() ? 'marketing' : 'web'); From 8641884515a9799e1a57c0c555bf720644ad4cc7 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Fri, 9 Feb 2024 12:37:17 +1100 Subject: [PATCH 44/61] fix: recipients with CC role not being editable (#918) ## Description Fixed issue where setting a recipient role as CC will prevent any further changes as it is considered as "sent" and "signed". ## Other changes - Prevent editing document after completed - Removed CC and Viewers from the field recipient list since they will never be filled - Minor UI issues ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [X] I have followed the project's coding style guidelines. --- .../documents/data-table-action-dropdown.tsx | 2 +- .../app/(signing)/sign/[token]/name-field.tsx | 2 +- .../field/set-fields-for-document.ts | 4 ++++ .../recipient/set-recipients-for-document.ts | 10 ++++++++-- .../ui/primitives/document-flow/add-fields.tsx | 18 +++++++++++------- .../primitives/document-flow/add-signers.tsx | 5 ++++- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx index b7d2cf452..2bd888bb0 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx @@ -114,7 +114,7 @@ export const DataTableActionDropdown = ({ row, team }: DataTableActionDropdownPr Action - {recipient?.role !== RecipientRole.CC && ( + {recipient && recipient?.role !== RecipientRole.CC && ( {recipient?.role === RecipientRole.VIEWER && ( diff --git a/apps/web/src/app/(signing)/sign/[token]/name-field.tsx b/apps/web/src/app/(signing)/sign/[token]/name-field.tsx index 6e661e77a..44de2fc36 100644 --- a/apps/web/src/app/(signing)/sign/[token]/name-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/name-field.tsx @@ -118,7 +118,7 @@ export const NameField = ({ field, recipient }: NameFieldProps) => { ({recipient.email}) -
+
({ ...recipient, email: recipient.email.toLowerCase(), @@ -77,8 +81,9 @@ export const setRecipientsForDocument = async ({ }) .filter((recipient) => { return ( - recipient._persisted?.sendStatus !== SendStatus.SENT && - recipient._persisted?.signingStatus !== SigningStatus.SIGNED + recipient._persisted?.role === RecipientRole.CC || + (recipient._persisted?.sendStatus !== SendStatus.SENT && + recipient._persisted?.signingStatus !== SigningStatus.SIGNED) ); }); @@ -96,6 +101,7 @@ export const setRecipientsForDocument = async ({ email: recipient.email, role: recipient.role, documentId, + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, signingStatus: recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, }, diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index 9c8db7918..be7d451f7 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -304,6 +304,13 @@ export const AddFieldsFormPartial = ({ return recipientsByRole; }, [recipients]); + const recipientsByRoleToDisplay = useMemo(() => { + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + return (Object.entries(recipientsByRole) as [RecipientRole, Recipient[]][]).filter( + ([role]) => role !== RecipientRole.CC && role !== RecipientRole.VIEWER, + ); + }, [recipientsByRole]); + return ( <> - {Object.entries(recipientsByRole).map(([role, recipients], roleIndex) => ( + {recipientsByRoleToDisplay.map(([role, recipients], roleIndex) => (
- { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - RECIPIENT_ROLES_DESCRIPTION[role as RecipientRole].roleName - } + {`${RECIPIENT_ROLES_DESCRIPTION[role].roleName}s`}
{recipients.length === 0 && ( @@ -403,7 +407,7 @@ export const AddFieldsFormPartial = ({ {recipients.map((recipient) => ( { @@ -413,7 +417,7 @@ export const AddFieldsFormPartial = ({ > {recipient.name && ( diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index 26aedcae7..b1341c6ca 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -105,7 +105,10 @@ export const AddSignersFormPartial = ({ } return recipients.some( - (recipient) => recipient.id === id && recipient.sendStatus === SendStatus.SENT, + (recipient) => + recipient.id === id && + recipient.sendStatus === SendStatus.SENT && + recipient.role !== RecipientRole.CC, ); }; From 3a32bc62c520ed17cb0d8aa465b63f221523ebca Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Mon, 12 Feb 2024 12:04:53 +1100 Subject: [PATCH 45/61] feat: initial document audit logs implementation (#922) Added initial implementation of document audit logs. --- .../app/(marketing)/singleplayer/client.tsx | 1 + .../src/app/(signing)/sign/[token]/page.tsx | 8 +- packages/lib/constants/recipient-roles.ts | 6 + .../document-data/create-document-data.ts | 2 +- .../document-meta/upsert-document-meta.ts | 88 +++-- .../document/complete-document-with-token.ts | 25 +- .../server-only/document/create-document.ts | 53 ++- .../server-only/document/resend-document.tsx | 59 ++- .../lib/server-only/document/seal-document.ts | 40 +- .../document/send-completed-email.ts | 59 ++- .../server-only/document/send-document.tsx | 86 +++-- .../lib/server-only/document/update-title.ts | 76 +++- .../server-only/document/viewed-document.ts | 44 ++- .../field/remove-signed-field-with-token.ts | 34 +- .../field/set-fields-for-document.ts | 170 ++++++--- .../field/sign-field-with-token.ts | 42 +++ .../recipient/set-recipients-for-document.ts | 168 +++++++-- packages/lib/types/document-audit-logs.ts | 350 ++++++++++++++++++ .../lib/universal/extract-request-metadata.ts | 10 +- packages/lib/utils/document-audit-logs.ts | 205 ++++++++++ .../migration.sql | 37 ++ packages/prisma/schema.prisma | 20 + .../trpc/server/document-router/router.ts | 9 + packages/trpc/server/field-router/router.ts | 8 +- .../trpc/server/recipient-router/router.ts | 5 +- .../trpc/server/singleplayer-router/router.ts | 1 + 26 files changed, 1382 insertions(+), 224 deletions(-) create mode 100644 packages/lib/types/document-audit-logs.ts create mode 100644 packages/lib/utils/document-audit-logs.ts create mode 100644 packages/prisma/migrations/20240209023519_add_document_audit_logs/migration.sql diff --git a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx index a1b56257a..f4be02d7b 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx @@ -85,6 +85,7 @@ export const SinglePlayerClient = () => { setFields( data.fields.map((field, i) => ({ id: i, + secondaryId: i.toString(), documentId: -1, templateId: null, recipientId: -1, diff --git a/apps/web/src/app/(signing)/sign/[token]/page.tsx b/apps/web/src/app/(signing)/sign/[token]/page.tsx index 9a7e8acbe..99b9d1dd7 100644 --- a/apps/web/src/app/(signing)/sign/[token]/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/page.tsx @@ -1,3 +1,4 @@ +import { headers } from 'next/headers'; import { notFound, redirect } from 'next/navigation'; import { match } from 'ts-pattern'; @@ -13,6 +14,7 @@ import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-f import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token'; import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get-recipient-signatures'; import { symmetricDecrypt } from '@documenso/lib/universal/crypto'; +import { extractNextHeaderRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { DocumentStatus, FieldType, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { ElementVisible } from '@documenso/ui/primitives/element-visible'; @@ -39,13 +41,17 @@ export default async function SigningPage({ params: { token } }: SigningPageProp return notFound(); } + const requestHeaders = Object.fromEntries(headers().entries()); + + const requestMetadata = extractNextHeaderRequestMetadata(requestHeaders); + const [document, fields, recipient] = await Promise.all([ getDocumentAndSenderByToken({ token, }).catch(() => null), getFieldsForToken({ token }), getRecipientByToken({ token }).catch(() => null), - viewedDocument({ token }).catch(() => null), + viewedDocument({ token, requestMetadata }).catch(() => null), ]); if (!document || !document.documentData || !recipient) { diff --git a/packages/lib/constants/recipient-roles.ts b/packages/lib/constants/recipient-roles.ts index 920cf1f32..48d9d611b 100644 --- a/packages/lib/constants/recipient-roles.ts +++ b/packages/lib/constants/recipient-roles.ts @@ -24,3 +24,9 @@ export const RECIPIENT_ROLES_DESCRIPTION: { roleName: 'Viewer', }, }; + +export const RECIPIENT_ROLE_TO_EMAIL_TYPE = { + [RecipientRole.SIGNER]: 'SIGNING_REQUEST', + [RecipientRole.VIEWER]: 'VIEW_REQUEST', + [RecipientRole.APPROVER]: 'APPROVE_REQUEST', +} as const; diff --git a/packages/lib/server-only/document-data/create-document-data.ts b/packages/lib/server-only/document-data/create-document-data.ts index e41f00fe7..7f3a7db9d 100644 --- a/packages/lib/server-only/document-data/create-document-data.ts +++ b/packages/lib/server-only/document-data/create-document-data.ts @@ -1,7 +1,7 @@ 'use server'; import { prisma } from '@documenso/prisma'; -import { DocumentDataType } from '@documenso/prisma/client'; +import type { DocumentDataType } from '@documenso/prisma/client'; export type CreateDocumentDataOptions = { type: DocumentDataType; diff --git a/packages/lib/server-only/document-meta/upsert-document-meta.ts b/packages/lib/server-only/document-meta/upsert-document-meta.ts index 7bd6d93cc..5a1c1594e 100644 --- a/packages/lib/server-only/document-meta/upsert-document-meta.ts +++ b/packages/lib/server-only/document-meta/upsert-document-meta.ts @@ -1,5 +1,11 @@ 'use server'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { + createDocumentAuditLogData, + diffDocumentMetaChanges, +} from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; export type CreateDocumentMetaOptions = { @@ -11,6 +17,7 @@ export type CreateDocumentMetaOptions = { dateFormat?: string; redirectUrl?: string; userId: number; + requestMetadata: RequestMetadata; }; export const upsertDocumentMeta = async ({ @@ -19,50 +26,81 @@ export const upsertDocumentMeta = async ({ timezone, dateFormat, documentId, - userId, password, + userId, redirectUrl, + requestMetadata, }: CreateDocumentMetaOptions) => { - await prisma.document.findFirstOrThrow({ + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + select: { + id: true, + email: true, + name: true, + }, + }); + + const { documentMeta: originalDocumentMeta } = await prisma.document.findFirstOrThrow({ where: { id: documentId, OR: [ { - userId, + userId: user.id, }, { team: { members: { some: { - userId, + userId: user.id, }, }, }, }, ], }, + include: { + documentMeta: true, + }, }); - return await prisma.documentMeta.upsert({ - where: { - documentId, - }, - create: { - subject, - message, - password, - dateFormat, - timezone, - documentId, - redirectUrl, - }, - update: { - subject, - message, - password, - dateFormat, - timezone, - redirectUrl, - }, + return await prisma.$transaction(async (tx) => { + const upsertedDocumentMeta = await tx.documentMeta.upsert({ + where: { + documentId, + }, + create: { + subject, + message, + password, + dateFormat, + timezone, + documentId, + redirectUrl, + }, + update: { + subject, + message, + password, + dateFormat, + timezone, + redirectUrl, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_META_UPDATED, + documentId, + user, + requestMetadata, + data: { + changes: diffDocumentMetaChanges(originalDocumentMeta ?? {}, upsertedDocumentMeta), + }, + }), + }); + + return upsertedDocumentMeta; }); }; diff --git a/packages/lib/server-only/document/complete-document-with-token.ts b/packages/lib/server-only/document/complete-document-with-token.ts index 62db516fa..b0e7e024f 100644 --- a/packages/lib/server-only/document/complete-document-with-token.ts +++ b/packages/lib/server-only/document/complete-document-with-token.ts @@ -1,5 +1,8 @@ 'use server'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; @@ -9,11 +12,13 @@ import { sendPendingEmail } from './send-pending-email'; export type CompleteDocumentWithTokenOptions = { token: string; documentId: number; + requestMetadata?: RequestMetadata; }; export const completeDocumentWithToken = async ({ token, documentId, + requestMetadata, }: CompleteDocumentWithTokenOptions) => { 'use server'; @@ -70,6 +75,24 @@ export const completeDocumentWithToken = async ({ }, }); + await prisma.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_COMPLETED, + documentId: document.id, + user: { + name: recipient.name, + email: recipient.email, + }, + requestMetadata, + data: { + recipientEmail: recipient.email, + recipientName: recipient.name, + recipientId: recipient.id, + recipientRole: recipient.role, + }, + }), + }); + const pendingRecipients = await prisma.recipient.count({ where: { documentId: document.id, @@ -99,6 +122,6 @@ export const completeDocumentWithToken = async ({ }); if (documents.count > 0) { - await sealDocument({ documentId: document.id }); + await sealDocument({ documentId: document.id, requestMetadata }); } }; diff --git a/packages/lib/server-only/document/create-document.ts b/packages/lib/server-only/document/create-document.ts index 93307a7b4..7243652f0 100644 --- a/packages/lib/server-only/document/create-document.ts +++ b/packages/lib/server-only/document/create-document.ts @@ -1,5 +1,9 @@ 'use server'; +import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; export type CreateDocumentOptions = { @@ -7,6 +11,7 @@ export type CreateDocumentOptions = { userId: number; teamId?: number; documentDataId: string; + requestMetadata?: RequestMetadata; }; export const createDocument = async ({ @@ -14,22 +19,30 @@ export const createDocument = async ({ title, documentDataId, teamId, + requestMetadata, }: CreateDocumentOptions) => { - return await prisma.$transaction(async (tx) => { - if (teamId !== undefined) { - await tx.team.findFirstOrThrow({ - where: { - id: teamId, - members: { - some: { - userId, - }, - }, + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + include: { + teamMembers: { + select: { + teamId: true, }, - }); - } + }, + }, + }); - return await tx.document.create({ + if ( + teamId !== undefined && + !user.teamMembers.some((teamMember) => teamMember.teamId === teamId) + ) { + throw new AppError(AppErrorCode.NOT_FOUND, 'Team not found'); + } + + return await prisma.$transaction(async (tx) => { + const document = await tx.document.create({ data: { title, documentDataId, @@ -37,5 +50,19 @@ export const createDocument = async ({ teamId, }, }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED, + documentId: document.id, + user, + requestMetadata, + data: { + title, + }, + }), + }); + + return document; }); }; diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index d72da3a8d..1acc684b9 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -4,12 +4,18 @@ import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { + RECIPIENT_ROLES_DESCRIPTION, + RECIPIENT_ROLE_TO_EMAIL_TYPE, +} from '@documenso/lib/constants/recipient-roles'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-email-template'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import type { Prisma } from '@documenso/prisma/client'; -import { RECIPIENT_ROLES_DESCRIPTION } from '../../constants/recipient-roles'; import { getDocumentWhereInput } from './get-document-by-id'; export type ResendDocumentOptions = { @@ -17,6 +23,7 @@ export type ResendDocumentOptions = { userId: number; recipients: number[]; teamId?: number; + requestMetadata: RequestMetadata; }; export const resendDocument = async ({ @@ -24,6 +31,7 @@ export const resendDocument = async ({ userId, recipients, teamId, + requestMetadata, }: ResendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { @@ -76,6 +84,8 @@ export const resendDocument = async ({ return; } + const recipientEmailType = RECIPIENT_ROLE_TO_EMAIL_TYPE[recipient.role]; + const { email, name } = recipient; const customEmailTemplate = { @@ -99,20 +109,39 @@ export const resendDocument = async ({ const { actionVerb } = RECIPIENT_ROLES_DESCRIPTION[recipient.role]; - await mailer.sendMail({ - to: { - address: email, - name, - }, - from: { - name: FROM_NAME, - address: FROM_ADDRESS, - }, - subject: customEmail?.subject - ? renderCustomEmailTemplate(customEmail.subject, customEmailTemplate) - : `Please ${actionVerb.toLowerCase()} this document`, - html: render(template), - text: render(template, { plainText: true }), + await prisma.$transaction(async (tx) => { + await mailer.sendMail({ + to: { + address: email, + name, + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: customEmail?.subject + ? renderCustomEmailTemplate(customEmail.subject, customEmailTemplate) + : `Please ${actionVerb.toLowerCase()} this document`, + html: render(template), + text: render(template, { plainText: true }), + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT, + documentId: document.id, + user, + requestMetadata, + data: { + emailType: recipientEmailType, + recipientEmail: recipient.email, + recipientName: recipient.name, + recipientRole: recipient.role, + recipientId: recipient.id, + isResending: true, + }, + }), + }); }); }), ); diff --git a/packages/lib/server-only/document/seal-document.ts b/packages/lib/server-only/document/seal-document.ts index b24288c3e..09832db7d 100644 --- a/packages/lib/server-only/document/seal-document.ts +++ b/packages/lib/server-only/document/seal-document.ts @@ -5,10 +5,13 @@ import path from 'node:path'; import { PDFDocument } from 'pdf-lib'; import PostHogServerClient from '@documenso/lib/server-only/feature-flags/get-post-hog-server-client'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SigningStatus } from '@documenso/prisma/client'; import { signPdf } from '@documenso/signing'; +import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { putFile } from '../../universal/upload/put-file'; import { insertFieldInPDF } from '../pdf/insert-field-in-pdf'; @@ -17,9 +20,14 @@ import { sendCompletedEmail } from './send-completed-email'; export type SealDocumentOptions = { documentId: number; sendEmail?: boolean; + requestMetadata?: RequestMetadata; }; -export const sealDocument = async ({ documentId, sendEmail = true }: SealDocumentOptions) => { +export const sealDocument = async ({ + documentId, + sendEmail = true, + requestMetadata, +}: SealDocumentOptions) => { 'use server'; const document = await prisma.document.findFirstOrThrow({ @@ -100,16 +108,30 @@ export const sealDocument = async ({ documentId, sendEmail = true }: SealDocumen }); } - await prisma.documentData.update({ - where: { - id: documentData.id, - }, - data: { - data: newData, - }, + await prisma.$transaction(async (tx) => { + await tx.documentData.update({ + where: { + id: documentData.id, + }, + data: { + data: newData, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_COMPLETED, + documentId: document.id, + requestMetadata, + user: null, + data: { + transactionId: nanoid(), + }, + }), + }); }); if (sendEmail) { - await sendCompletedEmail({ documentId }); + await sendCompletedEmail({ documentId, requestMetadata }); } }; diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 226ff43ec..3ab62833c 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -5,13 +5,17 @@ import { render } from '@documenso/email/render'; import { DocumentCompletedEmailTemplate } from '@documenso/email/templates/document-completed'; import { prisma } from '@documenso/prisma'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; +import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; +import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; export interface SendDocumentOptions { documentId: number; + requestMetadata?: RequestMetadata; } -export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => { +export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDocumentOptions) => { const document = await prisma.document.findUnique({ where: { id: documentId, @@ -44,24 +48,43 @@ export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => downloadLink: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${token}/complete`, }); - await mailer.sendMail({ - to: { - address: email, - name, - }, - from: { - name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', - address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', - }, - subject: 'Signing Complete!', - html: render(template), - text: render(template, { plainText: true }), - attachments: [ - { - filename: document.title, - content: Buffer.from(buffer), + await prisma.$transaction(async (tx) => { + await mailer.sendMail({ + to: { + address: email, + name, }, - ], + from: { + name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', + address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', + }, + subject: 'Signing Complete!', + html: render(template), + text: render(template, { plainText: true }), + attachments: [ + { + filename: document.title, + content: Buffer.from(buffer), + }, + ], + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT, + documentId: document.id, + user: null, + requestMetadata, + data: { + emailType: 'DOCUMENT_COMPLETED', + recipientEmail: recipient.email, + recipientName: recipient.name, + recipientId: recipient.id, + recipientRole: recipient.role, + isResending: false, + }, + }), + }); }); }), ); diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index 312b30462..fc174c084 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -4,22 +4,37 @@ import { mailer } from '@documenso/email/mailer'; import { render } from '@documenso/email/render'; import { DocumentInviteEmailTemplate } from '@documenso/email/templates/document-invite'; import { FROM_ADDRESS, FROM_NAME } from '@documenso/lib/constants/email'; +import { + RECIPIENT_ROLES_DESCRIPTION, + RECIPIENT_ROLE_TO_EMAIL_TYPE, +} from '@documenso/lib/constants/recipient-roles'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { renderCustomEmailTemplate } from '@documenso/lib/utils/render-custom-email-template'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, RecipientRole, SendStatus } from '@documenso/prisma/client'; -import { RECIPIENT_ROLES_DESCRIPTION } from '../../constants/recipient-roles'; - export type SendDocumentOptions = { documentId: number; userId: number; + requestMetadata?: RequestMetadata; }; -export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) => { +export const sendDocument = async ({ + documentId, + userId, + requestMetadata, +}: SendDocumentOptions) => { const user = await prisma.user.findFirstOrThrow({ where: { id: userId, }, + select: { + id: true, + name: true, + email: true, + }, }); const document = await prisma.document.findUnique({ @@ -66,6 +81,8 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) return; } + const recipientEmailType = RECIPIENT_ROLE_TO_EMAIL_TYPE[recipient.role]; + const { email, name } = recipient; const customEmailTemplate = { @@ -89,29 +106,48 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) const { actionVerb } = RECIPIENT_ROLES_DESCRIPTION[recipient.role]; - await mailer.sendMail({ - to: { - address: email, - name, - }, - from: { - name: FROM_NAME, - address: FROM_ADDRESS, - }, - subject: customEmail?.subject - ? renderCustomEmailTemplate(customEmail.subject, customEmailTemplate) - : `Please ${actionVerb.toLowerCase()} this document`, - html: render(template), - text: render(template, { plainText: true }), - }); + await prisma.$transaction(async (tx) => { + await mailer.sendMail({ + to: { + address: email, + name, + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: customEmail?.subject + ? renderCustomEmailTemplate(customEmail.subject, customEmailTemplate) + : `Please ${actionVerb.toLowerCase()} this document`, + html: render(template), + text: render(template, { plainText: true }), + }); - await prisma.recipient.update({ - where: { - id: recipient.id, - }, - data: { - sendStatus: SendStatus.SENT, - }, + await tx.recipient.update({ + where: { + id: recipient.id, + }, + data: { + sendStatus: SendStatus.SENT, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT, + documentId: document.id, + user, + requestMetadata, + data: { + emailType: recipientEmailType, + recipientEmail: recipient.email, + recipientName: recipient.name, + recipientRole: recipient.role, + recipientId: recipient.id, + isResending: false, + }, + }), + }); }); }), ); diff --git a/packages/lib/server-only/document/update-title.ts b/packages/lib/server-only/document/update-title.ts index 19a902930..3e934e7be 100644 --- a/packages/lib/server-only/document/update-title.ts +++ b/packages/lib/server-only/document/update-title.ts @@ -1,34 +1,76 @@ 'use server'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; export type UpdateTitleOptions = { userId: number; documentId: number; title: string; + requestMetadata?: RequestMetadata; }; -export const updateTitle = async ({ userId, documentId, title }: UpdateTitleOptions) => { - return await prisma.document.update({ +export const updateTitle = async ({ + userId, + documentId, + title, + requestMetadata, +}: UpdateTitleOptions) => { + const user = await prisma.user.findFirstOrThrow({ where: { - id: documentId, - OR: [ - { - userId, - }, - { - team: { - members: { - some: { - userId, + id: userId, + }, + }); + + return await prisma.$transaction(async (tx) => { + const document = await tx.document.findFirstOrThrow({ + where: { + id: documentId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, }, }, }, + ], + }, + }); + + if (document.title === title) { + return document; + } + + const updatedDocument = await tx.document.update({ + where: { + id: documentId, + }, + data: { + title, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_TITLE_UPDATED, + documentId, + user, + requestMetadata, + data: { + from: document.title, + to: updatedDocument.title, }, - ], - }, - data: { - title, - }, + }), + }); + + return updatedDocument; }); }; diff --git a/packages/lib/server-only/document/viewed-document.ts b/packages/lib/server-only/document/viewed-document.ts index 5944d4841..452da1460 100644 --- a/packages/lib/server-only/document/viewed-document.ts +++ b/packages/lib/server-only/document/viewed-document.ts @@ -1,11 +1,15 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import { ReadStatus } from '@documenso/prisma/client'; export type ViewedDocumentOptions = { token: string; + requestMetadata?: RequestMetadata; }; -export const viewedDocument = async ({ token }: ViewedDocumentOptions) => { +export const viewedDocument = async ({ token, requestMetadata }: ViewedDocumentOptions) => { const recipient = await prisma.recipient.findFirst({ where: { token, @@ -13,16 +17,38 @@ export const viewedDocument = async ({ token }: ViewedDocumentOptions) => { }, }); - if (!recipient) { + if (!recipient || !recipient.documentId) { return; } - await prisma.recipient.update({ - where: { - id: recipient.id, - }, - data: { - readStatus: ReadStatus.OPENED, - }, + const { documentId } = recipient; + + await prisma.$transaction(async (tx) => { + await tx.recipient.update({ + where: { + id: recipient.id, + }, + data: { + readStatus: ReadStatus.OPENED, + }, + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_OPENED, + documentId, + user: { + name: recipient.name, + email: recipient.email, + }, + requestMetadata, + data: { + recipientEmail: recipient.email, + recipientId: recipient.id, + recipientName: recipient.name, + recipientRole: recipient.role, + }, + }), + }); }); }; diff --git a/packages/lib/server-only/field/remove-signed-field-with-token.ts b/packages/lib/server-only/field/remove-signed-field-with-token.ts index ee472ec9f..6548ae0f1 100644 --- a/packages/lib/server-only/field/remove-signed-field-with-token.ts +++ b/packages/lib/server-only/field/remove-signed-field-with-token.ts @@ -1,16 +1,21 @@ 'use server'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; export type RemovedSignedFieldWithTokenOptions = { token: string; fieldId: number; + requestMetadata?: RequestMetadata; }; export const removeSignedFieldWithToken = async ({ token, fieldId, + requestMetadata, }: RemovedSignedFieldWithTokenOptions) => { const field = await prisma.field.findFirstOrThrow({ where: { @@ -44,8 +49,8 @@ export const removeSignedFieldWithToken = async ({ throw new Error(`Field ${fieldId} has no recipientId`); } - await Promise.all([ - prisma.field.update({ + await prisma.$transaction(async (tx) => { + await tx.field.update({ where: { id: field.id, }, @@ -53,11 +58,28 @@ export const removeSignedFieldWithToken = async ({ customText: '', inserted: false, }, - }), - prisma.signature.deleteMany({ + }); + + await tx.signature.deleteMany({ where: { fieldId: field.id, }, - }), - ]); + }); + + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_UNINSERTED, + documentId: document.id, + user: { + name: recipient?.name, + email: recipient?.email, + }, + requestMetadata, + data: { + field: field.type, + fieldId: field.secondaryId, + }, + }), + }); + }); }; diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index 71508a9c5..7916de554 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -1,3 +1,9 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { + createDocumentAuditLogData, + diffFieldChanges, +} from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import type { FieldType } from '@documenso/prisma/client'; import { SendStatus, SigningStatus } from '@documenso/prisma/client'; @@ -15,12 +21,14 @@ export interface SetFieldsForDocumentOptions { pageWidth: number; pageHeight: number; }[]; + requestMetadata?: RequestMetadata; } export const setFieldsForDocument = async ({ userId, documentId, fields, + requestMetadata, }: SetFieldsForDocumentOptions) => { const document = await prisma.document.findFirst({ where: { @@ -42,6 +50,17 @@ export const setFieldsForDocument = async ({ }, }); + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + select: { + id: true, + name: true, + email: true, + }, + }); + if (!document) { throw new Error('Document not found'); } @@ -79,56 +98,123 @@ export const setFieldsForDocument = async ({ ); }); - const persistedFields = await prisma.$transaction( - // Disabling as wrapping promises here causes type issues - // eslint-disable-next-line @typescript-eslint/promise-function-async - linkedFields.map((field) => - prisma.field.upsert({ - where: { - id: field._persisted?.id ?? -1, - documentId, - }, - update: { - page: field.pageNumber, - positionX: field.pageX, - positionY: field.pageY, - width: field.pageWidth, - height: field.pageHeight, - }, - create: { - type: field.type, - page: field.pageNumber, - positionX: field.pageX, - positionY: field.pageY, - width: field.pageWidth, - height: field.pageHeight, - customText: '', - inserted: false, - Document: { - connect: { - id: documentId, - }, + const persistedFields = await prisma.$transaction(async (tx) => { + await Promise.all( + linkedFields.map(async (field) => { + const fieldSignerEmail = field.signerEmail.toLowerCase(); + + const upsertedField = await tx.field.upsert({ + where: { + id: field._persisted?.id ?? -1, + documentId, }, - Recipient: { - connect: { - documentId_email: { - documentId, - email: field.signerEmail.toLowerCase(), + update: { + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + }, + create: { + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + customText: '', + inserted: false, + Document: { + connect: { + id: documentId, + }, + }, + Recipient: { + connect: { + documentId_email: { + documentId, + email: fieldSignerEmail, + }, }, }, }, - }, + }); + + if (upsertedField.recipientId === null) { + throw new Error('Not possible'); + } + + const baseAuditLog = { + fieldId: upsertedField.secondaryId, + fieldRecipientEmail: fieldSignerEmail, + fieldRecipientId: upsertedField.recipientId, + fieldType: upsertedField.type, + }; + + const changes = field._persisted ? diffFieldChanges(field._persisted, upsertedField) : []; + + // Handle field updated audit log. + if (field._persisted && changes.length > 0) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_UPDATED, + documentId: documentId, + user, + requestMetadata, + data: { + changes, + ...baseAuditLog, + }, + }), + }); + } + + // Handle field created audit log. + if (!field._persisted) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_CREATED, + documentId: documentId, + user, + requestMetadata, + data: { + ...baseAuditLog, + }, + }), + }); + } + + return upsertedField; }), - ), - ); + ); + }); if (removedFields.length > 0) { - await prisma.field.deleteMany({ - where: { - id: { - in: removedFields.map((field) => field.id), + await prisma.$transaction(async (tx) => { + await tx.field.deleteMany({ + where: { + id: { + in: removedFields.map((field) => field.id), + }, }, - }, + }); + + await tx.documentAuditLog.createMany({ + data: removedFields.map((field) => + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.FIELD_DELETED, + documentId: documentId, + user, + requestMetadata, + data: { + fieldId: field.secondaryId, + fieldRecipientEmail: field.Recipient?.email ?? '', + fieldRecipientId: field.recipientId ?? -1, + fieldType: field.type, + }, + }), + ), + }); }); } diff --git a/packages/lib/server-only/field/sign-field-with-token.ts b/packages/lib/server-only/field/sign-field-with-token.ts index 62deccd5a..aa3056f52 100644 --- a/packages/lib/server-only/field/sign-field-with-token.ts +++ b/packages/lib/server-only/field/sign-field-with-token.ts @@ -1,18 +1,23 @@ 'use server'; import { DateTime } from 'luxon'; +import { match } from 'ts-pattern'; import { prisma } from '@documenso/prisma'; import { DocumentStatus, FieldType, SigningStatus } from '@documenso/prisma/client'; import { DEFAULT_DOCUMENT_DATE_FORMAT } from '../../constants/date-formats'; import { DEFAULT_DOCUMENT_TIME_ZONE } from '../../constants/time-zones'; +import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; +import type { RequestMetadata } from '../../universal/extract-request-metadata'; +import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; export type SignFieldWithTokenOptions = { token: string; fieldId: number; value: string; isBase64?: boolean; + requestMetadata?: RequestMetadata; }; export const signFieldWithToken = async ({ @@ -20,6 +25,7 @@ export const signFieldWithToken = async ({ fieldId, value, isBase64, + requestMetadata, }: SignFieldWithTokenOptions) => { const field = await prisma.field.findFirstOrThrow({ where: { @@ -40,6 +46,10 @@ export const signFieldWithToken = async ({ throw new Error(`Document not found for field ${field.id}`); } + if (!recipient) { + throw new Error(`Recipient not found for field ${field.id}`); + } + if (document.status === DocumentStatus.COMPLETED) { throw new Error(`Document ${document.id} has already been completed`); } @@ -123,6 +133,38 @@ export const signFieldWithToken = async ({ }); } + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_INSERTED, + documentId: document.id, + user: { + email: recipient.email, + name: recipient.name, + }, + requestMetadata, + data: { + recipientEmail: recipient.email, + recipientId: recipient.id, + recipientName: recipient.name, + recipientRole: recipient.role, + fieldId: updatedField.secondaryId, + field: match(updatedField.type) + .with(FieldType.SIGNATURE, FieldType.FREE_SIGNATURE, (type) => ({ + type, + data: signatureImageAsBase64 || typedSignature || '', + })) + .with(FieldType.DATE, FieldType.EMAIL, FieldType.NAME, FieldType.TEXT, (type) => ({ + type, + data: updatedField.customText, + })) + .exhaustive(), + fieldSecurity: { + type: 'NONE', + }, + }, + }), + }); + return updatedField; }); }; diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts index 82261a446..b18ea6420 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-document.ts +++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts @@ -1,9 +1,14 @@ +import { DOCUMENT_AUDIT_LOG_TYPE } from '@documenso/lib/types/document-audit-logs'; +import type { RequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; +import { nanoid } from '@documenso/lib/universal/id'; +import { + createDocumentAuditLogData, + diffRecipientChanges, +} from '@documenso/lib/utils/document-audit-logs'; import { prisma } from '@documenso/prisma'; import { RecipientRole } from '@documenso/prisma/client'; import { SendStatus, SigningStatus } from '@documenso/prisma/client'; -import { nanoid } from '../../universal/id'; - export interface SetRecipientsForDocumentOptions { userId: number; documentId: number; @@ -13,12 +18,14 @@ export interface SetRecipientsForDocumentOptions { name: string; role: RecipientRole; }[]; + requestMetadata?: RequestMetadata; } export const setRecipientsForDocument = async ({ userId, documentId, recipients, + requestMetadata, }: SetRecipientsForDocumentOptions) => { const document = await prisma.document.findFirst({ where: { @@ -40,6 +47,17 @@ export const setRecipientsForDocument = async ({ }, }); + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + select: { + id: true, + name: true, + email: true, + }, + }); + if (!document) { throw new Error('Document not found'); } @@ -87,45 +105,121 @@ export const setRecipientsForDocument = async ({ ); }); - const persistedRecipients = await prisma.$transaction( - // Disabling as wrapping promises here causes type issues - // eslint-disable-next-line @typescript-eslint/promise-function-async - linkedRecipients.map((recipient) => - prisma.recipient.upsert({ - where: { - id: recipient._persisted?.id ?? -1, - documentId, - }, - update: { - name: recipient.name, - email: recipient.email, - role: recipient.role, - documentId, - sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, - signingStatus: - recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, - }, - create: { - name: recipient.name, - email: recipient.email, - role: recipient.role, - token: nanoid(), - documentId, - sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, - signingStatus: - recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, - }, + const persistedRecipients = await prisma.$transaction(async (tx) => { + await Promise.all( + linkedRecipients.map(async (recipient) => { + const upsertedRecipient = await tx.recipient.upsert({ + where: { + id: recipient._persisted?.id ?? -1, + documentId, + }, + update: { + name: recipient.name, + email: recipient.email, + role: recipient.role, + documentId, + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, + }, + create: { + name: recipient.name, + email: recipient.email, + role: recipient.role, + token: nanoid(), + documentId, + sendStatus: recipient.role === RecipientRole.CC ? SendStatus.SENT : SendStatus.NOT_SENT, + signingStatus: + recipient.role === RecipientRole.CC ? SigningStatus.SIGNED : SigningStatus.NOT_SIGNED, + }, + }); + + const recipientId = upsertedRecipient.id; + + // Clear all fields if the recipient role is changed to a type that cannot have fields. + if ( + recipient._persisted && + recipient._persisted.role !== recipient.role && + (recipient.role === RecipientRole.CC || recipient.role === RecipientRole.VIEWER) + ) { + await tx.field.deleteMany({ + where: { + recipientId, + }, + }); + } + + const baseAuditLog = { + recipientEmail: upsertedRecipient.email, + recipientName: upsertedRecipient.name, + recipientId, + recipientRole: upsertedRecipient.role, + }; + + const changes = recipient._persisted + ? diffRecipientChanges(recipient._persisted, upsertedRecipient) + : []; + + // Handle recipient updated audit log. + if (recipient._persisted && changes.length > 0) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_UPDATED, + documentId: documentId, + user, + requestMetadata, + data: { + changes, + ...baseAuditLog, + }, + }), + }); + } + + // Handle recipient created audit log. + if (!recipient._persisted) { + await tx.documentAuditLog.create({ + data: createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_CREATED, + documentId: documentId, + user, + requestMetadata, + data: baseAuditLog, + }), + }); + } + + return upsertedRecipient; }), - ), - ); + ); + }); if (removedRecipients.length > 0) { - await prisma.recipient.deleteMany({ - where: { - id: { - in: removedRecipients.map((recipient) => recipient.id), + await prisma.$transaction(async (tx) => { + await tx.recipient.deleteMany({ + where: { + id: { + in: removedRecipients.map((recipient) => recipient.id), + }, }, - }, + }); + + await tx.documentAuditLog.createMany({ + data: removedRecipients.map((recipient) => + createDocumentAuditLogData({ + type: DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_DELETED, + documentId: documentId, + user, + requestMetadata, + data: { + recipientEmail: recipient.email, + recipientName: recipient.name, + recipientId: recipient.id, + recipientRole: recipient.role, + }, + }), + ), + }); }); } diff --git a/packages/lib/types/document-audit-logs.ts b/packages/lib/types/document-audit-logs.ts new file mode 100644 index 000000000..e6a954603 --- /dev/null +++ b/packages/lib/types/document-audit-logs.ts @@ -0,0 +1,350 @@ +///////////////////////////////////////////////////////////////////////////////////////////// +// +// Be aware that any changes to this file may require migrations since we are storing JSON +// data in Prisma. +// +///////////////////////////////////////////////////////////////////////////////////////////// +import { z } from 'zod'; + +import { FieldType } from '@documenso/prisma/client'; + +export const ZDocumentAuditLogTypeSchema = z.enum([ + // Document actions. + 'EMAIL_SENT', + + // Document modification events. + 'FIELD_CREATED', + 'FIELD_DELETED', + 'FIELD_UPDATED', + 'RECIPIENT_CREATED', + 'RECIPIENT_DELETED', + 'RECIPIENT_UPDATED', + + // Document events. + 'DOCUMENT_COMPLETED', + 'DOCUMENT_CREATED', + 'DOCUMENT_DELETED', + 'DOCUMENT_FIELD_INSERTED', + 'DOCUMENT_FIELD_UNINSERTED', + 'DOCUMENT_META_UPDATED', + 'DOCUMENT_OPENED', + 'DOCUMENT_TITLE_UPDATED', + 'DOCUMENT_RECIPIENT_COMPLETED', +]); + +export const ZDocumentMetaDiffTypeSchema = z.enum([ + 'DATE_FORMAT', + 'MESSAGE', + 'PASSWORD', + 'REDIRECT_URL', + 'SUBJECT', + 'TIMEZONE', +]); +export const ZFieldDiffTypeSchema = z.enum(['DIMENSION', 'POSITION']); +export const ZRecipientDiffTypeSchema = z.enum(['NAME', 'ROLE', 'EMAIL']); + +export const DOCUMENT_AUDIT_LOG_TYPE = ZDocumentAuditLogTypeSchema.Enum; +export const DOCUMENT_META_DIFF_TYPE = ZDocumentMetaDiffTypeSchema.Enum; +export const FIELD_DIFF_TYPE = ZFieldDiffTypeSchema.Enum; +export const RECIPIENT_DIFF_TYPE = ZRecipientDiffTypeSchema.Enum; + +export const ZFieldDiffDimensionSchema = z.object({ + type: z.literal(FIELD_DIFF_TYPE.DIMENSION), + from: z.object({ + width: z.number(), + height: z.number(), + }), + to: z.object({ + width: z.number(), + height: z.number(), + }), +}); + +export const ZFieldDiffPositionSchema = z.object({ + type: z.literal(FIELD_DIFF_TYPE.POSITION), + from: z.object({ + page: z.number(), + positionX: z.number(), + positionY: z.number(), + }), + to: z.object({ + page: z.number(), + positionX: z.number(), + positionY: z.number(), + }), +}); + +export const ZDocumentAuditLogDocumentMetaSchema = z.union([ + z.object({ + type: z.union([ + z.literal(DOCUMENT_META_DIFF_TYPE.DATE_FORMAT), + z.literal(DOCUMENT_META_DIFF_TYPE.MESSAGE), + z.literal(DOCUMENT_META_DIFF_TYPE.REDIRECT_URL), + z.literal(DOCUMENT_META_DIFF_TYPE.SUBJECT), + z.literal(DOCUMENT_META_DIFF_TYPE.TIMEZONE), + ]), + from: z.string().nullable(), + to: z.string().nullable(), + }), + z.object({ + type: z.literal(DOCUMENT_META_DIFF_TYPE.PASSWORD), + }), +]); + +export const ZDocumentAuditLogFieldDiffSchema = z.union([ + ZFieldDiffDimensionSchema, + ZFieldDiffPositionSchema, +]); + +export const ZRecipientDiffNameSchema = z.object({ + type: z.literal(RECIPIENT_DIFF_TYPE.NAME), + from: z.string(), + to: z.string(), +}); + +export const ZRecipientDiffRoleSchema = z.object({ + type: z.literal(RECIPIENT_DIFF_TYPE.ROLE), + from: z.string(), + to: z.string(), +}); + +export const ZRecipientDiffEmailSchema = z.object({ + type: z.literal(RECIPIENT_DIFF_TYPE.EMAIL), + from: z.string(), + to: z.string(), +}); + +export const ZDocumentAuditLogRecipientDiffSchema = z.union([ + ZRecipientDiffNameSchema, + ZRecipientDiffRoleSchema, + ZRecipientDiffEmailSchema, +]); + +const ZBaseFieldEventDataSchema = z.object({ + fieldId: z.string(), // Note: This is the secondary field ID, which will get migrated in the future. + fieldRecipientEmail: z.string(), + fieldRecipientId: z.number(), + fieldType: z.string(), // We specifically don't want to use enums to allow for more flexibility. +}); + +const ZBaseRecipientDataSchema = z.object({ + recipientEmail: z.string(), + recipientName: z.string(), + recipientId: z.number(), + recipientRole: z.string(), +}); + +/** + * Event: Email sent. + */ +export const ZDocumentAuditLogEventEmailSentSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.EMAIL_SENT), + data: ZBaseRecipientDataSchema.extend({ + emailType: z.enum([ + 'SIGNING_REQUEST', + 'VIEW_REQUEST', + 'APPROVE_REQUEST', + 'CC', + 'DOCUMENT_COMPLETED', + ]), + isResending: z.boolean(), + }), +}); + +/** + * Event: Document completed. + */ +export const ZDocumentAuditLogEventDocumentCompletedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_COMPLETED), + data: z.object({ + transactionId: z.string(), + }), +}); + +/** + * Event: Document created. + */ +export const ZDocumentAuditLogEventDocumentCreatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_CREATED), + data: z.object({ + title: z.string(), + }), +}); + +/** + * Event: Document field inserted. + */ +export const ZDocumentAuditLogEventDocumentFieldInsertedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_INSERTED), + data: ZBaseRecipientDataSchema.extend({ + fieldId: z.string(), + + // Organised into union to allow us to extend each field if required. + field: z.union([ + z.object({ + type: z.literal(FieldType.EMAIL), + data: z.string(), + }), + z.object({ + type: z.literal(FieldType.DATE), + data: z.string(), + }), + z.object({ + type: z.literal(FieldType.NAME), + data: z.string(), + }), + z.object({ + type: z.literal(FieldType.TEXT), + data: z.string(), + }), + z.object({ + type: z.union([z.literal(FieldType.SIGNATURE), z.literal(FieldType.FREE_SIGNATURE)]), + data: z.string(), + }), + ]), + + // Todo: Replace with union once we have more field security types. + fieldSecurity: z.object({ + type: z.literal('NONE'), + }), + }), +}); + +/** + * Event: Document field uninserted. + */ +export const ZDocumentAuditLogEventDocumentFieldUninsertedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_FIELD_UNINSERTED), + data: z.object({ + field: z.nativeEnum(FieldType), + fieldId: z.string(), + }), +}); + +/** + * Event: Document meta updated. + */ +export const ZDocumentAuditLogEventDocumentMetaUpdatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_META_UPDATED), + data: z.object({ + changes: z.array(ZDocumentAuditLogDocumentMetaSchema), + }), +}); + +/** + * Event: Document opened. + */ +export const ZDocumentAuditLogEventDocumentOpenedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_OPENED), + data: ZBaseRecipientDataSchema, +}); + +/** + * Event: Document recipient completed the document (the recipient has fully actioned and completed their required steps for the document). + */ +export const ZDocumentAuditLogEventDocumentRecipientCompleteSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_RECIPIENT_COMPLETED), + data: ZBaseRecipientDataSchema, +}); + +/** + * Event: Document title updated. + */ +export const ZDocumentAuditLogEventDocumentTitleUpdatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.DOCUMENT_TITLE_UPDATED), + data: z.object({ + from: z.string(), + to: z.string(), + }), +}); + +/** + * Event: Field created. + */ +export const ZDocumentAuditLogEventFieldCreatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.FIELD_CREATED), + data: ZBaseFieldEventDataSchema, +}); + +/** + * Event: Field deleted. + */ +export const ZDocumentAuditLogEventFieldRemovedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.FIELD_DELETED), + data: ZBaseFieldEventDataSchema, +}); + +/** + * Event: Field updated. + */ +export const ZDocumentAuditLogEventFieldUpdatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.FIELD_UPDATED), + data: ZBaseFieldEventDataSchema.extend({ + changes: z.array(ZDocumentAuditLogFieldDiffSchema), + }), +}); + +/** + * Event: Recipient added. + */ +export const ZDocumentAuditLogEventRecipientAddedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_CREATED), + data: ZBaseRecipientDataSchema, +}); + +/** + * Event: Recipient updated. + */ +export const ZDocumentAuditLogEventRecipientUpdatedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_UPDATED), + data: ZBaseRecipientDataSchema.extend({ + changes: z.array(ZDocumentAuditLogRecipientDiffSchema), + }), +}); + +/** + * Event: Recipient deleted. + */ +export const ZDocumentAuditLogEventRecipientRemovedSchema = z.object({ + type: z.literal(DOCUMENT_AUDIT_LOG_TYPE.RECIPIENT_DELETED), + data: ZBaseRecipientDataSchema, +}); + +export const ZDocumentAuditLogBaseSchema = z.object({ + id: z.string(), + createdAt: z.date(), + documentId: z.number(), +}); + +export const ZDocumentAuditLogSchema = ZDocumentAuditLogBaseSchema.and( + z.union([ + ZDocumentAuditLogEventEmailSentSchema, + ZDocumentAuditLogEventDocumentCompletedSchema, + ZDocumentAuditLogEventDocumentCreatedSchema, + ZDocumentAuditLogEventDocumentFieldInsertedSchema, + ZDocumentAuditLogEventDocumentFieldUninsertedSchema, + ZDocumentAuditLogEventDocumentMetaUpdatedSchema, + ZDocumentAuditLogEventDocumentOpenedSchema, + ZDocumentAuditLogEventDocumentRecipientCompleteSchema, + ZDocumentAuditLogEventDocumentTitleUpdatedSchema, + ZDocumentAuditLogEventFieldCreatedSchema, + ZDocumentAuditLogEventFieldRemovedSchema, + ZDocumentAuditLogEventFieldUpdatedSchema, + ZDocumentAuditLogEventRecipientAddedSchema, + ZDocumentAuditLogEventRecipientUpdatedSchema, + ZDocumentAuditLogEventRecipientRemovedSchema, + ]), +); + +export type TDocumentAuditLog = z.infer; +export type TDocumentAuditLogType = z.infer; + +export type TDocumentAuditLogFieldDiffSchema = z.infer; + +export type TDocumentAuditLogDocumentMetaDiffSchema = z.infer< + typeof ZDocumentAuditLogDocumentMetaSchema +>; + +export type TDocumentAuditLogRecipientDiffSchema = z.infer< + typeof ZDocumentAuditLogRecipientDiffSchema +>; diff --git a/packages/lib/universal/extract-request-metadata.ts b/packages/lib/universal/extract-request-metadata.ts index 5549e5de7..d608d5f80 100644 --- a/packages/lib/universal/extract-request-metadata.ts +++ b/packages/lib/universal/extract-request-metadata.ts @@ -25,10 +25,16 @@ export const extractNextApiRequestMetadata = (req: NextApiRequest): RequestMetad export const extractNextAuthRequestMetadata = ( req: Pick, ): RequestMetadata => { - const parsedIp = ZIpSchema.safeParse(req.headers?.['x-forwarded-for']); + return extractNextHeaderRequestMetadata(req.headers ?? {}); +}; + +export const extractNextHeaderRequestMetadata = ( + headers: Record, +): RequestMetadata => { + const parsedIp = ZIpSchema.safeParse(headers?.['x-forwarded-for']); const ipAddress = parsedIp.success ? parsedIp.data : undefined; - const userAgent = req.headers?.['user-agent']; + const userAgent = headers?.['user-agent']; return { ipAddress, diff --git a/packages/lib/utils/document-audit-logs.ts b/packages/lib/utils/document-audit-logs.ts new file mode 100644 index 000000000..dcc3932e9 --- /dev/null +++ b/packages/lib/utils/document-audit-logs.ts @@ -0,0 +1,205 @@ +import type { DocumentAuditLog, DocumentMeta, Field, Recipient } from '@documenso/prisma/client'; + +import type { + TDocumentAuditLog, + TDocumentAuditLogDocumentMetaDiffSchema, + TDocumentAuditLogFieldDiffSchema, + TDocumentAuditLogRecipientDiffSchema, +} from '../types/document-audit-logs'; +import { + DOCUMENT_META_DIFF_TYPE, + FIELD_DIFF_TYPE, + RECIPIENT_DIFF_TYPE, + ZDocumentAuditLogSchema, +} from '../types/document-audit-logs'; +import type { RequestMetadata } from '../universal/extract-request-metadata'; + +type CreateDocumentAuditLogDataOptions = { + documentId: number; + type: T; + data: Extract['data']; + user: { email?: string; id?: number | null; name?: string | null } | null; + requestMetadata?: RequestMetadata; +}; + +type CreateDocumentAuditLogDataResponse = Pick< + DocumentAuditLog, + 'type' | 'ipAddress' | 'userAgent' | 'email' | 'userId' | 'name' | 'documentId' +> & { + data: TDocumentAuditLog['data']; +}; + +export const createDocumentAuditLogData = ({ + documentId, + type, + data, + user, + requestMetadata, +}: CreateDocumentAuditLogDataOptions): CreateDocumentAuditLogDataResponse => { + return { + type, + data, + documentId, + userId: user?.id ?? null, + email: user?.email ?? null, + name: user?.name ?? null, + userAgent: requestMetadata?.userAgent ?? null, + ipAddress: requestMetadata?.ipAddress ?? null, + }; +}; + +/** + * Parse a raw document audit log from Prisma, to a typed audit log. + * + * @param auditLog raw audit log from Prisma. + */ +export const parseDocumentAuditLogData = (auditLog: DocumentAuditLog): TDocumentAuditLog => { + const data = ZDocumentAuditLogSchema.safeParse(auditLog); + + // Handle any required migrations here. + if (!data.success) { + throw new Error('Migration required'); + } + + return data.data; +}; + +type PartialRecipient = Pick; + +export const diffRecipientChanges = ( + oldRecipient: PartialRecipient, + newRecipient: PartialRecipient, +): TDocumentAuditLogRecipientDiffSchema[] => { + const diffs: TDocumentAuditLogRecipientDiffSchema[] = []; + + if (oldRecipient.email !== newRecipient.email) { + diffs.push({ + type: RECIPIENT_DIFF_TYPE.EMAIL, + from: oldRecipient.email, + to: newRecipient.email, + }); + } + + if (oldRecipient.role !== newRecipient.role) { + diffs.push({ + type: RECIPIENT_DIFF_TYPE.ROLE, + from: oldRecipient.role, + to: newRecipient.role, + }); + } + + if (oldRecipient.name !== newRecipient.name) { + diffs.push({ + type: RECIPIENT_DIFF_TYPE.NAME, + from: oldRecipient.name, + to: newRecipient.name, + }); + } + + return diffs; +}; + +export const diffFieldChanges = ( + oldField: Field, + newField: Field, +): TDocumentAuditLogFieldDiffSchema[] => { + const diffs: TDocumentAuditLogFieldDiffSchema[] = []; + + if ( + oldField.page !== newField.page || + !oldField.positionX.equals(newField.positionX) || + !oldField.positionY.equals(newField.positionY) + ) { + diffs.push({ + type: FIELD_DIFF_TYPE.POSITION, + from: { + page: oldField.page, + positionX: oldField.positionX.toNumber(), + positionY: oldField.positionY.toNumber(), + }, + to: { + page: newField.page, + positionX: newField.positionX.toNumber(), + positionY: newField.positionY.toNumber(), + }, + }); + } + + if (!oldField.width.equals(newField.width) || !oldField.height.equals(newField.height)) { + diffs.push({ + type: FIELD_DIFF_TYPE.DIMENSION, + from: { + width: oldField.width.toNumber(), + height: oldField.height.toNumber(), + }, + to: { + width: newField.width.toNumber(), + height: newField.height.toNumber(), + }, + }); + } + + return diffs; +}; + +export const diffDocumentMetaChanges = ( + oldData: Partial = {}, + newData: DocumentMeta, +): TDocumentAuditLogDocumentMetaDiffSchema[] => { + const diffs: TDocumentAuditLogDocumentMetaDiffSchema[] = []; + + const oldDateFormat = oldData?.dateFormat ?? ''; + const oldMessage = oldData?.message ?? ''; + const oldSubject = oldData?.subject ?? ''; + const oldTimezone = oldData?.timezone ?? ''; + const oldPassword = oldData?.password ?? null; + const oldRedirectUrl = oldData?.redirectUrl ?? ''; + + if (oldDateFormat !== newData.dateFormat) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.DATE_FORMAT, + from: oldData?.dateFormat ?? '', + to: newData.dateFormat, + }); + } + + if (oldMessage !== newData.message) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.MESSAGE, + from: oldMessage, + to: newData.message, + }); + } + + if (oldSubject !== newData.subject) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.SUBJECT, + from: oldSubject, + to: newData.subject, + }); + } + + if (oldTimezone !== newData.timezone) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.TIMEZONE, + from: oldTimezone, + to: newData.timezone, + }); + } + + if (oldRedirectUrl !== newData.redirectUrl) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.REDIRECT_URL, + from: oldRedirectUrl, + to: newData.redirectUrl, + }); + } + + if (oldPassword !== newData.password) { + diffs.push({ + type: DOCUMENT_META_DIFF_TYPE.PASSWORD, + }); + } + + return diffs; +}; diff --git a/packages/prisma/migrations/20240209023519_add_document_audit_logs/migration.sql b/packages/prisma/migrations/20240209023519_add_document_audit_logs/migration.sql new file mode 100644 index 000000000..94e5fd097 --- /dev/null +++ b/packages/prisma/migrations/20240209023519_add_document_audit_logs/migration.sql @@ -0,0 +1,37 @@ +/* + Warnings: + + - A unique constraint covering the columns `[secondaryId]` on the table `Field` will be added. If there are existing duplicate values, this will fail. + - The required column `secondaryId` was added to the `Field` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. + +*/ +-- AlterTable +ALTER TABLE "Field" ADD COLUMN "secondaryId" TEXT; + +-- Set all null secondaryId fields to a uuid +UPDATE "Field" SET "secondaryId" = gen_random_uuid()::text WHERE "secondaryId" IS NULL; + +-- Restrict the Field to required +ALTER TABLE "Field" ALTER COLUMN "secondaryId" SET NOT NULL; + +-- CreateTable +CREATE TABLE "DocumentAuditLog" ( + "id" TEXT NOT NULL, + "documentId" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "type" TEXT NOT NULL, + "data" JSONB NOT NULL, + "name" TEXT, + "email" TEXT, + "userId" INTEGER, + "userAgent" TEXT, + "ipAddress" TEXT, + + CONSTRAINT "DocumentAuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Field_secondaryId_key" ON "Field"("secondaryId"); + +-- AddForeignKey +ALTER TABLE "DocumentAuditLog" ADD CONSTRAINT "DocumentAuditLog_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "Document"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index ff2d12319..2887cd6d2 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -170,11 +170,30 @@ model Document { teamId Int? team Team? @relation(fields: [teamId], references: [id]) + auditLogs DocumentAuditLog[] + @@unique([documentDataId]) @@index([userId]) @@index([status]) } +model DocumentAuditLog { + id String @id @default(cuid()) + documentId Int + createdAt DateTime @default(now()) + type String + data Json + + // Details of the person who performed the action which caused the audit log. + name String? + email String? + userId Int? + userAgent String? + ipAddress String? + + Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) +} + enum DocumentDataType { S3_PATH BYTES @@ -260,6 +279,7 @@ enum FieldType { model Field { id Int @id @default(autoincrement()) + secondaryId String @unique @default(cuid()) documentId Int? templateId Int? recipientId Int? diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index d0ff48941..aebc6e505 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -15,6 +15,7 @@ import { updateTitle } from '@documenso/lib/server-only/document/update-title'; import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; import { symmetricEncrypt } from '@documenso/lib/universal/crypto'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { @@ -88,6 +89,7 @@ export const documentRouter = router({ teamId, title, documentDataId, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { if (err instanceof TRPCError) { @@ -131,6 +133,7 @@ export const documentRouter = router({ title, userId, documentId, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); }), @@ -144,6 +147,7 @@ export const documentRouter = router({ userId: ctx.user.id, documentId, recipients, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -166,6 +170,7 @@ export const documentRouter = router({ userId: ctx.user.id, documentId, fields, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -198,6 +203,7 @@ export const documentRouter = router({ documentId, password: securePassword, userId: ctx.user.id, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -224,12 +230,14 @@ export const documentRouter = router({ timezone: meta.timezone, redirectUrl: meta.redirectUrl, userId: ctx.user.id, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } return await sendDocument({ userId: ctx.user.id, documentId, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -248,6 +256,7 @@ export const documentRouter = router({ return await resendDocument({ userId: ctx.user.id, ...input, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index 5ae3cbe4b..4df1b1ddc 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -4,6 +4,7 @@ import { removeSignedFieldWithToken } from '@documenso/lib/server-only/field/rem import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; import { setFieldsForTemplate } from '@documenso/lib/server-only/field/set-fields-for-template'; import { signFieldWithToken } from '@documenso/lib/server-only/field/sign-field-with-token'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { @@ -33,6 +34,7 @@ export const fieldRouter = router({ pageWidth: field.pageWidth, pageHeight: field.pageHeight, })), + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -67,7 +69,7 @@ export const fieldRouter = router({ signFieldWithToken: procedure .input(ZSignFieldWithTokenMutationSchema) - .mutation(async ({ input }) => { + .mutation(async ({ input, ctx }) => { try { const { token, fieldId, value, isBase64 } = input; @@ -76,6 +78,7 @@ export const fieldRouter = router({ fieldId, value, isBase64, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -89,13 +92,14 @@ export const fieldRouter = router({ removeSignedFieldWithToken: procedure .input(ZRemovedSignedFieldWithTokenMutationSchema) - .mutation(async ({ input }) => { + .mutation(async ({ input, ctx }) => { try { const { token, fieldId } = input; return await removeSignedFieldWithToken({ token, fieldId, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index 9553a8aae..c36b09ec9 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -3,6 +3,7 @@ import { TRPCError } from '@trpc/server'; import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; import { setRecipientsForTemplate } from '@documenso/lib/server-only/recipient/set-recipients-for-template'; +import { extractNextApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata'; import { authenticatedProcedure, procedure, router } from '../trpc'; import { @@ -27,6 +28,7 @@ export const recipientRouter = router({ name: signer.name, role: signer.role, })), + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); @@ -65,13 +67,14 @@ export const recipientRouter = router({ completeDocumentWithToken: procedure .input(ZCompleteDocumentWithTokenMutationSchema) - .mutation(async ({ input }) => { + .mutation(async ({ input, ctx }) => { try { const { token, documentId } = input; return await completeDocumentWithToken({ token, documentId, + requestMetadata: extractNextApiRequestMetadata(ctx.req), }); } catch (err) { console.error(err); diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index 8e2266fcc..e2a6dbec0 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -62,6 +62,7 @@ export const singleplayerRouter = router({ : null, // Dummy data. id: -1, + secondaryId: '-1', documentId: -1, templateId: null, recipientId: -1, From 20e297673168b81c4fc5f807f892603e30866a28 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 12 Feb 2024 01:29:22 +0000 Subject: [PATCH 46/61] fix: build issues --- .../content/blog/commodifying-signing.mdx | 2 +- apps/marketing/content/blog/linear-gh.mdx | 2 +- .../content/blog/why-i-started-documenso.mdx | 2 +- .../src/app/(marketing)/[content]/page.tsx | 2 +- .../src/app/(marketing)/blog/[post]/page.tsx | 6 ++- .../src/app/(marketing)/claimed/page.tsx | 2 + .../src/app/(marketing)/pricing/page.tsx | 2 + .../src/app/(marketing)/singleplayer/page.tsx | 1 + apps/marketing/src/app/layout.tsx | 52 ++++++++++--------- .../web/src/app/(share)/share/[slug]/page.tsx | 6 +-- .../src/app/(unauthenticated)/signin/page.tsx | 2 +- apps/web/src/app/layout.tsx | 51 +++++++++--------- .../(teams)/dialogs/transfer-team-dialog.tsx | 2 +- .../(teams)/settings/layout/desktop-nav.tsx | 2 +- .../(teams)/settings/layout/mobile-nav.tsx | 2 +- packages/ee/server-only/limits/server.ts | 2 +- packages/lib/constants/app.ts | 2 +- .../server-only/document/send-document.tsx | 7 +-- .../team/accept-team-invitation.ts | 2 +- .../team/create-team-billing-portal.ts | 2 +- packages/lib/server-only/team/create-team.ts | 4 +- .../server-only/team/delete-team-members.ts | 2 +- packages/lib/server-only/team/leave-team.ts | 2 +- .../team/transfer-team-ownership.ts | 2 +- packages/lib/server-only/user/create-user.ts | 4 +- 25 files changed, 88 insertions(+), 77 deletions(-) diff --git a/apps/marketing/content/blog/commodifying-signing.mdx b/apps/marketing/content/blog/commodifying-signing.mdx index 0a9cf4050..2bf1b2799 100644 --- a/apps/marketing/content/blog/commodifying-signing.mdx +++ b/apps/marketing/content/blog/commodifying-signing.mdx @@ -5,7 +5,7 @@ authorName: 'Timur Ercan' authorImage: '/blog/blog-author-timur.jpeg' authorRole: 'Co-Founder' date: 2024-01-25 -Tags: +tags: - Vision - Mission - Open Source diff --git a/apps/marketing/content/blog/linear-gh.mdx b/apps/marketing/content/blog/linear-gh.mdx index 1267931d6..fc5282851 100644 --- a/apps/marketing/content/blog/linear-gh.mdx +++ b/apps/marketing/content/blog/linear-gh.mdx @@ -5,7 +5,7 @@ authorName: 'Timur Ercan' authorImage: '/blog/blog-author-timur.jpeg' authorRole: 'Co-Founder' date: 2024-01-10 -Tags: +tags: - GitHub - Backlog - Roadmap diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 2fceddd25..9ef83b8d1 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -5,7 +5,7 @@ authorName: 'Timur Ercan' authorImage: '/blog/blog-author-timur.jpeg' authorRole: 'Co-Founder' date: 2024-02-06 -Tags: +tags: - Founders - Mission - Open Source diff --git a/apps/marketing/src/app/(marketing)/[content]/page.tsx b/apps/marketing/src/app/(marketing)/[content]/page.tsx index 62c83f400..ba23e6b81 100644 --- a/apps/marketing/src/app/(marketing)/[content]/page.tsx +++ b/apps/marketing/src/app/(marketing)/[content]/page.tsx @@ -12,7 +12,7 @@ export const generateMetadata = ({ params }: { params: { content: string } }) => const document = allDocuments.find((post) => post._raw.flattenedPath === params.content); if (!document) { - notFound(); + return { title: 'Not Found' }; } return { title: document.title }; diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 866539a92..495b8946e 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,6 +7,8 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; +export const dynamic = 'force-dynamic'; + export const generateStaticParams = () => allBlogPosts.map((post) => ({ post: post._raw.flattenedPath })); @@ -14,7 +16,9 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); if (!blogPost) { - notFound(); + return { + title: 'Not Found', + }; } return { diff --git a/apps/marketing/src/app/(marketing)/claimed/page.tsx b/apps/marketing/src/app/(marketing)/claimed/page.tsx index 7f85b5d2e..730a99377 100644 --- a/apps/marketing/src/app/(marketing)/claimed/page.tsx +++ b/apps/marketing/src/app/(marketing)/claimed/page.tsx @@ -13,6 +13,8 @@ import { Button } from '@documenso/ui/primitives/button'; import { PasswordReveal } from '~/components/(marketing)/password-reveal'; +export const dynamic = 'force-dynamic'; + const fontCaveat = Caveat({ weight: ['500'], subsets: ['latin'], diff --git a/apps/marketing/src/app/(marketing)/pricing/page.tsx b/apps/marketing/src/app/(marketing)/pricing/page.tsx index e4c7b776a..d926ec675 100644 --- a/apps/marketing/src/app/(marketing)/pricing/page.tsx +++ b/apps/marketing/src/app/(marketing)/pricing/page.tsx @@ -15,6 +15,8 @@ export const metadata: Metadata = { title: 'Pricing', }; +export const dynamic = 'force-dynamic'; + export type PricingPageProps = { searchParams?: { planId?: string; diff --git a/apps/marketing/src/app/(marketing)/singleplayer/page.tsx b/apps/marketing/src/app/(marketing)/singleplayer/page.tsx index aafad32a8..5e8a07040 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/page.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/page.tsx @@ -7,6 +7,7 @@ export const metadata: Metadata = { }; export const revalidate = 0; +export const dynamic = 'force-dynamic'; // !: This entire file is a hack to get around failed prerendering of // !: the Single Player Mode page. This regression was introduced during diff --git a/apps/marketing/src/app/layout.tsx b/apps/marketing/src/app/layout.tsx index 1745149c6..57da42c3f 100644 --- a/apps/marketing/src/app/layout.tsx +++ b/apps/marketing/src/app/layout.tsx @@ -3,6 +3,7 @@ import { Suspense } from 'react'; import { Caveat, Inter } from 'next/font/google'; import { FeatureFlagProvider } from '@documenso/lib/client-only/providers/feature-flag'; +import { NEXT_PUBLIC_MARKETING_URL } from '@documenso/lib/constants/app'; import { getAllAnonymousFlags } from '@documenso/lib/universal/get-feature-flag'; import { TrpcProvider } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -17,32 +18,35 @@ import './globals.css'; const fontInter = Inter({ subsets: ['latin'], variable: '--font-sans' }); const fontCaveat = Caveat({ subsets: ['latin'], variable: '--font-signature' }); -export const metadata = { - title: { - template: '%s - Documenso', - default: 'Documenso', - }, - description: - 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - keywords: - 'Documenso, open source, DocuSign alternative, document signing, open signing infrastructure, open-source community, fast signing, beautiful signing, smart templates', - authors: { name: 'Documenso, Inc.' }, - robots: 'index, follow', - openGraph: { - title: 'Documenso - The Open Source DocuSign Alternative', +export function generateMetadata() { + return { + title: { + template: '%s - Documenso', + default: 'Documenso', + }, description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - type: 'website', - images: [`${process.env.NEXT_PUBLIC_MARKETING_URL}/opengraph-image.jpg`], - }, - twitter: { - site: '@documenso', - card: 'summary_large_image', - images: [`${process.env.NEXT_PUBLIC_MARKETING_URL}/opengraph-image.jpg`], - description: - 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - }, -}; + keywords: + 'Documenso, open source, DocuSign alternative, document signing, open signing infrastructure, open-source community, fast signing, beautiful signing, smart templates', + authors: { name: 'Documenso, Inc.' }, + robots: 'index, follow', + metadataBase: new URL(NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3000'), + openGraph: { + title: 'Documenso - The Open Source DocuSign Alternative', + description: + 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', + type: 'website', + images: ['/opengraph-image.jpg'], + }, + twitter: { + site: '@documenso', + card: 'summary_large_image', + images: ['/opengraph-image.jpg'], + description: + 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', + }, + }; +} export default async function RootLayout({ children }: { children: React.ReactNode }) { const flags = await getAllAnonymousFlags(); diff --git a/apps/web/src/app/(share)/share/[slug]/page.tsx b/apps/web/src/app/(share)/share/[slug]/page.tsx index 80d991934..efcd75a41 100644 --- a/apps/web/src/app/(share)/share/[slug]/page.tsx +++ b/apps/web/src/app/(share)/share/[slug]/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from 'next'; import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; -import { APP_BASE_URL, NEXT_PUBLIC_MARKETING_URL } from '@documenso/lib/constants/app'; +import { NEXT_PUBLIC_MARKETING_URL } from '@documenso/lib/constants/app'; type SharePageProps = { params: { slug: string }; @@ -16,12 +16,12 @@ export function generateMetadata({ params: { slug } }: SharePageProps) { title: 'Documenso - Join the open source signing revolution', description: 'I just signed with Documenso!', type: 'website', - images: [`${APP_BASE_URL()}/share/${slug}/opengraph`], + images: [`/share/${slug}/opengraph`], }, twitter: { site: '@documenso', card: 'summary_large_image', - images: [`${APP_BASE_URL()}/share/${slug}/opengraph`], + images: [`/share/${slug}/opengraph`], description: 'I just signed with Documenso!', }, } satisfies Metadata; diff --git a/apps/web/src/app/(unauthenticated)/signin/page.tsx b/apps/web/src/app/(unauthenticated)/signin/page.tsx index 71a558bc0..50356a5bb 100644 --- a/apps/web/src/app/(unauthenticated)/signin/page.tsx +++ b/apps/web/src/app/(unauthenticated)/signin/page.tsx @@ -21,7 +21,7 @@ type SignInPageProps = { export default function SignInPage({ searchParams }: SignInPageProps) { const NEXT_PUBLIC_DISABLE_SIGNUP = env('NEXT_PUBLIC_DISABLE_SIGNUP'); - + const rawEmail = typeof searchParams.email === 'string' ? searchParams.email : undefined; const email = rawEmail ? decryptSecondaryData(rawEmail) : null; diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 606aa0f10..7753e1e53 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -22,32 +22,35 @@ import './globals.css'; const fontInter = Inter({ subsets: ['latin'], variable: '--font-sans' }); const fontCaveat = Caveat({ subsets: ['latin'], variable: '--font-signature' }); -export const metadata = { - title: { - template: '%s - Documenso', - default: 'Documenso', - }, - description: - 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - keywords: - 'Documenso, open source, DocuSign alternative, document signing, open signing infrastructure, open-source community, fast signing, beautiful signing, smart templates', - authors: { name: 'Documenso, Inc.' }, - robots: 'index, follow', - openGraph: { - title: 'Documenso - The Open Source DocuSign Alternative', +export function generateMetadata() { + return { + title: { + template: '%s - Documenso', + default: 'Documenso', + }, description: 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - type: 'website', - images: [`${NEXT_PUBLIC_WEBAPP_URL()}/opengraph-image.jpg`], - }, - twitter: { - site: '@documenso', - card: 'summary_large_image', - images: [`${NEXT_PUBLIC_WEBAPP_URL()}/opengraph-image.jpg`], - description: - 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', - }, -}; + keywords: + 'Documenso, open source, DocuSign alternative, document signing, open signing infrastructure, open-source community, fast signing, beautiful signing, smart templates', + authors: { name: 'Documenso, Inc.' }, + robots: 'index, follow', + metadataBase: new URL(NEXT_PUBLIC_WEBAPP_URL() ?? 'http://localhost:3000'), + openGraph: { + title: 'Documenso - The Open Source DocuSign Alternative', + description: + 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', + type: 'website', + images: ['/opengraph-image.jpg'], + }, + twitter: { + site: '@documenso', + card: 'summary_large_image', + images: ['/opengraph-image.jpg'], + description: + 'Join Documenso, the open signing infrastructure, and get a 10x better signing experience. Pricing starts at $30/mo. forever! Sign in now and enjoy a faster, smarter, and more beautiful document signing process. Integrates with your favorite tools, customizable, and expandable. Support our mission and become a part of our open-source community.', + }, + }; +} export default async function RootLayout({ children }: { children: React.ReactNode }) { const flags = await getServerComponentAllFlags(); diff --git a/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx b/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx index e5dd8ca17..fb2d1bdfd 100644 --- a/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx +++ b/apps/web/src/components/(teams)/dialogs/transfer-team-dialog.tsx @@ -238,7 +238,7 @@ export const TransferTeamDialog = ({
    - {IS_BILLING_ENABLED && ( + {IS_BILLING_ENABLED() && ( // Temporary removed. //
  • // {form.getValues('clearPaymentMethods') diff --git a/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx index be68f6c03..98df7416e 100644 --- a/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx +++ b/apps/web/src/components/(teams)/settings/layout/desktop-nav.tsx @@ -48,7 +48,7 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { - {IS_BILLING_ENABLED && ( + {IS_BILLING_ENABLED() && ( - {IS_BILLING_ENABLED && ( + {IS_BILLING_ENABLED() && (
From c432261dd8ff7756ad7bc9b1059944d7478fa1c1 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:49:31 +0200 Subject: [PATCH 51/61] chore: disable button while form is submitting --- apps/web/src/components/forms/send-confirmation-email.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/forms/send-confirmation-email.tsx b/apps/web/src/components/forms/send-confirmation-email.tsx index 9e669539e..ee073d063 100644 --- a/apps/web/src/components/forms/send-confirmation-email.tsx +++ b/apps/web/src/components/forms/send-confirmation-email.tsx @@ -83,7 +83,7 @@ export const SendConfirmationEmailForm = ({ className }: SendConfirmationEmailFo )} /> - From 149f416be76ef555f91a5e9bebacc5659ec826b0 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 13 Feb 2024 07:50:22 +0200 Subject: [PATCH 52/61] chore: refactor code --- .../forms/send-confirmation-email.tsx | 50 ++++++++++--------- packages/lib/next-auth/auth-options.ts | 14 ++++-- .../user/get-last-verification-token.ts | 27 ++++++++++ .../lib/server-only/user/get-user-by-email.ts | 3 -- 4 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 packages/lib/server-only/user/get-last-verification-token.ts diff --git a/apps/web/src/components/forms/send-confirmation-email.tsx b/apps/web/src/components/forms/send-confirmation-email.tsx index ee073d063..33247bf9f 100644 --- a/apps/web/src/components/forms/send-confirmation-email.tsx +++ b/apps/web/src/components/forms/send-confirmation-email.tsx @@ -13,6 +13,7 @@ import { FormField, FormItem, FormLabel, + FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; @@ -63,31 +64,32 @@ export const SendConfirmationEmailForm = ({ className }: SendConfirmationEmailFo }; return ( -
-
- -
- ( - - Email address - - - - - )} - /> -
- -
- -
+ + + ); }; diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index d28506ca3..723b9cd7b 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -13,6 +13,7 @@ import { IdentityProvider, UserSecurityAuditLogType } from '@documenso/prisma/cl import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; +import { getLastVerificationToken } from '../server-only/user/get-last-verification-token'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; import { sendConfirmationToken } from '../server-only/user/send-confirmation-token'; import { extractNextAuthRequestMetadata } from '../universal/extract-request-metadata'; @@ -92,12 +93,19 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } if (!user.emailVerified) { - const totalUserVerificationTokens = user.VerificationToken.length; - const lastUserVerificationToken = user.VerificationToken[totalUserVerificationTokens - 1]; + const [lastUserVerificationToken] = await getLastVerificationToken({ userId: user.id }); + + if (!lastUserVerificationToken) { + await sendConfirmationToken({ email }); + throw new Error(ErrorCode.UNVERIFIED_EMAIL); + } + const expiredToken = DateTime.fromJSDate(lastUserVerificationToken.expires) <= DateTime.now(); + const lastSentToken = DateTime.fromJSDate(lastUserVerificationToken.createdAt); + const sentWithinLastHour = DateTime.now().minus({ hours: 1 }) <= lastSentToken; - if (totalUserVerificationTokens < 1 || expiredToken) { + if (expiredToken || !sentWithinLastHour) { await sendConfirmationToken({ email }); } diff --git a/packages/lib/server-only/user/get-last-verification-token.ts b/packages/lib/server-only/user/get-last-verification-token.ts new file mode 100644 index 000000000..279a1fcfd --- /dev/null +++ b/packages/lib/server-only/user/get-last-verification-token.ts @@ -0,0 +1,27 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetLastVerificationTokenOptions { + userId: number; +} + +export const getLastVerificationToken = async ({ userId }: GetLastVerificationTokenOptions) => { + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + include: { + VerificationToken: { + select: { + expires: true, + createdAt: true, + }, + orderBy: { + createdAt: 'desc', + }, + take: 1, + }, + }, + }); + + return user.VerificationToken; +}; diff --git a/packages/lib/server-only/user/get-user-by-email.ts b/packages/lib/server-only/user/get-user-by-email.ts index 8c61202a2..0a2ef8d16 100644 --- a/packages/lib/server-only/user/get-user-by-email.ts +++ b/packages/lib/server-only/user/get-user-by-email.ts @@ -9,8 +9,5 @@ export const getUserByEmail = async ({ email }: GetUserByEmailOptions) => { where: { email: email.toLowerCase(), }, - include: { - VerificationToken: true, - }, }); }; From 4878cf388f35feb857fd1c701868b5f97bd46476 Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Tue, 13 Feb 2024 07:53:36 +0200 Subject: [PATCH 53/61] chore: add the missing signIn function --- apps/web/src/components/forms/signup.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index 087e71fbe..7082bcee3 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -3,6 +3,7 @@ import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; +import { signIn } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { FcGoogle } from 'react-icons/fc'; import { z } from 'zod'; From d052f0201325d590d5066efafeefbc8f2e6a1f69 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Tue, 13 Feb 2024 06:01:25 +0000 Subject: [PATCH 54/61] chore: refactor code --- packages/lib/next-auth/auth-options.ts | 22 +++++++-------- .../user/get-last-verification-token.ts | 27 ------------------- ...st-recent-verification-token-by-user-id.ts | 18 +++++++++++++ .../user/send-confirmation-token.ts | 20 +++++++++++++- 4 files changed, 46 insertions(+), 41 deletions(-) delete mode 100644 packages/lib/server-only/user/get-last-verification-token.ts create mode 100644 packages/lib/server-only/user/get-most-recent-verification-token-by-user-id.ts diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 723b9cd7b..b944b6e7b 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -13,7 +13,7 @@ import { IdentityProvider, UserSecurityAuditLogType } from '@documenso/prisma/cl import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; -import { getLastVerificationToken } from '../server-only/user/get-last-verification-token'; +import { getMostRecentVerificationTokenByUserId } from '../server-only/user/get-most-recent-verification-token-by-user-id'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; import { sendConfirmationToken } from '../server-only/user/send-confirmation-token'; import { extractNextAuthRequestMetadata } from '../universal/extract-request-metadata'; @@ -93,19 +93,15 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { } if (!user.emailVerified) { - const [lastUserVerificationToken] = await getLastVerificationToken({ userId: user.id }); + const mostRecentToken = await getMostRecentVerificationTokenByUserId({ + userId: user.id, + }); - if (!lastUserVerificationToken) { - await sendConfirmationToken({ email }); - throw new Error(ErrorCode.UNVERIFIED_EMAIL); - } - - const expiredToken = - DateTime.fromJSDate(lastUserVerificationToken.expires) <= DateTime.now(); - const lastSentToken = DateTime.fromJSDate(lastUserVerificationToken.createdAt); - const sentWithinLastHour = DateTime.now().minus({ hours: 1 }) <= lastSentToken; - - if (expiredToken || !sentWithinLastHour) { + if ( + !mostRecentToken || + mostRecentToken.expires.valueOf() <= Date.now() || + DateTime.fromJSDate(mostRecentToken.createdAt).diffNow('minutes').minutes > -5 + ) { await sendConfirmationToken({ email }); } diff --git a/packages/lib/server-only/user/get-last-verification-token.ts b/packages/lib/server-only/user/get-last-verification-token.ts deleted file mode 100644 index 279a1fcfd..000000000 --- a/packages/lib/server-only/user/get-last-verification-token.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { prisma } from '@documenso/prisma'; - -export interface GetLastVerificationTokenOptions { - userId: number; -} - -export const getLastVerificationToken = async ({ userId }: GetLastVerificationTokenOptions) => { - const user = await prisma.user.findFirstOrThrow({ - where: { - id: userId, - }, - include: { - VerificationToken: { - select: { - expires: true, - createdAt: true, - }, - orderBy: { - createdAt: 'desc', - }, - take: 1, - }, - }, - }); - - return user.VerificationToken; -}; diff --git a/packages/lib/server-only/user/get-most-recent-verification-token-by-user-id.ts b/packages/lib/server-only/user/get-most-recent-verification-token-by-user-id.ts new file mode 100644 index 000000000..d9adc4498 --- /dev/null +++ b/packages/lib/server-only/user/get-most-recent-verification-token-by-user-id.ts @@ -0,0 +1,18 @@ +import { prisma } from '@documenso/prisma'; + +export type GetMostRecentVerificationTokenByUserIdOptions = { + userId: number; +}; + +export const getMostRecentVerificationTokenByUserId = async ({ + userId, +}: GetMostRecentVerificationTokenByUserIdOptions) => { + return await prisma.verificationToken.findFirst({ + where: { + userId, + }, + orderBy: { + createdAt: 'desc', + }, + }); +}; diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts index a399dd9fc..ef7c4b104 100644 --- a/packages/lib/server-only/user/send-confirmation-token.ts +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -1,13 +1,20 @@ import crypto from 'crypto'; +import { DateTime } from 'luxon'; import { prisma } from '@documenso/prisma'; import { ONE_HOUR } from '../../constants/time'; import { sendConfirmationEmail } from '../auth/send-confirmation-email'; +import { getMostRecentVerificationTokenByUserId } from './get-most-recent-verification-token-by-user-id'; const IDENTIFIER = 'confirmation-email'; -export const sendConfirmationToken = async ({ email }: { email: string }) => { +type SendConfirmationTokenOptions = { email: string; force?: boolean }; + +export const sendConfirmationToken = async ({ + email, + force = false, +}: SendConfirmationTokenOptions) => { const token = crypto.randomBytes(20).toString('hex'); const user = await prisma.user.findFirst({ @@ -24,6 +31,17 @@ export const sendConfirmationToken = async ({ email }: { email: string }) => { throw new Error('Email verified'); } + const mostRecentToken = await getMostRecentVerificationTokenByUserId({ userId: user.id }); + + // If we've sent a token in the last 5 minutes, don't send another one + if ( + !force && + mostRecentToken?.createdAt && + DateTime.fromJSDate(mostRecentToken.createdAt).diffNow('minutes').minutes > -5 + ) { + return; + } + const createdToken = await prisma.verificationToken.create({ data: { identifier: IDENTIFIER, From abab0c0a22a586e22c0f50007f300ceb4e9c519d Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 14 Feb 2024 17:11:46 +0100 Subject: [PATCH 55/61] chore: grammer and format --- .well-known/security.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.well-known/security.txt b/.well-known/security.txt index 0b00c7123..1a3f685e5 100644 --- a/.well-known/security.txt +++ b/.well-known/security.txt @@ -1,6 +1,7 @@ # General Issues Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml -# Report critical issues privately, to let us take appropriate action before publishing + +# Report critical issues privately to let us take appropriate action before publishing. Contact: mailto:security@documenso.com Preferred-Languages: en -Canonical: https://documenso.com/.well-known/security.txt +Canonical: https://documenso.com/.well-known/security.txt \ No newline at end of file From 3e12a05ab8fa665bb53f9ba71c9e9b06c59817e6 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 14 Feb 2024 17:19:48 +0100 Subject: [PATCH 56/61] chore: more grammar --- apps/marketing/public/.well-known/security.txt | 5 +++-- apps/web/public/.well-known/security.txt | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/marketing/public/.well-known/security.txt b/apps/marketing/public/.well-known/security.txt index 0b00c7123..1a3f685e5 100644 --- a/apps/marketing/public/.well-known/security.txt +++ b/apps/marketing/public/.well-known/security.txt @@ -1,6 +1,7 @@ # General Issues Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml -# Report critical issues privately, to let us take appropriate action before publishing + +# Report critical issues privately to let us take appropriate action before publishing. Contact: mailto:security@documenso.com Preferred-Languages: en -Canonical: https://documenso.com/.well-known/security.txt +Canonical: https://documenso.com/.well-known/security.txt \ No newline at end of file diff --git a/apps/web/public/.well-known/security.txt b/apps/web/public/.well-known/security.txt index 0b00c7123..1a3f685e5 100644 --- a/apps/web/public/.well-known/security.txt +++ b/apps/web/public/.well-known/security.txt @@ -1,6 +1,7 @@ # General Issues Contact: https://github.com/documenso/documenso/issues/new?assignees=&labels=bug&projects=&template=bug-report.yml -# Report critical issues privately, to let us take appropriate action before publishing + +# Report critical issues privately to let us take appropriate action before publishing. Contact: mailto:security@documenso.com Preferred-Languages: en -Canonical: https://documenso.com/.well-known/security.txt +Canonical: https://documenso.com/.well-known/security.txt \ No newline at end of file From 49cddfab38acdbefd5a385b105cdef8929991429 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 15 Feb 2024 06:11:50 +0000 Subject: [PATCH 57/61] chore: lint with oxc --- .../src/app/(marketing)/open/page.tsx | 7 +- .../src/app/(marketing)/pricing/page.tsx | 4 +- .../components/(marketing)/pricing-table.tsx | 8 +- .../_action-items/resend-document.tsx | 152 +++++++++--------- packages/lib/server-only/2fa/setup-2fa.ts | 2 +- 5 files changed, 91 insertions(+), 82 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index a1fea41e4..76de85fcf 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -147,7 +147,12 @@ export default async function OpenPage() {
diff --git a/apps/marketing/src/app/(marketing)/pricing/page.tsx b/apps/marketing/src/app/(marketing)/pricing/page.tsx index e4c7b776a..5756f9e68 100644 --- a/apps/marketing/src/app/(marketing)/pricing/page.tsx +++ b/apps/marketing/src/app/(marketing)/pricing/page.tsx @@ -53,7 +53,7 @@ export default function PricingPage() {
@@ -166,6 +166,7 @@ export default function PricingPage() { support@documenso.com @@ -175,6 +176,7 @@ export default function PricingPage() { className="text-documenso-700 font-bold" href="https://documen.so/discord" target="_blank" + rel="noreferrer" > in our Discord-Support-Channel {' '} diff --git a/apps/marketing/src/components/(marketing)/pricing-table.tsx b/apps/marketing/src/components/(marketing)/pricing-table.tsx index b65411064..80510b8e5 100644 --- a/apps/marketing/src/components/(marketing)/pricing-table.tsx +++ b/apps/marketing/src/components/(marketing)/pricing-table.tsx @@ -123,7 +123,7 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => {

{' '} - + The Early Adopter Deal:

@@ -133,7 +133,11 @@ export const PricingTable = ({ className, ...props }: PricingTableProps) => {

{' '} - + Includes all upcoming features diff --git a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx index e8e3d6130..4bcb25a6c 100644 --- a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx @@ -108,88 +108,86 @@ export const ResendDocumentActionItem = ({ }; return ( - <> -

- - e.preventDefault()}> - - Resend - - + + + e.preventDefault()}> + + Resend + + - - - -

Who do you want to remind?

-
-
+ + + +

Who do you want to remind?

+
+
-
- - ( - <> - {recipients.map((recipient) => ( - + + ( + <> + {recipients.map((recipient) => ( + + - - - {recipient.email} - + + {recipient.email} + - - - checked - ? onChange([...value, recipient.id]) - : onChange(value.filter((v) => v !== recipient.id)) - } - /> - - - ))} - - )} - /> - - + + + checked + ? onChange([...value, recipient.id]) + : onChange(value.filter((v) => v !== recipient.id)) + } + /> + + + ))} + + )} + /> + + - -
- - - - - -
-
-
-
- + + + +
+ + + ); }; diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts index 23f213574..bcaa8d498 100644 --- a/packages/lib/server-only/2fa/setup-2fa.ts +++ b/packages/lib/server-only/2fa/setup-2fa.ts @@ -43,7 +43,7 @@ export const setupTwoFactorAuthentication = async ({ const secret = crypto.randomBytes(10); - const backupCodes = new Array(10) + const backupCodes = Array.from({ length: 10 }) .fill(null) .map(() => crypto.randomBytes(5).toString('hex')) .map((code) => `${code.slice(0, 5)}-${code.slice(5)}`.toUpperCase()); From 25291b64ebc61ce69387ee1e43511f58daccbf93 Mon Sep 17 00:00:00 2001 From: Sumit Bisht Date: Thu, 15 Feb 2024 22:25:23 +0530 Subject: [PATCH 58/61] fix: highlighting issue in recipient selection --- packages/ui/primitives/command.tsx | 2 +- packages/ui/primitives/document-flow/add-fields.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index fee5321cd..89777d417 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -121,7 +121,7 @@ const CommandItem = React.forwardRef< - + From a30b73ce86374ea0bfa9015c1633bc680f978f80 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 16 Feb 2024 11:02:04 +0000 Subject: [PATCH 59/61] fix: update css --- apps/web/src/app/(dashboard)/documents/upload-document.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/upload-document.tsx b/apps/web/src/app/(dashboard)/documents/upload-document.tsx index 71926dafc..f958d5a3f 100644 --- a/apps/web/src/app/(dashboard)/documents/upload-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/upload-document.tsx @@ -96,12 +96,10 @@ export const UploadDocument = ({ className }: UploadDocumentProps) => { } }; - const isSmallVerticalScreen = typeof window !== 'undefined' && window.innerHeight < 800; - return (
Date: Fri, 16 Feb 2024 11:56:02 +0000 Subject: [PATCH 60/61] chore: use unsafe effect --- .../lib/client-only/hooks/use-effect-once.ts | 13 ++++++++++ .../signature-pad/signature-pad.tsx | 25 ++++++++++++------- 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 packages/lib/client-only/hooks/use-effect-once.ts diff --git a/packages/lib/client-only/hooks/use-effect-once.ts b/packages/lib/client-only/hooks/use-effect-once.ts new file mode 100644 index 000000000..dc6d062dd --- /dev/null +++ b/packages/lib/client-only/hooks/use-effect-once.ts @@ -0,0 +1,13 @@ +import type { EffectCallback } from 'react'; +import { useEffect } from 'react'; + +/** + * Dangerously runs an effect "once" by ignoring the depedencies of a given effect. + * + * DANGER: The effect will run twice in concurrent react and development environments. + */ +export const unsafe_useEffectOnce = (callback: EffectCallback) => { + // Intentionally avoiding exhaustive deps and rule of hooks here + // eslint-disable-next-line react-hooks/exhaustive-deps, react-hooks/rules-of-hooks + return useEffect(callback, []); +}; diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index ad6f92e91..8524450fc 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -7,6 +7,8 @@ import { Undo2 } from 'lucide-react'; import type { StrokeOptions } from 'perfect-freehand'; import { getStroke } from 'perfect-freehand'; +import { unsafe_useEffectOnce } from '@documenso/lib/client-only/hooks/use-effect-once'; + import { cn } from '../../lib/utils'; import { getSvgPathFromStroke } from './helper'; import { Point } from './point'; @@ -28,7 +30,8 @@ export const SignaturePad = ({ ...props }: SignaturePadProps) => { const $el = useRef(null); - const defaultImageRef = useRef(null); + const $imageData = useRef(null); + const [isPressed, setIsPressed] = useState(false); const [lines, setLines] = useState([]); const [currentLine, setCurrentLine] = useState([]); @@ -162,7 +165,7 @@ export const SignaturePad = ({ const ctx = $el.current.getContext('2d'); ctx?.clearRect(0, 0, $el.current.width, $el.current.height); - defaultImageRef.current = null; + $imageData.current = null; } onChange?.(null); @@ -176,8 +179,7 @@ export const SignaturePad = ({ return; } - const newLines = [...lines]; - newLines.pop(); // Remove the last line + const newLines = lines.slice(0, -1); setLines(newLines); // Clear the canvas @@ -185,13 +187,16 @@ export const SignaturePad = ({ const ctx = $el.current.getContext('2d'); const { width, height } = $el.current; ctx?.clearRect(0, 0, width, height); - if (typeof defaultValue === 'string' && defaultImageRef.current) { - ctx?.putImageData(defaultImageRef.current, 0, 0); + + if (typeof defaultValue === 'string' && $imageData.current) { + ctx?.putImageData($imageData.current, 0, 0); } + newLines.forEach((line) => { const pathData = new Path2D(getSvgPathFromStroke(getStroke(line, perfectFreehandOptions))); ctx?.fill(pathData); }); + onChange?.($el.current.toDataURL()); } }; @@ -203,7 +208,7 @@ export const SignaturePad = ({ } }, []); - useEffect(() => { + unsafe_useEffectOnce(() => { if ($el.current && typeof defaultValue === 'string') { const ctx = $el.current.getContext('2d'); @@ -213,13 +218,15 @@ export const SignaturePad = ({ img.onload = () => { ctx?.drawImage(img, 0, 0, Math.min(width, img.width), Math.min(height, img.height)); + const defaultImageData = ctx?.getImageData(0, 0, width, height) || null; - defaultImageRef.current = defaultImageData; + + $imageData.current = defaultImageData; }; img.src = defaultValue; } - }, []); + }); return (
Date: Sat, 17 Feb 2024 12:42:00 +1100 Subject: [PATCH 61/61] feat: add enterprise billing (#939) ## Description Add support for enterprise billing plans. Enterprise billing plans by default get access to everything early adopters do: - Unlimited teams - Unlimited documents They will also get additional features in the future. ## Notes Pending webhook updates to support enterprise onboarding. Rolled back env changes `NEXT_PUBLIC_PROJECT` since it doesn't seem to work. --- .../app/(dashboard)/settings/billing/page.tsx | 16 ++++++++-------- .../tables/teams-member-page-data-table.tsx | 2 +- packages/ee/server-only/limits/server.ts | 8 ++++---- .../stripe/get-document-related-prices.ts.ts | 10 ++++++++++ .../stripe/get-enterprise-plan-prices.ts | 13 +++++++++++++ .../ee/server-only/stripe/get-prices-by-plan.ts | 14 +++++++++----- .../stripe/get-primary-account-plan-prices.ts | 10 ++++++++++ .../stripe/get-team-related-prices.ts | 17 +++++++++++++++++ .../stripe/transfer-team-subscription.ts | 12 ++++++------ packages/lib/constants/app.ts | 9 ++++----- packages/lib/constants/billing.ts | 3 +-- packages/lib/server-only/team/create-team.ts | 13 ++++++------- packages/lib/utils/billing.ts | 9 ++++----- 13 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 packages/ee/server-only/stripe/get-document-related-prices.ts.ts create mode 100644 packages/ee/server-only/stripe/get-enterprise-plan-prices.ts create mode 100644 packages/ee/server-only/stripe/get-primary-account-plan-prices.ts create mode 100644 packages/ee/server-only/stripe/get-team-related-prices.ts diff --git a/apps/web/src/app/(dashboard)/settings/billing/page.tsx b/apps/web/src/app/(dashboard)/settings/billing/page.tsx index cee2aa2f1..7865e2b5c 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/billing/page.tsx @@ -5,7 +5,7 @@ import { match } from 'ts-pattern'; import { getStripeCustomerByUser } from '@documenso/ee/server-only/stripe/get-customer'; import { getPricesByInterval } from '@documenso/ee/server-only/stripe/get-prices-by-interval'; -import { getPricesByPlan } from '@documenso/ee/server-only/stripe/get-prices-by-plan'; +import { getPrimaryAccountPlanPrices } from '@documenso/ee/server-only/stripe/get-primary-account-plan-prices'; import { getProductByPriceId } from '@documenso/ee/server-only/stripe/get-product-by-price-id'; import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; @@ -37,23 +37,23 @@ export default async function BillingSettingsPage() { user = await getStripeCustomerByUser(user).then((result) => result.user); } - const [subscriptions, prices, communityPlanPrices] = await Promise.all([ + const [subscriptions, prices, primaryAccountPlanPrices] = await Promise.all([ getSubscriptionsByUserId({ userId: user.id }), getPricesByInterval({ plan: STRIPE_PLAN_TYPE.COMMUNITY }), - getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY), + getPrimaryAccountPlanPrices(), ]); - const communityPlanPriceIds = communityPlanPrices.map(({ id }) => id); + const primaryAccountPlanPriceIds = primaryAccountPlanPrices.map(({ id }) => id); let subscriptionProduct: Stripe.Product | null = null; - const communityPlanUserSubscriptions = subscriptions.filter(({ priceId }) => - communityPlanPriceIds.includes(priceId), + const primaryAccountPlanSubscriptions = subscriptions.filter(({ priceId }) => + primaryAccountPlanPriceIds.includes(priceId), ); const subscription = - communityPlanUserSubscriptions.find(({ status }) => status === SubscriptionStatus.ACTIVE) ?? - communityPlanUserSubscriptions[0]; + primaryAccountPlanSubscriptions.find(({ status }) => status === SubscriptionStatus.ACTIVE) ?? + primaryAccountPlanSubscriptions[0]; if (subscription?.priceId) { subscriptionProduct = await getProductByPriceId({ priceId: subscription.priceId }).catch( diff --git a/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx b/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx index 316c4373f..24d4089b2 100644 --- a/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx +++ b/apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx @@ -67,7 +67,7 @@ export const TeamsMemberPageDataTable = ({ - All + Active diff --git a/packages/ee/server-only/limits/server.ts b/packages/ee/server-only/limits/server.ts index 4904f0271..abed86da7 100644 --- a/packages/ee/server-only/limits/server.ts +++ b/packages/ee/server-only/limits/server.ts @@ -1,11 +1,10 @@ import { DateTime } from 'luxon'; import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; -import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { prisma } from '@documenso/prisma'; import { SubscriptionStatus } from '@documenso/prisma/client'; -import { getPricesByPlan } from '../stripe/get-prices-by-plan'; +import { getDocumentRelatedPrices } from '../stripe/get-document-related-prices.ts'; import { FREE_PLAN_LIMITS, SELFHOSTED_PLAN_LIMITS, TEAM_PLAN_LIMITS } from './constants'; import { ERROR_CODES } from './errors'; import { ZLimitsSchema } from './schema'; @@ -56,10 +55,11 @@ const handleUserLimits = async ({ email }: HandleUserLimitsOptions) => { ); if (activeSubscriptions.length > 0) { - const communityPlanPrices = await getPricesByPlan(STRIPE_PLAN_TYPE.COMMUNITY); + const documentPlanPrices = await getDocumentRelatedPrices(); for (const subscription of activeSubscriptions) { - const price = communityPlanPrices.find((price) => price.id === subscription.priceId); + const price = documentPlanPrices.find((price) => price.id === subscription.priceId); + if (!price || typeof price.product === 'string' || price.product.deleted) { continue; } diff --git a/packages/ee/server-only/stripe/get-document-related-prices.ts.ts b/packages/ee/server-only/stripe/get-document-related-prices.ts.ts new file mode 100644 index 000000000..81b32a7b9 --- /dev/null +++ b/packages/ee/server-only/stripe/get-document-related-prices.ts.ts @@ -0,0 +1,10 @@ +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +/** + * Returns the Stripe prices of items that affect the amount of documents a user can create. + */ +export const getDocumentRelatedPrices = async () => { + return await getPricesByPlan([STRIPE_PLAN_TYPE.COMMUNITY, STRIPE_PLAN_TYPE.ENTERPRISE]); +}; diff --git a/packages/ee/server-only/stripe/get-enterprise-plan-prices.ts b/packages/ee/server-only/stripe/get-enterprise-plan-prices.ts new file mode 100644 index 000000000..ec67fe163 --- /dev/null +++ b/packages/ee/server-only/stripe/get-enterprise-plan-prices.ts @@ -0,0 +1,13 @@ +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +export const getEnterprisePlanPrices = async () => { + return await getPricesByPlan(STRIPE_PLAN_TYPE.ENTERPRISE); +}; + +export const getEnterprisePlanPriceIds = async () => { + const prices = await getEnterprisePlanPrices(); + + return prices.map((price) => price.id); +}; diff --git a/packages/ee/server-only/stripe/get-prices-by-plan.ts b/packages/ee/server-only/stripe/get-prices-by-plan.ts index 5c390b35a..45906d54a 100644 --- a/packages/ee/server-only/stripe/get-prices-by-plan.ts +++ b/packages/ee/server-only/stripe/get-prices-by-plan.ts @@ -1,14 +1,18 @@ import type { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; import { stripe } from '@documenso/lib/server-only/stripe'; -export const getPricesByPlan = async ( - plan: (typeof STRIPE_PLAN_TYPE)[keyof typeof STRIPE_PLAN_TYPE], -) => { +type PlanType = (typeof STRIPE_PLAN_TYPE)[keyof typeof STRIPE_PLAN_TYPE]; + +export const getPricesByPlan = async (plan: PlanType | PlanType[]) => { + const planTypes = typeof plan === 'string' ? [plan] : plan; + + const query = planTypes.map((planType) => `metadata['plan']:'${planType}'`).join(' OR '); + const { data: prices } = await stripe.prices.search({ - query: `metadata['plan']:'${plan}' type:'recurring'`, + query, expand: ['data.product'], limit: 100, }); - return prices; + return prices.filter((price) => price.type === 'recurring'); }; diff --git a/packages/ee/server-only/stripe/get-primary-account-plan-prices.ts b/packages/ee/server-only/stripe/get-primary-account-plan-prices.ts new file mode 100644 index 000000000..0eb368ce7 --- /dev/null +++ b/packages/ee/server-only/stripe/get-primary-account-plan-prices.ts @@ -0,0 +1,10 @@ +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +/** + * Returns the prices of items that count as the account's primary plan. + */ +export const getPrimaryAccountPlanPrices = async () => { + return await getPricesByPlan([STRIPE_PLAN_TYPE.COMMUNITY, STRIPE_PLAN_TYPE.ENTERPRISE]); +}; diff --git a/packages/ee/server-only/stripe/get-team-related-prices.ts b/packages/ee/server-only/stripe/get-team-related-prices.ts new file mode 100644 index 000000000..b10ab06f4 --- /dev/null +++ b/packages/ee/server-only/stripe/get-team-related-prices.ts @@ -0,0 +1,17 @@ +import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing'; + +import { getPricesByPlan } from './get-prices-by-plan'; + +/** + * Returns the Stripe prices of items that affect the amount of teams a user can create. + */ +export const getTeamRelatedPrices = async () => { + return await getPricesByPlan([STRIPE_PLAN_TYPE.COMMUNITY, STRIPE_PLAN_TYPE.ENTERPRISE]); +}; + +/** + * Returns the Stripe price IDs of items that affect the amount of teams a user can create. + */ +export const getTeamRelatedPriceIds = async () => { + return await getTeamRelatedPrices().then((prices) => prices.map((price) => price.id)); +}; diff --git a/packages/ee/server-only/stripe/transfer-team-subscription.ts b/packages/ee/server-only/stripe/transfer-team-subscription.ts index b4e0bd59a..953efcaf4 100644 --- a/packages/ee/server-only/stripe/transfer-team-subscription.ts +++ b/packages/ee/server-only/stripe/transfer-team-subscription.ts @@ -2,13 +2,13 @@ import type Stripe from 'stripe'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; import { stripe } from '@documenso/lib/server-only/stripe'; -import { subscriptionsContainsActiveCommunityPlan } from '@documenso/lib/utils/billing'; +import { subscriptionsContainsActivePlan } from '@documenso/lib/utils/billing'; import { prisma } from '@documenso/prisma'; import { type Subscription, type Team, type User } from '@documenso/prisma/client'; import { deleteCustomerPaymentMethods } from './delete-customer-payment-methods'; -import { getCommunityPlanPriceIds } from './get-community-plan-prices'; import { getTeamPrices } from './get-team-prices'; +import { getTeamRelatedPriceIds } from './get-team-related-prices'; type TransferStripeSubscriptionOptions = { /** @@ -46,14 +46,14 @@ export const transferTeamSubscription = async ({ throw new AppError(AppErrorCode.NOT_FOUND, 'Missing customer ID.'); } - const [communityPlanIds, teamSeatPrices] = await Promise.all([ - getCommunityPlanPriceIds(), + const [teamRelatedPlanPriceIds, teamSeatPrices] = await Promise.all([ + getTeamRelatedPriceIds(), getTeamPrices(), ]); - const teamSubscriptionRequired = !subscriptionsContainsActiveCommunityPlan( + const teamSubscriptionRequired = !subscriptionsContainsActivePlan( user.Subscription, - communityPlanIds, + teamRelatedPlanPriceIds, ); let teamSubscription: Stripe.Subscription | null = null; diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 1adb4effb..c17193677 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -3,18 +3,17 @@ import { env } from 'next-runtime-env'; export const APP_DOCUMENT_UPLOAD_SIZE_LIMIT = Number(process.env.NEXT_PUBLIC_DOCUMENT_SIZE_UPLOAD_LIMIT) || 50; -export const NEXT_PUBLIC_PROJECT = () => env('NEXT_PUBLIC_PROJECT'); export const NEXT_PUBLIC_WEBAPP_URL = () => env('NEXT_PUBLIC_WEBAPP_URL'); export const NEXT_PUBLIC_MARKETING_URL = () => env('NEXT_PUBLIC_MARKETING_URL'); -export const IS_APP_MARKETING = () => NEXT_PUBLIC_PROJECT() === 'marketing'; -export const IS_APP_WEB = () => NEXT_PUBLIC_PROJECT() === 'web'; +export const IS_APP_MARKETING = process.env.NEXT_PUBLIC_PROJECT === 'marketing'; +export const IS_APP_WEB = process.env.NEXT_PUBLIC_PROJECT === 'web'; export const IS_BILLING_ENABLED = () => env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED') === 'true'; -export const APP_FOLDER = () => (IS_APP_MARKETING() ? 'marketing' : 'web'); +export const APP_FOLDER = () => (IS_APP_MARKETING ? 'marketing' : 'web'); export const APP_BASE_URL = () => - IS_APP_WEB() ? NEXT_PUBLIC_WEBAPP_URL() : NEXT_PUBLIC_MARKETING_URL(); + IS_APP_WEB ? NEXT_PUBLIC_WEBAPP_URL() : NEXT_PUBLIC_MARKETING_URL(); export const WEBAPP_BASE_URL = NEXT_PUBLIC_WEBAPP_URL() ?? 'http://localhost:3000'; export const MARKETING_BASE_URL = NEXT_PUBLIC_MARKETING_URL() ?? 'http://localhost:3001'; diff --git a/packages/lib/constants/billing.ts b/packages/lib/constants/billing.ts index e6d897af8..0d8dee6e2 100644 --- a/packages/lib/constants/billing.ts +++ b/packages/lib/constants/billing.ts @@ -6,6 +6,5 @@ export enum STRIPE_CUSTOMER_TYPE { export enum STRIPE_PLAN_TYPE { TEAM = 'team', COMMUNITY = 'community', + ENTERPRISE = 'enterprise', } - -export const TEAM_BILLING_DOMAIN = 'billing.team.documenso.com'; diff --git a/packages/lib/server-only/team/create-team.ts b/packages/lib/server-only/team/create-team.ts index 4d26a161a..3461d49bf 100644 --- a/packages/lib/server-only/team/create-team.ts +++ b/packages/lib/server-only/team/create-team.ts @@ -2,11 +2,11 @@ import type Stripe from 'stripe'; import { z } from 'zod'; import { createTeamCustomer } from '@documenso/ee/server-only/stripe/create-team-customer'; -import { getCommunityPlanPriceIds } from '@documenso/ee/server-only/stripe/get-community-plan-prices'; +import { getTeamRelatedPrices } from '@documenso/ee/server-only/stripe/get-team-related-prices'; import { mapStripeSubscriptionToPrismaUpsertAction } from '@documenso/ee/server-only/stripe/webhook/on-subscription-updated'; import { IS_BILLING_ENABLED } from '@documenso/lib/constants/app'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; -import { subscriptionsContainsActiveCommunityPlan } from '@documenso/lib/utils/billing'; +import { subscriptionsContainsActivePlan } from '@documenso/lib/utils/billing'; import { prisma } from '@documenso/prisma'; import { Prisma, TeamMemberRole } from '@documenso/prisma/client'; @@ -61,13 +61,12 @@ export const createTeam = async ({ let customerId: string | null = null; if (IS_BILLING_ENABLED()) { - const communityPlanPriceIds = await getCommunityPlanPriceIds(); - - isPaymentRequired = !subscriptionsContainsActiveCommunityPlan( - user.Subscription, - communityPlanPriceIds, + const teamRelatedPriceIds = await getTeamRelatedPrices().then((prices) => + prices.map((price) => price.id), ); + isPaymentRequired = !subscriptionsContainsActivePlan(user.Subscription, teamRelatedPriceIds); + customerId = await createTeamCustomer({ name: user.name ?? teamName, email: user.email, diff --git a/packages/lib/utils/billing.ts b/packages/lib/utils/billing.ts index ca85addbb..048fa6ee0 100644 --- a/packages/lib/utils/billing.ts +++ b/packages/lib/utils/billing.ts @@ -2,15 +2,14 @@ import type { Subscription } from '.prisma/client'; import { SubscriptionStatus } from '.prisma/client'; /** - * Returns true if there is a subscription that is active and is a community plan. + * Returns true if there is a subscription that is active and is one of the provided price IDs. */ -export const subscriptionsContainsActiveCommunityPlan = ( +export const subscriptionsContainsActivePlan = ( subscriptions: Subscription[], - communityPlanPriceIds: string[], + priceIds: string[], ) => { return subscriptions.some( (subscription) => - subscription.status === SubscriptionStatus.ACTIVE && - communityPlanPriceIds.includes(subscription.priceId), + subscription.status === SubscriptionStatus.ACTIVE && priceIds.includes(subscription.priceId), ); };

All our metrics, finances, and learnings are public. We believe in transparency and want to share our journey with you. You can read more about why here:{' '} - + Announcing Open Metrics