From 4a78b1f72d825749640f9af788b510a31e283eba Mon Sep 17 00:00:00 2001 From: juni-haukur <158475136+juni-haukur@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:02:07 +0000 Subject: [PATCH 01/20] chore(signature-collection): Swap out old endpoints for new ones (#16260) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../src/clientConfig.json | 16 +++- .../lib/signature-collection-admin.service.ts | 78 ++++++++++--------- .../lib/signature-collection.service.spec.ts | 52 +++++-------- .../src/lib/signature-collection.service.ts | 28 ++++--- 4 files changed, 90 insertions(+), 84 deletions(-) diff --git a/libs/clients/signature-collection/src/clientConfig.json b/libs/clients/signature-collection/src/clientConfig.json index 0b8c7c3f861c..fe45f37d9a21 100644 --- a/libs/clients/signature-collection/src/clientConfig.json +++ b/libs/clients/signature-collection/src/clientConfig.json @@ -177,7 +177,8 @@ "/Admin/Medmaelalisti/{ID}/ToggleList": { "patch": { "tags": ["Admin"], - "summary": "Toggle fyrir úrvinnslu lokið virkni í stjórnborði", + "summary": "Merkir að úrvinnslu sé lokið á ákveðnum meðmælalista.", + "description": "Merkir að úrvinnslu sé lokið á ákveðnum meðmælalista þ.e. að lista hafi verið skilað inn og öll skrifleg meðmæli lesin inn.\r\nHægt að opna aftur fyrir úrvinnslu.", "parameters": [ { "name": "ID", @@ -257,16 +258,20 @@ "/Admin/Medmaelalisti/{ID}/ExtendTime": { "patch": { "tags": ["Admin"], + "summary": "Framlengir gefinn meðmælalista", + "description": "Aðeins hægt að framkvæma eftir að meðmælasöfnun hefur verið merkt úrvinnslu lokið.", "parameters": [ { "name": "ID", "in": "path", + "description": "", "required": true, "schema": { "type": "integer", "format": "int32" } }, { "name": "newEndDate", "in": "query", + "description": "Ný lokadagsetning", "schema": { "type": "string", "format": "date-time" } } ], @@ -294,15 +299,18 @@ "/Admin/Medmaelalisti/{ID}/Compare": { "post": { "tags": ["Admin"], + "summary": "Skilar meðmælum sem tilheyra gefnum kennitölum sem finnast á gefnum meðmælalista", "parameters": [ { "name": "ID", "in": "path", + "description": "ID meðmælalista", "required": true, "schema": { "type": "integer", "format": "int32" } } ], "requestBody": { + "description": "Listi af kennitölum", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } @@ -409,10 +417,13 @@ "/Admin/Medmaelasofnun/{ID}/ToggleSofnun": { "patch": { "tags": ["Admin"], + "summary": "Merkir að allri úrvinnslu fyrri fasa meðmælasöfnunar sé lokið.", + "description": "Merkir að allri úrvinnslu fyrri fasa meðmælasöfnunar sé lokið.\r\nEkki hægt að framkvæma nema ef allir meðmælalistar söfnunarinnar hafi verið merktir úrvinnslu lokið.\r\nEftir að aðgerð hefur verið framkvæmd opnast fyrir framlengingarfasa.\r\nEinkvæm aðgerð.", "parameters": [ { "name": "ID", "in": "path", + "description": "", "required": true, "schema": { "type": "integer", "format": "int32" } } @@ -439,15 +450,18 @@ "/Admin/Medmaelasofnun/{ID}/Compare": { "post": { "tags": ["Admin"], + "summary": "Skilar meðmælum sem tilheyra gefnum kennitölum sem finnast á gefinni meðmælasöfnun", "parameters": [ { "name": "ID", "in": "path", + "description": "ID meðmælasöfnunar", "required": true, "schema": { "type": "integer", "format": "int32" } } ], "requestBody": { + "description": "Listi af kennitölum", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } diff --git a/libs/clients/signature-collection/src/lib/signature-collection-admin.service.ts b/libs/clients/signature-collection/src/lib/signature-collection-admin.service.ts index 9421457055fe..6bfffcd74640 100644 --- a/libs/clients/signature-collection/src/lib/signature-collection-admin.service.ts +++ b/libs/clients/signature-collection/src/lib/signature-collection-admin.service.ts @@ -7,7 +7,13 @@ import { ReasonKey, } from './signature-collection.types' import { Collection } from './types/collection.dto' -import { List, ListStatus, mapList, mapListBase } from './types/list.dto' +import { + getSlug, + List, + ListStatus, + mapList, + mapListBase, +} from './types/list.dto' import { Signature, mapSignature } from './types/signature.dto' import { CandidateLookup } from './types/user.dto' import { BulkUpload, mapBulkResponse } from './types/bulkUpload.dto' @@ -70,9 +76,9 @@ export class SignatureCollectionAdminClientService { listStatus === ListStatus.Reviewed ) { const list = await this.getApiWithAuth( - this.listsApi, + this.adminApi, auth, - ).medmaelalistarIDToggleListPatch({ iD: parseInt(listId) }) + ).adminMedmaelalistiIDToggleListPatch({ iD: parseInt(listId) }) return { success: !!list } } return { success: false } @@ -80,9 +86,9 @@ export class SignatureCollectionAdminClientService { async processCollection(collectionId: string, auth: Auth): Promise { const collection = await this.getApiWithAuth( - this.collectionsApi, + this.adminApi, auth, - ).medmaelasofnunIDToggleSofnunPost({ + ).adminMedmaelasofnunIDToggleSofnunPatch({ iD: parseInt(collectionId), }) return { success: !!collection } @@ -126,11 +132,11 @@ export class SignatureCollectionAdminClientService { ) : collectionAreas - const lists = await this.getApiWithAuth( - this.listsApi, + const candidacy = await this.getApiWithAuth( + this.adminApi, auth, - ).medmaelalistarAddListarAdminPost({ - medmaelalistiRequestDTO: { + ).adminFrambodPost({ + frambodRequestDTO: { sofnunID: parseInt(id), kennitala: owner.nationalId, simi: owner.phone, @@ -141,21 +147,23 @@ export class SignatureCollectionAdminClientService { })), }, }) - if (filteredAreas.length !== lists.length) { - throw new Error('Not all lists created') + return { + slug: getSlug( + candidacy.id ?? '', + candidacy.medmaelasofnun?.kosningTegund ?? '', + ), } - const { slug } = mapList(lists[0]) - return { slug } } async unsignListAdmin(signatureId: string, auth: Auth): Promise { - const signature = await this.getApiWithAuth( - this.signatureApi, - auth, - ).medmaeliIDRemoveMedmaeliAdminPost({ - iD: parseInt(signatureId), - }) - return { success: !!signature } + try { + await this.getApiWithAuth(this.adminApi, auth).adminMedmaeliIDDelete({ + iD: parseInt(signatureId), + }) + return { success: true } + } catch (error) { + return { success: false } + } } async candidateLookup( @@ -165,9 +173,9 @@ export class SignatureCollectionAdminClientService { const collection = await this.currentCollection(auth) const { id, isPresidential, areas } = collection const user = await this.getApiWithAuth( - this.collectionsApi, + this.adminApi, auth, - ).medmaelasofnunIDEinsInfoAdminKennitalaGet({ + ).adminMedmaelasofnunIDEinsInfoKennitalaGet({ kennitala: nationalId, iD: parseInt(id), }) @@ -202,9 +210,9 @@ export class SignatureCollectionAdminClientService { ): Promise { // Takes a list of nationalIds listId and returns signatures found on list const signaturesFound = await this.getApiWithAuth( - this.listsApi, + this.adminApi, auth, - ).medmaelalistarIDComparePost({ + ).adminMedmaelalistiIDComparePost({ iD: parseInt(listId), requestBody: nationalIds, }) @@ -218,9 +226,9 @@ export class SignatureCollectionAdminClientService { ): Promise { // Takes a list of nationalIds and returns signatures found on any list in current collection const signaturesFound = await this.getApiWithAuth( - this.collectionsApi, + this.adminApi, auth, - ).medmaelasofnunIDComparePost({ + ).adminMedmaelasofnunIDComparePost({ iD: parseInt(collectionId), requestBody: nationalIds, }) @@ -246,9 +254,9 @@ export class SignatureCollectionAdminClientService { auth: Auth, ): Promise { const list = await this.getApiWithAuth( - this.listsApi, + this.adminApi, auth, - ).medmaelalistarIDExtendTimePatch({ + ).adminMedmaelalistiIDExtendTimePatch({ iD: parseInt(listId), newEndDate: newEndDate, }) @@ -260,9 +268,9 @@ export class SignatureCollectionAdminClientService { // Can only toggle list if it is in review or reviewed if (success && list.lokadHandvirkt) { await this.getApiWithAuth( - this.listsApi, + this.adminApi, auth, - ).medmaelalistarIDToggleListPatch({ iD: parseInt(listId) }) + ).adminMedmaelalistiIDToggleListPatch({ iD: parseInt(listId) }) } return { success, @@ -279,9 +287,9 @@ export class SignatureCollectionAdminClientService { })) const signatures = await this.getApiWithAuth( - this.listsApi, + this.adminApi, auth, - ).medmaelalistarIDAddMedmaeliBulkPost({ + ).adminMedmaelalistiIDMedmaeliBulkPost({ iD: parseInt(listId), medmaeliBulkRequestDTO: { medmaeli }, }) @@ -292,10 +300,10 @@ export class SignatureCollectionAdminClientService { async removeCandidate(candidateId: string, auth: Auth): Promise { try { const res = await this.getApiWithAuth( - this.candidateApi, + this.adminApi, auth, - ).frambodIDRemoveFrambodAdminPost({ iD: parseInt(candidateId) }) - return { success: res?.id === parseInt(candidateId) } + ).adminFrambodIDDelete({ iD: parseInt(candidateId) }) + return { success: true } } catch (error) { return { success: false, reasons: [ReasonKey.DeniedByService] } } diff --git a/libs/clients/signature-collection/src/lib/signature-collection.service.spec.ts b/libs/clients/signature-collection/src/lib/signature-collection.service.spec.ts index 508739c3469c..d1c3cbd16ceb 100644 --- a/libs/clients/signature-collection/src/lib/signature-collection.service.spec.ts +++ b/libs/clients/signature-collection/src/lib/signature-collection.service.spec.ts @@ -7,6 +7,7 @@ import { MedmaelalistiDTO, MedmaelasofnunExtendedDTO, EinstaklingurKosningInfoDTO, + FrambodDTO, } from '../../gen/fetch' import { SignatureCollectionSharedClientService } from './signature-collection-shared.service' import { Test, TestingModule } from '@nestjs/testing' @@ -245,40 +246,30 @@ describe('MyService', () => { }, areas: [{ areaId: '123' }, { areaId: '321' }], } - const lists: MedmaelalistiDTO[] = [ - { + const candidacy: FrambodDTO = { + id: 123, + medmaelasofnun: { id: 123, - medmaelasofnun: { - id: 123, - kosningNafn: 'Gervikosning', - kosningTegund: 'Forsetakosning', - sofnunStart: new Date('01.01.1900'), - sofnunEnd: new Date('01.01.2199'), - }, - frambod: { id: 123, kennitala: '0101016789', nafn: 'Jónsframboð' }, - svaedi: { - id: 123, - nafn: 'Svæði', - svaediTegundLysing: 'Lýsing', - nr: '1', - }, - dagsetningLokar: new Date('01.01.2199'), - listaLokad: false, - frambodNafn: 'Jónsframboð', - listiNafn: 'Jónslisti', + kosningNafn: 'Gervikosning', + kosningTegund: 'Forsetakosning', + sofnunStart: new Date('01.01.1900'), + sofnunEnd: new Date('01.01.2199'), }, - ] + kennitala: '0101302399', + nafn: 'Jón Jónsson', + listabokstafur: 'A', + } jest .spyOn(sofnunApi, 'medmaelasofnunGet') .mockReturnValue(Promise.resolve(sofnun)) jest - .spyOn(listarApi, 'medmaelalistarAddListarPost') - .mockReturnValueOnce(Promise.resolve(lists)) + .spyOn(frambodApi, 'frambodPost') + .mockReturnValueOnce(Promise.resolve(candidacy)) jest .spyOn(service, 'getApiWithAuth') .mockReturnValueOnce(sofnunApi) - .mockReturnValueOnce(listarApi) + .mockReturnValueOnce(frambodApi) jest .spyOn(sofnunApi, 'medmaelasofnunIDEinsInfoKennitalaGet') .mockReturnValue(Promise.resolve(sofnunUser)) @@ -306,13 +297,8 @@ describe('MyService', () => { api instanceof MedmaelasofnunApi ? sofnunApi : frambodApi, ) jest - .spyOn(frambodApi, 'frambodIDRemoveFrambodUserPost') - .mockReturnValueOnce( - Promise.resolve({ - kennitala: '0101302399', - nafn: 'Jón Jónsson', - }), - ) + .spyOn(frambodApi, 'frambodIDDelete') + .mockImplementation(() => Promise.resolve()) // Act const notOwner = await service.removeLists( { collectionId: '', listIds: [''] }, @@ -361,7 +347,7 @@ describe('MyService', () => { ? frambodApi : listarApi, ) - jest.spyOn(listarApi, 'medmaelalistarIDAddMedmaeliPost').mockReturnValue( + jest.spyOn(listarApi, 'medmaelalistarIDMedmaeliPost').mockReturnValue( Promise.resolve({ kennitala: '0101302399', medmaeliTegundNr: 1, @@ -407,7 +393,7 @@ describe('MyService', () => { ], }), ) - jest.spyOn(medmaeliApi, 'medmaeliIDRemoveMedmaeliUserPost').mockReturnValue( + jest.spyOn(medmaeliApi, 'medmaeliIDDelete').mockReturnValue( Promise.resolve({ kennitala: '0101302399', }), diff --git a/libs/clients/signature-collection/src/lib/signature-collection.service.ts b/libs/clients/signature-collection/src/lib/signature-collection.service.ts index 1d03340382d3..6f463142142d 100644 --- a/libs/clients/signature-collection/src/lib/signature-collection.service.ts +++ b/libs/clients/signature-collection/src/lib/signature-collection.service.ts @@ -120,26 +120,27 @@ export class SignatureCollectionClientService { ) : collectionAreas - const lists = await this.getApiWithAuth( - this.listsApi, + const candidacy = await this.getApiWithAuth( + this.candidateApi, auth, - ).medmaelalistarAddListarPost({ - medmaelalistiRequestDTO: { + ).frambodPost({ + frambodRequestDTO: { sofnunID: parseInt(id), kennitala: owner.nationalId, simi: owner.phone, netfang: owner.email, medmaelalistar: filteredAreas.map((area) => ({ svaediID: parseInt(area.id), - listiNafn: `${name} - ${area.name}`, + listiNafn: `${owner.name} - ${area.name}`, })), }, }) - if (filteredAreas.length !== lists.length) { - throw new Error('Not all lists created') + return { + slug: getSlug( + candidacy.id ?? '', + candidacy.medmaelasofnun?.kosningTegund ?? '', + ), } - const { slug } = mapList(lists[0]) - return { slug } } async createParliamentaryCandidacy( @@ -260,7 +261,7 @@ export class SignatureCollectionClientService { const newSignature = await this.getApiWithAuth( this.listsApi, auth, - ).medmaelalistarIDAddMedmaeliPost({ + ).medmaelalistarIDMedmaeliPost({ kennitala: auth.nationalId, iD: parseInt(listId), }) @@ -308,7 +309,7 @@ export class SignatureCollectionClientService { const signatureRemoved = await this.getApiWithAuth( this.signatureApi, auth, - ).medmaeliIDRemoveMedmaeliUserPost({ + ).medmaeliIDDelete({ iD: parseInt(activeSignature.id), }) return { success: !!signatureRemoved } @@ -330,10 +331,7 @@ export class SignatureCollectionClientService { } // For presidentail elections remove all lists for owner, else remove selected lists if (isPresidential) { - await this.getApiWithAuth( - this.candidateApi, - auth, - ).frambodIDRemoveFrambodUserPost({ + await this.getApiWithAuth(this.candidateApi, auth).frambodIDDelete({ iD: parseInt(candidate.id), }) return { success: true } From ead8e7786ada5672271569da8a455615332e5538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dvar=20Oddsson?= Date: Fri, 4 Oct 2024 12:25:59 +0000 Subject: [PATCH 02/20] feat(j-s): Update subpoena dto and send multiple files (#16209) * Add properties to UpdateSubpoenaDTO * Add deliveryInvalidates * feat(j-s): Send indictment with subpoena to police as well as case number * Update police.service.ts * fix(j-s): Fix api dto for RLS --------- Co-authored-by: unakb --- .../src/app/modules/police/police.service.ts | 12 +++++---- .../app/modules/subpoena/subpoena.service.ts | 8 ++++-- .../xrd-api/src/app/app.service.ts | 19 ++++++++++--- .../xrd-api/src/app/dto/subpoena.dto.ts | 27 ++++++++++++++++++- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/apps/judicial-system/backend/src/app/modules/police/police.service.ts b/apps/judicial-system/backend/src/app/modules/police/police.service.ts index c4659a31c6de..39cd3ed543d4 100644 --- a/apps/judicial-system/backend/src/app/modules/police/police.service.ts +++ b/apps/judicial-system/backend/src/app/modules/police/police.service.ts @@ -514,6 +514,7 @@ export class PoliceService { workingCase: Case, defendant: Defendant, subpoena: string, + indictment: string, user: User, ): Promise { const { courtCaseNumber, dateLogs, prosecutor, policeCaseNumbers, court } = @@ -542,7 +543,7 @@ export class PoliceService { agent: this.agent, body: JSON.stringify({ documentName: documentName, - documentBase64: subpoena, + documentsBase64: [subpoena, indictment], courtRegistrationDate: arraignmentInfo?.date, prosecutorSsn: prosecutor?.nationalId, prosecutedSsn: normalizedNationalId, @@ -552,16 +553,17 @@ export class PoliceService { lokeCaseNumber: policeCaseNumbers?.[0], courtCaseNumber: courtCaseNumber, fileTypeCode: 'BRTNG', + rvgCaseId: workingCase.id, }), } as RequestInit, ) - if (!res.ok) { - throw await res.json() + if (res.ok) { + const subpoenaResponse = await res.json() + return { subpoenaId: subpoenaResponse.id } } - const subpoenaId = await res.json() - return { subpoenaId } + throw await res.text() } catch (error) { this.logger.error(`Failed create subpoena for case ${workingCase.id}`, { error, diff --git a/apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts b/apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts index 131bf070a499..2e735bcf6367 100644 --- a/apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts +++ b/apps/judicial-system/backend/src/app/modules/subpoena/subpoena.service.ts @@ -1,3 +1,4 @@ +import { Base } from 'infra/src/dsl/xroad' import { Base64 } from 'js-base64' import { Includeable, Sequelize } from 'sequelize' import { Transaction } from 'sequelize/types' @@ -148,16 +149,19 @@ export class SubpoenaService { user: User, ): Promise { try { - const pdf = await this.pdfService.getSubpoenaPdf( + const subpoenaPdf = await this.pdfService.getSubpoenaPdf( theCase, defendant, subpoena, ) + const indictmentPdf = await this.pdfService.getIndictmentPdf(theCase) + const createdSubpoena = await this.policeService.createSubpoena( theCase, defendant, - Base64.btoa(pdf.toString('binary')), + Base64.btoa(subpoenaPdf.toString('binary')), + Base64.btoa(indictmentPdf.toString('binary')), user, ) diff --git a/apps/judicial-system/xrd-api/src/app/app.service.ts b/apps/judicial-system/xrd-api/src/app/app.service.ts index 77da007af1cf..c2e33651586e 100644 --- a/apps/judicial-system/xrd-api/src/app/app.service.ts +++ b/apps/judicial-system/xrd-api/src/app/app.service.ts @@ -96,7 +96,18 @@ export class AppService { subpoenaId: string, updateSubpoena: UpdateSubpoenaDto, ): Promise { - let update = { ...updateSubpoena } + //TODO: Remove this mix + const { + deliveredOnPaper, + prosecutedConfirmedSubpoenaThroughIslandis, + delivered, + deliveredToLawyer, + deliveryInvalidated, + servedBy, + ...update + } = updateSubpoena + + let updatesToSend = { registeredBy: servedBy, ...update } if ( update.defenderChoice === DefenderChoice.CHOOSE && @@ -112,8 +123,8 @@ export class AppService { const chosenLawyer = await this.lawyersService.getLawyer( update.defenderNationalId, ) - update = { - ...update, + updatesToSend = { + ...updatesToSend, ...{ defenderName: chosenLawyer.Name, defenderEmail: chosenLawyer.Email, @@ -134,7 +145,7 @@ export class AppService { 'Content-Type': 'application/json', authorization: `Bearer ${this.config.backend.accessToken}`, }, - body: JSON.stringify(update), + body: JSON.stringify(updatesToSend), }, ) diff --git a/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts b/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts index 7ac2807b0467..c1a7a319c1a9 100644 --- a/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts +++ b/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts @@ -18,7 +18,7 @@ export class UpdateSubpoenaDto { @IsOptional() @IsString() @ApiProperty({ type: String, required: false }) - registeredBy?: string + servedBy?: string @IsOptional() @IsEnum(DefenderChoice) @@ -29,4 +29,29 @@ export class UpdateSubpoenaDto { @IsString() @ApiProperty({ type: String, required: false }) defenderNationalId?: string + + @IsOptional() + @IsBoolean() + @ApiProperty({ type: Boolean, required: false }) + prosecutedConfirmedSubpoenaThroughIslandis?: boolean + + @IsOptional() + @IsBoolean() + @ApiProperty({ type: Boolean, required: false }) + delivered?: boolean + + @IsOptional() + @IsBoolean() + @ApiProperty({ type: Boolean, required: false }) + deliveredOnPaper?: boolean + + @IsOptional() + @IsBoolean() + @ApiProperty({ type: Boolean, required: false }) + deliveredToLawyer?: boolean + + @IsOptional() + @IsBoolean() + @ApiProperty({ type: Boolean, required: false }) + deliveryInvalidated?: boolean } From 4c37af43553f5687a7e5772dc3c5d9249958692f Mon Sep 17 00:00:00 2001 From: albinagu <47886428+albinagu@users.noreply.github.com> Date: Fri, 4 Oct 2024 13:06:15 +0000 Subject: [PATCH 03/20] fix(portals-admin): signature collection overview search (#16268) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../signature-collection/src/lib/messages.ts | 42 +++++++- .../findSignature.graphql | 18 ++++ .../src/screens-parliamentary/index.tsx | 97 ++++++++++++++++++- .../compareLists/skeleton.tsx | 4 + 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 libs/portals/admin/signature-collection/src/screens-parliamentary/findSignature.graphql diff --git a/libs/portals/admin/signature-collection/src/lib/messages.ts b/libs/portals/admin/signature-collection/src/lib/messages.ts index f92d2c9d0dcf..80f2890f11c3 100644 --- a/libs/portals/admin/signature-collection/src/lib/messages.ts +++ b/libs/portals/admin/signature-collection/src/lib/messages.ts @@ -312,7 +312,12 @@ export const m = defineMessages({ }, searchNationalIdPlaceholder: { id: 'admin-portal.signature-collection:searchNationalIdPlaceholder', - defaultMessage: 'Leita eftir kennitölu', + defaultMessage: 'Leita eftir kennitölu meðmælanda', + description: '', + }, + noSigneeFoundOverviewText: { + id: 'admin-portal.signature-collection:noSigneeFoundOverviewText', + defaultMessage: 'Enginn meðmælandi fannst', description: '', }, sortBy: { @@ -355,6 +360,41 @@ export const m = defineMessages({ defaultMessage: 'Kennitala', description: '', }, + signeeListSigned: { + id: 'admin-portal.signature-collection:signeeListSigned', + defaultMessage: 'Listi', + description: '', + }, + signeeListSignedType: { + id: 'admin-portal.signature-collection:signeeListSignedType', + defaultMessage: 'Tegund', + description: '', + }, + signeeListSignedStatus: { + id: 'admin-portal.signature-collection:signeeListSignedStatus', + defaultMessage: 'Staða', + description: '', + }, + signeeListSignedDigital: { + id: 'admin-portal.signature-collection:signeeListSignedDigital', + defaultMessage: 'Rafrænt', + description: '', + }, + signeeListSignedPaper: { + id: 'admin-portal.signature-collection:signeeListSignedPaper', + defaultMessage: 'Af blaði', + description: '', + }, + signeeSignatureValid: { + id: 'admin-portal.signature-collection:signeeSigntaureValid', + defaultMessage: 'Gild', + description: '', + }, + signeeSignatureInvalid: { + id: 'admin-portal.signature-collection:signeeSigntaureInvalid', + defaultMessage: 'Ógild', + description: '', + }, signeeAddress: { id: 'admin-portal.signature-collection:signeeAddress', defaultMessage: 'Heimilisfang', diff --git a/libs/portals/admin/signature-collection/src/screens-parliamentary/findSignature.graphql b/libs/portals/admin/signature-collection/src/screens-parliamentary/findSignature.graphql new file mode 100644 index 000000000000..3349a3dd29fc --- /dev/null +++ b/libs/portals/admin/signature-collection/src/screens-parliamentary/findSignature.graphql @@ -0,0 +1,18 @@ +query SignatureCollectionSignatureLookup( + $input: SignatureCollectionSignatureLookupInput! +) { + signatureCollectionSignatureLookup(input: $input) { + id + listId + listTitle + created + signee { + nationalId + name + address + } + valid + isDigital + pageNumber + } +} diff --git a/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx b/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx index 16ec882f3d52..9ae00b303039 100644 --- a/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx +++ b/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx @@ -7,6 +7,8 @@ import { Stack, Box, Breadcrumbs, + Table as T, + Text, } from '@island.is/island-ui/core' import { useLocale } from '@island.is/localization' import { IntroHeader, PortalNavigation } from '@island.is/portals/core' @@ -19,6 +21,9 @@ import { ListsLoaderReturn } from '../loaders/AllLists.loader' import DownloadReports from './DownloadReports' import electionsCommitteeLogo from '../../assets/electionsCommittee.svg' import nationalRegistryLogo from '../../assets/nationalRegistry.svg' +import { useState } from 'react' +import { useSignatureCollectionSignatureLookupQuery } from './findSignature.generated' +import { SkeletonSingleRow } from '../shared-components/compareLists/skeleton' const ParliamentaryRoot = ({ allowedToProcess, @@ -30,6 +35,18 @@ const ParliamentaryRoot = ({ const navigate = useNavigate() const { collection, allLists } = useLoaderData() as ListsLoaderReturn + const [searchTerm, setSearchTerm] = useState('') + + const { data, loading } = useSignatureCollectionSignatureLookupQuery({ + variables: { + input: { + collectionId: collection?.id, + nationalId: searchTerm, + }, + }, + skip: searchTerm.replace(/[^0-9]/g, '').length !== 10, + }) + return ( @@ -69,15 +86,17 @@ const ParliamentaryRoot = ({ /> console.log('search')} + value={searchTerm} + onChange={(v) => { + setSearchTerm(v) + }} placeholder={formatMessage(m.searchNationalIdPlaceholder)} backgroundColor="blue" /> @@ -87,6 +106,78 @@ const ParliamentaryRoot = ({ collectionId={collection?.id} /> + {loading && ( + + + + )} + {data?.signatureCollectionSignatureLookup && + (data?.signatureCollectionSignatureLookup.length > 0 ? ( + + + + + {formatMessage(m.signeeName)} + + {formatMessage(m.signeeListSigned)} + + + {formatMessage(m.signeeListSignedType)} + + + {formatMessage(m.signeeListSignedStatus)} + + + + + {data?.signatureCollectionSignatureLookup?.map((s) => ( + + + {s.signee.name} + + + {s.listTitle} + + + {formatMessage( + s.isDigital + ? m.signeeListSignedDigital + : m.signeeListSignedPaper, + )} + + + {formatMessage( + s.valid + ? m.signeeSignatureValid + : m.signeeSignatureInvalid, + )} + + + ))} + + + + ) : ( + + {formatMessage(m.noSigneeFoundOverviewText)} + + ))} {collection?.areas.map((area) => ( { ) } + +export const SkeletonSingleRow = () => { + return +} From 7223702753b84ad6ea30f7594e39faabbf93462d Mon Sep 17 00:00:00 2001 From: berglindoma13 Date: Fri, 4 Oct 2024 13:13:34 +0000 Subject: [PATCH 04/20] fix(citizenship): small fix for file uploads (#16270) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../ChildrenOtherDocumentsSubSection.ts | 6 +++--- .../citizenship/src/lib/dataSchema.ts | 20 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/ChildrenSupportingDocuments/ChildrenOtherDocumentsSubSection.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/ChildrenSupportingDocuments/ChildrenOtherDocumentsSubSection.ts index 15c6e855feb7..bc30216bb35d 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/ChildrenSupportingDocuments/ChildrenOtherDocumentsSubSection.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/forms/CitizenshipForm/ChildrenSupportingDocuments/ChildrenOtherDocumentsSubSection.ts @@ -75,7 +75,7 @@ export const ChildrenOtherDocumentsSubSection = (index: number) => supportingDocuments.labels.otherDocuments.buttonText, }), buildHiddenInput({ - id: `${Routes.CHILDSUPPORTINGDOCUMENTS}.writtenConsentFromChildRequired`, + id: `${Routes.CHILDSUPPORTINGDOCUMENTS}[${index}].writtenConsentFromChildRequired`, defaultValue: (application: Application) => { const age = getSelectedIndividualAge( application.externalData, @@ -110,7 +110,7 @@ export const ChildrenOtherDocumentsSubSection = (index: number) => }, }), buildHiddenInput({ - id: `${Routes.CHILDSUPPORTINGDOCUMENTS}.writtenConsentFromOtherParentRequired`, + id: `${Routes.CHILDSUPPORTINGDOCUMENTS}[${index}].writtenConsentFromOtherParentRequired`, defaultValue: (application: Application) => { const answers = application.answers as Citizenship const selectedInCustody = getSelectedCustodyChildren( @@ -171,7 +171,7 @@ export const ChildrenOtherDocumentsSubSection = (index: number) => }, }), buildHiddenInput({ - id: `${Routes.CHILDSUPPORTINGDOCUMENTS}.custodyDocumentsRequired`, + id: `${Routes.CHILDSUPPORTINGDOCUMENTS}[${index}].custodyDocumentsRequired`, defaultValue: (application: Application) => { const answers = application.answers as Citizenship const selectedInCustody = getSelectedCustodyChildren( diff --git a/libs/application/templates/directorate-of-immigration/citizenship/src/lib/dataSchema.ts b/libs/application/templates/directorate-of-immigration/citizenship/src/lib/dataSchema.ts index 276330c22fd2..02daddd2de32 100644 --- a/libs/application/templates/directorate-of-immigration/citizenship/src/lib/dataSchema.ts +++ b/libs/application/templates/directorate-of-immigration/citizenship/src/lib/dataSchema.ts @@ -252,7 +252,6 @@ const SupportingDocumentsSchema = z }, { path: ['birthCertificate'], - params: error.fileUploadRequired, }, ) @@ -267,12 +266,17 @@ const ChildrenSupportingDocumentsSchema = z custodyDocumentsRequired: z.string().min(1), custodyDocuments: z.array(FileDocumentSchema).optional(), }) - .refine(({ writtenConsentFromChildRequired, writtenConsentFromChild }) => { - return ( - writtenConsentFromChildRequired === 'false' || - (writtenConsentFromChild && writtenConsentFromChild.length > 0) - ) - }) + .refine( + ({ writtenConsentFromChildRequired, writtenConsentFromChild }) => { + return ( + writtenConsentFromChildRequired === 'false' || + (writtenConsentFromChild && writtenConsentFromChild.length > 0) + ) + }, + { + path: ['writtenConsentFromChild'], + }, + ) .refine( ({ writtenConsentFromOtherParentRequired, @@ -286,7 +290,6 @@ const ChildrenSupportingDocumentsSchema = z }, { path: ['writtenConsentFromOtherParent'], - params: error.fileUploadRequired, }, ) .refine( @@ -298,7 +301,6 @@ const ChildrenSupportingDocumentsSchema = z }, { path: ['custodyDocuments'], - params: error.fileUploadRequired, }, ) From 8c470eff9a0733581a72d20d0e8573d62584e1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3r=C3=B0ur=20H?= Date: Fri, 4 Oct 2024 13:53:19 +0000 Subject: [PATCH 05/20] fix(island-ui): Update url for pdf worker (#16273) --- libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx b/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx index 641aab7dff71..c7ce3d348d20 100644 --- a/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx +++ b/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx @@ -45,7 +45,8 @@ export const PdfViewer: FC> = ({ useEffect(() => { import('react-pdf') .then((pdf) => { - pdf.pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdf.pdfjs.version}/pdf.worker.min.mjs` + pdf.pdfjs.GlobalWorkerOptions.workerSrc = + 'https://assets.ctfassets.net/8k0h54kbe6bj/8dqL0H07pYWZEkXwLtgBp/1c347f9a4f2bb255f78389b42cf40b97/pdf.worker.min.mjs' setPdfLib(pdf) }) .catch((e) => { From d86d920a734b1946200f4e7c518d41ef0bdd7406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3r=C3=B0ur=20H?= Date: Fri, 4 Oct 2024 14:29:34 +0000 Subject: [PATCH 06/20] chore(web): Add pdf worker file to web assets (#16266) * Add file * chore: nx format:write update dirty files * Disable lint * chore: nx format:write update dirty files * Disable lint * Disable lint * chore: nx format:write update dirty files * ignore * ignore * chore: nx format:write update dirty files * ignore --------- Co-authored-by: andes-it Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .prettierignore | 3 ++- apps/web/public/assets/pdf.worker.min.mjs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 apps/web/public/assets/pdf.worker.min.mjs diff --git a/.prettierignore b/.prettierignore index bd39c451491d..2619b48cd441 100644 --- a/.prettierignore +++ b/.prettierignore @@ -13,4 +13,5 @@ .yarn /infra/helm/ /.nx/cache -/.nx/workspace-data \ No newline at end of file +/.nx/workspace-data +apps/web/public/assets/pdf.worker.min.mjs \ No newline at end of file diff --git a/apps/web/public/assets/pdf.worker.min.mjs b/apps/web/public/assets/pdf.worker.min.mjs new file mode 100644 index 000000000000..47f8bf4887a0 --- /dev/null +++ b/apps/web/public/assets/pdf.worker.min.mjs @@ -0,0 +1,23 @@ +/* eslint-disable */ + +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2023 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */var e={9306:(e,t,i)=>{var a=i(4901),r=i(6823),s=TypeError;e.exports=function(e){if(a(e))return e;throw new s(r(e)+" is not a function")}},3506:(e,t,i)=>{var a=i(3925),r=String,s=TypeError;e.exports=function(e){if(a(e))return e;throw new s("Can't set "+r(e)+" as a prototype")}},7080:(e,t,i)=>{var a=i(4402).has;e.exports=function(e){a(e);return e}},679:(e,t,i)=>{var a=i(1625),r=TypeError;e.exports=function(e,t){if(a(t,e))return e;throw new r("Incorrect invocation")}},8551:(e,t,i)=>{var a=i(34),r=String,s=TypeError;e.exports=function(e){if(a(e))return e;throw new s(r(e)+" is not an object")}},7811:e=>{e.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},7394:(e,t,i)=>{var a=i(6706),r=i(4576),s=TypeError;e.exports=a(ArrayBuffer.prototype,"byteLength","get")||function(e){if("ArrayBuffer"!==r(e))throw new s("ArrayBuffer expected");return e.byteLength}},3238:(e,t,i)=>{var a=i(9504),r=i(7394),s=a(ArrayBuffer.prototype.slice);e.exports=function(e){if(0!==r(e))return!1;try{s(e,0,0);return!1}catch(e){return!0}}},5636:(e,t,i)=>{var a=i(4475),r=i(9504),s=i(6706),n=i(7696),o=i(3238),g=i(7394),c=i(4483),C=i(1548),h=a.structuredClone,l=a.ArrayBuffer,Q=a.DataView,E=a.TypeError,u=Math.min,d=l.prototype,f=Q.prototype,p=r(d.slice),m=s(d,"resizable","get"),y=s(d,"maxByteLength","get"),w=r(f.getInt8),b=r(f.setInt8);e.exports=(C||c)&&function(e,t,i){var a,r=g(e),s=void 0===t?r:n(t),d=!m||!m(e);if(o(e))throw new E("ArrayBuffer is detached");if(C){e=h(e,{transfer:[e]});if(r===s&&(i||d))return e}if(r>=s&&(!i||d))a=p(e,0,s);else{var f=i&&!d&&y?{maxByteLength:y(e)}:void 0;a=new l(s,f);for(var D=new Q(e),S=new Q(a),k=u(s,r),R=0;R{var a,r,s,n=i(7811),o=i(3724),g=i(4475),c=i(4901),C=i(34),h=i(9297),l=i(6955),Q=i(6823),E=i(6699),u=i(6840),d=i(2106),f=i(1625),p=i(2787),m=i(2967),y=i(8227),w=i(3392),b=i(1181),D=b.enforce,S=b.get,k=g.Int8Array,R=k&&k.prototype,N=g.Uint8ClampedArray,G=N&&N.prototype,x=k&&p(k),U=R&&p(R),M=Object.prototype,L=g.TypeError,H=y("toStringTag"),J=w("TYPED_ARRAY_TAG"),Y="TypedArrayConstructor",v=n&&!!m&&"Opera"!==l(g.opera),T=!1,K={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},q={BigInt64Array:8,BigUint64Array:8},getTypedArrayConstructor=function(e){var t=p(e);if(C(t)){var i=S(t);return i&&h(i,Y)?i[Y]:getTypedArrayConstructor(t)}},isTypedArray=function(e){if(!C(e))return!1;var t=l(e);return h(K,t)||h(q,t)};for(a in K)(s=(r=g[a])&&r.prototype)?D(s)[Y]=r:v=!1;for(a in q)(s=(r=g[a])&&r.prototype)&&(D(s)[Y]=r);if(!v||!c(x)||x===Function.prototype){x=function TypedArray(){throw new L("Incorrect invocation")};if(v)for(a in K)g[a]&&m(g[a],x)}if(!v||!U||U===M){U=x.prototype;if(v)for(a in K)g[a]&&m(g[a].prototype,U)}v&&p(G)!==U&&m(G,U);if(o&&!h(U,H)){T=!0;d(U,H,{configurable:!0,get:function(){return C(this)?this[J]:void 0}});for(a in K)g[a]&&E(g[a],J,a)}e.exports={NATIVE_ARRAY_BUFFER_VIEWS:v,TYPED_ARRAY_TAG:T&&J,aTypedArray:function(e){if(isTypedArray(e))return e;throw new L("Target is not a typed array")},aTypedArrayConstructor:function(e){if(c(e)&&(!m||f(x,e)))return e;throw new L(Q(e)+" is not a typed array constructor")},exportTypedArrayMethod:function(e,t,i,a){if(o){if(i)for(var r in K){var s=g[r];if(s&&h(s.prototype,e))try{delete s.prototype[e]}catch(i){try{s.prototype[e]=t}catch(e){}}}U[e]&&!i||u(U,e,i?t:v&&R[e]||t,a)}},exportTypedArrayStaticMethod:function(e,t,i){var a,r;if(o){if(m){if(i)for(a in K)if((r=g[a])&&h(r,e))try{delete r[e]}catch(e){}if(x[e]&&!i)return;try{return u(x,e,i?t:v&&x[e]||t)}catch(e){}}for(a in K)!(r=g[a])||r[e]&&!i||u(r,e,t)}},getTypedArrayConstructor,isView:function isView(e){if(!C(e))return!1;var t=l(e);return"DataView"===t||h(K,t)||h(q,t)},isTypedArray,TypedArray:x,TypedArrayPrototype:U}},5370:(e,t,i)=>{var a=i(6198);e.exports=function(e,t,i){for(var r=0,s=arguments.length>2?i:a(t),n=new e(s);s>r;)n[r]=t[r++];return n}},9617:(e,t,i)=>{var a=i(5397),r=i(5610),s=i(6198),createMethod=function(e){return function(t,i,n){var o=a(t),g=s(o);if(0===g)return!e&&-1;var c,C=r(n,g);if(e&&i!=i){for(;g>C;)if((c=o[C++])!=c)return!0}else for(;g>C;C++)if((e||C in o)&&o[C]===i)return e||C||0;return!e&&-1}};e.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},4527:(e,t,i)=>{var a=i(3724),r=i(4376),s=TypeError,n=Object.getOwnPropertyDescriptor,o=a&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(e){return e instanceof TypeError}}();e.exports=o?function(e,t){if(r(e)&&!n(e,"length").writable)throw new s("Cannot set read only .length");return e.length=t}:function(e,t){return e.length=t}},7628:(e,t,i)=>{var a=i(6198);e.exports=function(e,t){for(var i=a(e),r=new t(i),s=0;s{var a=i(6198),r=i(1291),s=RangeError;e.exports=function(e,t,i,n){var o=a(e),g=r(i),c=g<0?o+g:g;if(c>=o||c<0)throw new s("Incorrect index");for(var C=new t(o),h=0;h{var a=i(8551),r=i(9539);e.exports=function(e,t,i,s){try{return s?t(a(i)[0],i[1]):t(i)}catch(t){r(e,"throw",t)}}},4576:(e,t,i)=>{var a=i(9504),r=a({}.toString),s=a("".slice);e.exports=function(e){return s(r(e),8,-1)}},6955:(e,t,i)=>{var a=i(2140),r=i(4901),s=i(4576),n=i(8227)("toStringTag"),o=Object,g="Arguments"===s(function(){return arguments}());e.exports=a?s:function(e){var t,i,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,t){try{return e[t]}catch(e){}}(t=o(e),n))?i:g?s(t):"Object"===(a=s(t))&&r(t.callee)?"Arguments":a}},7740:(e,t,i)=>{var a=i(9297),r=i(5031),s=i(7347),n=i(4913);e.exports=function(e,t,i){for(var o=r(t),g=n.f,c=s.f,C=0;C{var a=i(9039);e.exports=!a((function(){function F(){}F.prototype.constructor=null;return Object.getPrototypeOf(new F)!==F.prototype}))},2529:e=>{e.exports=function(e,t){return{value:e,done:t}}},6699:(e,t,i)=>{var a=i(3724),r=i(4913),s=i(6980);e.exports=a?function(e,t,i){return r.f(e,t,s(1,i))}:function(e,t,i){e[t]=i;return e}},6980:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},4659:(e,t,i)=>{var a=i(3724),r=i(4913),s=i(6980);e.exports=function(e,t,i){a?r.f(e,t,s(0,i)):e[t]=i}},2106:(e,t,i)=>{var a=i(283),r=i(4913);e.exports=function(e,t,i){i.get&&a(i.get,t,{getter:!0});i.set&&a(i.set,t,{setter:!0});return r.f(e,t,i)}},6840:(e,t,i)=>{var a=i(4901),r=i(4913),s=i(283),n=i(9433);e.exports=function(e,t,i,o){o||(o={});var g=o.enumerable,c=void 0!==o.name?o.name:t;a(i)&&s(i,c,o);if(o.global)g?e[t]=i:n(t,i);else{try{o.unsafe?e[t]&&(g=!0):delete e[t]}catch(e){}g?e[t]=i:r.f(e,t,{value:i,enumerable:!1,configurable:!o.nonConfigurable,writable:!o.nonWritable})}return e}},6279:(e,t,i)=>{var a=i(6840);e.exports=function(e,t,i){for(var r in t)a(e,r,t[r],i);return e}},9433:(e,t,i)=>{var a=i(4475),r=Object.defineProperty;e.exports=function(e,t){try{r(a,e,{value:t,configurable:!0,writable:!0})}catch(i){a[e]=t}return t}},3724:(e,t,i)=>{var a=i(9039);e.exports=!a((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))},4483:(e,t,i)=>{var a,r,s,n,o=i(4475),g=i(9714),c=i(1548),C=o.structuredClone,h=o.ArrayBuffer,l=o.MessageChannel,Q=!1;if(c)Q=function(e){C(e,{transfer:[e]})};else if(h)try{l||(a=g("worker_threads"))&&(l=a.MessageChannel);if(l){r=new l;s=new h(2);n=function(e){r.port1.postMessage(null,[e])};if(2===s.byteLength){n(s);0===s.byteLength&&(Q=n)}}}catch(e){}e.exports=Q},4055:(e,t,i)=>{var a=i(4475),r=i(34),s=a.document,n=r(s)&&r(s.createElement);e.exports=function(e){return n?s.createElement(e):{}}},6837:e=>{var t=TypeError;e.exports=function(e){if(e>9007199254740991)throw t("Maximum allowed index exceeded");return e}},5002:e=>{e.exports={IndexSizeError:{s:"INDEX_SIZE_ERR",c:1,m:1},DOMStringSizeError:{s:"DOMSTRING_SIZE_ERR",c:2,m:0},HierarchyRequestError:{s:"HIERARCHY_REQUEST_ERR",c:3,m:1},WrongDocumentError:{s:"WRONG_DOCUMENT_ERR",c:4,m:1},InvalidCharacterError:{s:"INVALID_CHARACTER_ERR",c:5,m:1},NoDataAllowedError:{s:"NO_DATA_ALLOWED_ERR",c:6,m:0},NoModificationAllowedError:{s:"NO_MODIFICATION_ALLOWED_ERR",c:7,m:1},NotFoundError:{s:"NOT_FOUND_ERR",c:8,m:1},NotSupportedError:{s:"NOT_SUPPORTED_ERR",c:9,m:1},InUseAttributeError:{s:"INUSE_ATTRIBUTE_ERR",c:10,m:1},InvalidStateError:{s:"INVALID_STATE_ERR",c:11,m:1},SyntaxError:{s:"SYNTAX_ERR",c:12,m:1},InvalidModificationError:{s:"INVALID_MODIFICATION_ERR",c:13,m:1},NamespaceError:{s:"NAMESPACE_ERR",c:14,m:1},InvalidAccessError:{s:"INVALID_ACCESS_ERR",c:15,m:1},ValidationError:{s:"VALIDATION_ERR",c:16,m:0},TypeMismatchError:{s:"TYPE_MISMATCH_ERR",c:17,m:1},SecurityError:{s:"SECURITY_ERR",c:18,m:1},NetworkError:{s:"NETWORK_ERR",c:19,m:1},AbortError:{s:"ABORT_ERR",c:20,m:1},URLMismatchError:{s:"URL_MISMATCH_ERR",c:21,m:1},QuotaExceededError:{s:"QUOTA_EXCEEDED_ERR",c:22,m:1},TimeoutError:{s:"TIMEOUT_ERR",c:23,m:1},InvalidNodeTypeError:{s:"INVALID_NODE_TYPE_ERR",c:24,m:1},DataCloneError:{s:"DATA_CLONE_ERR",c:25,m:1}}},7290:(e,t,i)=>{var a=i(516),r=i(9088);e.exports=!a&&!r&&"object"==typeof window&&"object"==typeof document},516:e=>{e.exports="object"==typeof Deno&&Deno&&"object"==typeof Deno.version},9088:(e,t,i)=>{var a=i(4475),r=i(4576);e.exports="process"===r(a.process)},9392:e=>{e.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},7388:(e,t,i)=>{var a,r,s=i(4475),n=i(9392),o=s.process,g=s.Deno,c=o&&o.versions||g&&g.version,C=c&&c.v8;C&&(r=(a=C.split("."))[0]>0&&a[0]<4?1:+(a[0]+a[1]));!r&&n&&(!(a=n.match(/Edge\/(\d+)/))||a[1]>=74)&&(a=n.match(/Chrome\/(\d+)/))&&(r=+a[1]);e.exports=r},8727:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},6193:(e,t,i)=>{var a=i(9504),r=Error,s=a("".replace),n=String(new r("zxcasd").stack),o=/\n\s*at [^:]*:[^\n]*/,g=o.test(n);e.exports=function(e,t){if(g&&"string"==typeof e&&!r.prepareStackTrace)for(;t--;)e=s(e,o,"");return e}},6518:(e,t,i)=>{var a=i(4475),r=i(7347).f,s=i(6699),n=i(6840),o=i(9433),g=i(7740),c=i(2796);e.exports=function(e,t){var i,C,h,l,Q,E=e.target,u=e.global,d=e.stat;if(i=u?a:d?a[E]||o(E,{}):a[E]&&a[E].prototype)for(C in t){l=t[C];h=e.dontCallGetSet?(Q=r(i,C))&&Q.value:i[C];if(!c(u?C:E+(d?".":"#")+C,e.forced)&&void 0!==h){if(typeof l==typeof h)continue;g(l,h)}(e.sham||h&&h.sham)&&s(l,"sham",!0);n(i,C,l,e)}}},9039:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},6080:(e,t,i)=>{var a=i(7476),r=i(9306),s=i(616),n=a(a.bind);e.exports=function(e,t){r(e);return void 0===t?e:s?n(e,t):function(){return e.apply(t,arguments)}}},616:(e,t,i)=>{var a=i(9039);e.exports=!a((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},9565:(e,t,i)=>{var a=i(616),r=Function.prototype.call;e.exports=a?r.bind(r):function(){return r.apply(r,arguments)}},350:(e,t,i)=>{var a=i(3724),r=i(9297),s=Function.prototype,n=a&&Object.getOwnPropertyDescriptor,o=r(s,"name"),g=o&&"something"===function something(){}.name,c=o&&(!a||a&&n(s,"name").configurable);e.exports={EXISTS:o,PROPER:g,CONFIGURABLE:c}},6706:(e,t,i)=>{var a=i(9504),r=i(9306);e.exports=function(e,t,i){try{return a(r(Object.getOwnPropertyDescriptor(e,t)[i]))}catch(e){}}},7476:(e,t,i)=>{var a=i(4576),r=i(9504);e.exports=function(e){if("Function"===a(e))return r(e)}},9504:(e,t,i)=>{var a=i(616),r=Function.prototype,s=r.call,n=a&&r.bind.bind(s,s);e.exports=a?n:function(e){return function(){return s.apply(e,arguments)}}},7751:(e,t,i)=>{var a=i(4475),r=i(4901);e.exports=function(e,t){return arguments.length<2?(i=a[e],r(i)?i:void 0):a[e]&&a[e][t];var i}},1767:e=>{e.exports=function(e){return{iterator:e,next:e.next,done:!1}}},851:(e,t,i)=>{var a=i(6955),r=i(5966),s=i(4117),n=i(6269),o=i(8227)("iterator");e.exports=function(e){if(!s(e))return r(e,o)||r(e,"@@iterator")||n[a(e)]}},81:(e,t,i)=>{var a=i(9565),r=i(9306),s=i(8551),n=i(6823),o=i(851),g=TypeError;e.exports=function(e,t){var i=arguments.length<2?o(e):t;if(r(i))return s(a(i,e));throw new g(n(e)+" is not iterable")}},5966:(e,t,i)=>{var a=i(9306),r=i(4117);e.exports=function(e,t){var i=e[t];return r(i)?void 0:a(i)}},3789:(e,t,i)=>{var a=i(9306),r=i(8551),s=i(9565),n=i(1291),o=i(1767),g="Invalid size",c=RangeError,C=TypeError,h=Math.max,SetRecord=function(e,t){this.set=e;this.size=h(t,0);this.has=a(e.has);this.keys=a(e.keys)};SetRecord.prototype={getIterator:function(){return o(r(s(this.keys,this.set)))},includes:function(e){return s(this.has,this.set,e)}};e.exports=function(e){r(e);var t=+e.size;if(t!=t)throw new C(g);var i=n(t);if(i<0)throw new c(g);return new SetRecord(e,i)}},4475:function(e){var check=function(e){return e&&e.Math===Math&&e};e.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof global&&global)||check("object"==typeof this&&this)||function(){return this}()||Function("return this")()},9297:(e,t,i)=>{var a=i(9504),r=i(8981),s=a({}.hasOwnProperty);e.exports=Object.hasOwn||function hasOwn(e,t){return s(r(e),t)}},421:e=>{e.exports={}},397:(e,t,i)=>{var a=i(7751);e.exports=a("document","documentElement")},5917:(e,t,i)=>{var a=i(3724),r=i(9039),s=i(4055);e.exports=!a&&!r((function(){return 7!==Object.defineProperty(s("div"),"a",{get:function(){return 7}}).a}))},7055:(e,t,i)=>{var a=i(9504),r=i(9039),s=i(4576),n=Object,o=a("".split);e.exports=r((function(){return!n("z").propertyIsEnumerable(0)}))?function(e){return"String"===s(e)?o(e,""):n(e)}:n},3167:(e,t,i)=>{var a=i(4901),r=i(34),s=i(2967);e.exports=function(e,t,i){var n,o;s&&a(n=t.constructor)&&n!==i&&r(o=n.prototype)&&o!==i.prototype&&s(e,o);return e}},3706:(e,t,i)=>{var a=i(9504),r=i(4901),s=i(7629),n=a(Function.toString);r(s.inspectSource)||(s.inspectSource=function(e){return n(e)});e.exports=s.inspectSource},1181:(e,t,i)=>{var a,r,s,n=i(8622),o=i(4475),g=i(34),c=i(6699),C=i(9297),h=i(7629),l=i(6119),Q=i(421),E="Object already initialized",u=o.TypeError,d=o.WeakMap;if(n||h.state){var f=h.state||(h.state=new d);f.get=f.get;f.has=f.has;f.set=f.set;a=function(e,t){if(f.has(e))throw new u(E);t.facade=e;f.set(e,t);return t};r=function(e){return f.get(e)||{}};s=function(e){return f.has(e)}}else{var p=l("state");Q[p]=!0;a=function(e,t){if(C(e,p))throw new u(E);t.facade=e;c(e,p,t);return t};r=function(e){return C(e,p)?e[p]:{}};s=function(e){return C(e,p)}}e.exports={set:a,get:r,has:s,enforce:function(e){return s(e)?r(e):a(e,{})},getterFor:function(e){return function(t){var i;if(!g(t)||(i=r(t)).type!==e)throw new u("Incompatible receiver, "+e+" required");return i}}}},4209:(e,t,i)=>{var a=i(8227),r=i(6269),s=a("iterator"),n=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||n[s]===e)}},4376:(e,t,i)=>{var a=i(4576);e.exports=Array.isArray||function isArray(e){return"Array"===a(e)}},1108:(e,t,i)=>{var a=i(6955);e.exports=function(e){var t=a(e);return"BigInt64Array"===t||"BigUint64Array"===t}},4901:e=>{var t="object"==typeof document&&document.all;e.exports=void 0===t&&void 0!==t?function(e){return"function"==typeof e||e===t}:function(e){return"function"==typeof e}},2796:(e,t,i)=>{var a=i(9039),r=i(4901),s=/#|\.prototype\./,isForced=function(e,t){var i=o[n(e)];return i===c||i!==g&&(r(t)?a(t):!!t)},n=isForced.normalize=function(e){return String(e).replace(s,".").toLowerCase()},o=isForced.data={},g=isForced.NATIVE="N",c=isForced.POLYFILL="P";e.exports=isForced},4117:e=>{e.exports=function(e){return null==e}},34:(e,t,i)=>{var a=i(4901);e.exports=function(e){return"object"==typeof e?null!==e:a(e)}},3925:(e,t,i)=>{var a=i(34);e.exports=function(e){return a(e)||null===e}},6395:e=>{e.exports=!1},757:(e,t,i)=>{var a=i(7751),r=i(4901),s=i(1625),n=i(7040),o=Object;e.exports=n?function(e){return"symbol"==typeof e}:function(e){var t=a("Symbol");return r(t)&&s(t.prototype,o(e))}},507:(e,t,i)=>{var a=i(9565);e.exports=function(e,t,i){for(var r,s,n=i?e:e.iterator,o=e.next;!(r=a(o,n)).done;)if(void 0!==(s=t(r.value)))return s}},2652:(e,t,i)=>{var a=i(6080),r=i(9565),s=i(8551),n=i(6823),o=i(4209),g=i(6198),c=i(1625),C=i(81),h=i(851),l=i(9539),Q=TypeError,Result=function(e,t){this.stopped=e;this.result=t},E=Result.prototype;e.exports=function(e,t,i){var u,d,f,p,m,y,w,b=i&&i.that,D=!(!i||!i.AS_ENTRIES),S=!(!i||!i.IS_RECORD),k=!(!i||!i.IS_ITERATOR),R=!(!i||!i.INTERRUPTED),N=a(t,b),stop=function(e){u&&l(u,"normal",e);return new Result(!0,e)},callFn=function(e){if(D){s(e);return R?N(e[0],e[1],stop):N(e[0],e[1])}return R?N(e,stop):N(e)};if(S)u=e.iterator;else if(k)u=e;else{if(!(d=h(e)))throw new Q(n(e)+" is not iterable");if(o(d)){for(f=0,p=g(e);p>f;f++)if((m=callFn(e[f]))&&c(E,m))return m;return new Result(!1)}u=C(e,d)}y=S?e.next:u.next;for(;!(w=r(y,u)).done;){try{m=callFn(w.value)}catch(e){l(u,"throw",e)}if("object"==typeof m&&m&&c(E,m))return m}return new Result(!1)}},9539:(e,t,i)=>{var a=i(9565),r=i(8551),s=i(5966);e.exports=function(e,t,i){var n,o;r(e);try{if(!(n=s(e,"return"))){if("throw"===t)throw i;return i}n=a(n,e)}catch(e){o=!0;n=e}if("throw"===t)throw i;if(o)throw n;r(n);return i}},9462:(e,t,i)=>{var a=i(9565),r=i(2360),s=i(6699),n=i(6279),o=i(8227),g=i(1181),c=i(5966),C=i(7657).IteratorPrototype,h=i(2529),l=i(9539),Q=o("toStringTag"),E="IteratorHelper",u="WrapForValidIterator",d=g.set,createIteratorProxyPrototype=function(e){var t=g.getterFor(e?u:E);return n(r(C),{next:function next(){var i=t(this);if(e)return i.nextHandler();try{var a=i.done?void 0:i.nextHandler();return h(a,i.done)}catch(e){i.done=!0;throw e}},return:function(){var i=t(this),r=i.iterator;i.done=!0;if(e){var s=c(r,"return");return s?a(s,r):h(void 0,!0)}if(i.inner)try{l(i.inner.iterator,"normal")}catch(e){return l(r,"throw",e)}l(r,"normal");return h(void 0,!0)}})},f=createIteratorProxyPrototype(!0),p=createIteratorProxyPrototype(!1);s(p,Q,"Iterator Helper");e.exports=function(e,t){var i=function Iterator(i,a){if(a){a.iterator=i.iterator;a.next=i.next}else a=i;a.type=t?u:E;a.nextHandler=e;a.counter=0;a.done=!1;d(this,a)};i.prototype=t?f:p;return i}},713:(e,t,i)=>{var a=i(9565),r=i(9306),s=i(8551),n=i(1767),o=i(9462),g=i(6319),c=o((function(){var e=this.iterator,t=s(a(this.next,e));if(!(this.done=!!t.done))return g(e,this.mapper,[t.value,this.counter++],!0)}));e.exports=function map(e){s(this);r(e);return new c(n(this),{mapper:e})}},7657:(e,t,i)=>{var a,r,s,n=i(9039),o=i(4901),g=i(34),c=i(2360),C=i(2787),h=i(6840),l=i(8227),Q=i(6395),E=l("iterator"),u=!1;[].keys&&("next"in(s=[].keys())?(r=C(C(s)))!==Object.prototype&&(a=r):u=!0);!g(a)||n((function(){var e={};return a[E].call(e)!==e}))?a={}:Q&&(a=c(a));o(a[E])||h(a,E,(function(){return this}));e.exports={IteratorPrototype:a,BUGGY_SAFARI_ITERATORS:u}},6269:e=>{e.exports={}},6198:(e,t,i)=>{var a=i(8014);e.exports=function(e){return a(e.length)}},283:(e,t,i)=>{var a=i(9504),r=i(9039),s=i(4901),n=i(9297),o=i(3724),g=i(350).CONFIGURABLE,c=i(3706),C=i(1181),h=C.enforce,l=C.get,Q=String,E=Object.defineProperty,u=a("".slice),d=a("".replace),f=a([].join),p=o&&!r((function(){return 8!==E((function(){}),"length",{value:8}).length})),m=String(String).split("String"),y=e.exports=function(e,t,i){"Symbol("===u(Q(t),0,7)&&(t="["+d(Q(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]");i&&i.getter&&(t="get "+t);i&&i.setter&&(t="set "+t);(!n(e,"name")||g&&e.name!==t)&&(o?E(e,"name",{value:t,configurable:!0}):e.name=t);p&&i&&n(i,"arity")&&e.length!==i.arity&&E(e,"length",{value:i.arity});try{i&&n(i,"constructor")&&i.constructor?o&&E(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var a=h(e);n(a,"source")||(a.source=f(m,"string"==typeof t?t:""));return e};Function.prototype.toString=y((function toString(){return s(this)&&l(this).source||c(this)}),"toString")},741:e=>{var t=Math.ceil,i=Math.floor;e.exports=Math.trunc||function trunc(e){var a=+e;return(a>0?i:t)(a)}},6043:(e,t,i)=>{var a=i(9306),r=TypeError,PromiseCapability=function(e){var t,i;this.promise=new e((function(e,a){if(void 0!==t||void 0!==i)throw new r("Bad Promise constructor");t=e;i=a}));this.resolve=a(t);this.reject=a(i)};e.exports.f=function(e){return new PromiseCapability(e)}},2603:(e,t,i)=>{var a=i(655);e.exports=function(e,t){return void 0===e?arguments.length<2?"":t:a(e)}},2360:(e,t,i)=>{var a,r=i(8551),s=i(6801),n=i(8727),o=i(421),g=i(397),c=i(4055),C=i(6119),h="prototype",l="script",Q=C("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(e){return"<"+l+">"+e+""},NullProtoObjectViaActiveX=function(e){e.write(scriptTag(""));e.close();var t=e.parentWindow.Object;e=null;return t},NullProtoObject=function(){try{a=new ActiveXObject("htmlfile")}catch(e){}NullProtoObject="undefined"!=typeof document?document.domain&&a?NullProtoObjectViaActiveX(a):function(){var e,t=c("iframe"),i="java"+l+":";t.style.display="none";g.appendChild(t);t.src=String(i);(e=t.contentWindow.document).open();e.write(scriptTag("document.F=Object"));e.close();return e.F}():NullProtoObjectViaActiveX(a);for(var e=n.length;e--;)delete NullProtoObject[h][n[e]];return NullProtoObject()};o[Q]=!0;e.exports=Object.create||function create(e,t){var i;if(null!==e){EmptyConstructor[h]=r(e);i=new EmptyConstructor;EmptyConstructor[h]=null;i[Q]=e}else i=NullProtoObject();return void 0===t?i:s.f(i,t)}},6801:(e,t,i)=>{var a=i(3724),r=i(8686),s=i(4913),n=i(8551),o=i(5397),g=i(1072);t.f=a&&!r?Object.defineProperties:function defineProperties(e,t){n(e);for(var i,a=o(t),r=g(t),c=r.length,C=0;c>C;)s.f(e,i=r[C++],a[i]);return e}},4913:(e,t,i)=>{var a=i(3724),r=i(5917),s=i(8686),n=i(8551),o=i(6969),g=TypeError,c=Object.defineProperty,C=Object.getOwnPropertyDescriptor,h="enumerable",l="configurable",Q="writable";t.f=a?s?function defineProperty(e,t,i){n(e);t=o(t);n(i);if("function"==typeof e&&"prototype"===t&&"value"in i&&Q in i&&!i[Q]){var a=C(e,t);if(a&&a[Q]){e[t]=i.value;i={configurable:l in i?i[l]:a[l],enumerable:h in i?i[h]:a[h],writable:!1}}}return c(e,t,i)}:c:function defineProperty(e,t,i){n(e);t=o(t);n(i);if(r)try{return c(e,t,i)}catch(e){}if("get"in i||"set"in i)throw new g("Accessors not supported");"value"in i&&(e[t]=i.value);return e}},7347:(e,t,i)=>{var a=i(3724),r=i(9565),s=i(8773),n=i(6980),o=i(5397),g=i(6969),c=i(9297),C=i(5917),h=Object.getOwnPropertyDescriptor;t.f=a?h:function getOwnPropertyDescriptor(e,t){e=o(e);t=g(t);if(C)try{return h(e,t)}catch(e){}if(c(e,t))return n(!r(s.f,e,t),e[t])}},8480:(e,t,i)=>{var a=i(1828),r=i(8727).concat("length","prototype");t.f=Object.getOwnPropertyNames||function getOwnPropertyNames(e){return a(e,r)}},3717:(e,t)=>{t.f=Object.getOwnPropertySymbols},2787:(e,t,i)=>{var a=i(9297),r=i(4901),s=i(8981),n=i(6119),o=i(2211),g=n("IE_PROTO"),c=Object,C=c.prototype;e.exports=o?c.getPrototypeOf:function(e){var t=s(e);if(a(t,g))return t[g];var i=t.constructor;return r(i)&&t instanceof i?i.prototype:t instanceof c?C:null}},1625:(e,t,i)=>{var a=i(9504);e.exports=a({}.isPrototypeOf)},1828:(e,t,i)=>{var a=i(9504),r=i(9297),s=i(5397),n=i(9617).indexOf,o=i(421),g=a([].push);e.exports=function(e,t){var i,a=s(e),c=0,C=[];for(i in a)!r(o,i)&&r(a,i)&&g(C,i);for(;t.length>c;)r(a,i=t[c++])&&(~n(C,i)||g(C,i));return C}},1072:(e,t,i)=>{var a=i(1828),r=i(8727);e.exports=Object.keys||function keys(e){return a(e,r)}},8773:(e,t)=>{var i={}.propertyIsEnumerable,a=Object.getOwnPropertyDescriptor,r=a&&!i.call({1:2},1);t.f=r?function propertyIsEnumerable(e){var t=a(this,e);return!!t&&t.enumerable}:i},2967:(e,t,i)=>{var a=i(6706),r=i(34),s=i(7750),n=i(3506);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,i={};try{(e=a(Object.prototype,"__proto__","set"))(i,[]);t=i instanceof Array}catch(e){}return function setPrototypeOf(i,a){s(i);n(a);if(!r(i))return i;t?e(i,a):i.__proto__=a;return i}}():void 0)},4270:(e,t,i)=>{var a=i(9565),r=i(4901),s=i(34),n=TypeError;e.exports=function(e,t){var i,o;if("string"===t&&r(i=e.toString)&&!s(o=a(i,e)))return o;if(r(i=e.valueOf)&&!s(o=a(i,e)))return o;if("string"!==t&&r(i=e.toString)&&!s(o=a(i,e)))return o;throw new n("Can't convert object to primitive value")}},5031:(e,t,i)=>{var a=i(7751),r=i(9504),s=i(8480),n=i(3717),o=i(8551),g=r([].concat);e.exports=a("Reflect","ownKeys")||function ownKeys(e){var t=s.f(o(e)),i=n.f;return i?g(t,i(e)):t}},7979:(e,t,i)=>{var a=i(8551);e.exports=function(){var e=a(this),t="";e.hasIndices&&(t+="d");e.global&&(t+="g");e.ignoreCase&&(t+="i");e.multiline&&(t+="m");e.dotAll&&(t+="s");e.unicode&&(t+="u");e.unicodeSets&&(t+="v");e.sticky&&(t+="y");return t}},7750:(e,t,i)=>{var a=i(4117),r=TypeError;e.exports=function(e){if(a(e))throw new r("Can't call method on "+e);return e}},9286:(e,t,i)=>{var a=i(4402),r=i(8469),s=a.Set,n=a.add;e.exports=function(e){var t=new s;r(e,(function(e){n(t,e)}));return t}},3440:(e,t,i)=>{var a=i(7080),r=i(4402),s=i(9286),n=i(5170),o=i(3789),g=i(8469),c=i(507),C=r.has,h=r.remove;e.exports=function difference(e){var t=a(this),i=o(e),r=s(t);n(t)<=i.size?g(t,(function(e){i.includes(e)&&h(r,e)})):c(i.getIterator(),(function(e){C(t,e)&&h(r,e)}));return r}},4402:(e,t,i)=>{var a=i(9504),r=Set.prototype;e.exports={Set,add:a(r.add),has:a(r.has),remove:a(r.delete),proto:r}},8750:(e,t,i)=>{var a=i(7080),r=i(4402),s=i(5170),n=i(3789),o=i(8469),g=i(507),c=r.Set,C=r.add,h=r.has;e.exports=function intersection(e){var t=a(this),i=n(e),r=new c;s(t)>i.size?g(i.getIterator(),(function(e){h(t,e)&&C(r,e)})):o(t,(function(e){i.includes(e)&&C(r,e)}));return r}},4449:(e,t,i)=>{var a=i(7080),r=i(4402).has,s=i(5170),n=i(3789),o=i(8469),g=i(507),c=i(9539);e.exports=function isDisjointFrom(e){var t=a(this),i=n(e);if(s(t)<=i.size)return!1!==o(t,(function(e){if(i.includes(e))return!1}),!0);var C=i.getIterator();return!1!==g(C,(function(e){if(r(t,e))return c(C,"normal",!1)}))}},3838:(e,t,i)=>{var a=i(7080),r=i(5170),s=i(8469),n=i(3789);e.exports=function isSubsetOf(e){var t=a(this),i=n(e);return!(r(t)>i.size)&&!1!==s(t,(function(e){if(!i.includes(e))return!1}),!0)}},8527:(e,t,i)=>{var a=i(7080),r=i(4402).has,s=i(5170),n=i(3789),o=i(507),g=i(9539);e.exports=function isSupersetOf(e){var t=a(this),i=n(e);if(s(t){var a=i(9504),r=i(507),s=i(4402),n=s.Set,o=s.proto,g=a(o.forEach),c=a(o.keys),C=c(new n).next;e.exports=function(e,t,i){return i?r({iterator:c(e),next:C},t):g(e,t)}},4916:(e,t,i)=>{var a=i(7751),createSetLike=function(e){return{size:e,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}};e.exports=function(e){var t=a("Set");try{(new t)[e](createSetLike(0));try{(new t)[e](createSetLike(-1));return!1}catch(e){return!0}}catch(e){return!1}}},5170:(e,t,i)=>{var a=i(6706),r=i(4402);e.exports=a(r.proto,"size","get")||function(e){return e.size}},3650:(e,t,i)=>{var a=i(7080),r=i(4402),s=i(9286),n=i(3789),o=i(507),g=r.add,c=r.has,C=r.remove;e.exports=function symmetricDifference(e){var t=a(this),i=n(e).getIterator(),r=s(t);o(i,(function(e){c(t,e)?C(r,e):g(r,e)}));return r}},4204:(e,t,i)=>{var a=i(7080),r=i(4402).add,s=i(9286),n=i(3789),o=i(507);e.exports=function union(e){var t=a(this),i=n(e).getIterator(),g=s(t);o(i,(function(e){r(g,e)}));return g}},6119:(e,t,i)=>{var a=i(5745),r=i(3392),s=a("keys");e.exports=function(e){return s[e]||(s[e]=r(e))}},7629:(e,t,i)=>{var a=i(6395),r=i(4475),s=i(9433),n="__core-js_shared__",o=e.exports=r[n]||s(n,{});(o.versions||(o.versions=[])).push({version:"3.37.1",mode:a?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.37.1/LICENSE",source:"https://github.com/zloirock/core-js"})},5745:(e,t,i)=>{var a=i(7629);e.exports=function(e,t){return a[e]||(a[e]=t||{})}},1548:(e,t,i)=>{var a=i(4475),r=i(9039),s=i(7388),n=i(7290),o=i(516),g=i(9088),c=a.structuredClone;e.exports=!!c&&!r((function(){if(o&&s>92||g&&s>94||n&&s>97)return!1;var e=new ArrayBuffer(8),t=c(e,{transfer:[e]});return 0!==e.byteLength||8!==t.byteLength}))},4495:(e,t,i)=>{var a=i(7388),r=i(9039),s=i(4475).String;e.exports=!!Object.getOwnPropertySymbols&&!r((function(){var e=Symbol("symbol detection");return!s(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&a&&a<41}))},5610:(e,t,i)=>{var a=i(1291),r=Math.max,s=Math.min;e.exports=function(e,t){var i=a(e);return i<0?r(i+t,0):s(i,t)}},5854:(e,t,i)=>{var a=i(2777),r=TypeError;e.exports=function(e){var t=a(e,"number");if("number"==typeof t)throw new r("Can't convert number to bigint");return BigInt(t)}},7696:(e,t,i)=>{var a=i(1291),r=i(8014),s=RangeError;e.exports=function(e){if(void 0===e)return 0;var t=a(e),i=r(t);if(t!==i)throw new s("Wrong length or index");return i}},5397:(e,t,i)=>{var a=i(7055),r=i(7750);e.exports=function(e){return a(r(e))}},1291:(e,t,i)=>{var a=i(741);e.exports=function(e){var t=+e;return t!=t||0===t?0:a(t)}},8014:(e,t,i)=>{var a=i(1291),r=Math.min;e.exports=function(e){var t=a(e);return t>0?r(t,9007199254740991):0}},8981:(e,t,i)=>{var a=i(7750),r=Object;e.exports=function(e){return r(a(e))}},2777:(e,t,i)=>{var a=i(9565),r=i(34),s=i(757),n=i(5966),o=i(4270),g=i(8227),c=TypeError,C=g("toPrimitive");e.exports=function(e,t){if(!r(e)||s(e))return e;var i,g=n(e,C);if(g){void 0===t&&(t="default");i=a(g,e,t);if(!r(i)||s(i))return i;throw new c("Can't convert object to primitive value")}void 0===t&&(t="number");return o(e,t)}},6969:(e,t,i)=>{var a=i(2777),r=i(757);e.exports=function(e){var t=a(e,"string");return r(t)?t:t+""}},2140:(e,t,i)=>{var a={};a[i(8227)("toStringTag")]="z";e.exports="[object z]"===String(a)},655:(e,t,i)=>{var a=i(6955),r=String;e.exports=function(e){if("Symbol"===a(e))throw new TypeError("Cannot convert a Symbol value to a string");return r(e)}},9714:(e,t,i)=>{var a=i(9088);e.exports=function(e){try{if(a)return Function('return require("'+e+'")')()}catch(e){}}},6823:e=>{var t=String;e.exports=function(e){try{return t(e)}catch(e){return"Object"}}},3392:(e,t,i)=>{var a=i(9504),r=0,s=Math.random(),n=a(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+n(++r+s,36)}},7040:(e,t,i)=>{var a=i(4495);e.exports=a&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},8686:(e,t,i)=>{var a=i(3724),r=i(9039);e.exports=a&&r((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},2812:e=>{var t=TypeError;e.exports=function(e,i){if(e{var a=i(4475),r=i(4901),s=a.WeakMap;e.exports=r(s)&&/native code/.test(String(s))},8227:(e,t,i)=>{var a=i(4475),r=i(5745),s=i(9297),n=i(3392),o=i(4495),g=i(7040),c=a.Symbol,C=r("wks"),h=g?c.for||c:c&&c.withoutSetter||n;e.exports=function(e){s(C,e)||(C[e]=o&&s(c,e)?c[e]:h("Symbol."+e));return C[e]}},6573:(e,t,i)=>{var a=i(3724),r=i(2106),s=i(3238),n=ArrayBuffer.prototype;a&&!("detached"in n)&&r(n,"detached",{configurable:!0,get:function detached(){return s(this)}})},7936:(e,t,i)=>{var a=i(6518),r=i(5636);r&&a({target:"ArrayBuffer",proto:!0},{transferToFixedLength:function transferToFixedLength(){return r(this,arguments.length?arguments[0]:void 0,!1)}})},8100:(e,t,i)=>{var a=i(6518),r=i(5636);r&&a({target:"ArrayBuffer",proto:!0},{transfer:function transfer(){return r(this,arguments.length?arguments[0]:void 0,!0)}})},4114:(e,t,i)=>{var a=i(6518),r=i(8981),s=i(6198),n=i(4527),o=i(6837);a({target:"Array",proto:!0,arity:1,forced:i(9039)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(e){return e instanceof TypeError}}()},{push:function push(e){var t=r(this),i=s(t),a=arguments.length;o(i+a);for(var g=0;g{var a=i(6518),r=i(6043);a({target:"Promise",stat:!0},{withResolvers:function withResolvers(){var e=r.f(this);return{promise:e.promise,resolve:e.resolve,reject:e.reject}}})},9479:(e,t,i)=>{var a=i(4475),r=i(3724),s=i(2106),n=i(7979),o=i(9039),g=a.RegExp,c=g.prototype;r&&o((function(){var e=!0;try{g(".","d")}catch(t){e=!1}var t={},i="",a=e?"dgimsy":"gimsy",addGetter=function(e,a){Object.defineProperty(t,e,{get:function(){i+=a;return!0}})},r={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};e&&(r.hasIndices="d");for(var s in r)addGetter(s,r[s]);return Object.getOwnPropertyDescriptor(c,"flags").get.call(t)!==a||i!==a}))&&s(c,"flags",{configurable:!0,get:n})},7642:(e,t,i)=>{var a=i(6518),r=i(3440);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("difference")},{difference:r})},8004:(e,t,i)=>{var a=i(6518),r=i(9039),s=i(8750);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("intersection")||r((function(){return"3,2"!==String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))}))},{intersection:s})},3853:(e,t,i)=>{var a=i(6518),r=i(4449);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("isDisjointFrom")},{isDisjointFrom:r})},5876:(e,t,i)=>{var a=i(6518),r=i(3838);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("isSubsetOf")},{isSubsetOf:r})},2475:(e,t,i)=>{var a=i(6518),r=i(8527);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("isSupersetOf")},{isSupersetOf:r})},5024:(e,t,i)=>{var a=i(6518),r=i(3650);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("symmetricDifference")},{symmetricDifference:r})},1698:(e,t,i)=>{var a=i(6518),r=i(4204);a({target:"Set",proto:!0,real:!0,forced:!i(4916)("union")},{union:r})},7467:(e,t,i)=>{var a=i(7628),r=i(4644),s=r.aTypedArray,n=r.exportTypedArrayMethod,o=r.getTypedArrayConstructor;n("toReversed",(function toReversed(){return a(s(this),o(this))}))},4732:(e,t,i)=>{var a=i(4644),r=i(9504),s=i(9306),n=i(5370),o=a.aTypedArray,g=a.getTypedArrayConstructor,c=a.exportTypedArrayMethod,C=r(a.TypedArrayPrototype.sort);c("toSorted",(function toSorted(e){void 0!==e&&s(e);var t=o(this),i=n(g(t),t);return C(i,e)}))},9577:(e,t,i)=>{var a=i(9928),r=i(4644),s=i(1108),n=i(1291),o=i(5854),g=r.aTypedArray,c=r.getTypedArrayConstructor,C=r.exportTypedArrayMethod,h=!!function(){try{new Int8Array(1).with(2,{valueOf:function(){throw 8}})}catch(e){return 8===e}}();C("with",{with:function(e,t){var i=g(this),r=n(e),C=s(i)?o(t):+t;return a(i,c(i),r,C)}}.with,!h)},8992:(e,t,i)=>{var a=i(6518),r=i(4475),s=i(679),n=i(8551),o=i(4901),g=i(2787),c=i(2106),C=i(4659),h=i(9039),l=i(9297),Q=i(8227),E=i(7657).IteratorPrototype,u=i(3724),d=i(6395),f="constructor",p="Iterator",m=Q("toStringTag"),y=TypeError,w=r[p],b=d||!o(w)||w.prototype!==E||!h((function(){w({})})),D=function Iterator(){s(this,E);if(g(this)===E)throw new y("Abstract class Iterator not directly constructable")},defineIteratorPrototypeAccessor=function(e,t){u?c(E,e,{configurable:!0,get:function(){return t},set:function(t){n(this);if(this===E)throw new y("You can't redefine this property");l(this,e)?this[e]=t:C(this,e,t)}}):E[e]=t};l(E,m)||defineIteratorPrototypeAccessor(m,p);!b&&l(E,f)&&E[f]!==Object||defineIteratorPrototypeAccessor(f,D);D.prototype=E;a({global:!0,constructor:!0,forced:b},{Iterator:D})},3215:(e,t,i)=>{var a=i(6518),r=i(2652),s=i(9306),n=i(8551),o=i(1767);a({target:"Iterator",proto:!0,real:!0},{every:function every(e){n(this);s(e);var t=o(this),i=0;return!r(t,(function(t,a){if(!e(t,i++))return a()}),{IS_RECORD:!0,INTERRUPTED:!0}).stopped}})},4520:(e,t,i)=>{var a=i(6518),r=i(9565),s=i(9306),n=i(8551),o=i(1767),g=i(9462),c=i(6319),C=i(6395),h=g((function(){for(var e,t,i=this.iterator,a=this.predicate,s=this.next;;){e=n(r(s,i));if(this.done=!!e.done)return;t=e.value;if(c(i,a,[t,this.counter++],!0))return t}}));a({target:"Iterator",proto:!0,real:!0,forced:C},{filter:function filter(e){n(this);s(e);return new h(o(this),{predicate:e})}})},2577:(e,t,i)=>{var a=i(6518),r=i(2652),s=i(9306),n=i(8551),o=i(1767);a({target:"Iterator",proto:!0,real:!0},{find:function find(e){n(this);s(e);var t=o(this),i=0;return r(t,(function(t,a){if(e(t,i++))return a(t)}),{IS_RECORD:!0,INTERRUPTED:!0}).result}})},3949:(e,t,i)=>{var a=i(6518),r=i(2652),s=i(9306),n=i(8551),o=i(1767);a({target:"Iterator",proto:!0,real:!0},{forEach:function forEach(e){n(this);s(e);var t=o(this),i=0;r(t,(function(t){e(t,i++)}),{IS_RECORD:!0})}})},1454:(e,t,i)=>{var a=i(6518),r=i(713);a({target:"Iterator",proto:!0,real:!0,forced:i(6395)},{map:r})},8872:(e,t,i)=>{var a=i(6518),r=i(2652),s=i(9306),n=i(8551),o=i(1767),g=TypeError;a({target:"Iterator",proto:!0,real:!0},{reduce:function reduce(e){n(this);s(e);var t=o(this),i=arguments.length<2,a=i?void 0:arguments[1],c=0;r(t,(function(t){if(i){i=!1;a=t}else a=e(a,t,c);c++}),{IS_RECORD:!0});if(i)throw new g("Reduce of empty iterator with no initial value");return a}})},7550:(e,t,i)=>{var a=i(6518),r=i(2652),s=i(9306),n=i(8551),o=i(1767);a({target:"Iterator",proto:!0,real:!0},{some:function some(e){n(this);s(e);var t=o(this),i=0;return r(t,(function(t,a){if(e(t,i++))return a()}),{IS_RECORD:!0,INTERRUPTED:!0}).stopped}})},1795:(e,t,i)=>{var a=i(6518),r=i(8551),s=i(2652),n=i(1767),o=[].push;a({target:"Iterator",proto:!0,real:!0},{toArray:function toArray(){var e=[];s(n(r(this)),o,{that:e,IS_RECORD:!0});return e}})},3375:(e,t,i)=>{i(7642)},9225:(e,t,i)=>{i(8004)},3972:(e,t,i)=>{i(3853)},9209:(e,t,i)=>{i(5876)},5714:(e,t,i)=>{i(2475)},7561:(e,t,i)=>{i(5024)},6197:(e,t,i)=>{i(1698)},4979:(e,t,i)=>{var a=i(6518),r=i(4475),s=i(7751),n=i(6980),o=i(4913).f,g=i(9297),c=i(679),C=i(3167),h=i(2603),l=i(5002),Q=i(6193),E=i(3724),u=i(6395),d="DOMException",f=s("Error"),p=s(d),m=function DOMException(){c(this,y);var e=arguments.length,t=h(e<1?void 0:arguments[0]),i=h(e<2?void 0:arguments[1],"Error"),a=new p(t,i),r=new f(t);r.name=d;o(a,"stack",n(1,Q(r.stack,1)));C(a,this,m);return a},y=m.prototype=p.prototype,w="stack"in new f(d),b="stack"in new p(1,2),D=p&&E&&Object.getOwnPropertyDescriptor(r,d),S=!(!D||D.writable&&D.configurable),k=w&&!S&&!b;a({global:!0,constructor:!0,forced:u||k},{DOMException:k?m:p});var R=s(d),N=R.prototype;if(N.constructor!==R){u||o(N,"constructor",n(1,R));for(var G in l)if(g(l,G)){var x=l[G],U=x.s;g(R,U)||o(R,U,n(6,x.c))}}},3611:(e,t,i)=>{var a=i(6518),r=i(4475),s=i(2106),n=i(3724),o=TypeError,g=Object.defineProperty,c=r.self!==r;try{if(n){var C=Object.getOwnPropertyDescriptor(r,"self");!c&&C&&C.get&&C.enumerable||s(r,"self",{get:function self(){return r},set:function self(e){if(this!==r)throw new o("Illegal invocation");g(r,"self",{value:e,writable:!0,configurable:!0,enumerable:!0})},configurable:!0,enumerable:!0})}else a({global:!0,simple:!0,forced:c},{self:r})}catch(e){}},4603:(e,t,i)=>{var a=i(6840),r=i(9504),s=i(655),n=i(2812),o=URLSearchParams,g=o.prototype,c=r(g.append),C=r(g.delete),h=r(g.forEach),l=r([].push),Q=new o("a=1&a=2&b=3");Q.delete("a",1);Q.delete("b",void 0);Q+""!="a=2"&&a(g,"delete",(function(e){var t=arguments.length,i=t<2?void 0:arguments[1];if(t&&void 0===i)return C(this,e);var a=[];h(this,(function(e,t){l(a,{key:t,value:e})}));n(t,1);for(var r,o=s(e),g=s(i),Q=0,E=0,u=!1,d=a.length;Q{var a=i(6840),r=i(9504),s=i(655),n=i(2812),o=URLSearchParams,g=o.prototype,c=r(g.getAll),C=r(g.has),h=new o("a=1");!h.has("a",2)&&h.has("a",void 0)||a(g,"has",(function has(e){var t=arguments.length,i=t<2?void 0:arguments[1];if(t&&void 0===i)return C(this,e);var a=c(this,e);n(t,1);for(var r=s(i),o=0;o{var a=i(3724),r=i(9504),s=i(2106),n=URLSearchParams.prototype,o=r(n.forEach);a&&!("size"in n)&&s(n,"size",{get:function size(){var e=0;o(this,(function(){e++}));return e},configurable:!0,enumerable:!0})}},t={};function __webpack_require__(i){var a=t[i];if(void 0!==a)return a.exports;var r=t[i]={exports:{}};e[i].call(r.exports,r,r.exports,__webpack_require__);return r.exports}__webpack_require__.d=(e,t)=>{for(var i in t)__webpack_require__.o(t,i)&&!__webpack_require__.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})};__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__ = globalThis.pdfjsWorker = {};__webpack_require__.d(__webpack_exports__,{WorkerMessageHandler:()=>WorkerMessageHandler});__webpack_require__(4114),__webpack_require__(6573),__webpack_require__(8100),__webpack_require__(7936),__webpack_require__(4628),__webpack_require__(7467),__webpack_require__(4732),__webpack_require__(9577),__webpack_require__(8992),__webpack_require__(3949),__webpack_require__(1454),__webpack_require__(7550),__webpack_require__(3375),__webpack_require__(9225),__webpack_require__(3972),__webpack_require__(9209),__webpack_require__(5714),__webpack_require__(7561),__webpack_require__(6197),__webpack_require__(3611),__webpack_require__(4603),__webpack_require__(7566),__webpack_require__(8721);const i=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type),a=[1,0,0,1,0,0],r=[.001,0,0,.001,0,0],s=1.35,n=.35,o=.25925925925925924,g=1,c=2,C=4,h=8,l=16,Q=64,E=256,u="pdfjs_internal_editor_",d=3,f=9,p=13,m=15,y={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048},w=0,b=4,D=1,S=2,k=3,R=1,N=2,G=3,x=4,U=5,M=6,L=7,H=8,J=9,Y=10,v=11,T=12,K=13,q=14,O=15,W=16,j=17,X=20,Z="Group",V="R",_=1,z=2,$=4,AA=16,eA=32,tA=128,iA=512,aA=1,rA=2,sA=4096,nA=8192,oA=32768,gA=65536,IA=131072,cA=1048576,CA=2097152,hA=8388608,lA=16777216,BA=1,QA=2,EA=3,uA=4,dA=5,fA={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"},pA={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"},mA={O:"PageOpen",C:"PageClose"},yA={ERRORS:0,WARNINGS:1,INFOS:5},wA={NONE:0,BINARY:1},bA=1,DA=2,FA=3,SA=4,kA=5,RA=6,NA=7,GA=8,xA=9,UA=10,MA=11,LA=12,HA=13,JA=14,YA=15,vA=16,TA=17,KA=18,qA=19,OA=20,PA=21,WA=22,jA=23,XA=24,ZA=25,VA=26,_A=27,zA=28,$A=29,Ae=30,ee=31,te=32,ie=33,ae=34,re=35,se=36,ne=37,oe=38,ge=39,Ie=40,ce=41,Ce=42,he=43,le=44,Be=45,Qe=46,Ee=47,ue=48,de=49,fe=50,pe=51,me=52,ye=53,we=54,be=55,De=56,Fe=57,Se=58,ke=59,Re=60,Ne=61,Ge=62,xe=63,Ue=64,Me=65,Le=66,He=67,Je=68,Ye=69,ve=70,Te=71,Ke=72,qe=73,Oe=74,Pe=75,We=76,je=77,Xe=80,Ze=81,Ve=83,_e=84,ze=85,$e=86,At=87,et=88,tt=89,it=90,at=91,rt=1,st=2;let nt=yA.WARNINGS;function getVerbosityLevel(){return nt}function info(e){nt>=yA.INFOS&&console.log(`Info: ${e}`)}function warn(e){nt>=yA.WARNINGS&&console.log(`Warning: ${e}`)}function unreachable(e){throw new Error(e)}function assert(e,t){e||unreachable(t)}function createValidAbsoluteUrl(e,t=null,i=null){if(!e)return null;try{if(i&&"string"==typeof e){if(i.addDefaultProtocol&&e.startsWith("www.")){const t=e.match(/\./g);t?.length>=2&&(e=`http://${e}`)}if(i.tryConvertEncoding)try{e=stringToUTF8String(e)}catch{}}const a=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}}(a))return a}catch{}return null}function shadow(e,t,i,a=!1){Object.defineProperty(e,t,{value:i,enumerable:!a,configurable:!0,writable:!1});return i}const ot=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}();class PasswordException extends ot{constructor(e,t){super(e,"PasswordException");this.code=t}}class UnknownErrorException extends ot{constructor(e,t){super(e,"UnknownErrorException");this.details=t}}class InvalidPDFException extends ot{constructor(e){super(e,"InvalidPDFException")}}class MissingPDFException extends ot{constructor(e){super(e,"MissingPDFException")}}class UnexpectedResponseException extends ot{constructor(e,t){super(e,"UnexpectedResponseException");this.status=t}}class FormatError extends ot{constructor(e){super(e,"FormatError")}}class AbortException extends ot{constructor(e){super(e,"AbortException")}}function bytesToString(e){"object"==typeof e&&void 0!==e?.length||unreachable("Invalid argument for bytesToString");const t=e.length,i=8192;if(t>24&255,e>>16&255,e>>8&255,255&e)}function objectSize(e){return Object.keys(e).length}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{return!1}}())}static get isOffscreenCanvasSupported(){return shadow(this,"isOffscreenCanvasSupported","undefined"!=typeof OffscreenCanvas)}static get platform(){return"undefined"!=typeof navigator&&"string"==typeof navigator?.platform?shadow(this,"platform",{isMac:navigator.platform.includes("Mac")}):shadow(this,"platform",{isMac:!1})}static get isCSSRoundSupported(){return shadow(this,"isCSSRoundSupported",globalThis.CSS?.supports?.("width: round(1.5px, 1px)"))}}const gt=Array.from(Array(256).keys(),(e=>e.toString(16).padStart(2,"0")));class Util{static makeHexColor(e,t,i){return`#${gt[e]}${gt[t]}${gt[i]}`}static scaleMinMax(e,t){let i;if(e[0]){if(e[0]<0){i=t[0];t[0]=t[2];t[2]=i}t[0]*=e[0];t[2]*=e[0];if(e[3]<0){i=t[1];t[1]=t[3];t[3]=i}t[1]*=e[3];t[3]*=e[3]}else{i=t[0];t[0]=t[1];t[1]=i;i=t[2];t[2]=t[3];t[3]=i;if(e[1]<0){i=t[1];t[1]=t[3];t[3]=i}t[1]*=e[1];t[3]*=e[1];if(e[2]<0){i=t[0];t[0]=t[2];t[2]=i}t[0]*=e[2];t[2]*=e[2]}t[0]+=e[4];t[1]+=e[5];t[2]+=e[4];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 i=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])/i,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/i]}static getAxialAlignedBoundingBox(e,t){const i=this.applyTransform(e,t),a=this.applyTransform(e.slice(2,4),t),r=this.applyTransform([e[0],e[3]],t),s=this.applyTransform([e[2],e[1]],t);return[Math.min(i[0],a[0],r[0],s[0]),Math.min(i[1],a[1],r[1],s[1]),Math.max(i[0],a[0],r[0],s[0]),Math.max(i[1],a[1],r[1],s[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]],i=e[0]*t[0]+e[1]*t[2],a=e[0]*t[1]+e[1]*t[3],r=e[2]*t[0]+e[3]*t[2],s=e[2]*t[1]+e[3]*t[3],n=(i+s)/2,o=Math.sqrt((i+s)**2-4*(i*s-r*a))/2,g=n+o||1,c=n-o||1;return[Math.sqrt(g),Math.sqrt(c)]}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 i=Math.max(Math.min(e[0],e[2]),Math.min(t[0],t[2])),a=Math.min(Math.max(e[0],e[2]),Math.max(t[0],t[2]));if(i>a)return null;const r=Math.max(Math.min(e[1],e[3]),Math.min(t[1],t[3])),s=Math.min(Math.max(e[1],e[3]),Math.max(t[1],t[3]));return r>s?null:[i,r,a,s]}static#A(e,t,i,a,r,s,n,o,g,c){if(g<=0||g>=1)return;const C=1-g,h=g*g,l=h*g,Q=C*(C*(C*e+3*g*t)+3*h*i)+l*a,E=C*(C*(C*r+3*g*s)+3*h*n)+l*o;c[0]=Math.min(c[0],Q);c[1]=Math.min(c[1],E);c[2]=Math.max(c[2],Q);c[3]=Math.max(c[3],E)}static#e(e,t,i,a,r,s,n,o,g,c,C,h){if(Math.abs(g)<1e-12){Math.abs(c)>=1e-12&&this.#A(e,t,i,a,r,s,n,o,-C/c,h);return}const l=c**2-4*C*g;if(l<0)return;const Q=Math.sqrt(l),E=2*g;this.#A(e,t,i,a,r,s,n,o,(-c+Q)/E,h);this.#A(e,t,i,a,r,s,n,o,(-c-Q)/E,h)}static bezierBoundingBox(e,t,i,a,r,s,n,o,g){if(g){g[0]=Math.min(g[0],e,n);g[1]=Math.min(g[1],t,o);g[2]=Math.max(g[2],e,n);g[3]=Math.max(g[3],t,o)}else g=[Math.min(e,n),Math.min(t,o),Math.max(e,n),Math.max(t,o)];this.#e(e,i,r,n,t,a,s,o,3*(3*(i-r)-e+n),6*(e-2*i+r),3*(i-e),g);this.#e(e,i,r,n,t,a,s,o,3*(3*(a-s)-t+o),6*(t-2*a+s),3*(a-t),g);return g}}const It=[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 stringToPDFString(e){if(e[0]>="ï"){let t;if("þ"===e[0]&&"ÿ"===e[1]){t="utf-16be";e.length%2==1&&(e=e.slice(0,-1))}else if("ÿ"===e[0]&&"þ"===e[1]){t="utf-16le";e.length%2==1&&(e=e.slice(0,-1))}else"ï"===e[0]&&"»"===e[1]&&"¿"===e[2]&&(t="utf-8");if(t)try{const i=new TextDecoder(t,{fatal:!0}),a=stringToBytes(e),r=i.decode(a);return r.includes("")?r.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g,""):r}catch(e){warn(`stringToPDFString: "${e}".`)}}const t=[];for(let i=0,a=e.length;i{unreachable("Should not call `set` on the empty dictionary.")};return shadow(this,"empty",e)}static merge({xref:e,dictArray:t,mergeSubDicts:i=!1}){const a=new Dict(e),r=new Map;for(const e of t)if(e instanceof Dict)for(const[t,a]of Object.entries(e._map)){let e=r.get(t);if(void 0===e){e=[];r.set(t,e)}else if(!(i&&a instanceof Dict))continue;e.push(a)}for(const[t,i]of r){if(1===i.length||!(i[0]instanceof Dict)){a._map[t]=i[0];continue}const r=new Dict(e);for(const e of i)for(const[t,i]of Object.entries(e._map))void 0===r._map[t]&&(r._map[t]=i);r.size>0&&(a._map[t]=r)}r.clear();return a.size>0?a:Dict.empty}clone(){const e=new Dict(this.xref);for(const t of this.getKeys())e.set(t,this.getRaw(t));return e}}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 fromString(e){const t=Dt[e];if(t)return t;const i=/^(\d+)R(\d*)$/.exec(e);return i&&"0"!==i[1]?Dt[e]=new Ref(parseInt(i[1]),i[2]?parseInt(i[2]):0):null}static get(e,t){const i=0===t?`${e}R`:`${e}R${t}`;return Dt[i]||=new Ref(e,t)}}class RefSet{constructor(e=null){this._set=new Set(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()}}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()}*items(){for(const[e,t]of this._map)yield[Ref.fromString(e),t]}}function isName(e,t){return e instanceof Name&&(void 0===t||e.name===t)}function isCmd(e,t){return e instanceof Cmd&&(void 0===t||e.cmd===t)}function isDict(e,t){return e instanceof Dict&&(void 0===t||isName(e.get("Type"),t))}function isRefsEqual(e,t){return e.num===t.num&&e.gen===t.gen}class BaseStream{constructor(){this.constructor===BaseStream&&unreachable("Cannot initialize BaseStream.")}get length(){unreachable("Abstract getter `length` accessed")}get isEmpty(){unreachable("Abstract getter `isEmpty` accessed")}get isDataLoaded(){return shadow(this,"isDataLoaded",!0)}getByte(){unreachable("Abstract method `getByte` called")}getBytes(e){unreachable("Abstract method `getBytes` called")}async getImageData(e,t){return this.getBytes(e,t)}async asyncGetBytes(){unreachable("Abstract method `asyncGetBytes` called")}get isAsync(){return!1}get canAsyncDecodeImageFromBuffer(){return!1}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){unreachable("Abstract method `getByteRange` called")}getString(e){return bytesToString(this.getBytes(e))}skip(e){this.pos+=e||1}reset(){unreachable("Abstract method `reset` called")}moveStart(){unreachable("Abstract method `moveStart` called")}makeSubStream(e,t,i=null){unreachable("Abstract method `makeSubStream` called")}getBaseStreams(){return null}}const St=/^[1-9]\.\d$/;function getLookupTableFactory(e){let t;return function(){if(e){t=Object.create(null);e(t);e=null}return t}}class MissingDataException extends ot{constructor(e,t){super(`Missing data [${e}, ${t})`,"MissingDataException");this.begin=e;this.end=t}}class ParserEOFException extends ot{constructor(e){super(e,"ParserEOFException")}}class XRefEntryException extends ot{constructor(e){super(e,"XRefEntryException")}}class XRefParseException extends ot{constructor(e){super(e,"XRefParseException")}}function arrayBuffersToBytes(e){const t=e.length;if(0===t)return new Uint8Array(0);if(1===t)return new Uint8Array(e[0]);let i=0;for(let a=0;a0,"The number should be a positive integer.");const i=[];let a;for(;e>=1e3;){e-=1e3;i.push("M")}a=e/100|0;e%=100;i.push(kt[a]);a=e/10|0;e%=10;i.push(kt[10+a]);i.push(kt[20+e]);const r=i.join("");return t?r.toLowerCase():r}function log2(e){return e<=0?0:Math.ceil(Math.log2(e))}function readInt8(e,t){return e[t]<<24>>24}function readUint16(e,t){return e[t]<<8|e[t+1]}function readUint32(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}function isWhiteSpace(e){return 32===e||9===e||13===e||10===e}function isNumberArray(e,t){return Array.isArray(e)&&(null===t||e.length===t)&&e.every((e=>"number"==typeof e))}function lookupMatrix(e,t){return isNumberArray(e,6)?e:t}function lookupRect(e,t){return isNumberArray(e,4)?e:t}function lookupNormalRect(e,t){return isNumberArray(e,4)?Util.normalizeRect(e):t}function parseXFAPath(e){const t=/(.+)\[(\d+)\]$/;return e.split(".").map((e=>{const i=e.match(t);return i?{name:i[1],pos:parseInt(i[2],10)}:{name:e,pos:0}}))}function escapePDFName(e){const t=[];let i=0;for(let a=0,r=e.length;a126||35===r||40===r||41===r||60===r||62===r||91===r||93===r||123===r||125===r||47===r||37===r){i"\n"===e?"\\n":"\r"===e?"\\r":`\\${e}`))}function _collectJS(e,t,i,a){if(!e)return;let r=null;if(e instanceof Ref){if(a.has(e))return;r=e;a.put(r);e=t.fetch(e)}if(Array.isArray(e))for(const r of e)_collectJS(r,t,i,a);else if(e instanceof Dict){if(isName(e.get("S"),"JavaScript")){const t=e.get("JS");let a;t instanceof BaseStream?a=t.getString():"string"==typeof t&&(a=t);a&&=stringToPDFString(a).replaceAll("\0","");a&&i.push(a)}_collectJS(e.getRaw("Next"),t,i,a)}r&&a.remove(r)}function collectActions(e,t,i){const a=Object.create(null),r=getInheritableProperty({dict:t,key:"AA",stopWhenFound:!1});if(r)for(let t=r.length-1;t>=0;t--){const s=r[t];if(s instanceof Dict)for(const t of s.getKeys()){const r=i[t];if(!r)continue;const n=[];_collectJS(s.getRaw(t),e,n,new RefSet);n.length>0&&(a[r]=n)}}if(t.has("A")){const i=[];_collectJS(t.get("A"),e,i,new RefSet);i.length>0&&(a.Action=i)}return objectSize(a)>0?a:null}const Rt={60:"<",62:">",38:"&",34:""",39:"'"};function*codePointIter(e){for(let t=0,i=e.length;t55295&&(i<57344||i>65533)&&t++;yield i}}function encodeToXmlString(e){const t=[];let i=0;for(let a=0,r=e.length;a55295&&(r<57344||r>65533)&&a++;i=a+1}}if(0===t.length)return e;i: ${e}.`);return!1}return!0}function validateCSSFont(e){const t=new Set(["100","200","300","400","500","600","700","800","900","1000","normal","bold","bolder","lighter"]),{fontFamily:i,fontWeight:a,italicAngle:r}=e;if(!validateFontName(i,!0))return!1;const s=a?a.toString():"";e.fontWeight=t.has(s)?s:"400";const n=parseFloat(r);e.italicAngle=isNaN(n)||n<-90||n>90?"14":r.toString();return!0}function recoverJsURL(e){const t=new RegExp("^\\s*("+["app.launchURL","window.open","xfa.host.gotoURL"].join("|").replaceAll(".","\\.")+")\\((?:'|\")([^'\"]*)(?:'|\")(?:,\\s*(\\w+)\\)|\\))","i").exec(e);if(t?.[2]){const e=t[2];let i=!1;"true"===t[3]&&"app.launchURL"===t[1]&&(i=!0);return{url:e,newWindow:i}}return null}function numberToString(e){if(Number.isInteger(e))return e.toString();const t=Math.round(100*e);return t%100==0?(t/100).toString():t%10==0?e.toFixed(1):e.toFixed(2)}function getNewAnnotationsMap(e){if(!e)return null;const t=new Map;for(const[i,a]of e){if(!i.startsWith(u))continue;let e=t.get(a.pageIndex);if(!e){e=[];t.set(a.pageIndex,e)}e.push(a)}return t.size>0?t:null}function isAscii(e){return/^[\x00-\x7F]*$/.test(e)}function stringToUTF16HexString(e){const t=[];for(let i=0,a=e.length;i>8&255).toString(16).padStart(2,"0"),(255&a).toString(16).padStart(2,"0"))}return t.join("")}function stringToUTF16String(e,t=!1){const i=[];t&&i.push("þÿ");for(let t=0,a=e.length;t>8&255),String.fromCharCode(255&a))}return i.join("")}function getRotationMatrix(e,t,i){switch(e){case 90:return[0,1,-1,0,t,0];case 180:return[-1,0,0,-1,t,i];case 270:return[0,-1,1,0,0,i];default:throw new Error("Invalid rotation")}}function getSizeInBytes(e){return Math.ceil(Math.ceil(Math.log2(1+e))/8)}class Stream extends BaseStream{constructor(e,t,i,a){super();this.bytes=e instanceof Uint8Array?e:new Uint8Array(e);this.start=t||0;this.pos=this.start;this.end=t+i||this.bytes.length;this.dict=a}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,i=this.pos,a=this.end;if(!e)return t.subarray(i,a);let r=i+e;r>a&&(r=a);this.pos=r;return t.subarray(i,r)}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,i=null){return new Stream(this.bytes.buffer,e,t,i)}}class StringStream extends Stream{constructor(e){super(stringToBytes(e))}}class NullStream extends Stream{constructor(){super(new Uint8Array(0))}}class ChunkedStream extends Stream{constructor(e,t,i){super(new Uint8Array(e),0,e,null);this.chunkSize=t;this._loadedChunks=new Set;this.numChunks=Math.ceil(e/t);this.manager=i;this.progressiveDataLength=0;this.lastSuccessfulEnsureByteChunk=-1}getMissingChunks(){const e=[];for(let t=0,i=this.numChunks;t=this.end?this.numChunks:Math.floor(t/this.chunkSize);for(let e=i;ethis.numChunks)&&t!==this.lastSuccessfulEnsureByteChunk){if(!this._loadedChunks.has(t))throw new MissingDataException(e,e+1);this.lastSuccessfulEnsureByteChunk=t}}ensureRange(e,t){if(e>=t)return;if(t<=this.progressiveDataLength)return;const i=Math.floor(e/this.chunkSize);if(i>this.numChunks)return;const a=Math.min(Math.floor((t-1)/this.chunkSize)+1,this.numChunks);for(let r=i;r=this.end)return-1;e>=this.progressiveDataLength&&this.ensureByte(e);return this.bytes[this.pos++]}getBytes(e){const t=this.bytes,i=this.pos,a=this.end;if(!e){a>this.progressiveDataLength&&this.ensureRange(i,a);return t.subarray(i,a)}let r=i+e;r>a&&(r=a);r>this.progressiveDataLength&&this.ensureRange(i,r);this.pos=r;return t.subarray(i,r)}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,i=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),i=Math.floor((this.end-1)/e)+1,a=[];for(let e=t;e{const readChunk=({value:s,done:n})=>{try{if(n){const t=arrayBuffersToBytes(a);a=null;e(t);return}r+=s.byteLength;i.isStreamingSupported&&this.onProgress({loaded:r});a.push(s);i.read().then(readChunk,t)}catch(e){t(e)}};i.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++,i=new Set;this._chunksNeededByRequest.set(t,i);for(const t of e)this.stream.hasChunk(t)||i.add(t);if(0===i.size)return Promise.resolve();const a=Promise.withResolvers();this._promisesByRequest.set(t,a);const r=[];for(const e of i){let i=this._requestsByChunk.get(e);if(!i){i=[];this._requestsByChunk.set(e,i);r.push(e)}i.push(t)}if(r.length>0){const e=this.groupChunks(r);for(const t of e){const e=t.beginChunk*this.chunkSize,i=Math.min(t.endChunk*this.chunkSize,this.length);this.sendRequest(e,i).catch(a.reject)}}return a.promise.catch((e=>{if(!this.aborted)throw e}))}getStream(){return this.stream}requestRange(e,t){t=Math.min(t,this.length);const i=this.getBeginChunk(e),a=this.getEndChunk(t),r=[];for(let e=i;e=0&&a+1!==s){t.push({beginChunk:i,endChunk:a+1});i=s}r+1===e.length&&t.push({beginChunk:i,endChunk:s+1});a=s}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,i=void 0===e.begin,a=i?this.progressiveDataLength:e.begin,r=a+t.byteLength,s=Math.floor(a/this.chunkSize),n=r0||o.push(i)}}}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(n);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?.cancelAllRequests(e);for(const t of this._promisesByRequest.values())t.reject(e)}}__webpack_require__(4520),__webpack_require__(9479),__webpack_require__(2577),__webpack_require__(8872);class ColorSpace{constructor(e,t){this.constructor===ColorSpace&&unreachable("Cannot initialize ColorSpace.");this.name=e;this.numComps=t}getRgb(e,t){const i=new Uint8ClampedArray(3);this.getRgbItem(e,t,i,0);return i}getRgbItem(e,t,i,a){unreachable("Should not call ColorSpace.getRgbItem")}getRgbBuffer(e,t,i,a,r,s,n){unreachable("Should not call ColorSpace.getRgbBuffer")}getOutputLength(e,t){unreachable("Should not call ColorSpace.getOutputLength")}isPassthrough(e){return!1}isDefaultDecode(e,t){return ColorSpace.isDefaultDecode(e,this.numComps)}fillRgb(e,t,i,a,r,s,n,o,g){const c=t*i;let C=null;const h=1<h&&"DeviceGray"!==this.name&&"DeviceRGB"!==this.name){const t=n<=8?new Uint8Array(h):new Uint16Array(h);for(let e=0;e=.99554525?1:this.#B(0,1,1.055*e**(1/2.4)-.055)}#B(e,t,i){return Math.max(e,Math.min(t,i))}#Q(e){return e<0?-this.#Q(-e):e>8?((e+16)/116)**3:e*CalRGBCS.#I}#E(e,t,i){if(0===e[0]&&0===e[1]&&0===e[2]){i[0]=t[0];i[1]=t[1];i[2]=t[2];return}const a=this.#Q(0),r=(1-a)/(1-this.#Q(e[0])),s=1-r,n=(1-a)/(1-this.#Q(e[1])),o=1-n,g=(1-a)/(1-this.#Q(e[2])),c=1-g;i[0]=t[0]*r+s;i[1]=t[1]*n+o;i[2]=t[2]*g+c}#u(e,t,i){if(1===e[0]&&1===e[2]){i[0]=t[0];i[1]=t[1];i[2]=t[2];return}const a=i;this.#c(CalRGBCS.#i,t,a);const r=CalRGBCS.#n;this.#C(e,a,r);this.#c(CalRGBCS.#a,r,i)}#d(e,t,i){const a=i;this.#c(CalRGBCS.#i,t,a);const r=CalRGBCS.#n;this.#h(e,a,r);this.#c(CalRGBCS.#a,r,i)}#t(e,t,i,a,r){const s=this.#B(0,1,e[t]*r),n=this.#B(0,1,e[t+1]*r),o=this.#B(0,1,e[t+2]*r),g=1===s?1:s**this.GR,c=1===n?1:n**this.GG,C=1===o?1:o**this.GB,h=this.MXA*g+this.MXB*c+this.MXC*C,l=this.MYA*g+this.MYB*c+this.MYC*C,Q=this.MZA*g+this.MZB*c+this.MZC*C,E=CalRGBCS.#o;E[0]=h;E[1]=l;E[2]=Q;const u=CalRGBCS.#g;this.#u(this.whitePoint,E,u);const d=CalRGBCS.#o;this.#E(this.blackPoint,u,d);const f=CalRGBCS.#g;this.#d(CalRGBCS.#s,d,f);const p=CalRGBCS.#o;this.#c(CalRGBCS.#r,f,p);i[a]=255*this.#l(p[0]);i[a+1]=255*this.#l(p[1]);i[a+2]=255*this.#l(p[2])}getRgbItem(e,t,i,a){this.#t(e,t,i,a,1)}getRgbBuffer(e,t,i,a,r,s,n){const o=1/((1<this.amax||this.bmin>this.bmax){info("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=-100;this.bmax=100}}#f(e){return e>=6/29?e**3:108/841*(e-4/29)}#p(e,t,i,a){return i+e*(a-i)/t}#t(e,t,i,a,r){let s=e[t],n=e[t+1],o=e[t+2];if(!1!==i){s=this.#p(s,i,0,100);n=this.#p(n,i,this.amin,this.amax);o=this.#p(o,i,this.bmin,this.bmax)}n>this.amax?n=this.amax:nthis.bmax?o=this.bmax:o>>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,i){let a=0;for(let r=i;r>=0;r--){a+=e[r]+t[r];e[r]=255&a;a>>=8}}function incHex(e,t){let i=1;for(let a=t;a>=0&&i>0;a--){i+=e[a];e[a]=255&i;i>>=8}}const Nt=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 i=this.readByte();if(i<0)throw new FormatError("unexpected EOF in bcmap");e=!(128&i);t=t<<7|127&i}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 i;const a=this.tmpBuf;let r=0;do{const e=this.readByte();if(e<0)throw new FormatError("unexpected EOF in bcmap");i=!(128&e);a[r++]=127&e}while(!i);let s=t,n=0,o=0;for(;s>=0;){for(;o<8&&a.length>0;){n|=a[--r]<>=8;o-=8}}readHexSigned(e,t){this.readHexNumber(e,t);const i=1&e[t]?255:0;let a=0;for(let r=0;r<=t;r++){a=(1&a)<<8|e[r];e[r]=a>>1^i}}readString(){const e=this.readNumber(),t=new Array(e);for(let i=0;i=0;){const e=l>>5;if(7===e){switch(31&l){case 0:a.readString();break;case 1:s=a.readString()}continue}const i=!!(16&l),r=15&l;if(r+1>Nt)throw new Error("BinaryCMapReader.process: Invalid dataSize.");const Q=1,E=a.readNumber();switch(e){case 0:a.readHex(n,r);a.readHexNumber(o,r);addHex(o,n,r);t.addCodespaceRange(r+1,hexToInt(n,r),hexToInt(o,r));for(let e=1;er&&(a=r)}else{for(;!this.eof;)this.readBlock(t);a=this.bufferLength}this.pos=a;return this.buffer.subarray(i,a)}async getImageData(e,t=null){if(!this.canAsyncDecodeImageFromBuffer)return this.getBytes(e,t);const i=await this.stream.asyncGetBytes();return this.decodeImage(i,t)}reset(){this.pos=0}makeSubStream(e,t,i=null){if(void 0===t)for(;!this.eof;)this.readBlock();else{const i=e+t;for(;this.bufferLength<=i&&!this.eof;)this.readBlock()}return new Stream(this.buffer,e,t,i)}getBaseStreams(){return this.str?this.str.getBaseStreams():null}}class StreamsSequenceStream extends DecodeStream{constructor(e,t=null){let i=0;for(const t of e)i+=t instanceof DecodeStream?t._rawMinBufferLength:t.length;super(i);this.streams=e;this._onError=t}readBlock(){const e=this.streams;if(0===e.length){this.eof=!0;return}const t=e.shift();let i;try{i=t.getBytes()}catch(e){if(this._onError){this._onError(e,t.dict?.objId);return}throw e}const a=this.bufferLength,r=a+i.length;this.ensureBuffer(r).set(i,a);this.bufferLength=r}getBaseStreams(){const e=[];for(const t of this.streams){const i=t.getBaseStreams();i&&e.push(...i)}return e.length>0?e:null}}class Ascii85Stream extends 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(;isWhiteSpace(t);)t=e.getByte();if(-1===t||126===t){this.eof=!0;return}const i=this.bufferLength;let a,r;if(122===t){a=this.ensureBuffer(i+4);for(r=0;r<4;++r)a[i+r]=0;this.bufferLength+=4}else{const s=this.input;s[0]=t;for(r=1;r<5;++r){t=e.getByte();for(;isWhiteSpace(t);)t=e.getByte();s[r]=t;if(-1===t||126===t)break}a=this.ensureBuffer(i+r-1);this.bufferLength+=r-1;if(r<5){for(;r<5;++r)s[r]=117;this.eof=!0}let n=0;for(r=0;r<5;++r)n=85*n+(s[r]-33);for(r=3;r>=0;--r){a[i+r]=255&n;n>>=8}}}}class AsciiHexStream extends 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,i=this.ensureBuffer(this.bufferLength+t);let a=this.bufferLength,r=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(r<0)r=e;else{i[a++]=r<<4|e;r=-1}}if(r>=0&&this.eof){i[a++]=r<<4;r=-1}this.firstDigit=r;this.bufferLength=a}}const xt=-1,Ut=[[-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]],Mt=[[-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]],Lt=[[-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]],Ht=[[-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]],Jt=[[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]],Yt=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];class CCITTFaxDecoder{constructor(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;this.eoblock=t.EndOfBlock??!0;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;let i;for(;0===(i=this._lookBits(12));)this._eatBits(1);1===i&&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,i=this.columns;let a,r,s,n,o;if(0===this.outputBits){this.rowsDone&&(this.eof=!0);if(this.eof)return-1;this.err=!1;let s,o,g;if(this.nextLine2D){for(n=0;t[n]=64);do{o+=g=this._getWhiteCode()}while(g>=64)}else{do{s+=g=this._getWhiteCode()}while(g>=64);do{o+=g=this._getBlackCode()}while(g>=64)}this._addPixels(t[this.codingPos]+s,r);t[this.codingPos]0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]0?--a:++a;for(;e[a]<=t[this.codingPos]&&e[a]=64);else do{s+=g=this._getWhiteCode()}while(g>=64);this._addPixels(t[this.codingPos]+s,r);r^=1}}let c=!1;this.byteAlign&&(this.inputBits&=-8);if(this.eoblock||this.row!==this.rows-1){s=this._lookBits(12);if(this.eoline)for(;s!==xt&&1!==s;){this._eatBits(1);s=this._lookBits(12)}else for(;0===s;){this._eatBits(1);s=this._lookBits(12)}if(1===s){this._eatBits(12);c=!0}else s===xt&&(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&&c&&this.byteAlign){s=this._lookBits(12);if(1===s){this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}if(this.encoding>=0)for(n=0;n<4;++n){s=this._lookBits(12);1!==s&&info("bad rtc code: "+s);this._eatBits(12);if(this.encoding>0){this._lookBits(1);this._eatBits(1)}}this.eof=!0}}else if(this.err&&this.eoline){for(;;){s=this._lookBits(13);if(s===xt){this.eof=!0;return-1}if(s>>1==1)break;this._eatBits(1)}this._eatBits(12);if(this.encoding>0){this._eatBits(1);this.nextLine2D=!(1&s)}}this.outputBits=t[0]>0?t[this.codingPos=0]:t[this.codingPos=1];this.row++}if(this.outputBits>=8){o=1&this.codingPos?0:255;this.outputBits-=8;if(0===this.outputBits&&t[this.codingPos]s){o<<=s;1&this.codingPos||(o|=255>>8-s);this.outputBits-=s;s=0}else{o<<=this.outputBits;1&this.codingPos||(o|=255>>8-this.outputBits);s-=this.outputBits;this.outputBits=0;if(t[this.codingPos]0){o<<=s;s=0}}}while(s)}this.black&&(o^=255);return o}_addPixels(e,t){const i=this.codingLine;let a=this.codingPos;if(e>i[a]){if(e>this.columns){info("row is wrong length");this.err=!0;e=this.columns}1&a^t&&++a;i[a]=e}this.codingPos=a}_addPixelsNeg(e,t){const i=this.codingLine;let a=this.codingPos;if(e>i[a]){if(e>this.columns){info("row is wrong length");this.err=!0;e=this.columns}1&a^t&&++a;i[a]=e}else if(e0&&e=r){const t=i[e-r];if(t[0]===a){this._eatBits(a);return[!0,t[1],!0]}}}return[!1,0,!1]}_getTwoDimCode(){let e,t=0;if(this.eoblock){t=this._lookBits(7);e=Ut[t];if(e?.[0]>0){this._eatBits(e[0]);return e[1]}}else{const e=this._findTableCode(1,7,Ut);if(e[0]&&e[2])return e[1]}info("Bad two dim code");return xt}_getWhiteCode(){let e,t=0;if(this.eoblock){t=this._lookBits(12);if(t===xt)return 1;e=t>>5==0?Mt[t]:Lt[t>>3];if(e[0]>0){this._eatBits(e[0]);return e[1]}}else{let e=this._findTableCode(1,9,Lt);if(e[0])return e[1];e=this._findTableCode(11,12,Mt);if(e[0])return e[1]}info("bad white code");this._eatBits(1);return 1}_getBlackCode(){let e,t;if(this.eoblock){e=this._lookBits(13);if(e===xt)return 1;t=e>>7==0?Ht[e]:e>>9==0&&e>>7!=0?Jt[(e>>1)-64]:Yt[e>>7];if(t[0]>0){this._eatBits(t[0]);return t[1]}}else{let e=this._findTableCode(2,6,Yt);if(e[0])return e[1];e=this._findTableCode(7,12,Jt,64);if(e[0])return e[1];e=this._findTableCode(10,13,Ht);if(e[0])return e[1]}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)}}class CCITTFaxStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;i instanceof Dict||(i=Dict.empty);const a={next:()=>e.getByte()};this.ccittFaxDecoder=new CCITTFaxDecoder(a,{K:i.get("K"),EndOfLine:i.get("EndOfLine"),EncodedByteAlign:i.get("EncodedByteAlign"),Columns:i.get("Columns"),Rows:i.get("Rows"),EndOfBlock:i.get("EndOfBlock"),BlackIs1:i.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}}}const vt=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Tt=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]),Kt=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]),qt=[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],Ot=[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 DecodeStream{constructor(e,t){super(t);this.str=e;this.dict=e.dict;const i=e.getByte(),a=e.getByte();if(-1===i||-1===a)throw new FormatError(`Invalid header in flate stream: ${i}, ${a}`);if(8!=(15&i))throw new FormatError(`Unknown compression method in flate stream: ${i}, ${a}`);if(((i<<8)+a)%31!=0)throw new FormatError(`Bad FCHECK in flate stream: ${i}, ${a}`);if(32&a)throw new FormatError(`FDICT bit set in flate stream: ${i}, ${a}`);this.codeSize=0;this.codeBuf=0}async getImageData(e,t){const i=await this.asyncGetBytes();return i?.subarray(0,e)||this.getBytes(e)}async asyncGetBytes(){this.str.reset();const e=this.str.getBytes();try{const{readable:t,writable:i}=new DecompressionStream("deflate"),a=i.getWriter();a.write(e);a.close();const r=[];let s=0;for await(const e of t){r.push(e);s+=e.byteLength}const n=new Uint8Array(s);let o=0;for(const e of r){n.set(e,o);o+=e.byteLength}return n}catch{this.str=new Stream(e,2,e.length,this.str.dict);this.reset();return null}}get isAsync(){return!0}getBits(e){const t=this.str;let i,a=this.codeSize,r=this.codeBuf;for(;a>e;this.codeSize=a-=e;return i}getCode(e){const t=this.str,i=e[0],a=e[1];let r,s=this.codeSize,n=this.codeBuf;for(;s>16,c=65535&o;if(g<1||s>g;this.codeSize=s-g;return c}generateHuffmanTable(e){const t=e.length;let i,a=0;for(i=0;ia&&(a=e[i]);const r=1<>=1}for(i=e;i>=1;if(0===t){let t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}let i=t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}i|=t<<8;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}let r=t;if(-1===(t=a.getByte())){this.#m("Bad block header in flate stream");return}r|=t<<8;if(r!==(65535&~i)&&(0!==i||0!==r))throw new FormatError("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;const s=this.bufferLength,n=s+i;e=this.ensureBuffer(n);this.bufferLength=n;if(0===i)-1===a.peekByte()&&(this.eof=!0);else{const t=a.getBytes(i);e.set(t,s);t.length0;)C[o++]=Q}r=this.generateHuffmanTable(C.subarray(0,e));s=this.generateHuffmanTable(C.subarray(e,c))}}e=this.buffer;let n=e?e.length:0,o=this.bufferLength;for(;;){let t=this.getCode(r);if(t<256){if(o+1>=n){e=this.ensureBuffer(o+1);n=e.length}e[o++]=t;continue}if(256===t){this.bufferLength=o;return}t-=257;t=Tt[t];let a=t>>16;a>0&&(a=this.getBits(a));i=(65535&t)+a;t=this.getCode(s);t=Kt[t];a=t>>16;a>0&&(a=this.getBits(a));const g=(65535&t)+a;if(o+i>=n){e=this.ensureBuffer(o+i);n=e.length}for(let t=0;t>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 i=e[t]>>1,a=1&e[t];const r=Pt[i],s=r.qe;let n,o=this.a-s;if(this.chigh>15&1;this.clow=this.clow<<1&65535;this.ct--}while(0==(32768&o));this.a=o;e[t]=i<<1|a;return n}}class Jbig2Error extends ot{constructor(e){super(e,"Jbig2Error")}}class ContextCache{getContexts(e){return e in this?this[e]:this[e]=new Int8Array(65536)}}class DecodingContext{constructor(e,t,i){this.data=e;this.start=t;this.end=i}get decoder(){return shadow(this,"decoder",new ArithmeticDecoder(this.data,this.start,this.end))}get contextCache(){return shadow(this,"contextCache",new ContextCache)}}const Wt=2**31-1,jt=-(2**31);function decodeInteger(e,t,i){const a=e.getContexts(t);let r=1;function readBits(e){let t=0;for(let s=0;s>>0}const s=readBits(1),n=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 o;0===s?o=n:n>0&&(o=-n);return o>=jt&&o<=Wt?o:null}function decodeIAID(e,t,i){const a=e.getContexts("IAID");let r=1;for(let e=0;e=S&&L=k){K=K<<1&d;for(u=0;u=0&&J=0){Y=x[H][J];Y&&(K|=Y<=e?c<<=1:c=c<<1|w[o][g]}for(Q=0;Q=m||g<0||g>=p?c<<=1:c=c<<1|a[o][g]}const E=b.readBit(D,c);t[n]=E}}return w}function decodeTextRegion(e,t,i,a,r,s,n,o,g,c,C,h,l,Q,E,u,d,f,p){if(e&&t)throw new Jbig2Error("refinement with Huffman is not supported");const m=[];let y,w;for(y=0;y1&&(r=e?p.readBits(f):decodeInteger(D,"IAIT",b));const s=n*S+r,k=e?Q.symbolIDTable.decode(p):decodeIAID(D,b,g),R=t&&(e?p.readBit():decodeInteger(D,"IARI",b));let N=o[k],G=N[0].length,x=N.length;if(R){const e=decodeInteger(D,"IARDW",b),t=decodeInteger(D,"IARDH",b);G+=e;x+=t;N=decodeRefinement(G,x,E,N,(e>>1)+decodeInteger(D,"IARDX",b),(t>>1)+decodeInteger(D,"IARDY",b),!1,u,d)}let U=0;c?1&h?U=x-1:a+=x-1:h>1?a+=G-1:U=G-1;const M=s-(1&h?0:x-1),L=a-(2&h?G-1:0);let H,J,Y;if(c)for(H=0;H>5&7;const g=[31&n];let c=t+6;if(7===n){o=536870911&readUint32(e,c-1);c+=3;let t=o+7>>3;g[0]=e[c++];for(;--t>0;)g.push(e[c++])}else if(5===n||6===n)throw new Jbig2Error("invalid referred-to flags");i.retainBits=g;let C=4;i.number<=256?C=1:i.number<=65536&&(C=2);const h=[];let l,Q;for(l=0;l>>24&255;s[3]=t.height>>16&255;s[4]=t.height>>8&255;s[5]=255&t.height;for(l=c,Q=e.length;l>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;c+=2;if(!e.huffman){g=0===e.template?4:1;n=[];for(o=0;o>2&3;C.stripSize=1<>4&3;C.transposed=!!(64&h);C.combinationOperator=h>>7&3;C.defaultPixelValue=h>>9&1;C.dsOffset=h<<17>>27;C.refinementTemplate=h>>15&1;if(C.huffman){const e=readUint16(a,c);c+=2;C.huffmanFS=3&e;C.huffmanDS=e>>2&3;C.huffmanDT=e>>4&3;C.huffmanRefinementDW=e>>6&3;C.huffmanRefinementDH=e>>8&3;C.huffmanRefinementDX=e>>10&3;C.huffmanRefinementDY=e>>12&3;C.huffmanRefinementSizeSelector=!!(16384&e)}if(C.refinement&&!C.refinementTemplate){n=[];for(o=0;o<2;o++){n.push({x:readInt8(a,c),y:readInt8(a,c+1)});c+=2}C.refinementAt=n}C.numberOfSymbolInstances=readUint32(a,c);c+=4;s=[C,i.referredTo,a,c,r];break;case 16:const l={},Q=a[c++];l.mmr=!!(1&Q);l.template=Q>>1&3;l.patternWidth=a[c++];l.patternHeight=a[c++];l.maxPatternIndex=readUint32(a,c);c+=4;s=[l,i.number,a,c,r];break;case 22:case 23:const E={};E.info=readRegionSegmentInformation(a,c);c+=$t;const u=a[c++];E.mmr=!!(1&u);E.template=u>>1&3;E.enableSkip=!!(8&u);E.combinationOperator=u>>4&7;E.defaultPixelValue=u>>7&1;E.gridWidth=readUint32(a,c);c+=4;E.gridHeight=readUint32(a,c);c+=4;E.gridOffsetX=4294967295&readUint32(a,c);c+=4;E.gridOffsetY=4294967295&readUint32(a,c);c+=4;E.gridVectorX=readUint16(a,c);c+=2;E.gridVectorY=readUint16(a,c);c+=2;s=[E,i.referredTo,a,c,r];break;case 38:case 39:const d={};d.info=readRegionSegmentInformation(a,c);c+=$t;const f=a[c++];d.mmr=!!(1&f);d.template=f>>1&3;d.prediction=!!(8&f);if(!d.mmr){g=0===d.template?4:1;n=[];for(o=0;o>2&1;p.combinationOperator=m>>3&3;p.requiresBuffer=!!(32&m);p.combinationOperatorOverride=!!(64&m);s=[p];break;case 49:case 50:case 51:case 62:break;case 53:s=[i.number,a,c,r];break;default:throw new Jbig2Error(`segment type ${i.typeName}(${i.type}) is not implemented`)}const C="on"+i.typeName;C in t&&t[C].apply(t,s)}function processSegments(e,t){for(let i=0,a=e.length;i>3,i=new Uint8ClampedArray(t*e.height);e.defaultPixelValue&&i.fill(255);this.buffer=i}drawBitmap(e,t){const i=this.currentPageInfo,a=e.width,r=e.height,s=i.width+7>>3,n=i.combinationOperatorOverride?e.combinationOperator:i.combinationOperator,o=this.buffer,g=128>>(7&e.x);let c,C,h,l,Q=e.y*s+(e.x>>3);switch(n){case 0:for(c=0;c>=1;if(!h){h=128;l++}}Q+=s}break;case 2:for(c=0;c>=1;if(!h){h=128;l++}}Q+=s}break;default:throw new Jbig2Error(`operator ${n} is not supported`)}}onImmediateGenericRegion(e,t,i,a){const r=e.info,s=new DecodingContext(t,i,a),n=decodeBitmap(e.mmr,r.width,r.height,e.template,e.prediction,null,e.at,s);this.drawBitmap(r,n)}onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion(...arguments)}onSymbolDictionary(e,t,i,a,r,s){let n,o;if(e.huffman){n=function getSymbolDictionaryHuffmanTables(e,t,i){let a,r,s,n,o=0;switch(e.huffmanDHSelector){case 0:case 1:a=getStandardTable(e.huffmanDHSelector+4);break;case 3:a=getCustomHuffmanTable(o,t,i);o++;break;default:throw new Jbig2Error("invalid Huffman DH selector")}switch(e.huffmanDWSelector){case 0:case 1:r=getStandardTable(e.huffmanDWSelector+2);break;case 3:r=getCustomHuffmanTable(o,t,i);o++;break;default:throw new Jbig2Error("invalid Huffman DW selector")}if(e.bitmapSizeSelector){s=getCustomHuffmanTable(o,t,i);o++}else s=getStandardTable(1);n=e.aggregationInstancesSelector?getCustomHuffmanTable(o,t,i):getStandardTable(1);return{tableDeltaHeight:a,tableDeltaWidth:r,tableBitmapSize:s,tableAggregateInstances:n}}(e,i,this.customTables);o=new Reader(a,r,s)}let g=this.symbols;g||(this.symbols=g={});const c=[];for(const e of i){const t=g[e];t&&c.push(...t)}const C=new DecodingContext(a,r,s);g[t]=function decodeSymbolDictionary(e,t,i,a,r,s,n,o,g,c,C,h){if(e&&t)throw new Jbig2Error("symbol refinement with Huffman is not supported");const l=[];let Q=0,E=log2(i.length+a);const u=C.decoder,d=C.contextCache;let f,p;if(e){f=getStandardTable(1);p=[];E=Math.max(E,1)}for(;l.length1)m=decodeTextRegion(e,t,a,Q,0,r,1,i.concat(l),E,0,0,1,0,s,g,c,C,0,h);else{const e=decodeIAID(d,u,E),t=decodeInteger(d,"IARDX",u),r=decodeInteger(d,"IARDY",u);m=decodeRefinement(a,Q,g,e=32){let i,a,n;switch(t){case 32:if(0===e)throw new Jbig2Error("no previous value in symbol ID table");a=r.readBits(2)+3;i=s[e-1].prefixLength;break;case 33:a=r.readBits(3)+3;i=0;break;case 34:a=r.readBits(7)+11;i=0;break;default:throw new Jbig2Error("invalid code length in symbol ID table")}for(n=0;n=0;d--){N=e?decodeMMRBitmap(R,g,c,!0):decodeBitmap(!1,g,c,i,!1,null,S,E);k[d]=N}for(G=0;G=0;f--){U^=k[f][G][x];M|=U<>8;J=h+G*l-x*Q>>8;if(H>=0&&H+w<=a&&J>=0&&J+b<=r)for(d=0;d=r)){v=u[t];Y=L[d];for(f=0;f=0&&e>1&7),g=1+(a>>4&7),c=[];let C,h,l=r;do{C=n.readBits(o);h=n.readBits(g);c.push(new HuffmanLine([l,C,h,0]));l+=1<>t&1;if(t<=0)this.children[i]=new HuffmanTreeNode(e);else{let a=this.children[i];a||(this.children[i]=a=new HuffmanTreeNode(null));a.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,i=e.length;t0&&this.rootNode.buildTree(i,i.prefixLength-1)}}decode(e){return this.rootNode.decodeNode(e)}assignPrefixCodes(e){const t=e.length;let i=0;for(let a=0;a=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,i=0;for(t=e-1;t>=0;t--)i|=this.readBit()<=this.end?-1:this.data[this.position++]}}function getCustomHuffmanTable(e,t,i){let a=0;for(let r=0,s=t.length;r>i&1;i--}}if(a&&!o){const e=5;for(let t=0;t>2,g=new Uint32Array(e.buffer,t,o);if(FeatureTest.isLittleEndian){for(;n>>24|t<<8|4278190080;i[a+2]=t>>>16|r<<16|4278190080;i[a+3]=r>>>8|4278190080}for(let t=4*n,r=e.length;t>>8|255;i[a+2]=t<<16|r>>>16|255;i[a+3]=r<<8|255}for(let t=4*n,r=e.length;t>3,h=7&a,l=e.length;i=new Uint32Array(i.buffer);let Q=0;for(let a=0;a0&&!e[s-1];)s--;const n=[{children:[],index:0}];let o,g=n[0];for(i=0;i0;)g=n.pop();g.index++;n.push(g);for(;n.length<=i;){n.push(o={children:[],index:0});g.children[g.index]=o.children;g=o}r++}if(i+10){E--;return Q>>E&1}Q=e[t++];if(255===Q){const a=e[t++];if(a){if(220===a&&c){const a=readUint16(e,t+=2);t+=2;if(a>0&&a!==i.scanLines)throw new DNLMarkerError("Found DNL marker (0xFFDC) while parsing scan data",a)}else if(217===a){if(c){const e=p*(8===i.precision?8:0);if(e>0&&Math.round(i.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 ${(Q<<8|a).toString(16)}`)}}E=7;return Q>>>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){u--;return}let i=s;const a=n;for(;i<=a;){const a=decodeHuffman(e.huffmanTableAC),r=15&a,s=a>>4;if(0===r){if(s<15){u=receive(s)+(1<>4;if(0===r)if(c<15){u=receive(c)+(1<>4;if(0===a){if(s<15)break;r+=16;continue}r+=s;const n=ei[r];e.blockData[t+n]=receiveAndExtend(a);r++}};let R,N=0;const G=1===m?a[0].blocksPerLine*a[0].blocksPerColumn:C*i.mcusPerColumn;let x,U;for(;N<=G;){const i=r?Math.min(G-N,r):G;if(i>0){for(w=0;w0?"unexpected":"excessive"} MCU data, current marker is: ${R.invalid}`);t=R.offset}if(!(R.marker>=65488&&R.marker<=65495))break;t+=2}return t-l}function quantizeAndInverse(e,t,i){const a=e.quantizationTable,r=e.blockData;let s,n,o,g,c,C,h,l,Q,E,u,d,f,p,m,y,w;if(!a)throw new JpegError("missing required Quantization Table.");for(let e=0;e<64;e+=8){Q=r[t+e];E=r[t+e+1];u=r[t+e+2];d=r[t+e+3];f=r[t+e+4];p=r[t+e+5];m=r[t+e+6];y=r[t+e+7];Q*=a[e];if(0!=(E|u|d|f|p|m|y)){E*=a[e+1];u*=a[e+2];d*=a[e+3];f*=a[e+4];p*=a[e+5];m*=a[e+6];y*=a[e+7];s=oi*Q+128>>8;n=oi*f+128>>8;o=u;g=m;c=gi*(E-y)+128>>8;l=gi*(E+y)+128>>8;C=d<<4;h=p<<4;s=s+n+1>>1;n=s-n;w=o*ni+g*si+128>>8;o=o*si-g*ni+128>>8;g=w;c=c+h+1>>1;h=c-h;l=l+C+1>>1;C=l-C;s=s+g+1>>1;g=s-g;n=n+o+1>>1;o=n-o;w=c*ri+l*ai+2048>>12;c=c*ai-l*ri+2048>>12;l=w;w=C*ii+h*ti+2048>>12;C=C*ti-h*ii+2048>>12;h=w;i[e]=s+l;i[e+7]=s-l;i[e+1]=n+h;i[e+6]=n-h;i[e+2]=o+C;i[e+5]=o-C;i[e+3]=g+c;i[e+4]=g-c}else{w=oi*Q+512>>10;i[e]=w;i[e+1]=w;i[e+2]=w;i[e+3]=w;i[e+4]=w;i[e+5]=w;i[e+6]=w;i[e+7]=w}}for(let e=0;e<8;++e){Q=i[e];E=i[e+8];u=i[e+16];d=i[e+24];f=i[e+32];p=i[e+40];m=i[e+48];y=i[e+56];if(0!=(E|u|d|f|p|m|y)){s=oi*Q+2048>>12;n=oi*f+2048>>12;o=u;g=m;c=gi*(E-y)+2048>>12;l=gi*(E+y)+2048>>12;C=d;h=p;s=4112+(s+n+1>>1);n=s-n;w=o*ni+g*si+2048>>12;o=o*si-g*ni+2048>>12;g=w;c=c+h+1>>1;h=c-h;l=l+C+1>>1;C=l-C;s=s+g+1>>1;g=s-g;n=n+o+1>>1;o=n-o;w=c*ri+l*ai+2048>>12;c=c*ai-l*ri+2048>>12;l=w;w=C*ii+h*ti+2048>>12;C=C*ti-h*ii+2048>>12;h=w;Q=s+l;y=s-l;E=n+h;m=n-h;u=o+C;p=o-C;d=g+c;f=g-c;Q<16?Q=0:Q>=4080?Q=255:Q>>=4;E<16?E=0:E>=4080?E=255:E>>=4;u<16?u=0:u>=4080?u=255:u>>=4;d<16?d=0:d>=4080?d=255:d>>=4;f<16?f=0:f>=4080?f=255:f>>=4;p<16?p=0:p>=4080?p=255:p>>=4;m<16?m=0:m>=4080?m=255:m>>=4;y<16?y=0:y>=4080?y=255:y>>=4;r[t+e]=Q;r[t+e+8]=E;r[t+e+16]=u;r[t+e+24]=d;r[t+e+32]=f;r[t+e+40]=p;r[t+e+48]=m;r[t+e+56]=y}else{w=oi*Q+8192>>14;w=w<-2040?0:w>=2024?255:w+2056>>4;r[t+e]=w;r[t+e+8]=w;r[t+e+16]=w;r[t+e+24]=w;r[t+e+32]=w;r[t+e+40]=w;r[t+e+48]=w;r[t+e+56]=w}}}function buildComponentData(e,t){const i=t.blocksPerLine,a=t.blocksPerColumn,r=new Int16Array(64);for(let e=0;e=a)return null;const s=readUint16(e,t);if(s>=65472&&s<=65534)return{invalid:null,marker:s,offset:t};let n=readUint16(e,r);for(;!(n>=65472&&n<=65534);){if(++r>=a)return null;n=readUint16(e,r)}return{invalid:s.toString(16),marker:n,offset:r}}class JpegImage{constructor({decodeTransform:e=null,colorTransform:t=-1}={}){this._decodeTransform=e;this._colorTransform=t}parse(e,{dnlScanLines:t=null}={}){function readDataBlock(){const t=readUint16(e,r);r+=2;let i=r+t-2;const a=findNextFileMarker(e,i,r);if(a?.invalid){warn("readDataBlock - incorrect length, current marker is: "+a.invalid);i=a.offset}const s=e.subarray(r,i);r+=s.length;return s}function prepareComponents(e){const t=Math.ceil(e.samplesPerLine/8/e.maxH),i=Math.ceil(e.scanLines/8/e.maxV);for(const a of e.components){const r=Math.ceil(Math.ceil(e.samplesPerLine/8)*a.h/e.maxH),s=Math.ceil(Math.ceil(e.scanLines/8)*a.v/e.maxV),n=t*a.h,o=64*(i*a.v)*(n+1);a.blockData=new Int16Array(o);a.blocksPerLine=r;a.blocksPerColumn=s}e.mcusPerLine=t;e.mcusPerColumn=i}let i,a,r=0,s=null,n=null,o=0;const g=[],c=[],C=[];let h=readUint16(e,r);r+=2;if(65496!==h)throw new JpegError("SOI not found");h=readUint16(e,r);r+=2;A:for(;65497!==h;){let l,Q,E;switch(h){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 u=readDataBlock();65504===h&&74===u[0]&&70===u[1]&&73===u[2]&&70===u[3]&&0===u[4]&&(s={version:{major:u[5],minor:u[6]},densityUnits:u[7],xDensity:u[8]<<8|u[9],yDensity:u[10]<<8|u[11],thumbWidth:u[12],thumbHeight:u[13],thumbData:u.subarray(14,14+3*u[12]*u[13])});65518===h&&65===u[0]&&100===u[1]&&111===u[2]&&98===u[3]&&101===u[4]&&(n={version:u[5]<<8|u[6],flags0:u[7]<<8|u[8],flags1:u[9]<<8|u[10],transformCode:u[11]});break;case 65499:const d=readUint16(e,r);r+=2;const f=d+r-2;let p;for(;r>4==0)for(Q=0;Q<64;Q++){p=ei[Q];i[p]=e[r++]}else{if(t>>4!=1)throw new JpegError("DQT - invalid table spec");for(Q=0;Q<64;Q++){p=ei[Q];i[p]=readUint16(e,r);r+=2}}g[15&t]=i}break;case 65472:case 65473:case 65474:if(i)throw new JpegError("Only single frame JPEGs supported");r+=2;i={};i.extended=65473===h;i.progressive=65474===h;i.precision=e[r++];const m=readUint16(e,r);r+=2;i.scanLines=t||m;i.samplesPerLine=readUint16(e,r);r+=2;i.components=[];i.componentIds={};const y=e[r++];let w=0,b=0;for(l=0;l>4,s=15&e[r+1];w>4==0?C:c)[15&t]=buildHuffmanTable(i,s)}break;case 65501:r+=2;a=readUint16(e,r);r+=2;break;case 65498:const S=1==++o&&!t;r+=2;const k=e[r++],R=[];for(l=0;l>4];s.huffmanTableAC=c[15&n];R.push(s)}const N=e[r++],G=e[r++],x=e[r++];try{const t=decodeScan(e,r,i,R,a,N,G,x>>4,15&x,S);r+=t}catch(t){if(t instanceof DNLMarkerError){warn(`${t.message} -- attempting to re-parse the JPEG image.`);return this.parse(e,{dnlScanLines:t.scanLines})}if(t instanceof EOIMarkerError){warn(`${t.message} -- ignoring the rest of the image data.`);break A}throw t}break;case 65500:r+=4;break;case 65535:255!==e[r]&&r--;break;default:const U=findNextFileMarker(e,r-2,r-3);if(U?.invalid){warn("JpegImage.parse - unexpected data, current marker is: "+U.invalid);r=U.offset;break}if(!U||r>=e.length-1){warn("JpegImage.parse - reached the end of the image data without finding an EOI marker (0xFFD9).");break A}throw new JpegError("JpegImage.parse - unknown marker: "+h.toString(16))}h=readUint16(e,r);r+=2}if(!i)throw new JpegError("JpegImage.parse - no frame data found.");this.width=i.samplesPerLine;this.height=i.scanLines;this.jfif=s;this.adobe=n;this.components=[];for(const e of i.components){const t=g[e.quantizationId];t&&(e.quantizationTable=t);this.components.push({index:e.index,output:buildComponentData(0,e),scaleX:e.h/i.maxH,scaleY:e.v/i.maxV,blocksPerLine:e.blocksPerLine,blocksPerColumn:e.blocksPerColumn})}this.numComponents=this.components.length}_getLinearizedBlockData(e,t,i=!1){const a=this.width/e,r=this.height/t;let s,n,o,g,c,C,h,l,Q,E,u,d=0;const f=this.components.length,p=e*t*f,m=new Uint8ClampedArray(p),y=new Uint32Array(e),w=4294967288;let b;for(h=0;h>8)+D[Q+1];return m}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,i,a;for(let r=0,s=e.length;r4)throw new JpegError("Unsupported color mode");const s=this._getLinearizedBlockData(e,t,r);if(1===this.numComponents&&(i||a)){const e=s.length*(i?4:3),t=new Uint8ClampedArray(e);let a=0;if(i)!function grayToRGBA(e,t){if(FeatureTest.isLittleEndian)for(let i=0,a=e.length;i0&&(e=e.subarray(t));break}const t={decodeTransform:void 0,colorTransform:void 0},i=this.dict.getArray("D","Decode");if((this.forceRGBA||this.forceRGB)&&Array.isArray(i)){const e=this.dict.get("BPC","BitsPerComponent")||8,a=i.length,r=new Int32Array(a);let s=!1;const n=(1<{t=e;i=a}));a.decode=function(e,{numComponents:t=4,isIndexedColormap:i=!1,smaskInData:r=!1}){const s=e.length,n=a._malloc(s);a.HEAPU8.set(e,n);const o=a._jp2_decode(n,s,t>0?t:0,!!i,!!r);a._free(n);if(o){const{errorMessages:e}=a;if(e){delete a.errorMessages;return e}return"Unknown error"}const{imageData:g}=a;a.imageData=null;return g};var r,s=Object.assign({},a),n="./this.program",o="";"undefined"!=typeof document&&document.currentScript&&(o=document.currentScript.src);Ii&&(o=Ii);o=o.startsWith("blob:")?"":o.substr(0,o.replace(/[?#].*/,"").lastIndexOf("/")+1);var g,c,C,h,l,Q=a.print||console.log.bind(console),E=a.printErr||console.error.bind(console);Object.assign(a,s);s=null;a.arguments&&a.arguments;a.thisProgram&&(n=a.thisProgram);a.quit&&a.quit;a.wasmBinary&&(g=a.wasmBinary);function tryParseAsDataURI(e){if(isDataURI(e))return function intArrayFromBase64(e){for(var t=atob(e),i=new Uint8Array(t.length),a=0;ae.startsWith(b);function instantiateSync(e,t){var i,a=function getBinarySync(e){if(e==u&&g)return new Uint8Array(g);var t=tryParseAsDataURI(e);if(t)return t;if(r)return r(e);throw'sync fetching of the wasm failed: you can preload it to Module["wasmBinary"] manually, or emcc.py will do that for you when generating HTML (but not JS)'}(e);i=new WebAssembly.Module(a);return[new WebAssembly.Instance(i,t),i]}var callRuntimeCallbacks=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var D,growMemory=e=>{var t=(e-c.buffer.byteLength+65535)/65536;try{c.grow(t);updateMemoryViews();return 1}catch(e){}},S={},getEnvStrings=()=>{if(!getEnvStrings.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:n||"./this.program"};for(var t in S)void 0===S[t]?delete e[t]:e[t]=S[t];var i=[];for(var t in e)i.push(`${t}=${e[t]}`);getEnvStrings.strings=i}return getEnvStrings.strings},k=[null,[],[]],R="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0,UTF8ArrayToString=(e,t,i)=>{for(var a=t+i,r=t;e[r]&&!(r>=a);)++r;if(r-t>16&&e.buffer&&R)return R.decode(e.subarray(t,r));for(var s="";t>10,56320|1023&c)}}else s+=String.fromCharCode((31&n)<<6|o)}else s+=String.fromCharCode(n)}return s},printChar=(e,t)=>{var i=k[e];if(0===t||10===t){(1===e?Q:E)(UTF8ArrayToString(i,0));i.length=0}else i.push(t)},UTF8ToString=(e,t)=>e?UTF8ArrayToString(h,e,t):"",N={c:(e,t,i)=>h.copyWithin(e,t,t+i),g:function _copy_pixels_1(e,t){e>>=2;const i=a.imageData=new Uint8ClampedArray(t),r=a.HEAP32.subarray(e,e+t);i.set(r)},f:function _copy_pixels_3(e,t,i,r){e>>=2;t>>=2;i>>=2;const s=a.imageData=new Uint8ClampedArray(3*r),n=a.HEAP32.subarray(e,e+r),o=a.HEAP32.subarray(t,t+r),g=a.HEAP32.subarray(i,i+r);for(let e=0;e>=2;t>>=2;i>>=2;r>>=2;const n=a.imageData=new Uint8ClampedArray(4*s),o=a.HEAP32.subarray(e,e+s),g=a.HEAP32.subarray(t,t+s),c=a.HEAP32.subarray(i,i+s),C=a.HEAP32.subarray(r,r+s);for(let e=0;e{var t=h.length,i=2147483648;if((e>>>=0)>i)return!1;for(var a,r,s=1;s<=4;s*=2){var n=t*(1+.2/s);n=Math.min(n,e+100663296);var o=Math.min(i,(a=Math.max(e,n))+((r=65536)-a%r)%r);if(growMemory(o))return!0}return!1},l:(e,t)=>{var i=0;getEnvStrings().forEach(((a,r)=>{var s=t+i;l[e+4*r>>2]=s;((e,t)=>{for(var i=0;i{var i=getEnvStrings();l[e>>2]=i.length;var a=0;i.forEach((e=>a+=e.length+1));l[t>>2]=a;return 0},n:e=>52,j:function _fd_seek(e,t,i,a,r){return 70},b:(e,t,i,a)=>{for(var r=0,s=0;s>2],o=l[t+4>>2];t+=8;for(var g=0;g>2]=r;return 0},o:function _gray_to_rgba(e,t){e>>=2;const i=a.imageData=new Uint8ClampedArray(4*t),r=a.HEAP32.subarray(e,e+t);for(let e=0;e>=2;t>>=2;const r=a.imageData=new Uint8ClampedArray(4*i),s=a.HEAP32.subarray(e,e+i),n=a.HEAP32.subarray(t,t+i);for(let e=0;e>=2;t>>=2;i>>=2;const s=a.imageData=new Uint8ClampedArray(4*r),n=a.HEAP32.subarray(e,e+r),o=a.HEAP32.subarray(t,t+r),g=a.HEAP32.subarray(i,i+r);for(let e=0;e0)){!function preRun(){if(a.preRun){"function"==typeof a.preRun&&(a.preRun=[a.preRun]);for(;a.preRun.length;)e=a.preRun.shift(),d.unshift(e)}var e;callRuntimeCallbacks(d)}();if(!(m>0))if(a.setStatus){a.setStatus("Running...");setTimeout((function(){setTimeout((function(){a.setStatus("")}),1);doRun()}),1)}else doRun()}function doRun(){if(!D){D=!0;a.calledRun=!0;!function initRuntime(){callRuntimeCallbacks(f)}();t(a);a.onRuntimeInitialized&&a.onRuntimeInitialized();!function postRun(){if(a.postRun){"function"==typeof a.postRun&&(a.postRun=[a.postRun]);for(;a.postRun.length;)e=a.postRun.shift(),p.unshift(e)}var e;callRuntimeCallbacks(p)}()}}}if(a.preInit){"function"==typeof a.preInit&&(a.preInit=[a.preInit]);for(;a.preInit.length>0;)a.preInit.pop()()}run();return a});const Ci=ci;class JpxError extends ot{constructor(e){super(e,"JpxError")}}class JpxImage{static#y=null;static decode(e,t){t||={};this.#y||=Ci({warn});const i=this.#y.decode(e,t);if("string"==typeof i)throw new JpxError(i);return i}static cleanup(){this.#y=null}static parseImageProperties(e){let t=e.getByte();for(;t>=0;){const i=t;t=e.getByte();if(65361===(i<<8|t)){e.skip(4);const t=e.getInt32()>>>0,i=e.getInt32()>>>0,a=e.getInt32()>>>0,r=e.getInt32()>>>0;e.skip(16);return{width:t-a,height:i-r,bitsPerComponent:8,componentsCount:e.getUint16()}}}throw new JpxError("No size marker found in JPX stream")}}class JpxStream extends DecodeStream{constructor(e,t,i){super(t);this.stream=e;this.dict=e.dict;this.maybeLength=t;this.params=i}get bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))}ensureBuffer(e){}readBlock(e){this.decodeImage(null,e)}decodeImage(e,t){if(this.eof)return this.buffer;e||=this.bytes;this.buffer=JpxImage.decode(e,t);this.bufferLength=this.buffer.length;this.eof=!0;return this.buffer}get canAsyncDecodeImageFromBuffer(){return this.stream.isAsync}}class LZWStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;this.cachedData=0;this.bitsCached=0;const a=4096,r={earlyChange:i,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(a),dictionaryLengths:new Uint16Array(a),dictionaryPrevCodes:new Uint16Array(a),currentSequence:new Uint8Array(a),currentSequenceLength:0};for(let e=0;e<256;++e){r.dictionaryValues[e]=e;r.dictionaryLengths[e]=1}this.lzwState=r}readBits(e){let t=this.bitsCached,i=this.cachedData;for(;t>>t&(1<0;if(e<256){l[0]=e;Q=1}else{if(!(e>=258)){if(256===e){C=9;n=258;Q=0;continue}this.eof=!0;delete this.lzwState;break}if(e=0;t--){l[t]=o[i];i=c[i]}}else l[Q++]=l[0]}if(r){c[n]=h;g[n]=g[h]+1;o[n]=l[0];n++;C=n+s&n+s-1?C:0|Math.min(Math.log(n+s)/.6931471805599453+1,12)}h=e;E+=Q;if(a15))throw new FormatError(`Unsupported predictor: ${a}`);this.readBlock=2===a?this.readBlockTiff:this.readBlockPng;this.str=e;this.dict=e.dict;const r=this.colors=i.get("Colors")||1,s=this.bits=i.get("BPC","BitsPerComponent")||8,n=this.columns=i.get("Columns")||1;this.pixBytes=r*s+7>>3;this.rowBytes=n*r*s+7>>3;return this}readBlockTiff(){const e=this.rowBytes,t=this.bufferLength,i=this.ensureBuffer(t+e),a=this.bits,r=this.colors,s=this.str.getBytes(e);this.eof=!s.length;if(this.eof)return;let n,o=0,g=0,c=0,C=0,h=t;if(1===a&&1===r)for(n=0;n>1;e^=e>>2;e^=e>>4;o=(1&e)<<7;i[h++]=e}else if(8===a){for(n=0;n>8&255;i[h++]=255&e}}else{const e=new Uint8Array(r+1),h=(1<>c-a)&h;c-=a;g=g<=8){i[Q++]=g>>C-8&255;C-=8}}C>0&&(i[Q++]=(g<<8-C)+(o&(1<<8-C)-1))}this.bufferLength+=e}readBlockPng(){const e=this.rowBytes,t=this.pixBytes,i=this.str.getByte(),a=this.str.getBytes(e);this.eof=!a.length;if(this.eof)return;const r=this.bufferLength,s=this.ensureBuffer(r+e);let n=s.subarray(r-e,r);0===n.length&&(n=new Uint8Array(e));let o,g,c,C=r;switch(i){case 0:for(o=0;o>1)+a[o];for(;o>1)+a[o]&255;C++}break;case 4:for(o=0;o0){const e=this.str.getBytes(a);t.set(e,i);i+=a}}else{a=257-a;const r=e[1];t=this.ensureBuffer(i+a+1);for(let e=0;e>")&&this.buf1!==yt;){if(!(this.buf1 instanceof Name)){info("Malformed dictionary: key must be a name object");this.shift();continue}const t=this.buf1.name;this.shift();if(this.buf1===yt)break;a.set(t,this.getObj(e))}if(this.buf1===yt){if(this.recoveryMode)return a;throw new ParserEOFException("End of file inside dictionary.")}if(isCmd(this.buf2,"stream"))return this.allowStreams?this.makeStream(a,e):a;this.shift();return a;default:return t}if(Number.isInteger(t)){if(Number.isInteger(this.buf1)&&isCmd(this.buf2,"R")){const e=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{knownCommands:t}=this.lexer,i=e.pos;let a,r,s=0;for(;-1!==(a=e.getByte());)if(0===s)s=69===a?1:0;else if(1===s)s=73===a?2:0;else if(32===a||10===a||13===a){r=e.pos;const i=e.peekBytes(15),n=i.length;if(0===n)break;for(let e=0;e127))){s=0;break}}if(2!==s)continue;if(!t){warn("findDefaultInlineStreamEnd - `lexer.knownCommands` is undefined.");continue}const o=new Lexer(new Stream(i.slice()),t);o._hexStringWarn=()=>{};let g=0;for(;;){const e=o.getObj();if(e===yt){s=0;break}if(e instanceof Cmd){const i=t[e.cmd];if(!i){s=0;break}if(i.variableArgs?g<=i.numArgs:g===i.numArgs)break;g=0}else g++}if(2===s)break}else s=0;if(-1===a){warn("findDefaultInlineStreamEnd: Reached the end of the stream without finding a valid EI marker");if(r){warn('... trying to recover by using the last "EI" occurrence.');e.skip(-(e.pos-r))}}let n=4;e.skip(-n);a=e.peekByte();e.skip(n);isWhiteSpace(a)||n--;return e.pos-n-i}findDCTDecodeInlineStreamEnd(e){const t=e.pos;let i,a,r=!1;for(;-1!==(i=e.getByte());)if(255===i){switch(e.getByte()){case 0:break;case 255:e.skip(-1);break;case 217:r=!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:a=e.getUint16();a>2?e.skip(a-2):e.skip(-2)}if(r)break}const s=e.pos-t;if(-1===i){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 i;for(;-1!==(i=e.getByte());)if(126===i){const t=e.pos;i=e.peekByte();for(;isWhiteSpace(i);){e.skip();i=e.peekByte()}if(62===i){e.skip();break}if(e.pos>t){const t=e.peekBytes(2);if(69===t[0]&&73===t[1])break}}const a=e.pos-t;if(-1===i){warn("Inline ASCII85Decode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-a);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return a}findASCIIHexDecodeInlineStreamEnd(e){const t=e.pos;let i;for(;-1!==(i=e.getByte())&&62!==i;);const a=e.pos-t;if(-1===i){warn("Inline ASCIIHexDecode image stream: EOD marker not found, searching for /EI/ instead.");e.skip(-a);return this.findDefaultInlineStreamEnd(e)}this.inlineStreamSkipEI(e);return a}inlineStreamSkipEI(e){let t,i=0;for(;-1!==(t=e.getByte());)if(0===i)i=69===t?1:0;else if(1===i)i=73===t?2:0;else if(2===i)break}makeInlineImage(e){const t=this.lexer,i=t.stream,a=Object.create(null);let r;for(;!isCmd(this.buf1,"ID")&&this.buf1!==yt;){if(!(this.buf1 instanceof Name))throw new FormatError("Dictionary key must be a name object");const t=this.buf1.name;this.shift();if(this.buf1===yt)break;a[t]=this.getObj(e)}-1!==t.beginInlineImagePos&&(r=i.pos-t.beginInlineImagePos);const s=this.xref.fetchIfRef(a.F||a.Filter);let n;if(s instanceof Name)n=s.name;else if(Array.isArray(s)){const e=this.xref.fetchIfRef(s[0]);e instanceof Name&&(n=e.name)}const o=i.pos;let g,c;switch(n){case"DCT":case"DCTDecode":g=this.findDCTDecodeInlineStreamEnd(i);break;case"A85":case"ASCII85Decode":g=this.findASCII85DecodeInlineStreamEnd(i);break;case"AHx":case"ASCIIHexDecode":g=this.findASCIIHexDecodeInlineStreamEnd(i);break;default:g=this.findDefaultInlineStreamEnd(i)}if(g<1e3&&r>0){const e=i.pos;i.pos=t.beginInlineImagePos;c=function getInlineImageCacheKey(e){const t=[],i=e.length;let a=0;for(;a=a){let a=!1;for(const e of r){const t=e.length;let r=0;for(;r=s){a=!0;break}if(r>=t){if(isWhiteSpace(n[g+o+r])){info(`Found "${bytesToString([...i,...e])}" when searching for endstream command.`);a=!0}break}}if(a){t.pos+=g;return t.pos-e}}g++}t.pos+=o}return-1}makeStream(e,t){const i=this.lexer;let a=i.stream;i.skipToNextLine();const r=a.pos-1;let s=e.get("Length");if(!Number.isInteger(s)){info(`Bad length "${s&&s.toString()}" in stream.`);s=0}a.pos=r+s;i.nextChar();if(this.tryShift()&&isCmd(this.buf2,"endstream"))this.shift();else{s=this.#w(r);if(s<0)throw new FormatError("Missing endstream command.");i.nextChar();this.shift();this.shift()}this.shift();a=a.makeSubStream(r,s,e);t&&(a=t.createStream(a,s));a=this.filter(a,e,s);a.dict=e;return a}filter(e,t,i){let a=t.get("F","Filter"),r=t.get("DP","DecodeParms");if(a instanceof Name){Array.isArray(r)&&warn("/DecodeParms should not be an Array, when /Filter is a Name.");return this.makeFilter(e,a.name,i,r)}let s=i;if(Array.isArray(a)){const t=a,i=r;for(let n=0,o=t.length;n=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,i=0,a=1;if(45===e){a=-1;e=this.nextChar();45===e&&(e=this.nextChar())}else 43===e&&(e=this.nextChar());if(10===e||13===e)do{e=this.nextChar()}while(10===e||13===e);if(46===e){i=10;e=this.nextChar()}if(e<48||e>57){const t=`Invalid number: ${String.fromCharCode(e)} (charCode ${e})`;if(isWhiteSpace(e)||-1===e){info(`Lexer.getNumber - "${t}".`);return 0}throw new FormatError(t)}let r=e-48,s=0,n=1;for(;(e=this.nextChar())>=0;)if(e>=48&&e<=57){const a=e-48;if(t)s=10*s+a;else{0!==i&&(i*=10);r=10*r+a}}else if(46===e){if(0!==i)break;i=1}else if(45===e)warn("Badly formatted number: minus sign in the middle");else{if(69!==e&&101!==e)break;e=this.peekChar();if(43===e||45===e){n=45===e?-1:1;this.nextChar()}else if(e<48||e>57)break;t=!0}0!==i&&(r/=i);t&&(r*=10**(n*s));return a*r}getString(){let e=1,t=!1;const i=this.strBuf;i.length=0;let a=this.nextChar();for(;;){let r=!1;switch(0|a){case-1:warn("Unterminated string");t=!0;break;case 40:++e;i.push("(");break;case 41:if(0==--e){this.nextChar();t=!0}else i.push(")");break;case 92:a=this.nextChar();switch(a){case-1:warn("Unterminated string");t=!0;break;case 110:i.push("\n");break;case 114:i.push("\r");break;case 116:i.push("\t");break;case 98:i.push("\b");break;case 102:i.push("\f");break;case 92:case 40:case 41:i.push(String.fromCharCode(a));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:let e=15&a;a=this.nextChar();r=!0;if(a>=48&&a<=55){e=(e<<3)+(15&a);a=this.nextChar();if(a>=48&&a<=55){r=!1;e=(e<<3)+(15&a)}}i.push(String.fromCharCode(e));break;case 13:10===this.peekChar()&&this.nextChar();break;case 10:break;default:i.push(String.fromCharCode(a))}break;default:i.push(String.fromCharCode(a))}if(t)break;r||(a=this.nextChar())}return i.join("")}getName(){let e,t;const i=this.strBuf;i.length=0;for(;(e=this.nextChar())>=0&&!hi[e];)if(35===e){e=this.nextChar();if(hi[e]){warn("Lexer_getName: NUMBER SIGN (#) should be followed by a hexadecimal number.");i.push("#");break}const a=toHexDigit(e);if(-1!==a){t=e;e=this.nextChar();const r=toHexDigit(e);if(-1===r){warn(`Lexer_getName: Illegal digit (${String.fromCharCode(e)}) in hexadecimal number.`);i.push("#",String.fromCharCode(t));if(hi[e])break;i.push(String.fromCharCode(e));continue}i.push(String.fromCharCode(a<<4|r))}else i.push("#",String.fromCharCode(e))}else i.push(String.fromCharCode(e));i.length>127&&warn(`Name token is longer than allowed by the spec: ${i.length}`);return Name.get(i.join(""))}_hexStringWarn(e){5!=this._hexStringNumWarn++?this._hexStringNumWarn>5||warn(`getHexString - ignoring invalid character: ${e}`):warn("getHexString - ignoring additional invalid characters.")}getHexString(){const e=this.strBuf;e.length=0;let t,i,a=this.currentChar,r=!0;this._hexStringNumWarn=0;for(;;){if(a<0){warn("Unterminated hex string");break}if(62===a){this.nextChar();break}if(1!==hi[a]){if(r){t=toHexDigit(a);if(-1===t){this._hexStringWarn(a);a=this.nextChar();continue}}else{i=toHexDigit(a);if(-1===i){this._hexStringWarn(a);a=this.nextChar();continue}e.push(String.fromCharCode(t<<4|i))}r=!r;a=this.nextChar()}else a=this.nextChar()}return e.join("")}getObj(){let e=!1,t=this.currentChar;for(;;){if(t<0)return yt;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(1!==hi[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 Cmd.get("[");case 93:this.nextChar();return Cmd.get("]");case 60:t=this.nextChar();if(60===t){this.nextChar();return Cmd.get("<<")}return this.getHexString();case 62:t=this.nextChar();if(62===t){this.nextChar();return Cmd.get(">>")}return Cmd.get(">");case 123:this.nextChar();return Cmd.get("{");case 125:this.nextChar();return Cmd.get("}");case 41:this.nextChar();throw new FormatError(`Illegal character: ${t}`)}let i=String.fromCharCode(t);if(t<32||t>127){const e=this.peekChar();if(e>=32&&e<=127){this.nextChar();return Cmd.get(i)}}const a=this.knownCommands;let r=void 0!==a?.[i];for(;(t=this.nextChar())>=0&&!hi[t];){const e=i+String.fromCharCode(t);if(r&&void 0===a[e])break;if(128===i.length)throw new FormatError(`Command token too long: ${i.length}`);i=e;r=void 0!==a?.[i]}if("true"===i)return!0;if("false"===i)return!1;if("null"===i)return null;"BI"===i&&(this.beginInlineImagePos=this.stream.pos);return Cmd.get(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()}}}class Linearization{static create(e){function getInt(e,t,i=!1){const a=e.get(t);if(Number.isInteger(a)&&(i?a>=0:a>0))return a;throw new Error(`The "${t}" parameter in the linearization dictionary is invalid.`)}const t=new Parser({lexer:new Lexer(e),xref:null}),i=t.getObj(),a=t.getObj(),r=t.getObj(),s=t.getObj();let n,o;if(!(Number.isInteger(i)&&Number.isInteger(a)&&isCmd(r,"obj")&&s instanceof Dict&&"number"==typeof(n=s.get("Linearized"))&&n>0))return null;if((o=getInt(s,"L"))!==e.length)throw new Error('The "L" parameter in the linearization dictionary does not equal the stream length.');return{length:o,hints:function getHints(e){const t=e.get("H");let i;if(Array.isArray(t)&&(2===(i=t.length)||4===i)){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}}}const li=["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"],Bi=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,i){this.codespaceRanges[e-1].push(t,i);this.numCodespaceRanges++}mapCidRange(e,t,i){if(t-e>Bi)throw new Error("mapCidRange - ignoring data above MAX_MAP_RANGE.");for(;e<=t;)this._map[e++]=i++}mapBfRange(e,t,i){if(t-e>Bi)throw new Error("mapBfRange - ignoring data above MAX_MAP_RANGE.");const a=i.length-1;for(;e<=t;){this._map[e++]=i;const t=i.charCodeAt(a)+1;t>255?i=i.substring(0,a-1)+String.fromCharCode(i.charCodeAt(a-1)+1)+"\0":i=i.substring(0,a)+String.fromCharCode(t)}}mapBfRangeToArray(e,t,i){if(t-e>Bi)throw new Error("mapBfRangeToArray - ignoring data above MAX_MAP_RANGE.");const a=i.length;let r=0;for(;e<=t&&r>>0;const n=r[s];for(let e=0,t=n.length;e=t&&a<=r){i.charcode=a;i.length=s+1;return}}}i.charcode=0;i.length=1}getCharCodeLength(e){const t=this.codespaceRanges;for(let i=0,a=t.length;i=r&&e<=s)return i+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}}class IdentityCMap extends CMap{constructor(e,t){super();this.vertical=e;this.addCodespaceRange(t,0,65535)}mapCidRange(e,t,i){unreachable("should not call mapCidRange")}mapBfRange(e,t,i){unreachable("should not call mapBfRange")}mapBfRangeToArray(e,t,i){unreachable("should not call mapBfRangeToArray")}mapOne(e,t){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(){unreachable("should not access .isIdentityCMap")}}function strToInt(e){let t=0;for(let i=0;i>>0}function expectString(e){if("string"!=typeof e)throw new FormatError("Malformed CMap: expected string.")}function expectInt(e){if(!Number.isInteger(e))throw new FormatError("Malformed CMap: expected int.")}function parseBfChar(e,t){for(;;){let i=t.getObj();if(i===yt)break;if(isCmd(i,"endbfchar"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const r=i;e.mapOne(a,r)}}function parseBfRange(e,t){for(;;){let i=t.getObj();if(i===yt)break;if(isCmd(i,"endbfrange"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const r=strToInt(i);i=t.getObj();if(Number.isInteger(i)||"string"==typeof i){const t=Number.isInteger(i)?String.fromCharCode(i):i;e.mapBfRange(a,r,t)}else{if(!isCmd(i,"["))break;{i=t.getObj();const s=[];for(;!isCmd(i,"]")&&i!==yt;){s.push(i);i=t.getObj()}e.mapBfRangeToArray(a,r,s)}}}throw new FormatError("Invalid bf range.")}function parseCidChar(e,t){for(;;){let i=t.getObj();if(i===yt)break;if(isCmd(i,"endcidchar"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectInt(i);const r=i;e.mapOne(a,r)}}function parseCidRange(e,t){for(;;){let i=t.getObj();if(i===yt)break;if(isCmd(i,"endcidrange"))return;expectString(i);const a=strToInt(i);i=t.getObj();expectString(i);const r=strToInt(i);i=t.getObj();expectInt(i);const s=i;e.mapCidRange(a,r,s)}}function parseCodespaceRange(e,t){for(;;){let i=t.getObj();if(i===yt)break;if(isCmd(i,"endcodespacerange"))return;if("string"!=typeof i)break;const a=strToInt(i);i=t.getObj();if("string"!=typeof i)break;const r=strToInt(i);e.addCodespaceRange(i.length,a,r)}throw new FormatError("Invalid codespace range.")}function parseWMode(e,t){const i=t.getObj();Number.isInteger(i)&&(e.vertical=!!i)}function parseCMapName(e,t){const i=t.getObj();i instanceof Name&&(e.name=i.name)}async function parseCMap(e,t,i,a){let r,s;A:for(;;)try{const i=t.getObj();if(i===yt)break;if(i instanceof Name){"WMode"===i.name?parseWMode(e,t):"CMapName"===i.name&&parseCMapName(e,t);r=i}else if(i instanceof Cmd)switch(i.cmd){case"endcmap":break A;case"usecmap":r instanceof Name&&(s=r.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 MissingDataException)throw e;warn("Invalid cMap data: "+e);continue}!a&&s&&(a=s);return a?extendCMap(e,i,a):e}async function extendCMap(e,t,i){e.useCMap=await createBuiltInCMap(i,t);if(0===e.numCodespaceRanges){const t=e.useCMap.codespaceRanges;for(let i=0;iextendCMap(r,t,e)));if(a===wA.NONE){const e=new Lexer(new Stream(i));return parseCMap(r,e,t,null)}throw new Error(`Invalid CMap "compressionType" value: ${a}`)}class CMapFactory{static async create({encoding:e,fetchBuiltInCMap:t,useCMap:i}){if(e instanceof Name)return createBuiltInCMap(e.name,t);if(e instanceof BaseStream){const a=await parseCMap(new CMap,new Lexer(e),t,i);return a.isIdentityCMap?createBuiltInCMap(a.name,t):a}throw new Error("Encoding required.")}}__webpack_require__(1795);const Qi=[".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"],Ei=[".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"],ui=[".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"],di=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],fi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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","","","",""],pi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],mi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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","","","",""],yi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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"],wi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","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",""],bi=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19","a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85","a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166","a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191",""];function getEncoding(e){switch(e){case"WinAnsiEncoding":return yi;case"StandardEncoding":return mi;case"MacRomanEncoding":return pi;case"SymbolSetEncoding":return wi;case"ZapfDingbatsEncoding":return bi;case"ExpertEncoding":return di;case"MacExpertEncoding":return fi;default:return null}}const Di=[".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"],Fi=391,Si=[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}],ki=[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}];class CFFParser{constructor(e,t,i){this.bytes=e.getBytes();this.properties=t;this.seacAnalysisEnabled=!!i}parse(){const e=this.properties,t=new CFF;this.cff=t;const i=this.parseHeader(),a=this.parseIndex(i.endPos),r=this.parseIndex(a.endPos),s=this.parseIndex(r.endPos),n=this.parseIndex(s.endPos),o=this.parseDict(r.obj.get(0)),g=this.createDict(CFFTopDict,o,t.strings);t.header=i.obj;t.names=this.parseNameIndex(a.obj);t.strings=this.parseStringIndex(s.obj);t.topDict=g;t.globalSubrIndex=n.obj;this.parsePrivateDict(t.topDict);t.isCIDFont=g.hasName("ROS");const c=g.getByName("CharStrings"),C=this.parseIndex(c).obj,h=g.getByName("FontMatrix");h&&(e.fontMatrix=h);const l=g.getByName("FontBBox");if(l){e.ascent=Math.max(l[3],l[1]);e.descent=Math.min(l[1],l[3]);e.ascentScaled=!0}let Q,E;if(t.isCIDFont){const e=this.parseIndex(g.getByName("FDArray")).obj;for(let i=0,a=e.count;i=t)throw new FormatError("Invalid CFF header");if(0!==i){info("cff data is shifted");e=e.subarray(i);this.bytes=e}const a=e[0],r=e[1],s=e[2],n=e[3];return{obj:new CFFHeader(a,r,s,n),endPos:s}}parseDict(e){let t=0;function parseOperand(){let i=e[t++];if(30===i)return function parseFloatOperand(){let i="";const a=15,r=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"],s=e.length;for(;t>4,o=15&s;if(n===a)break;i+=r[n];if(o===a)break;i+=r[o]}return parseFloat(i)}();if(28===i){i=e[t++];i=(i<<24|e[t++]<<16)>>16;return i}if(29===i){i=e[t++];i=i<<8|e[t++];i=i<<8|e[t++];i=i<<8|e[t++];return i}if(i>=32&&i<=246)return i-139;if(i>=247&&i<=250)return 256*(i-247)+e[t++]+108;if(i>=251&&i<=254)return-256*(i-251)-e[t++]-108;warn('CFFParser_parseDict: "'+i+'" is a reserved command.');return NaN}let i=[];const a=[];t=0;const r=e.length;for(;t10)return!1;let r=e.stackSize;const s=e.stack;let n=t.length;for(let o=0;o>16;o+=2;r++}else if(14===g){if(r>=4){r-=4;if(this.seacAnalysisEnabled){e.seac=s.slice(r,r+4);return!1}}c=Si[g]}else if(g>=32&&g<=246){s[r]=g-139;r++}else if(g>=247&&g<=254){s[r]=g<251?(g-247<<8)+t[o]+108:-(g-251<<8)-t[o]-108;o++;r++}else if(255===g){s[r]=(t[o]<<24|t[o+1]<<16|t[o+2]<<8|t[o+3])/65536;o+=4;r++}else if(19===g||20===g){e.hints+=r>>1;if(0===e.hints){t.copyWithin(o-1,o,-1);o-=1;n-=1;continue}o+=e.hints+7>>3;r%=2;c=Si[g]}else{if(10===g||29===g){const t=10===g?i:a;if(!t){c=Si[g];warn("Missing subrsIndex for "+c.id);return!1}let n=32768;t.count<1240?n=107:t.count<33900&&(n=1131);const o=s[--r]+n;if(o<0||o>=t.count||isNaN(o)){c=Si[g];warn("Out of bounds subrIndex for "+c.id);return!1}e.stackSize=r;e.callDepth++;if(!this.parseCharString(e,t.get(o),i,a))return!1;e.callDepth--;r=e.stackSize;continue}if(11===g){e.stackSize=r;return!0}if(0===g&&o===t.length){t[o-1]=14;c=Si[14]}else{if(9===g){t.copyWithin(o-1,o,-1);o-=1;n-=1;continue}c=Si[g]}}if(c){if(c.stem){e.hints+=r>>1;if(3===g||23===g)e.hasVStems=!0;else if(e.hasVStems&&(1===g||18===g)){warn("CFF stem hints are in wrong order");t[o-1]=1===g?3:23}}if("min"in c&&!e.undefStack&&r=2&&c.stem?r%=2:r>1&&warn("Found too many parameters for stack-clearing command");r>0&&(e.width=s[r-1])}if("stackDelta"in c){"stackFn"in c&&c.stackFn(s,r);r+=c.stackDelta}else if(c.stackClearing)r=0;else if(c.resetStack){r=0;e.undefStack=!1}else if(c.undefStack){r=0;e.undefStack=!0;e.firstStackClearing=!1}}}n=r.length){warn("Invalid fd index for glyph index.");h=!1}if(h){Q=r[e].privateDict;l=Q.subrsIndex}}else t&&(l=t);h&&(h=this.parseCharString(C,g,l,i));if(null!==C.width){const e=Q.getByName("nominalWidthX");o[c]=e+C.width}else{const e=Q.getByName("defaultWidthX");o[c]=e}null!==C.seac&&(n[c]=C.seac);h||e.set(c,new Uint8Array([14]))}return{charStrings:e,seacs:n,widths:o}}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 i=t[0],a=t[1];if(0===i||a>=this.bytes.length){this.emptyPrivateDictionary(e);return}const r=a+i,s=this.bytes.subarray(a,r),n=this.parseDict(s),o=this.createDict(CFFPrivateDict,n,e.strings);e.privateDict=o;0===o.getByName("ExpansionFactor")&&o.setByName("ExpansionFactor",.06);if(!o.getByName("Subrs"))return;const g=o.getByName("Subrs"),c=a+g;if(0===g||c>=this.bytes.length){this.emptyPrivateDictionary(e);return}const C=this.parseIndex(c);o.subrsIndex=C.obj}parseCharsets(e,t,i,a){if(0===e)return new CFFCharset(!0,Gi.ISO_ADOBE,Qi);if(1===e)return new CFFCharset(!0,Gi.EXPERT,Ei);if(2===e)return new CFFCharset(!0,Gi.EXPERT_SUBSET,ui);const r=this.bytes,s=e,n=r[e++],o=[a?0:".notdef"];let g,c,C;t-=1;switch(n){case 0:for(C=0;C=65535){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}}class CFFHeader{constructor(e,t,i,a){this.major=e;this.minor=t;this.hdrSize=i;this.offSize=a}}class CFFStrings{constructor(){this.strings=[]}get(e){return e>=0&&e<=390?Di[e]:e-Fi<=this.strings.length?this.strings[e-Fi]:Di[0]}getSID(e){let t=Di.indexOf(e);if(-1!==t)return t;t=this.strings.indexOf(e);return-1!==t?t+Fi:-1}add(e){this.strings.push(e)}get count(){return this.strings.length}}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}}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 i of t)if(isNaN(i)){warn(`Invalid CFFDict value: "${t}" for key "${e}".`);return!0}const i=this.types[e];"num"!==i&&"sid"!==i&&"offset"!==i||(t=t[0]);this.values[e]=t;return!0}setByName(e,t){if(!(e in this.nameToKeyMap))throw new 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 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 i of e){const e=Array.isArray(i[0])?(i[0][0]<<8)+i[0][1]:i[0];t.keyToNameMap[e]=i[1];t.nameToKeyMap[i[1]]=e;t.types[e]=i[2];t.defaults[e]=i[3];t.opcodes[e]=Array.isArray(i[0])?i[0]:[i[0]];t.order.push(e)}return t}}const Ri=[[[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 shadow(this,"tables",this.createTables(Ri))}constructor(e){super(CFFTopDict.tables,e);this.privateDict=null}}const Ni=[[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 shadow(this,"tables",this.createTables(Ni))}constructor(e){super(CFFPrivateDict.tables,e);this.subrsIndex=null}}const Gi={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2};class CFFCharset{constructor(e,t,i,a){this.predefined=e;this.format=t;this.charset=i;this.raw=a}}class CFFEncoding{constructor(e,t,i,a){this.predefined=e;this.format=t;this.encoding=i;this.raw=a}}class CFFFDSelect{constructor(e,t){this.format=e;this.fdSelect=t}getFDIndex(e){return e<0||e>=this.fdSelect.length?-1:this.fdSelect[e]}}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 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,i){if(!(e in this.offsets))throw new FormatError(`Not tracking location of ${e}`);const a=i.data,r=this.offsets[e];for(let e=0,i=t.length;e>24&255;a[n]=c>>16&255;a[o]=c>>8&255;a[g]=255&c}}}class CFFCompiler{constructor(e){this.cff=e}compile(){const e=this.cff,t={data:[],length:0,add(e){try{this.data.push(...e)}catch{this.data=this.data.concat(e)}this.length=this.data.length}},i=this.compileHeader(e.header);t.add(i);const a=this.compileNameIndex(e.names);t.add(a);if(e.isCIDFont&&e.topDict.hasName("FontMatrix")){const t=e.topDict.getByName("FontMatrix");e.topDict.removeByName("FontMatrix");for(const i of e.fdArray){let e=t.slice(0);i.hasName("FontMatrix")&&(e=Util.transform(e,i.getByName("FontMatrix")));i.setByName("FontMatrix",e)}}const r=e.topDict.getByName("XUID");r?.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 n=s.trackers[0],o=this.compileStringIndex(e.strings.strings);t.add(o);const g=this.compileIndex(e.globalSubrIndex);t.add(g);if(e.encoding&&e.topDict.hasName("Encoding"))if(e.encoding.predefined)n.setEntryLocation("Encoding",[e.encoding.format],t);else{const i=this.compileEncoding(e.encoding);n.setEntryLocation("Encoding",[t.length],t);t.add(i)}const c=this.compileCharset(e.charset,e.charStrings.count,e.strings,e.isCIDFont);n.setEntryLocation("charset",[t.length],t);t.add(c);const C=this.compileCharStrings(e.charStrings);n.setEntryLocation("CharStrings",[t.length],t);t.add(C);if(e.isCIDFont){n.setEntryLocation("FDSelect",[t.length],t);const i=this.compileFDSelect(e.fdSelect);t.add(i);s=this.compileTopDicts(e.fdArray,t.length,!0);n.setEntryLocation("FDArray",[t.length],t);t.add(s.output);const a=s.trackers;this.compilePrivateDicts(e.fdArray,a,t)}this.compilePrivateDicts([e.topDict],[n],t);t.add([0]);return t.data}encodeNumber(e){return Number.isInteger(e)?this.encodeInteger(e):this.encodeFloat(e)}static get EncodeFloatRegExp(){return shadow(this,"EncodeFloatRegExp",/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/)}encodeFloat(e){let t=e.toString();const i=CFFCompiler.EncodeFloatRegExp.exec(t);if(i){const a=parseFloat("1e"+((i[2]?+i[2]:0)+i[1].length));t=(Math.round(e*a)/a).toString()}let a,r,s="";for(a=0,r=t.length;a=-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 i of e){const e=Math.min(i.length,127);let a=new Array(e);for(let t=0;t"~"||"["===e||"]"===e||"("===e||")"===e||"{"===e||"}"===e||"<"===e||">"===e||"/"===e||"%"===e)&&(e="_");a[t]=e}a=a.join("");""===a&&(a="Bad_Font_Name");t.add(stringToBytes(a))}return this.compileIndex(t)}compileTopDicts(e,t,i){const a=[];let r=new CFFIndex;for(const s of e){if(i){s.removeByName("CIDFontVersion");s.removeByName("CIDFontRevision");s.removeByName("CIDFontType");s.removeByName("CIDCount");s.removeByName("UIDBase")}const e=new CFFOffsetTracker,n=this.compileDict(s,e);a.push(e);r.add(n);e.offset(t)}r=this.compileIndex(r,a);return{trackers:a,output:r}}compilePrivateDicts(e,t,i){for(let a=0,r=e.length;a>8&255,255&s]);else{r=new Uint8Array(1+2*s);r[0]=0;let t=0;const a=e.charset.length;let n=!1;for(let s=1;s>8&255;r[s+1]=255&o}}return this.compileTypedArray(r)}compileEncoding(e){return this.compileTypedArray(e.raw)}compileFDSelect(e){const t=e.format;let i,a;switch(t){case 0:i=new Uint8Array(1+e.fdSelect.length);i[0]=t;for(a=0;a>8&255,255&r,s];for(a=1;a>8&255,255&a,t);s=t}}const o=(n.length-3)/3;n[1]=o>>8&255;n[2]=255&o;n.push(a>>8&255,255&a);i=new Uint8Array(n)}return this.compileTypedArray(i)}compileTypedArray(e){return Array.from(e)}compileIndex(e,t=[]){const i=e.objects,a=i.length;if(0===a)return[0,0];const r=[a>>8&255,255&a];let s,n,o=1;for(s=0;s>8&255,255&g):3===n?r.push(g>>16&255,g>>8&255,255&g):r.push(g>>>24&255,g>>16&255,g>>8&255,255&g);i[s]&&(g+=i[s].length)}for(s=0;s=5&&t<=7))return-1;a=e.substring(1)}if(a===a.toUpperCase()){i=parseInt(a,16);if(i>=0)return i}}return-1}const Ji=[[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 i=Ji[t];for(let a=0,r=i.length;a=i[a]&&e<=i[a+1])return t}for(let t=0,i=Ji.length;t=i[a]&&e<=i[a+1])return t}return-1}const Yi=new RegExp("^(\\s)|(\\p{Mn})|(\\p{Cf})$","u"),vi=new Map;const Ti=!0,Ki=1,qi=2,Oi=4,Pi=32,Wi=[".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 i=getUnicodeForGlyph(e,t);if(-1!==i)for(const e in t)if(t[e]===i)return e;info("Unable to recover a standard glyph name for: "+e);return e}function type1FontGlyphMapping(e,t,i){const a=Object.create(null);let r,s,n;const o=!!(e.flags&Oi);if(e.isInternalFont){n=t;for(s=0;s=0?r:0}}else if(e.baseEncodingName){n=getEncoding(e.baseEncodingName);for(s=0;s=0?r:0}}else if(o)for(s in t)a[s]=t[s];else{n=mi;for(s=0;s=0?r:0}}const g=e.differences;let c;if(g)for(s in g){const e=g[s];r=i.indexOf(e);if(-1===r){c||(c=xi());const t=recoverGlyphName(e,c);t!==e&&(r=i.indexOf(t))}a[s]=r>=0?r:0}return a}function normalizeFontName(e){return e.replaceAll(/[,_]/g,"-").replaceAll(/\s/g,"")}const ji=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["Arial-BoldItalicMT-BoldItalic"]="Helvetica-BoldOblique";e["Arial-BoldMT-Bold"]="Helvetica-Bold";e["Arial-ItalicMT-Italic"]="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"})),Xi=getLookupTableFactory((function(e){e.Courier="FoxitFixed.pfb";e["Courier-Bold"]="FoxitFixedBold.pfb";e["Courier-BoldOblique"]="FoxitFixedBoldItalic.pfb";e["Courier-Oblique"]="FoxitFixedItalic.pfb";e.Helvetica="LiberationSans-Regular.ttf";e["Helvetica-Bold"]="LiberationSans-Bold.ttf";e["Helvetica-BoldOblique"]="LiberationSans-BoldItalic.ttf";e["Helvetica-Oblique"]="LiberationSans-Italic.ttf";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"})),Zi=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.Impact="Helvetica";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"})),Vi=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})),_i=getLookupTableFactory((function(e){e.Dingbats=!0;e.Symbol=!0;e.ZapfDingbats=!0;e.Wingdings=!0;e["Wingdings-Bold"]=!0;e["Wingdings-Regular"]=!0})),zi=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})),$i=getLookupTableFactory((function(e){e[227]=322;e[264]=261;e[291]=346})),Aa=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}));function getStandardFontName(e){const t=normalizeFontName(e);return ji()[t]}function isKnownFontName(e){const t=normalizeFontName(e);return!!(ji()[t]||Zi()[t]||Vi()[t]||_i()[t])}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 i in t)if(t[i]===e)return 0|i;return-1}amend(e){for(const t in e)this._map[t]=e[t]}}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,i=this.lastChar;t<=i;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){unreachable("Should not call amend()")}}class CFFFont{constructor(e,t){this.properties=t;const i=new CFFParser(e,t,Ti);this.cff=i.parse();this.cff.duplicateFirstGlyph();const a=new CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=a.compile()}catch{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:i,cMap:a}=t,r=e.charset.charset;let s,n;if(t.composite){let t,o;if(i?.length>0){t=Object.create(null);for(let e=0,a=i.length;e=0){const a=i[t];a&&(r[e]=a)}}r.length>0&&(this.properties.builtInEncoding=r)}}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 i=32768;t<1240?i=107:t<33900&&(i=1131);return i}function parseCmap(e,t,i){const a=1===getUint16(e,t+2)?getUint32(e,t+8):getUint32(e,t+16),r=getUint16(e,t+a);let s,n,o;if(4===r){getUint16(e,t+a+2);const i=getUint16(e,t+a+6)>>1;n=t+a+14;s=[];for(o=0;o>1;i0;)C.push({flags:s})}for(i=0;i>1;p=!0;break;case 4:n+=r.pop();moveTo(s,n);p=!0;break;case 5:for(;r.length>0;){s+=r.shift();n+=r.shift();lineTo(s,n)}break;case 6:for(;r.length>0;){s+=r.shift();lineTo(s,n);if(0===r.length)break;n+=r.shift();lineTo(s,n)}break;case 7:for(;r.length>0;){n+=r.shift();lineTo(s,n);if(0===r.length)break;s+=r.shift();lineTo(s,n)}break;case 8:for(;r.length>0;){c=s+r.shift();h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l+r.shift();bezierCurveTo(c,h,C,l,s,n)}break;case 10:d=r.pop();f=null;if(i.isCFFCIDFont){const e=i.fdSelect.getFDIndex(a);if(e>=0&&eMath.abs(n-t)?s+=r.shift():n+=r.shift();bezierCurveTo(c,h,C,l,s,n);break;default:throw new FormatError(`unknown operator: 12 ${m}`)}break;case 14:if(r.length>=4){const e=r.pop(),a=r.pop();n=r.pop();s=r.pop();t.add(ut);t.add(pt,[s,n]);let o=lookupCmap(i.cmap,String.fromCharCode(i.glyphNameMap[mi[e]]));compileCharString(i.glyphs[o.glyphId],t,i,o.glyphId);t.add(Et);o=lookupCmap(i.cmap,String.fromCharCode(i.glyphNameMap[mi[a]]));compileCharString(i.glyphs[o.glyphId],t,i,o.glyphId)}return;case 19:case 20:o+=r.length>>1;g+=o+7>>3;p=!0;break;case 21:n+=r.pop();s+=r.pop();moveTo(s,n);p=!0;break;case 22:s+=r.pop();moveTo(s,n);p=!0;break;case 24:for(;r.length>2;){c=s+r.shift();h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l+r.shift();bezierCurveTo(c,h,C,l,s,n)}s+=r.shift();n+=r.shift();lineTo(s,n);break;case 25:for(;r.length>6;){s+=r.shift();n+=r.shift();lineTo(s,n)}c=s+r.shift();h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l+r.shift();bezierCurveTo(c,h,C,l,s,n);break;case 26:r.length%2&&(s+=r.shift());for(;r.length>0;){c=s;h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C;n=l+r.shift();bezierCurveTo(c,h,C,l,s,n)}break;case 27:r.length%2&&(n+=r.shift());for(;r.length>0;){c=s+r.shift();h=n;C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l;bezierCurveTo(c,h,C,l,s,n)}break;case 28:r.push((e[g]<<24|e[g+1]<<16)>>16);g+=2;break;case 29:d=r.pop()+i.gsubrsBias;f=i.gsubrs[d];f&&parse(f);break;case 30:for(;r.length>0;){c=s;h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l+(1===r.length?r.shift():0);bezierCurveTo(c,h,C,l,s,n);if(0===r.length)break;c=s+r.shift();h=n;C=c+r.shift();l=h+r.shift();n=l+r.shift();s=C+(1===r.length?r.shift():0);bezierCurveTo(c,h,C,l,s,n)}break;case 31:for(;r.length>0;){c=s+r.shift();h=n;C=c+r.shift();l=h+r.shift();n=l+r.shift();s=C+(1===r.length?r.shift():0);bezierCurveTo(c,h,C,l,s,n);if(0===r.length)break;c=s;h=n+r.shift();C=c+r.shift();l=h+r.shift();s=C+r.shift();n=l+(1===r.length?r.shift():0);bezierCurveTo(c,h,C,l,s,n)}break;default:if(m<32)throw new FormatError(`unknown operator: ${m}`);if(m<247)r.push(m-139);else if(m<251)r.push(256*(m-247)+e[g++]+108);else if(m<255)r.push(256*-(m-251)-e[g++]-108);else{r.push((e[g]<<24|e[g+1]<<16|e[g+2]<<8|e[g+3])/65536);g+=4}}p&&(r.length=0)}}(e)}const ea=[];class Commands{cmds=[];add(e,t){if(t)if(isNumberArray(t,null))this.cmds.push(e,...t);else{warn(`Commands.add - "${e}" has at least one non-number arg: "${t}".`);const i=t.map((e=>"number"==typeof e?e:0));this.cmds.push(e,...i)}else this.cmds.push(e)}}class CompiledFont{constructor(e){this.constructor===CompiledFont&&unreachable("Cannot initialize CompiledFont.");this.fontMatrix=e;this.compiledGlyphs=Object.create(null);this.compiledCharCodeToGlyphId=Object.create(null)}getPathJs(e){const{charCode:t,glyphId:i}=lookupCmap(this.cmap,e);let a,r=this.compiledGlyphs[i];if(!r){try{r=this.compileGlyph(this.glyphs[i],i)}catch(e){r=ea;a=e}this.compiledGlyphs[i]=r}this.compiledCharCodeToGlyphId[t]??=i;if(a)throw a;return r}compileGlyph(e,t){if(!e||0===e.length||14===e[0])return ea;let i=this.fontMatrix;if(this.isCFFCIDFont){const e=this.fdSelect.getFDIndex(t);if(e>=0&&e2*getUint16(e,t)}const s=[];let n=r(t,0);for(let i=a;ie+(t.getSize()+3&-4)),0)}write(){const e=this.getSize(),t=new DataView(new ArrayBuffer(e)),i=e>131070,a=i?4:2,r=new DataView(new ArrayBuffer((this.glyphs.length+1)*a));i?r.setUint32(0,0):r.setUint16(0,0);let s=0,n=0;for(const e of this.glyphs){s+=e.write(s,t);s=s+3&-4;n+=a;i?r.setUint32(n,s):r.setUint16(n,s>>1)}return{isLocationLong:i,loca:new Uint8Array(r.buffer),glyf:new Uint8Array(t.buffer)}}scale(e){for(let t=0,i=this.glyphs.length;te+t.getSize()),0);return this.header.getSize()+e}write(e,t){if(!this.header)return 0;const i=e;e+=this.header.write(e,t);if(this.simple)e+=this.simple.write(e,t);else for(const i of this.composites)e+=i.write(e,t);return e-i}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 i of this.composites)i.scale(t,e)}}class GlyphHeader{constructor({numberOfContours:e,xMin:t,yMin:i,xMax:a,yMax:r}){this.numberOfContours=e;this.xMin=t;this.yMin=i;this.xMax=a;this.yMax=r}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:i}){this.xCoordinates=t;this.yCoordinates=i;this.flags=e}}class SimpleGlyph{constructor({contours:e,instructions:t}){this.contours=e;this.instructions=t}static parse(e,t,i){const a=[];for(let r=0;r255?e+=2:o>0&&(e+=1);t=s;o=Math.abs(n-i);o>255?e+=2:o>0&&(e+=1);i=n}}return e}write(e,t){const i=e,a=[],r=[],s=[];let n=0,o=0;for(const i of this.contours){for(let e=0,t=i.xCoordinates.length;e=0?18:2;a.push(e)}else a.push(c)}n=g;const C=i.yCoordinates[e];c=C-o;if(0===c){t|=32;r.push(0)}else{const e=Math.abs(c);if(e<=255){t|=c>=0?36:4;r.push(e)}else r.push(c)}o=C;s.push(t)}t.setUint16(e,a.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 i of s)t.setUint8(e++,i);for(let i=0,r=a.length;i=-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 i=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-i}scale(e,t){}}function writeInt16(e,t,i){e[t]=i>>8&255;e[t+1]=255&i}function writeInt32(e,t,i){e[t]=i>>24&255;e[t+1]=i>>16&255;e[t+2]=i>>8&255;e[t+3]=255&i}function writeData(e,t,i){if(i instanceof Uint8Array)e.set(i,t);else if("string"==typeof i)for(let a=0,r=i.length;ai;){i<<=1;a++}const r=i*t;return{range:r,entry:a,rangeShift:t*e-r}}toArray(){let e=this.sfnt;const t=this.tables,i=Object.keys(t);i.sort();const a=i.length;let r,s,n,o,g,c=12+16*a;const C=[c];for(r=0;r>>0;C.push(c)}const h=new Uint8Array(c);for(r=0;r>>0}writeInt32(h,c+4,e);writeInt32(h,c+8,C[r]);writeInt32(h,c+12,t[g].length);c+=16}return h}addTable(e,t){if(e in this.tables)throw new Error("Table "+e+" already exists");this.tables[e]=t}}const aa=[4],ra=[5],sa=[6],na=[7],oa=[8],ga=[12,35],Ia=[14],ca=[21],Ca=[22],ha=[30],la=[31];class Type1CharString{constructor(){this.width=0;this.lsb=0;this.flexing=!1;this.output=[];this.stack=[]}convert(e,t,i){const a=e.length;let r,s,n,o=!1;for(let g=0;ga)return!0;const r=a-e;for(let e=r;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);i?this.stack.splice(r,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,i){if(i>=e.length)return new Uint8Array(0);let a,r,s=0|t;for(a=0;a>8;s=52845*(t+s)+22719&65535}return o}function isSpecial(e){return 47===e||91===e||93===e||123===e||125===e||40===e||41===e}class Type1Parser{constructor(e,t,i){if(t){const t=e.getBytes(),i=!((isHexDigit(t[0])||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 Stream(i?decrypt(t,55665,4):function decryptAscii(e,t,i){let a=0|t;const r=e.length,s=new Uint8Array(r>>>1);let n,o;for(n=0,o=0;n>8;a=52845*(e+a)+22719&65535}}return s.slice(i,o)}(t,55665,4))}this.seacAnalysisEnabled=!!i;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(!isWhiteSpace(t))break;t=this.nextChar()}if(isSpecial(t)){this.nextChar();return String.fromCharCode(t)}let i="";do{i+=String.fromCharCode(t);t=this.nextChar()}while(t>=0&&!isWhiteSpace(t)&&!isSpecial(t));return i}readCharStrings(e,t){return-1===t?e:decrypt(e,4330,t)}extractFontProgram(e){const t=this.stream,i=[],a=[],r=Object.create(null);r.lenIV=4;const s={subrs:[],charstrings:[],properties:{privateData:r}};let n,o,g,c;for(;null!==(n=this.getToken());)if("/"===n){n=this.getToken();switch(n){case"CharStrings":this.getToken();this.getToken();this.getToken();this.getToken();for(;;){n=this.getToken();if(null===n||"end"===n)break;if("/"!==n)continue;const e=this.getToken();o=this.readInt();this.getToken();g=o>0?t.getBytes(o):new Uint8Array(0);c=s.properties.privateData.lenIV;const i=this.readCharStrings(g,c);this.nextChar();n=this.getToken();"noaccess"===n?this.getToken():"/"===n&&this.prevChar();a.push({glyph:e,encoded:i})}break;case"Subrs":this.readInt();this.getToken();for(;"dup"===this.getToken();){const e=this.readInt();o=this.readInt();this.getToken();g=o>0?t.getBytes(o):new Uint8Array(0);c=s.properties.privateData.lenIV;const a=this.readCharStrings(g,c);this.nextChar();n=this.getToken();"noaccess"===n&&this.getToken();i[e]=a}break;case"BlueValues":case"OtherBlues":case"FamilyBlues":case"FamilyOtherBlues":const e=this.readNumberArray();e.length>0&&e.length,0;break;case"StemSnapH":case"StemSnapV":s.properties.privateData[n]=this.readNumberArray();break;case"StdHW":case"StdVW":s.properties.privateData[n]=this.readNumberArray()[0];break;case"BlueShift":case"lenIV":case"BlueFuzz":case"BlueScale":case"LanguageGroup":s.properties.privateData[n]=this.readNumber();break;case"ExpansionFactor":s.properties.privateData[n]=this.readNumber()||.06;break;case"ForceBold":s.properties.privateData[n]=this.readBoolean()}}for(const{encoded:t,glyph:r}of a){const a=new Type1CharString,n=a.convert(t,i,this.seacAnalysisEnabled);let o=a.output;n&&(o=[14]);const g={glyphName:r,charstring:o,width:a.width,lsb:a.lsb,seac:a.seac};".notdef"===r?s.charstrings.unshift(g):s.charstrings.push(g);if(e.builtInEncoding){const t=e.builtInEncoding.indexOf(r);t>-1&&void 0===e.widths[t]&&t>=e.firstChar&&t<=e.lastChar&&(e.widths[t]=a.width)}}return s}extractFontHeader(e){let t;for(;null!==(t=this.getToken());)if("/"===t){t=this.getToken();switch(t){case"FontMatrix":const i=this.readNumberArray();e.fontMatrix=i;break;case"Encoding":const a=this.getToken();let r;if(/^\d+$/.test(a)){r=[];const e=0|parseInt(a,10);this.getToken();for(let i=0;i=r){n+=i;for(;n=0&&(a[e]=r)}}return type1FontGlyphMapping(e,a,i)}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 i=0,a=e.length;i0;e--)t[e]-=t[e-1];Q.setByName(e,t)}s.topDict.privateDict=Q;const u=new CFFIndex;for(C=0,h=a.length;C0&&e.toUnicode.amend(t)}class fonts_Glyph{constructor(e,t,i,a,r,s,n,o,g){this.originalCharCode=e;this.fontChar=t;this.unicode=i;this.accent=a;this.width=r;this.vmetric=s;this.operatorListId=n;this.isSpace=o;this.isInFont=g}get category(){return shadow(this,"category",function getCharUnicodeCategory(e){const t=vi.get(e);if(t)return t;const i=e.match(Yi),a={isWhitespace:!!i?.[1],isZeroWidthDiacritic:!!i?.[2],isInvisibleFormatMark:!!i?.[3]};vi.set(e,a);return a}(this.unicode),!0)}}function int16(e,t){return(e<<8)+t}function writeSignedInt16(e,t,i){e[t+1]=i;e[t]=i>>>8}function signedInt16(e,t){const i=(e<<8)+t;return 32768&i?i-65536:i}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){return"ttcf"===bytesToString(e.peekBytes(4))}function getFontFileType(e,{type:t,subtype:i,composite:a}){let r,s;if(function isTrueTypeFile(e){const t=e.peekBytes(4);return 65536===readUint32(t,0)||"true"===bytesToString(t)}(e)||isTrueTypeCollectionFile(e))r=a?"CIDFontType2":"TrueType";else if(function isOpenTypeFile(e){return"OTTO"===bytesToString(e.peekBytes(4))}(e))r=a?"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))r=a?"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(a){r="CIDFontType0";s="CIDFontType0C"}else{r="MMType1"===t?"MMType1":"Type1";s="Type1C"}else{warn("getFontFileType: Unable to detect correct font file Type/Subtype.");r=t;s=i}return[r,s]}function applyStandardFontGlyphMap(e,t){for(const i in t)e[+i]=t[i]}function buildToFontChar(e,t,i){const a=[];let r;for(let i=0,s=e.length;iC){g++;if(g>=Ba.length){warn("Ran out of space in font private use area.");break}c=Ba[g][0];C=Ba[g][1]}const E=c++;0===Q&&(Q=i);let u=a.get(l);"string"==typeof u&&(u=u.codePointAt(0));if(u&&!(h=u,Ba[0][0]<=h&&h<=Ba[0][1]||Ba[1][0]<=h&&h<=Ba[1][1])&&!o.has(Q)){s.set(u,Q);o.add(Q)}r[E]=Q;n[l]=E}var h;return{toFontChar:n,charCodeToGlyphId:r,toUnicodeExtraMap:s,nextAvailableFontCharCode:c}}function createCmapTable(e,t,i){const a=function getRanges(e,t,i){const a=[];for(const t in e)e[t]>=i||a.push({fontCharCode:0|t,glyphId:e[t]});if(t)for(const[e,r]of t)r>=i||a.push({fontCharCode:e,glyphId:r});0===a.length&&a.push({fontCharCode:0,glyphId:0});a.sort((function fontGetRangesSort(e,t){return e.fontCharCode-t.fontCharCode}));const r=[],s=a.length;for(let e=0;e65535?2:1;let s,n,o,g,c="\0\0"+string16(r)+"\0\0"+string32(4+8*r);for(s=a.length-1;s>=0&&!(a[s][0]<=65535);--s);const C=s+1;a[s][0]<65535&&65535===a[s][1]&&(a[s][1]=65534);const h=a[s][1]<65535?1:0,l=C+h,Q=OpenTypeFileBuilder.getSearchParams(l,2);let E,u,d,f,p="",m="",y="",w="",b="",D=0;for(s=0,n=C;s0){m+="ÿÿ";p+="ÿÿ";y+="\0";w+="\0\0"}const S="\0\0"+string16(2*l)+string16(Q.range)+string16(Q.entry)+string16(Q.rangeShift)+m+"\0\0"+p+y+w+b;let k="",R="";if(r>1){c+="\0\0\n"+string32(4+8*r+4+S.length);k="";for(s=0,n=a.length;se||!o)&&(o=e);g 123 are reserved for internal usage");n|=1<65535&&(g=65535)}else{o=0;g=255}const C=e.bbox||[0,0,0,0],h=i.unitsPerEm||(e.fontMatrix?1/Math.max(...e.fontMatrix.slice(0,4).map(Math.abs)):1e3),l=e.ascentScaled?1:h/Qa,Q=i.ascent||Math.round(l*(e.ascent||C[3]));let E=i.descent||Math.round(l*(e.descent||C[1]));E>0&&e.descent>0&&C[1]<0&&(E=-E);const u=i.yMax||Q,d=-i.yMin||-E;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"+string32(a)+string32(r)+string32(s)+string32(n)+"*21*"+string16(e.italicAngle?1:0)+string16(o||e.firstChar)+string16(g||e.lastChar)+string16(Q)+string16(E)+"\0d"+string16(u)+string16(d)+"\0\0\0\0\0\0\0\0"+string16(e.xHeight)+string16(e.capHeight)+string16(0)+string16(o||e.firstChar)+"\0"}function createPostTable(e){return"\0\0\0"+string32(Math.floor(65536*e.italicAngle))+"\0\0\0\0"+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 i=[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"],a=[];let r,s,n,o,g;for(r=0,s=i.length;r0;if((n||o)&&"CIDFontType2"===i&&this.cidEncoding.startsWith("Identity-")){const i=e.cidToGidMap,a=[];applyStandardFontGlyphMap(a,zi());/Arial-?Black/i.test(t)?applyStandardFontGlyphMap(a,$i()):/Calibri/i.test(t)&&applyStandardFontGlyphMap(a,Aa());if(i){for(const e in a){const t=a[e];void 0!==i[t]&&(a[+e]=i[t])}i.length!==this.toUnicode.length&&e.hasIncludedToUnicodeMap&&this.toUnicode instanceof IdentityToUnicodeMap&&this.toUnicode.forEach((function(e,t){const r=a[e];void 0===i[r]&&(a[+e]=t)}))}this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach((function(e,t){a[+e]=t}));this.toFontChar=a;this.toUnicode=new ToUnicodeMap(a)}else if(/Symbol/i.test(a))this.toFontChar=buildToFontChar(wi,xi(),this.differences);else if(/Dingbats/i.test(a))this.toFontChar=buildToFontChar(bi,Mi(),this.differences);else if(n){const e=buildToFontChar(this.defaultEncoding,xi(),this.differences);"CIDFontType2"!==i||this.cidEncoding.startsWith("Identity-")||this.toUnicode instanceof IdentityToUnicodeMap||this.toUnicode.forEach((function(t,i){e[+t]=i}));this.toFontChar=e}else{const e=xi(),i=[];this.toUnicode.forEach(((t,a)=>{if(!this.composite){const i=getUnicodeForGlyph(this.differences[t]||this.defaultEncoding[t],e);-1!==i&&(a=i)}i[+t]=a}));this.composite&&this.toUnicode instanceof IdentityToUnicodeMap&&/Tahoma|Verdana/i.test(t)&&applyStandardFontGlyphMap(i,zi());this.toFontChar=i}amendFallbackToUnicode(e);this.loadedName=a.split("-",1)[0]}checkAndRepair(e,t,i){const a=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];function readTables(e,t){const i=Object.create(null);i["OS/2"]=null;i.cmap=null;i.head=null;i.hhea=null;i.hmtx=null;i.maxp=null;i.name=null;i.post=null;for(let r=0;r>>0,a=e.getInt32()>>>0,r=e.getInt32()>>>0,s=e.pos;e.pos=e.start||0;e.skip(a);const n=e.getBytes(r);e.pos=s;if("head"===t){n[8]=n[9]=n[10]=n[11]=0;n[17]|=32}return{tag:t,checksum:i,length:r,offset:a,data:n}}function readOpenTypeHeader(e){return{version:e.getString(4),numTables:e.getUint16(),searchRange:e.getUint16(),entrySelector:e.getUint16(),rangeShift:e.getUint16()}}function sanitizeGlyph(e,t,i,a,r,s){const n={length:0,sizeOfInstructions:0};if(t<0||t>=e.length||i>e.length||i-t<=12)return n;const o=e.subarray(t,i),g=signedInt16(o[2],o[3]),c=signedInt16(o[4],o[5]),C=signedInt16(o[6],o[7]),h=signedInt16(o[8],o[9]);if(g>C){writeSignedInt16(o,2,C);writeSignedInt16(o,6,g)}if(c>h){writeSignedInt16(o,4,h);writeSignedInt16(o,8,c)}const l=signedInt16(o[0],o[1]);if(l<0){if(l<-1)return n;a.set(o,r);n.length=o.length;return n}let Q,E=10,u=0;for(Q=0;Qo.length)return n;if(!s&&f>0){a.set(o.subarray(0,d),r);a.set([0,0],r+d);a.set(o.subarray(p,y),r+d+2);y-=f;o.length-y>3&&(y=y+3&-4);n.length=y;return n}if(o.length-y>3){y=y+3&-4;a.set(o.subarray(0,y),r);n.length=y;return n}a.set(o,r);n.length=o.length;return n}function readNameTable(e){const i=(t.start||0)+e.offset;t.pos=i;const a=[[],[]],r=[],s=e.length,n=i+s;if(0!==t.getUint16()||s<6)return[a,r];const o=t.getUint16(),g=t.getUint16();let c,C;for(c=0;cn)continue;t.pos=s;const o=e.name;if(e.encoding){let i="";for(let a=0,r=e.length;a0&&(c+=e-1)}}else{if(d||p){warn("TT: nested FDEFs not allowed");u=!0}d=!0;h=c;n=l.pop();t.functionsDefined[n]={data:g,i:c}}else if(!d&&!p){n=l.at(-1);if(isNaN(n))info("TT: CALL empty stack (or invalid entry).");else{t.functionsUsed[n]=!0;if(n in t.functionsStackDeltas){const e=l.length+t.functionsStackDeltas[n];if(e<0){warn("TT: CALL invalid functions stack delta.");t.hintsValid=!1;return}l.length=e}else if(n in t.functionsDefined&&!E.includes(n)){Q.push({data:g,i:c,stackTop:l.length-1});E.push(n);o=t.functionsDefined[n];if(!o){warn("TT: CALL non-existent function");t.hintsValid=!1;return}g=o.data;c=o.i}}}if(!d&&!p){let t=0;e<=142?t=r[e]:e>=192&&e<=223?t=-1:e>=224&&(t=-2);if(e>=113&&e<=117){a=l.pop();isNaN(a)||(t=2*-a)}for(;t<0&&l.length>0;){l.pop();t++}for(;t>0;){l.push(NaN);t--}}}t.tooComplexToFollowFunctions=u;const m=[g];c>g.length&&m.push(new Uint8Array(c-g.length));if(h>C){warn("TT: complementing a missing function tail");m.push(new Uint8Array([34,45]))}!function foldTTTable(e,t){if(t.length>1){let i,a,r=0;for(i=0,a=t.length;i>>0,s=[];for(let t=0;t>>0);const n={ttcTag:t,majorVersion:i,minorVersion:a,numFonts:r,offsetTable:s};switch(i){case 1:return n;case 2:n.dsigTag=e.getInt32()>>>0;n.dsigLength=e.getInt32()>>>0;n.dsigOffset=e.getInt32()>>>0;return n}throw new FormatError(`Invalid TrueType Collection majorVersion: ${i}.`)}(e),r=t.split("+");let s;for(let n=0;n0||!(i.cMap instanceof IdentityCMap));if("OTTO"===s.version&&!t||!n.head||!n.hhea||!n.maxp||!n.post){g=new Stream(n["CFF "].data);o=new CFFFont(g,i);adjustWidths(i);return this.convert(e,o,i)}delete n.glyf;delete n.loca;delete n.fpgm;delete n.prep;delete n["cvt "];this.isOpenType=!0}if(!n.maxp)throw new FormatError('Required "maxp" table is not found');t.pos=(t.start||0)+n.maxp.offset;let C=t.getInt32();const h=t.getUint16();if(65536!==C&&20480!==C){if(6===n.maxp.length)C=20480;else{if(!(n.maxp.length>=32))throw new FormatError('"maxp" table has a wrong version number');C=65536}!function writeUint32(e,t,i){e[t+3]=255&i;e[t+2]=i>>>8;e[t+1]=i>>>16;e[t]=i>>>24}(n.maxp.data,0,C)}if(i.scaleFactors?.length===h&&c){const{scaleFactors:e}=i,t=int16(n.head.data[50],n.head.data[51]),a=new GlyfTable({glyfTable:n.glyf.data,isGlyphLocationsLong:t,locaTable:n.loca.data,numGlyphs:h});a.scale(e);const{glyf:r,loca:s,isLocationLong:o}=a.write();n.glyf.data=r;n.loca.data=s;if(o!==!!t){n.head.data[50]=0;n.head.data[51]=o?1:0}const g=n.hmtx.data;for(let t=0;t>8&255;g[i+1]=255&a;writeSignedInt16(g,i+2,Math.round(e[t]*signedInt16(g[i+2],g[i+3])))}}let l=h+1,Q=!0;if(l>65535){Q=!1;l=h;warn("Not enough space in glyfs to duplicate first glyph.")}let E=0,u=0;if(C>=65536&&n.maxp.length>=32){t.pos+=8;if(t.getUint16()>2){n.maxp.data[14]=0;n.maxp.data[15]=2}t.pos+=4;E=t.getUint16();t.pos+=4;u=t.getUint16()}n.maxp.data[4]=l>>8;n.maxp.data[5]=255&l;const d=function sanitizeTTPrograms(e,t,i,a){const r={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:!1,hintsValid:!0};e&&sanitizeTTProgram(e,r);t&&sanitizeTTProgram(t,r);e&&function checkInvalidFunctions(e,t){if(!e.tooComplexToFollowFunctions)if(e.functionsDefined.length>t){warn("TT: more functions defined than expected");e.hintsValid=!1}else for(let i=0,a=e.functionsUsed.length;it){warn("TT: invalid function id: "+i);e.hintsValid=!1;return}if(e.functionsUsed[i]&&!e.functionsDefined[i]){warn("TT: undefined function: "+i);e.hintsValid=!1;return}}}(r,a);if(i&&1&i.length){const e=new Uint8Array(i.length+1);e.set(i.data);i.data=e}return r.hintsValid}(n.fpgm,n.prep,n["cvt "],E);if(!d){delete n.fpgm;delete n.prep;delete n["cvt "]}!function sanitizeMetrics(e,t,i,a,r,s){if(!t){i&&(i.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 n=e.getUint16();e.pos+=8;e.pos+=2;let o=e.getUint16();if(0!==n){if(!(2&int16(a.data[44],a.data[45]))){t.data[22]=0;t.data[23]=0}}if(o>r){info(`The numOfMetrics (${o}) should not be greater than the numGlyphs (${r}).`);o=r;t.data[34]=(65280&o)>>8;t.data[35]=255&o}const g=r-o-(i.length-4*o>>1);if(g>0){const e=new Uint8Array(i.length+2*g);e.set(i.data);if(s){e[i.length]=i.data[2];e[i.length+1]=i.data[3]}i.data=e}}(t,n.hhea,n.hmtx,n.head,l,Q);if(!n.head)throw new FormatError('Required "head" table is not found');!function sanitizeHead(e,t,i){const a=e.data,r=function int32(e,t,i,a){return(e<<24)+(t<<16)+(i<<8)+a}(a[0],a[1],a[2],a[3]);if(r>>16!=1){info("Attempting to fix invalid version in head table: "+r);a[0]=0;a[1]=1;a[2]=0;a[3]=0}const s=int16(a[50],a[51]);if(s<0||s>1){info("Attempting to fix invalid indexToLocFormat in head table: "+s);const e=t+1;if(i===e<<1){a[50]=0;a[51]=0}else{if(i!==e<<2)throw new FormatError("Could not fix indexToLocFormat: "+s);a[50]=0;a[51]=1}}}(n.head,h,c?n.loca.length:0);let f=Object.create(null);if(c){const e=int16(n.head.data[50],n.head.data[51]),t=function sanitizeGlyphLocations(e,t,i,a,r,s,n){let o,g,c;if(a){o=4;g=function fontItemDecodeLong(e,t){return e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3]};c=function fontItemEncodeLong(e,t,i){e[t]=i>>>24&255;e[t+1]=i>>16&255;e[t+2]=i>>8&255;e[t+3]=255&i}}else{o=2;g=function fontItemDecode(e,t){return e[t]<<9|e[t+1]<<1};c=function fontItemEncode(e,t,i){e[t]=i>>9&255;e[t+1]=i>>1&255}}const C=s?i+1:i,h=o*(1+C),l=new Uint8Array(h);l.set(e.data.subarray(0,h));e.data=l;const Q=t.data,E=Q.length,u=new Uint8Array(E);let d,f;const p=[];for(d=0,f=0;dE&&(e=E);p.push({index:d,offset:e,endOffset:0})}p.sort(((e,t)=>e.offset-t.offset));for(d=0;de.index-t.index));for(d=0;dn&&(n=e.sizeOfInstructions);w+=t;c(l,f,w)}if(0===w){const e=new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(d=0,f=o;di+w)t.data=u.subarray(0,i+w);else{t.data=new Uint8Array(i+w);t.data.set(u.subarray(0,w))}t.data.set(u.subarray(0,i),w);c(e.data,l.length-o,w+i)}else t.data=u.subarray(0,w);return{missingGlyphs:y,maxSizeOfInstructions:n}}(n.loca,n.glyf,h,e,d,Q,u);f=t.missingGlyphs;if(C>=65536&&n.maxp.length>=32){n.maxp.data[26]=t.maxSizeOfInstructions>>8;n.maxp.data[27]=255&t.maxSizeOfInstructions}}if(!n.hhea)throw new FormatError('Required "hhea" table is not found');if(0===n.hhea.data[10]&&0===n.hhea.data[11]){n.hhea.data[10]=255;n.hhea.data[11]=255}const p={unitsPerEm:int16(n.head.data[18],n.head.data[19]),yMax:signedInt16(n.head.data[42],n.head.data[43]),yMin:signedInt16(n.head.data[38],n.head.data[39]),ascent:signedInt16(n.hhea.data[4],n.hhea.data[5]),descent:signedInt16(n.hhea.data[6],n.hhea.data[7]),lineGap:signedInt16(n.hhea.data[8],n.hhea.data[9])};this.ascent=p.ascent/p.unitsPerEm;this.descent=p.descent/p.unitsPerEm;this.lineGap=p.lineGap/p.unitsPerEm;if(this.cssFontInfo?.lineHeight){this.lineHeight=this.cssFontInfo.metrics.lineHeight;this.lineGap=this.cssFontInfo.metrics.lineGap}else this.lineHeight=this.ascent-this.descent+this.lineGap;n.post&&function readPostScriptTable(e,i,a){const r=(t.start||0)+e.offset;t.pos=r;const s=r+e.length,n=t.getInt32();t.skip(28);let o,g,c=!0;switch(n){case 65536:o=Wi;break;case 131072:const e=t.getUint16();if(e!==a){c=!1;break}const r=[];for(g=0;g=32768){c=!1;break}r.push(e)}if(!c)break;const C=[],h=[];for(;t.pos65535)throw new FormatError("Max size of CID is 65,535");let r=-1;t?r=a:void 0!==e[a]&&(r=e[a]);r>=0&&r>>0;let C=!1;if(o?.platformId!==r||o?.encodingId!==s){if(0!==r||0!==s&&1!==s&&3!==s)if(1===r&&0===s)C=!0;else if(3!==r||1!==s||!a&&o){if(i&&3===r&&0===s){C=!0;let i=!0;if(e>3;e.push(a);i=Math.max(a,i)}const a=[];for(let e=0;e<=i;e++)a.push({firstCode:t.getUint16(),entryCount:t.getUint16(),idDelta:signedInt16(t.getByte(),t.getByte()),idRangePos:t.pos+t.getUint16()});for(let i=0;i<256;i++)if(0===e[i]){t.pos=a[0].idRangePos+2*i;Q=t.getUint16();h.push({charCode:i,glyphId:Q})}else{const r=a[e[i]];for(l=0;l>1;t.skip(6);const i=[];let a;for(a=0;a>1)-(e-a);r.offsetIndex=n;o=Math.max(o,n+r.end-r.start+1)}else r.offsetIndex=-1}const g=[];for(l=0;l>>0;for(l=0;l>>0,i=t.getInt32()>>>0;let a=t.getInt32()>>>0;for(let t=e;t<=i;t++)h.push({charCode:t,glyphId:a++})}}}h.sort((function(e,t){return e.charCode-t.charCode}));for(let e=1;e=61440&&t<=61695&&(t&=255);m[t]=e.glyphId}else for(const e of s)m[e.charCode]=e.glyphId;if(i.glyphNames&&(o.length||this.differences.length))for(let e=0;e<256;++e){if(!g&&void 0!==m[e])continue;const t=this.differences[e]||o[e];if(!t)continue;const a=i.glyphNames.indexOf(t);a>0&&hasGlyph(a)&&(m[e]=a)}}0===m.length&&(m[0]=0);let y=l-1;Q||(y=0);if(!i.cssFontInfo){const e=adjustMapping(m,hasGlyph,y,this.toUnicode);this.toFontChar=e.toFontChar;n.cmap={tag:"cmap",data:createCmapTable(e.charCodeToGlyphId,e.toUnicodeExtraMap,l)};n["OS/2"]&&function validateOS2Table(e,t){t.pos=(t.start||0)+e.offset;const i=t.getUint16();t.skip(60);const a=t.getUint16();if(i<4&&768&a)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}(n["OS/2"],t)||(n["OS/2"]={tag:"OS/2",data:createOS2Table(i,e.charCodeToGlyphId,p)})}if(!c)try{g=new Stream(n["CFF "].data);o=new CFFParser(g,i,Ti).parse();o.duplicateFirstGlyph();const e=new CFFCompiler(o);n["CFF "].data=e.compile()}catch{warn("Failed to compile font "+i.loadedName)}if(n.name){const[t,a]=readNameTable(n.name);n.name.data=createNameTable(e,t);this.psName=t[0][6]||null;i.composite||function adjustTrueTypeToUnicode(e,t,i){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(e.hasEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;if(!t)return;if(0===i.length)return;if(e.defaultEncoding===yi)return;for(const e of i)if(!isWinNameRecord(e))return;const a=yi,r=[],s=xi();for(const e in a){const t=a[e];if(""===t)continue;const i=s[t];void 0!==i&&(r[e]=String.fromCharCode(i))}r.length>0&&e.toUnicode.amend(r)}(i,this.isSymbolicFont,a)}else n.name={tag:"name",data:createNameTable(this.name)};const w=new OpenTypeFileBuilder(s.version);for(const e in n)w.addTable(e,n[e].data);return w.toArray()}convert(e,t,i){i.fixedPitch=!1;i.builtInEncoding&&function adjustType1ToUnicode(e,t){if(e.isInternalFont)return;if(e.hasIncludedToUnicodeMap)return;if(t===e.defaultEncoding)return;if(e.toUnicode instanceof IdentityToUnicodeMap)return;const i=[],a=xi();for(const r in t){if(e.hasEncoding&&(e.baseEncodingName||void 0!==e.differences[r]))continue;const s=getUnicodeForGlyph(t[r],a);-1!==s&&(i[r]=String.fromCharCode(s))}i.length>0&&e.toUnicode.amend(i)}(i,i.builtInEncoding);let a=1;t instanceof CFFFont&&(a=t.numGlyphs-1);const s=t.getGlyphMapping(i);let n=null,o=s,g=null;if(!i.cssFontInfo){n=adjustMapping(s,t.hasGlyphId.bind(t),a,this.toUnicode);this.toFontChar=n.toFontChar;o=n.charCodeToGlyphId;g=n.toUnicodeExtraMap}const c=t.numGlyphs;function getCharCodes(e,t){let i=null;for(const a in e)t===e[a]&&(i||=[]).push(0|a);return i}function createCharCode(e,t){for(const i in e)if(t===e[i])return 0|i;n.charCodeToGlyphId[n.nextAvailableFontCharCode]=t;return n.nextAvailableFontCharCode++}const C=t.seacs;if(n&&C?.length){const e=i.fontMatrix||r,a=t.getCharset(),o=Object.create(null);for(let t in C){t|=0;const i=C[t],r=mi[i[2]],g=mi[i[3]],c=a.indexOf(r),h=a.indexOf(g);if(c<0||h<0)continue;const l={x:i[0]*e[0]+i[1]*e[2]+e[4],y:i[0]*e[1]+i[1]*e[3]+e[5]},Q=getCharCodes(s,t);if(Q)for(const e of Q){const t=n.charCodeToGlyphId,i=createCharCode(t,c),a=createCharCode(t,h);o[e]={baseFontCharCode:i,accentFontCharCode:a,accentOffset:l}}}i.seacMap=o}const h=i.fontMatrix?1/Math.max(...i.fontMatrix.slice(0,4).map(Math.abs)):1e3,l=new OpenTypeFileBuilder("OTTO");l.addTable("CFF ",t.data);l.addTable("OS/2",createOS2Table(i,o));l.addTable("cmap",createCmapTable(o,g,c));l.addTable("head","\0\0\0\0\0\0\0\0\0\0_<õ\0\0"+safeString16(h)+"\0\0\0\0ž\v~'\0\0\0\0ž\v~'\0\0"+safeString16(i.descent)+"ÿ"+safeString16(i.ascent)+string16(i.italicAngle?2:0)+"\0\0\0\0\0\0\0");l.addTable("hhea","\0\0\0"+safeString16(i.ascent)+safeString16(i.descent)+"\0\0ÿÿ\0\0\0\0\0\0"+safeString16(i.capHeight)+safeString16(Math.tan(i.italicAngle)*i.xHeight)+"\0\0\0\0\0\0\0\0\0\0\0\0"+string16(c));l.addTable("hmtx",function fontFieldsHmtx(){const e=t.charstrings,i=t.cff?t.cff.widths:null;let a="\0\0\0\0";for(let t=1,r=c;t=65520&&e<=65535?0:e>=62976&&e<=63743?Hi()[e]||e:173===e?45:e}(i)}this.isType3Font&&(r=i);let C=null;if(this.seacMap?.[e]){c=!0;const t=this.seacMap[e];i=t.baseFontCharCode;C={fontChar:String.fromCodePoint(t.accentFontCharCode),offset:t.accentOffset}}let h="";"number"==typeof i&&(i<=1114111?h=String.fromCodePoint(i):warn(`charToGlyph - invalid fontCharCode: ${i}`));s=new fonts_Glyph(e,h,g,C,a,o,r,t,c);return this._glyphCache[e]=s}charsToGlyphs(e){let t=this._charsCache[e];if(t)return t;t=[];if(this.cMap){const i=Object.create(null),a=e.length;let r=0;for(;rt.length%2==1,a=this.toUnicode instanceof IdentityToUnicodeMap?e=>this.toUnicode.charCodeOf(e):e=>this.toUnicode.charCodeOf(String.fromCodePoint(e));for(let r=0,s=e.length;r55295&&(s<57344||s>65533)&&r++;if(this.toUnicode){const e=a(s);if(-1!==e){if(hasCurrentBufErrors()){t.push(i.join(""));i.length=0}for(let t=(this.cMap?this.cMap.getCharCodeLength(e):1)-1;t>=0;t--)i.push(String.fromCharCode(e>>8*t&255));continue}}if(!hasCurrentBufErrors()){t.push(i.join(""));i.length=0}i.push(String.fromCodePoint(s))}t.push(i.join(""));return t}}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}}}const da=2,fa=3,pa=4,ma=5,ya=6,wa=7;class Pattern{constructor(){unreachable("Cannot initialize Pattern.")}static parseShading(e,t,i,a,r){const s=e instanceof BaseStream?e.dict:e,n=s.get("ShadingType");try{switch(n){case da:case fa:return new RadialAxialShading(s,t,i,a,r);case pa:case ma:case ya:case wa:return new MeshShading(e,t,i,a,r);default:throw new FormatError("Unsupported ShadingType: "+n)}}catch(e){if(e instanceof MissingDataException)throw e;warn(e);return new DummyShading}}}class BaseShading{static SMALL_NUMBER=1e-6;constructor(){this.constructor===BaseShading&&unreachable("Cannot initialize BaseShading.")}getIR(){unreachable("Abstract method `getIR` called.")}}class RadialAxialShading extends BaseShading{constructor(e,t,i,a,r){super();this.shadingType=e.get("ShadingType");let s=0;this.shadingType===da?s=4:this.shadingType===fa&&(s=6);this.coordsArr=e.getArray("Coords");if(!isNumberArray(this.coordsArr,s))throw new FormatError("RadialAxialShading: Invalid /Coords array.");const n=ColorSpace.parse({cs:e.getRaw("CS")||e.getRaw("ColorSpace"),xref:t,resources:i,pdfFunctionFactory:a,localColorSpaceCache:r});this.bbox=lookupNormalRect(e.getArray("BBox"),null);let o=0,g=1;const c=e.getArray("Domain");isNumberArray(c,2)&&([o,g]=c);let C=!1,h=!1;const l=e.getArray("Extend");(function isBooleanArray(e,t){return Array.isArray(e)&&(null===t||e.length===t)&&e.every((e=>"boolean"==typeof e))})(l,2)&&([C,h]=l);if(!(this.shadingType!==fa||C&&h)){const[e,t,i,a,r,s]=this.coordsArr,n=Math.hypot(e-a,t-r);i<=s+n&&s<=i+n&&warn("Unsupported radial gradient.")}this.extendStart=C;this.extendEnd=h;const Q=e.getRaw("Function"),E=a.createFromArray(Q),u=(g-o)/840,d=this.colorStops=[];if(o>=g||u<=0){info("Bad shading domain.");return}const f=new Float32Array(n.numComps),p=new Float32Array(1);let m,y=0;p[0]=o;E(p,0,f,0);let w=n.getRgb(f,0);const b=Util.makeHexColor(w[0],w[1],w[2]);d.push([0,b]);let D=1;p[0]=o+u;E(p,0,f,0);let S=n.getRgb(f,0),k=S[0]-w[0]+1,R=S[1]-w[1]+1,N=S[2]-w[2]+1,G=S[0]-w[0]-1,x=S[1]-w[1]-1,U=S[2]-w[2]-1;for(let e=2;e<840;e++){p[0]=o+e*u;E(p,0,f,0);m=n.getRgb(f,0);const t=e-y;k=Math.min(k,(m[0]-w[0]+1)/t);R=Math.min(R,(m[1]-w[1]+1)/t);N=Math.min(N,(m[2]-w[2]+1)/t);G=Math.max(G,(m[0]-w[0]-1)/t);x=Math.max(x,(m[1]-w[1]-1)/t);U=Math.max(U,(m[2]-w[2]-1)/t);if(!(G<=k&&x<=R&&U<=N)){const e=Util.makeHexColor(S[0],S[1],S[2]);d.push([D/840,e]);k=m[0]-S[0]+1;R=m[1]-S[1]+1;N=m[2]-S[2]+1;G=m[0]-S[0]-1;x=m[1]-S[1]-1;U=m[2]-S[2]-1;y=D;w=S}D=e;S=m}const M=Util.makeHexColor(S[0],S[1],S[2]);d.push([1,M]);let L="transparent";if(e.has("Background")){m=n.getRgb(e.get("Background"),0);L=Util.makeHexColor(m[0],m[1],m[2])}if(!C){d.unshift([0,L]);d[1][0]+=BaseShading.SMALL_NUMBER}if(!h){d.at(-1)[0]-=BaseShading.SMALL_NUMBER;d.push([1,L])}this.colorStops=d}getIR(){const{coordsArr:e,shadingType:t}=this;let i,a,r,s,n;if(t===da){a=[e[0],e[1]];r=[e[2],e[3]];s=null;n=null;i="axial"}else if(t===fa){a=[e[0],e[1]];r=[e[3],e[4]];s=e[2];n=e[5];i="radial"}else unreachable(`getPattern type unknown: ${t}`);return["RadialAxial",i,this.bbox,this.colorStops,a,r,s,n]}}class MeshStreamReader{constructor(e,t){this.stream=e;this.context=t;this.buffer=0;this.bufferLength=0;const i=t.numComps;this.tmpCompsBuf=new Float32Array(i);const a=t.colorSpace.numComps;this.tmpCsCompsBuf=t.colorFn?new Float32Array(a):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,i=this.bufferLength;if(32===e){if(0===i)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<>i)>>>0}if(8===e&&0===i)return this.stream.getByte();for(;i>i}align(){this.buffer=0;this.bufferLength=0}readFlag(){return this.readBits(this.context.bitsPerFlag)}readCoordinate(){const e=this.context.bitsPerCoordinate,t=this.readBits(e),i=this.readBits(e),a=this.context.decode,r=e<32?1/((1<s?s:e;t=t>n?n:t;i=ie*r[t])):i;let n,o=-2;const g=[];for(const[e,t]of a.map(((e,t)=>[e,t])).sort((([e],[t])=>e-t)))if(-1!==e)if(e===o+1){n.push(s[t]);o+=1}else{o=e;n=[s[t]];g.push(e,n)}return g}(e),i=new Dict(null);i.set("BaseFont",Name.get(e));i.set("Type",Name.get("Font"));i.set("Subtype",Name.get("CIDFontType2"));i.set("Encoding",Name.get("Identity-H"));i.set("CIDToGIDMap",Name.get("Identity"));i.set("W",t);i.set("FirstChar",t[0]);i.set("LastChar",t.at(-2)+t.at(-1).length-1);const a=new Dict(null);i.set("FontDescriptor",a);const r=new Dict(null);r.set("Ordering","Identity");r.set("Registry","Adobe");r.set("Supplement",0);i.set("CIDSystemInfo",r);return i}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 FormatError(`Unexpected symbol: found ${this.token.type} expected ${e}.`)}parse(){this.nextToken();this.expect(hr.LBRACE);this.parseBlock();this.expect(hr.RBRACE);return this.operators}parseBlock(){for(;;)if(this.accept(hr.NUMBER))this.operators.push(this.prev.value);else if(this.accept(hr.OPERATOR))this.operators.push(this.prev.value);else{if(!this.accept(hr.LBRACE))return;this.parseCondition()}}parseCondition(){const e=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(hr.RBRACE);if(this.accept(hr.IF)){this.operators[e]=this.operators.length;this.operators[e+1]="jz"}else{if(!this.accept(hr.LBRACE))throw new FormatError("PS Function: error parsing conditional.");{const t=this.operators.length;this.operators.push(null,null);const i=this.operators.length;this.parseBlock();this.expect(hr.RBRACE);this.expect(hr.IFELSE);this.operators[t]=this.operators.length;this.operators[t+1]="j";this.operators[e]=i;this.operators[e+1]="jz"}}}}const hr={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5};class PostScriptToken{static get opCache(){return shadow(this,"opCache",Object.create(null))}constructor(e,t){this.type=e;this.value=t}static getOperator(e){return PostScriptToken.opCache[e]||=new PostScriptToken(hr.OPERATOR,e)}static get LBRACE(){return shadow(this,"LBRACE",new PostScriptToken(hr.LBRACE,"{"))}static get RBRACE(){return shadow(this,"RBRACE",new PostScriptToken(hr.RBRACE,"}"))}static get IF(){return shadow(this,"IF",new PostScriptToken(hr.IF,"IF"))}static get IFELSE(){return shadow(this,"IFELSE",new PostScriptToken(hr.IFELSE,"IFELSE"))}}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 yt;if(e)10!==t&&13!==t||(e=!1);else if(37===t)e=!0;else if(!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(hr.NUMBER,this.getNumber());case 123:this.nextChar();return PostScriptToken.LBRACE;case 125:this.nextChar();return PostScriptToken.RBRACE}const i=this.strBuf;i.length=0;i[0]=String.fromCharCode(t);for(;(t=this.nextChar())>=0&&(t>=65&&t<=90||t>=97&&t<=122);)i.push(String.fromCharCode(t));const a=i.join("");switch(a.toLowerCase()){case"if":return PostScriptToken.IF;case"ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(a)}}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 i=parseFloat(t.join(""));if(isNaN(i))throw new FormatError(`Invalid floating point number: ${i}`);return i}}class BaseLocalCache{constructor(e){this.constructor===BaseLocalCache&&unreachable("Cannot initialize BaseLocalCache.");this._onlyRefs=!0===e?.onlyRefs;if(!this._onlyRefs){this._nameRefMap=new Map;this._imageMap=new Map}this._imageCache=new RefSetCache}getByName(e){this._onlyRefs&&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,i){unreachable("Abstract method `set` called.")}}class LocalImageCache extends BaseLocalCache{set(e,t=null,i){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,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalColorSpaceCache extends BaseLocalCache{set(e=null,t=null,i){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,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalFunctionCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('LocalFunctionCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class LocalGStateCache extends BaseLocalCache{set(e,t=null,i){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,i)}else this._imageMap.has(e)||this._imageMap.set(e,i)}}class LocalTilingPatternCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('LocalTilingPatternCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class RegionalImageCache extends BaseLocalCache{constructor(e){super({onlyRefs:!0})}set(e=null,t,i){if(!t)throw new Error('RegionalImageCache.set - expected "ref" argument.');this._imageCache.has(t)||this._imageCache.put(t,i)}}class GlobalImageCache{static NUM_PAGES_THRESHOLD=2;static MIN_IMAGES_TO_CACHE=10;static MAX_BYTE_SIZE=5e7;#b=new RefSet;constructor(){this._refCache=new RefSetCache;this._imageCache=new RefSetCache}get#D(){let e=0;for(const t of this._imageCache)e+=t.byteSize;return e}get#F(){return!(this._imageCache.size+e)):null}class PDFFunction{static getSampleArray(e,t,i,a){let r,s,n=1;for(r=0,s=e.length;r>g)*C;c&=(1<i?e=i:e0&&(l=s[h-1]);let Q=a[1];h>1,c=r.length>>1,C=new PostScriptEvaluator(o),h=Object.create(null);let l=8192;const Q=new Float32Array(c);return function constructPostScriptFn(e,t,i,a){let r,n,o="";const E=Q;for(r=0;re&&(n=e)}d[r]=n}if(l>0){l--;h[o]=d}i.set(d,a)}}}function isPDFFunction(e){let t;if(e instanceof Dict)t=e;else{if(!(e instanceof BaseStream))return!1;t=e.dict}return t.has("FunctionType")}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 i=t.length-e,a=e-1;a>=0;a--,i++)t.push(t[i])}index(e){this.push(this.stack[this.stack.length-e-1])}roll(e,t){const i=this.stack,a=i.length-e,r=i.length-1,s=a+(t-Math.floor(t/e)*e);for(let e=a,t=r;e0?t.push(n<>o);break;case"ceiling":n=t.pop();t.push(Math.ceil(n));break;case"copy":n=t.pop();t.copy(n);break;case"cos":n=t.pop();t.push(Math.cos(n%360/180*Math.PI));break;case"cvi":n=0|t.pop();t.push(n);break;case"cvr":break;case"div":o=t.pop();n=t.pop();t.push(n/o);break;case"dup":t.copy(1);break;case"eq":o=t.pop();n=t.pop();t.push(n===o);break;case"exch":t.roll(2,1);break;case"exp":o=t.pop();n=t.pop();t.push(n**o);break;case"false":t.push(!1);break;case"floor":n=t.pop();t.push(Math.floor(n));break;case"ge":o=t.pop();n=t.pop();t.push(n>=o);break;case"gt":o=t.pop();n=t.pop();t.push(n>o);break;case"idiv":o=t.pop();n=t.pop();t.push(n/o|0);break;case"index":n=t.pop();t.index(n);break;case"le":o=t.pop();n=t.pop();t.push(n<=o);break;case"ln":n=t.pop();t.push(Math.log(n));break;case"log":n=t.pop();t.push(Math.log10(n));break;case"lt":o=t.pop();n=t.pop();t.push(n=t?new AstLiteral(t):e.max<=t?e:new AstMin(e,t)}class PostScriptCompiler{compile(e,t,i){const a=[],r=[],s=t.length>>1,n=i.length>>1;let o,g,c,C,h,l,Q,E,u=0;for(let e=0;et.min){o.unshift("Math.max(",s,", ");o.push(")")}if(n4){a=!0;t=0}else{a=!1;t=1}const g=[];for(s=0;s=0&&"ET"===ur[e];--e)ur[e]="EN";for(let e=s+1;e0&&(t=ur[s-1]);let i=h;e+1E&&isOdd(E)&&(d=E)}for(E=u;E>=d;--E){let e=-1;for(s=0,n=g.length;s=0){reverseValues(Er,e,s);e=-1}}else e<0&&(e=s);e>=0&&reverseValues(Er,e,g.length)}for(s=0,n=Er.length;s"!==e||(Er[s]="")}return createBidiText(Er.join(""),a)}const dr={style:"normal",weight:"normal"},fr={style:"normal",weight:"bold"},pr={style:"italic",weight:"normal"},mr={style:"italic",weight:"bold"},yr=new Map([["Times-Roman",{local:["Times New Roman","Times-Roman","Times","Liberation Serif","Nimbus Roman","Nimbus Roman L","Tinos","Thorndale","TeX Gyre Termes","FreeSerif","Linux Libertine O","Libertinus Serif","DejaVu Serif","Bitstream Vera Serif","Ubuntu"],style:dr,ultimate:"serif"}],["Times-Bold",{alias:"Times-Roman",style:fr,ultimate:"serif"}],["Times-Italic",{alias:"Times-Roman",style:pr,ultimate:"serif"}],["Times-BoldItalic",{alias:"Times-Roman",style:mr,ultimate:"serif"}],["Helvetica",{local:["Helvetica","Helvetica Neue","Arial","Arial Nova","Liberation Sans","Arimo","Nimbus Sans","Nimbus Sans L","A030","TeX Gyre Heros","FreeSans","DejaVu Sans","Albany","Bitstream Vera Sans","Arial Unicode MS","Microsoft Sans Serif","Apple Symbols","Cantarell"],path:"LiberationSans-Regular.ttf",style:dr,ultimate:"sans-serif"}],["Helvetica-Bold",{alias:"Helvetica",path:"LiberationSans-Bold.ttf",style:fr,ultimate:"sans-serif"}],["Helvetica-Oblique",{alias:"Helvetica",path:"LiberationSans-Italic.ttf",style:pr,ultimate:"sans-serif"}],["Helvetica-BoldOblique",{alias:"Helvetica",path:"LiberationSans-BoldItalic.ttf",style:mr,ultimate:"sans-serif"}],["Courier",{local:["Courier","Courier New","Liberation Mono","Nimbus Mono","Nimbus Mono L","Cousine","Cumberland","TeX Gyre Cursor","FreeMono","Linux Libertine Mono O","Libertinus Mono"],style:dr,ultimate:"monospace"}],["Courier-Bold",{alias:"Courier",style:fr,ultimate:"monospace"}],["Courier-Oblique",{alias:"Courier",style:pr,ultimate:"monospace"}],["Courier-BoldOblique",{alias:"Courier",style:mr,ultimate:"monospace"}],["ArialBlack",{local:["Arial Black"],style:{style:"normal",weight:"900"},fallback:"Helvetica-Bold"}],["ArialBlack-Bold",{alias:"ArialBlack"}],["ArialBlack-Italic",{alias:"ArialBlack",style:{style:"italic",weight:"900"},fallback:"Helvetica-BoldOblique"}],["ArialBlack-BoldItalic",{alias:"ArialBlack-Italic"}],["ArialNarrow",{local:["Arial Narrow","Liberation Sans Narrow","Helvetica Condensed","Nimbus Sans Narrow","TeX Gyre Heros Cn"],style:dr,fallback:"Helvetica"}],["ArialNarrow-Bold",{alias:"ArialNarrow",style:fr,fallback:"Helvetica-Bold"}],["ArialNarrow-Italic",{alias:"ArialNarrow",style:pr,fallback:"Helvetica-Oblique"}],["ArialNarrow-BoldItalic",{alias:"ArialNarrow",style:mr,fallback:"Helvetica-BoldOblique"}],["Calibri",{local:["Calibri","Carlito"],style:dr,fallback:"Helvetica"}],["Calibri-Bold",{alias:"Calibri",style:fr,fallback:"Helvetica-Bold"}],["Calibri-Italic",{alias:"Calibri",style:pr,fallback:"Helvetica-Oblique"}],["Calibri-BoldItalic",{alias:"Calibri",style:mr,fallback:"Helvetica-BoldOblique"}],["Wingdings",{local:["Wingdings","URW Dingbats"],style:dr}],["Wingdings-Regular",{alias:"Wingdings"}],["Wingdings-Bold",{alias:"Wingdings"}]]),wr=new Map([["Arial-Black","ArialBlack"]]);function getFamilyName(e){const t=new Set(["thin","extralight","ultralight","demilight","semilight","light","book","regular","normal","medium","demibold","semibold","bold","extrabold","ultrabold","black","heavy","extrablack","ultrablack","roman","italic","oblique","ultracondensed","extracondensed","condensed","semicondensed","normal","semiexpanded","expanded","extraexpanded","ultraexpanded","bolditalic"]);return e.split(/[- ,+]+/g).filter((e=>!t.has(e.toLowerCase()))).join(" ")}function generateFont({alias:e,local:t,path:i,fallback:a,style:r,ultimate:s},n,o,g=!0,c=!0,C=""){const h={style:null,ultimate:null};if(t){const e=C?` ${C}`:"";for(const i of t)n.push(`local(${i}${e})`)}if(e){const t=yr.get(e),s=C||function getStyleToAppend(e){switch(e){case fr:return"Bold";case pr:return"Italic";case mr:return"Bold Italic";default:if("bold"===e?.weight)return"Bold";if("italic"===e?.style)return"Italic"}return""}(r);Object.assign(h,generateFont(t,n,o,g&&!a,c&&!i,s))}r&&(h.style=r);s&&(h.ultimate=s);if(g&&a){const e=yr.get(a),{ultimate:t}=generateFont(e,n,o,g,c&&!i,C);h.ultimate||=t}c&&i&&o&&n.push(`url(${o}${i})`);return h}function getFontSubstitution(e,t,i,a,r,s){if(a.startsWith("InvalidPDFjsFont_"))return null;"TrueType"!==s&&"Type1"!==s||!/^[A-Z]{6}\+/.test(a)||(a=a.slice(7));const n=a=normalizeFontName(a);let o=e.get(n);if(o)return o;let g=yr.get(a);if(!g)for(const[e,t]of wr)if(a.startsWith(e)){a=`${t}${a.substring(e.length)}`;g=yr.get(a);break}let c=!1;if(!g){g=yr.get(r);c=!0}const C=`${t.getDocId()}_s${t.createFontId()}`;if(!g){if(!validateFontName(a)){warn(`Cannot substitute the font because of its name: ${a}`);e.set(n,null);return null}const t=/bold/gi.test(a),i=/oblique|italic/gi.test(a),r=t&&i&&mr||t&&fr||i&&pr||dr;o={css:`"${getFamilyName(a)}",${C}`,guessFallback:!0,loadedName:C,baseFontName:a,src:`local(${a})`,style:r};e.set(n,o);return o}const h=[];c&&validateFontName(a)&&h.push(`local(${a})`);const{style:l,ultimate:Q}=generateFont(g,h,i),E=null===Q,u=E?"":`,${Q}`;o={css:`"${getFamilyName(a)}",${C}${u}`,guessFallback:E,loadedName:C,baseFontName:a,src:h.join(","),style:l};e.set(n,o);return o}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:i}=this;if(e>i||t>i)return!0;const a=e*t;if(this._hasMaxArea)return a>this.MAX_AREA;if(a(this.MAX_AREA=this._goodSquareLength**2)}static get MAX_DIM(){return shadow(this,"MAX_DIM",this._guessMax(2048,65537,0,1))}static get MAX_AREA(){this._hasMaxArea=!0;return 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;shadow(this,"MAX_AREA",e)}}static setMaxArea(e){this._hasMaxArea||(this.MAX_AREA=e>>2)}static _areGoodDims(e,t){try{const i=new OffscreenCanvas(e,t),a=i.getContext("2d");a.fillRect(0,0,1,1);const r=a.getImageData(0,0,1,1).data[3];i.width=i.height=1;return 0!==r}catch{return!1}}static _guessMax(e,t,i,a){for(;e+i+1>3,n=i+3&-4;if(i!==n){const e=new Uint8Array(n*t);let a=0;for(let s=0,o=t*i;s>>8;t[i++]=255&r}}}else{if(!ArrayBuffer.isView(e))throw new Error("Invalid data format, must be a string or TypedArray.");t=e.slice();i=t.byteLength}const a=i>>2,r=i-4*a,s=new Uint32Array(t.buffer,0,a);let n=0,o=0,g=this.h1,c=this.h2;const C=3432918353,h=461845907,l=11601,Q=13715;for(let e=0;e>>17;n=n*h&Dr|n*Q&Fr;g^=n;g=g<<13|g>>>19;g=5*g+3864292196}else{o=s[e];o=o*C&Dr|o*l&Fr;o=o<<15|o>>>17;o=o*h&Dr|o*Q&Fr;c^=o;c=c<<13|c>>>19;c=5*c+3864292196}n=0;switch(r){case 3:n^=t[4*a+2]<<16;case 2:n^=t[4*a+1]<<8;case 1:n^=t[4*a];n=n*C&Dr|n*l&Fr;n=n<<15|n>>>17;n=n*h&Dr|n*Q&Fr;1&a?g^=n:c^=n}this.h1=g;this.h2=c}hexdigest(){let e=this.h1,t=this.h2;e^=t>>>1;e=3981806797*e&Dr|36045*e&Fr;t=4283543511*t&Dr|(2950163797*(t<<16|e>>>16)&Dr)>>>16;e^=t>>>1;e=444984403*e&Dr|60499*e&Fr;t=3301882366*t&Dr|(3120437893*(t<<16|e>>>16)&Dr)>>>16;e^=t>>>1;return(e>>>0).toString(16).padStart(8,"0")+(t>>>0).toString(16).padStart(8,"0")}}function addState(e,t,i,a,r){let s=e;for(let e=0,i=t.length-1;e1e3){c=Math.max(c,l);Q+=h+2;l=0;h=0}C.push({transform:t,x:l,y:Q,w:i.width,h:i.height});l+=i.width+2;h=Math.max(h,i.height)}const E=Math.max(c,l)+1,u=Q+h+1,d=new Uint8Array(E*u*4),f=E<<2;for(let e=0;e=0;){t[s-4]=t[s];t[s-3]=t[s+1];t[s-2]=t[s+2];t[s-1]=t[s+3];t[s+i]=t[s+i-4];t[s+i+1]=t[s+i-3];t[s+i+2]=t[s+i-2];t[s+i+3]=t[s+i-1];s-=f}}const p={width:E,height:u};if(e.isOffscreenCanvasSupported){const e=new OffscreenCanvas(E,u);e.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(d.buffer),E,u),0,0);p.bitmap=e.transferToImageBitmap();p.data=null}else{p.kind=k;p.data=d}i.splice(s,4*g,At);a.splice(s,4*g,[p,C]);return s+1}));addState(Sr,[UA,LA,Ve,MA],null,(function iterateImageMaskGroup(e,t){const i=e.fnArray,a=(t-(e.iCurr-3))%4;switch(a){case 0:return i[t]===UA;case 1:return i[t]===LA;case 2:return i[t]===Ve;case 3:return i[t]===MA}throw new Error(`iterateImageMaskGroup - invalid pos: ${a}`)}),(function foundImageMaskGroup(e,t){const i=e.fnArray,a=e.argsArray,r=e.iCurr,s=r-3,n=r-2,o=r-1;let g=Math.floor((t-s)/4);if(g<10)return t-(t-s)%4;let c,C,h=!1;const l=a[o][0],Q=a[n][0],E=a[n][1],u=a[n][2],d=a[n][3];if(E===u){h=!0;c=n+4;let e=o+4;for(let t=1;t=4&&i[s-4]===i[n]&&i[s-3]===i[o]&&i[s-2]===i[g]&&i[s-1]===i[c]&&a[s-4][0]===C&&a[s-4][1]===h){l++;Q-=5}let E=Q+4;for(let e=1;e=i)break}a=(a||Sr)[e[t]];if(a&&!Array.isArray(a)){s.iCurr=t;t++;if(!a.checkFn||(0,a.checkFn)(s)){r=a;a=null}else a=null}else t++}this.state=a;this.match=r;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=[];this.optimizer=!t||e&E?new NullOptimizer(this):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===MA||e===te))&&this.flush()}addImageOps(e,t,i){void 0!==i&&this.addOp(ve,["OC",i]);this.addOp(e,t);void 0!==i&&this.addOp(Te,[])}addDependency(e){if(!this.dependencies.has(e)){this.dependencies.add(e);this.addOp(bA,[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,i=e.length;ta&&(e=a);return e}function resizeImageMask(e,t,i,a,r,s){const n=r*s;let o;o=t<=8?new Uint8Array(n):t<=16?new Uint16Array(n):new Uint32Array(n);const g=i/r,c=a/s;let C,h,l,Q,E=0;const u=new Uint16Array(r),d=i;for(C=0;C0&&Number.isInteger(i.height)&&i.height>0&&(i.width!==l||i.height!==Q)){warn("PDFImage - using the Width/Height of the image data, rather than the image dictionary.");l=i.width;Q=i.height}if(l<1||Q<1)throw new FormatError(`Invalid image width: ${l} or height: ${Q}`);this.width=l;this.height=Q;this.interpolate=c.get("I","Interpolate");this.imageMask=c.get("IM","ImageMask")||!1;this.matte=c.get("Matte")||!1;let E=i.bitsPerComponent;if(!E){E=c.get("BPC","BitsPerComponent");if(!E){if(!this.imageMask)throw new FormatError(`Bits per component missing in image: ${this.imageMask}`);E=1}}this.bpc=E;if(!this.imageMask){let r=c.getRaw("CS")||c.getRaw("ColorSpace");const s=!!r;if(s)this.jpxDecoderOptions?.smaskInData&&(r=Name.get("DeviceRGBA"));else if(this.jpxDecoderOptions)r=Name.get("DeviceRGBA");else switch(i.numComps){case 1:r=Name.get("DeviceGray");break;case 3:r=Name.get("DeviceRGB");break;case 4:r=Name.get("DeviceCMYK");break;default:throw new Error(`Images with ${i.numComps} color components not supported.`)}this.colorSpace=ColorSpace.parse({cs:r,xref:e,resources:a?t:null,pdfFunctionFactory:o,localColorSpaceCache:g});this.numComps=this.colorSpace.numComps;if(this.jpxDecoderOptions){this.jpxDecoderOptions.numComponents=s?this.numComp:0;this.jpxDecoderOptions.isIndexedColormap="Indexed"===this.colorSpace.name}}this.decode=c.getArray("D","Decode");this.needsDecode=!1;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode,E)||n&&!ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=!0;const e=(1<>3)*i,o=e.byteLength;let g,c;if(!a||r&&!(n===o))if(r){g=new Uint8Array(n);g.set(e);g.fill(255,o)}else g=new Uint8Array(e);else g=e;if(r)for(c=0;c>7&1;n[l+1]=h>>6&1;n[l+2]=h>>5&1;n[l+3]=h>>4&1;n[l+4]=h>>3&1;n[l+5]=h>>2&1;n[l+6]=h>>1&1;n[l+7]=1&h;l+=8}if(l>=1}}}}else{let i=0;h=0;for(l=0,C=s;l>a;r<0?r=0:r>c&&(r=c);n[l]=r;h&=(1<n[a+1]){t=255;break}}o[C]=t}}}if(o)for(C=0,l=3,h=t*a;C>3,C=t&&ImageResizer.needsToBeResized(i,a);if("DeviceRGBA"===this.colorSpace.name){r.kind=k;const e=r.data=await this.getImageBytes(o*n*4,{});return t?C?ImageResizer.createImage(r,!1):this.createBitmap(k,i,a,e):r}if(!e){let e;"DeviceGray"===this.colorSpace.name&&1===g?e=D:"DeviceRGB"!==this.colorSpace.name||8!==g||this.needsDecode||(e=S);if(e&&!this.smask&&!this.mask&&i===n&&a===o){const s=await this.getImageBytes(o*c,{});if(t)return C?ImageResizer.createImage({data:s,kind:e,width:i,height:a,interpolate:this.interpolate},this.needsDecode):this.createBitmap(e,n,o,s);r.kind=e;r.data=s;if(this.needsDecode){assert(e===D,"PDFImage.createImageData: The image must be grayscale.");const t=r.data;for(let e=0,i=t.length;e>3,n=await this.getImageBytes(a*s,{internal:!0}),o=this.getComponents(n);let g,c;if(1===r){c=i*a;if(this.needsDecode)for(g=0;g0&&t.args[0].count++}class TimeSlotManager{static TIME_SLOT_DURATION_MS=20;static CHECK_TIME_EVERY=100;constructor(){this.reset()}check(){if(++this.checkedh){const e="Image exceeded maximum allowed size and was removed.";if(this.options.ignoreErrors){warn(e);return}throw new Error(e)}let l;o.has("OC")&&(l=await this.parseMarkedContentProps(o.get("OC"),e));let Q,E;if(o.get("IM","ImageMask")||!1){const e=o.get("I","Interpolate"),i=c+7>>3,n=t.getBytes(i*C),h=o.getArray("D","Decode");if(this.parsingType3Font){Q=PDFImage.createRawMask({imgArray:n,width:c,height:C,imageIsFromDecodeStream:t instanceof DecodeStream,inverseDecode:h?.[0]>0,interpolate:e});Q.cached=!!r;E=[Q];a.addImageOps(Ve,E,l);if(r){const e={fn:Ve,args:E,optionalContent:l};s.set(r,g,e);g&&this._regionalImageCache.set(null,g,e)}return}Q=await PDFImage.createMask({imgArray:n,width:c,height:C,imageIsFromDecodeStream:t instanceof DecodeStream,inverseDecode:h?.[0]>0,interpolate:e,isOffscreenCanvasSupported:this.options.isOffscreenCanvasSupported});if(Q.isSingleOpaquePixel){a.addImageOps(it,[],l);if(r){const e={fn:it,args:[],optionalContent:l};s.set(r,g,e);g&&this._regionalImageCache.set(null,g,e)}return}const u=`mask_${this.idFactory.createObjId()}`;a.addDependency(u);Q.dataLen=Q.bitmap?Q.width*Q.height*4:Q.data.length;this._sendImgData(u,Q);E=[{data:u,width:Q.width,height:Q.height,interpolate:Q.interpolate,count:1}];a.addImageOps(Ve,E,l);if(r){const e={objId:u,fn:Ve,args:E,optionalContent:l};s.set(r,g,e);g&&this._regionalImageCache.set(null,g,e)}return}if(i&&c+C<200&&!o.has("SMask")&&!o.has("Mask")){try{const r=new PDFImage({xref:this.xref,res:e,image:t,isInline:i,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:n});Q=await r.createImageData(!0,!1);a.isOffscreenCanvasSupported=this.options.isOffscreenCanvasSupported;a.addImageOps($e,[Q],l)}catch(e){const t=`Unable to decode inline image: "${e}".`;if(!this.options.ignoreErrors)throw new Error(t);warn(t)}return}let u=`img_${this.idFactory.createObjId()}`,d=!1;if(this.parsingType3Font)u=`${this.idFactory.getDocId()}_type3_${u}`;else if(r&&g){d=this.globalImageCache.shouldCache(g,this.pageIndex);if(d){assert(!i,"Cannot cache an inline image globally.");u=`${this.idFactory.getDocId()}_${u}`}}a.addDependency(u);E=[u,c,C];a.addImageOps(ze,E,l);if(d){if(this.globalImageCache.hasDecodeFailed(g)){this.globalImageCache.setData(g,{objId:u,fn:ze,args:E,optionalContent:l,byteSize:0});this._sendImgData(u,null,d);return}if(c*C>25e4||o.has("SMask")||o.has("Mask")){const e=await this.handler.sendWithPromise("commonobj",[u,"CopyLocalImage",{imageRef:g}]);if(e){this.globalImageCache.setData(g,{objId:u,fn:ze,args:E,optionalContent:l,byteSize:0});this.globalImageCache.addByteSize(g,e);return}}}PDFImage.buildImage({xref:this.xref,res:e,image:t,isInline:i,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:n}).then((async e=>{Q=await e.createImageData(!1,this.options.isOffscreenCanvasSupported);Q.dataLen=Q.bitmap?Q.width*Q.height*4:Q.data.length;Q.ref=g;d&&this.globalImageCache.addByteSize(g,Q.dataLen);return this._sendImgData(u,Q,d)})).catch((e=>{warn(`Unable to decode image "${u}": "${e}".`);g&&this.globalImageCache.addDecodeFailed(g);return this._sendImgData(u,null,d)}));if(r){const e={objId:u,fn:ze,args:E,optionalContent:l};s.set(r,g,e);if(g){this._regionalImageCache.set(null,g,e);d&&this.globalImageCache.setData(g,{objId:u,fn:ze,args:E,optionalContent:l,byteSize:0})}}}handleSMask(e,t,i,a,r,s){const n=e.get("G"),o={subtype:e.get("S").name,backdrop:e.get("BC")},g=e.get("TR");if(isPDFFunction(g)){const e=this._pdfFunctionFactory.create(g),t=new Uint8Array(256),i=new Float32Array(1);for(let a=0;a<256;a++){i[0]=a/255;e(i,0,i,0);t[a]=255*i[0]|0}o.transferMap=t}return this.buildFormXObject(t,n,o,i,a,r.state.clone(),s)}handleTransferFunction(e){let t;if(Array.isArray(e))t=e;else{if(!isPDFFunction(e))return null;t=[e]}const i=[];let a=0,r=0;for(const e of t){const t=this.xref.fetchIfRef(e);a++;if(isName(t,"Identity")){i.push(null);continue}if(!isPDFFunction(t))return null;const s=this._pdfFunctionFactory.create(t),n=new Uint8Array(256),o=new Float32Array(1);for(let e=0;e<256;e++){o[0]=e/255;s(o,0,o,0);n[e]=255*o[0]|0}i.push(n);r++}return 1!==a&&4!==a||0===r?null:i}handleTilingType(e,t,i,a,r,s,n,o){const g=new OperatorList,c=Dict.merge({xref:this.xref,dictArray:[r.get("Resources"),i]});return this.getOperatorList({stream:a,task:n,resources:c,operatorList:g}).then((function(){const i=g.getIR(),a=getTilingPatternIR(i,r,t);s.addDependencies(g.dependencies);s.addOp(e,a);r.objId&&o.set(null,r.objId,{operatorListIR:i,dict:r})})).catch((e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`handleTilingType - ignoring pattern: "${e}".`)}}))}async handleSetFont(e,t,i,a,r,s,n=null,o=null){const g=t?.[0]instanceof Name?t[0].name:null;let c=await this.loadFont(g,i,e,n,o);if(c.font.isType3Font)try{await c.loadType3Data(this,e,r);a.addDependencies(c.type3Dependencies)}catch(e){c=new TranslatedFont({loadedName:"g_font_error",font:new ErrorFont(`Type3 font load error: ${e}`),dict:c.font,evaluatorOptions:this.options})}s.font=c.font;c.send(this.handler);return c.loadedName}handleText(e,t){const i=t.font,a=i.charsToGlyphs(e);if(i.data){(!!(t.textRenderingMode&b)||"Pattern"===t.fillColorSpace.name||i.disableFontFace||this.options.disableFontFace)&&PartialEvaluator.buildFontPaths(i,a,this.handler,this.options)}return a}ensureStateFont(e){if(e.font)return;const t=new FormatError("Missing setFont (Tf) operator before text rendering operator.");if(!this.options.ignoreErrors)throw t;warn(`ensureStateFont: "${t}".`)}async setGState({resources:e,gState:t,operatorList:i,cacheKey:a,task:r,stateManager:s,localGStateCache:n,localColorSpaceCache:o}){const g=t.objId;let c=!0;const C=[];let h=Promise.resolve();for(const a of t.getKeys()){const n=t.get(a);switch(a){case"Type":break;case"LW":case"LC":case"LJ":case"ML":case"D":case"RI":case"FL":case"CA":case"ca":C.push([a,n]);break;case"Font":c=!1;h=h.then((()=>this.handleSetFont(e,null,n[0],i,r,s.state).then((function(e){i.addDependency(e);C.push([a,[e,n[1]]])}))));break;case"BM":C.push([a,normalizeBlendMode(n)]);break;case"SMask":if(isName(n,"None")){C.push([a,!1]);break}if(n instanceof Dict){c=!1;h=h.then((()=>this.handleSMask(n,e,i,r,s,o)));C.push([a,!0])}else warn("Unsupported SMask type");break;case"TR":const t=this.handleTransferFunction(n);C.push([a,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":info("graphic state operator "+a);break;default:info("Unknown graphic state operator "+a)}}await h;C.length>0&&i.addOp(xA,[C]);c&&n.set(a,g,C)}loadFont(e,t,i,a=null,r=null){const errorFont=async()=>new TranslatedFont({loadedName:"g_font_error",font:new ErrorFont(`Font "${e}" is not available.`),dict:t,evaluatorOptions:this.options});let s;if(t)t instanceof Ref&&(s=t);else{const t=i.get("Font");t&&(s=t.getRaw(e))}if(s){if(this.type3FontRefs?.has(s))return errorFont();if(this.fontCache.has(s))return this.fontCache.get(s);try{t=this.xref.fetchIfRef(s)}catch(e){warn(`loadFont - lookup failed: "${e}".`)}}if(!(t instanceof Dict)){if(!this.options.ignoreErrors&&!this.parsingType3Font){warn(`Font "${e}" is not available.`);return errorFont()}warn(`Font "${e}" is not available -- attempting to fallback to a default font.`);t=a||PartialEvaluator.fallbackFontDict}if(t.cacheKey&&this.fontCache.has(t.cacheKey))return this.fontCache.get(t.cacheKey);const{promise:n,resolve:o}=Promise.withResolvers();let g;try{g=this.preEvaluateFont(t);g.cssFontInfo=r}catch(e){warn(`loadFont - preEvaluateFont failed: "${e}".`);return errorFont()}const{descriptor:c,hash:C}=g,h=s instanceof Ref;let l;if(C&&c instanceof Dict){const e=c.fontAliases||=Object.create(null);if(e[C]){const t=e[C].aliasRef;if(h&&t&&this.fontCache.has(t)){this.fontCache.putAlias(s,t);return this.fontCache.get(s)}}else e[C]={fontID:this.idFactory.createFontId()};h&&(e[C].aliasRef=s);l=e[C].fontID}else l=this.idFactory.createFontId();assert(l?.startsWith("f"),'The "fontID" must be (correctly) defined.');if(h)this.fontCache.put(s,n);else{t.cacheKey=`cacheKey_${l}`;this.fontCache.put(t.cacheKey,n)}t.loadedName=`${this.idFactory.getDocId()}_${l}`;this.translateFont(g).then((e=>{o(new TranslatedFont({loadedName:t.loadedName,font:e,dict:t,evaluatorOptions:this.options}))})).catch((e=>{warn(`loadFont - translateFont failed: "${e}".`);o(new TranslatedFont({loadedName:t.loadedName,font:new ErrorFont(e instanceof Error?e.message:e),dict:t,evaluatorOptions:this.options}))}));return n}buildPath(e,t,i,a=!1){const r=e.length-1;i||(i=[]);if(r<0||e.fnArray[r]!==at){if(a){warn(`Encountered path operator "${t}" inside of a text object.`);e.addOp(UA,null)}let r;switch(t){case qA:const e=i[0]+i[2],t=i[1]+i[3];r=[Math.min(i[0],e),Math.min(i[1],t),Math.max(i[0],e),Math.max(i[1],t)];break;case HA:case JA:r=[i[0],i[1],i[0],i[1]];break;default:r=[1/0,1/0,-1/0,-1/0]}e.addOp(at,[[t],i,r]);a&&e.addOp(MA,null)}else{const a=e.argsArray[r];a[0].push(t);a[1].push(...i);const s=a[2];switch(t){case qA:const e=i[0]+i[2],t=i[1]+i[3];s[0]=Math.min(s[0],i[0],e);s[1]=Math.min(s[1],i[1],t);s[2]=Math.max(s[2],i[0],e);s[3]=Math.max(s[3],i[1],t);break;case HA:case JA:s[0]=Math.min(s[0],i[0]);s[1]=Math.min(s[1],i[1]);s[2]=Math.max(s[2],i[0]);s[3]=Math.max(s[3],i[1])}}}parseColorSpace({cs:e,resources:t,localColorSpaceCache:i}){return ColorSpace.parseAsync({cs:e,xref:this.xref,resources:t,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:i}).catch((e=>{if(e instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`parseColorSpace - ignoring ColorSpace: "${e}".`);return null}throw e}))}parseShading({shading:e,resources:t,localColorSpaceCache:i,localShadingPatternCache:a}){let r,s=a.get(e);if(s)return s;try{r=Pattern.parseShading(e,this.xref,t,this._pdfFunctionFactory,i).getIR()}catch(t){if(t instanceof AbortException)return null;if(this.options.ignoreErrors){warn(`parseShading - ignoring shading: "${t}".`);a.set(e,null);return null}throw t}s=`pattern_${this.idFactory.createObjId()}`;this.parsingType3Font&&(s=`${this.idFactory.getDocId()}_type3_${s}`);a.set(e,s);this.parsingType3Font?this.handler.send("commonobj",[s,"Pattern",r]):this.handler.send("obj",[s,this.pageIndex,"Pattern",r]);return s}handleColorN(e,t,i,a,r,s,n,o,g,c){const C=i.pop();if(C instanceof Name){const h=r.getRaw(C.name),l=h instanceof Ref&&g.getByRef(h);if(l)try{const r=a.base?a.base.getRgb(i,0):null,s=getTilingPatternIR(l.operatorListIR,l.dict,r);e.addOp(t,s);return}catch{}const Q=this.xref.fetchIfRef(h);if(Q){const r=Q instanceof BaseStream?Q.dict:Q,C=r.get("PatternType");if(C===Rr){const o=a.base?a.base.getRgb(i,0):null;return this.handleTilingType(t,o,s,Q,r,e,n,g)}if(C===Nr){const i=r.get("Shading"),a=this.parseShading({shading:i,resources:s,localColorSpaceCache:o,localShadingPatternCache:c});if(a){const i=lookupMatrix(r.getArray("Matrix"),null);e.addOp(t,["Shading",a,i])}return}throw new FormatError(`Unknown PatternType: ${C}`)}}throw new FormatError(`Unknown PatternName: ${C}`)}_parseVisibilityExpression(e,t,i){if(++t>10){warn("Visibility expression is too deeply nested");return}const a=e.length,r=this.xref.fetchIfRef(e[0]);if(!(a<2)&&r instanceof Name){switch(r.name){case"And":case"Or":case"Not":i.push(r.name);break;default:warn(`Invalid operator ${r.name} in visibility expression`);return}for(let r=1;r0)return{type:"OCMD",expression:t}}const t=i.get("OCGs");if(Array.isArray(t)||t instanceof Dict){const e=[];if(Array.isArray(t))for(const i of t)e.push(i.toString());else e.push(t.objId);return{type:a,ids:e,policy:i.get("P")instanceof Name?i.get("P").name:null,expression:null}}if(t instanceof Ref)return{type:a,id:t.toString()}}return null}getOperatorList({stream:e,task:t,resources:i,operatorList:a,initialState:r=null,fallbackFontDict:s=null}){i||=Dict.empty;r||=new EvalState;if(!a)throw new Error('getOperatorList: missing "operatorList" parameter');const n=this,o=this.xref;let g=!1;const c=new LocalImageCache,C=new LocalColorSpaceCache,h=new LocalGStateCache,l=new LocalTilingPatternCache,Q=new Map,E=i.get("XObject")||Dict.empty,u=i.get("Pattern")||Dict.empty,d=new StateManager(r),f=new EvaluatorPreprocessor(e,o,d),p=new TimeSlotManager;function closePendingRestoreOPS(e){for(let e=0,t=f.savedStatesDepth;e0&&a.addOp(xA,[t]);e=null;continue}}next(new Promise((function(e,r){if(!k)throw new FormatError("GState must be referred to by name.");const s=i.get("ExtGState");if(!(s instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const o=s.get(S);if(!(o instanceof Dict))throw new FormatError("GState should be a dictionary.");n.setGState({resources:i,gState:o,operatorList:a,cacheKey:S,task:t,stateManager:d,localGStateCache:h,localColorSpaceCache:C}).then(e,r)})).catch((function(e){if(!(e instanceof AbortException)){if(!n.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring ExtGState: "${e}".`)}})));return;case HA:case JA:case YA:case vA:case TA:case KA:case qA:n.buildPath(a,r,e,g);continue;case He:case Je:case Ke:case qe:continue;case ve:if(!(e[0]instanceof Name)){warn(`Expected name for beginMarkedContentProps arg0=${e[0]}`);a.addOp(ve,["OC",null]);continue}if("OC"===e[0].name){next(n.parseMarkedContentProps(e[1],i).then((e=>{a.addOp(ve,["OC",e])})).catch((e=>{if(!(e instanceof AbortException)){if(!n.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring beginMarkedContentProps: "${e}".`);a.addOp(ve,["OC",null])}})));return}e=[e[0].name,e[1]instanceof Dict?e[1].get("MCID"):null];break;default:if(null!==e){for(w=0,b=e.length;w{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getOperatorList - ignoring errors during "${t.name}" task: "${e}".`);closePendingRestoreOPS()}}))}getTextContent({stream:e,task:t,resources:i,stateManager:s=null,includeMarkedContent:n=!1,sink:o,seenStyles:g=new Set,viewBox:c,lang:C=null,markedContentData:h=null,disableNormalization:l=!1,keepWhiteSpace:Q=!1}){i||=Dict.empty;s||=new StateManager(new TextState);n&&(h||={level:0});const E={items:[],styles:Object.create(null),lang:C},u={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},d=[" "," "];let f=0;function saveLastChar(e){const t=(f+1)%2,i=" "!==d[f]&&" "===d[t];d[f]=e;f=t;return!Q&&i}function shouldAddWhitepsace(){return!Q&&" "!==d[f]&&" "===d[(f+1)%2]}function resetLastChars(){d[0]=d[1]=" ";f=0}const p=this,m=this.xref,y=[];let w=null;const b=new LocalImageCache,D=new LocalGStateCache,S=new EvaluatorPreprocessor(e,m,s);let k;function pushWhitespace({width:e=0,height:t=0,transform:i=u.prevTransform,fontName:a=u.fontName}){E.items.push({str:" ",dir:"ltr",width:e,height:t,transform:i,fontName:a,hasEOL:!1})}function getCurrentTextTransform(){const e=k.font,t=[k.fontSize*k.textHScale,0,0,k.fontSize,0,k.textRise];if(e.isType3Font&&(k.fontSize<=1||e.isCharBBox)&&!isArrayEqual(k.fontMatrix,r)){const i=e.bbox[3]-e.bbox[1];i>0&&(t[3]*=i*k.fontMatrix[3])}return Util.transform(k.ctm,Util.transform(k.textMatrix,t))}function ensureTextContentItem(){if(u.initialized)return u;const{font:e,loadedName:t}=k;if(!g.has(t)){g.add(t);E.styles[t]={fontFamily:e.fallbackName,ascent:e.ascent,descent:e.descent,vertical:e.vertical};if(p.options.fontExtraProperties&&e.systemFontInfo){const i=E.styles[t];i.fontSubstitution=e.systemFontInfo.css;i.fontSubstitutionLoadedName=e.systemFontInfo.loadedName}}u.fontName=t;const i=u.transform=getCurrentTextTransform();if(e.vertical){u.width=u.totalWidth=Math.hypot(i[0],i[1]);u.height=u.totalHeight=0;u.vertical=!0}else{u.width=u.totalWidth=0;u.height=u.totalHeight=Math.hypot(i[2],i[3]);u.vertical=!1}const a=Math.hypot(k.textLineMatrix[0],k.textLineMatrix[1]),r=Math.hypot(k.ctm[0],k.ctm[1]);u.textAdvanceScale=r*a;const{fontSize:s}=k;u.trackingSpaceMin=.102*s;u.notASpace=.03*s;u.negativeSpaceMax=-.2*s;u.spaceInFlowMin=.102*s;u.spaceInFlowMax=.6*s;u.hasEOL=!1;u.initialized=!0;return u}function updateAdvanceScale(){if(!u.initialized)return;const e=Math.hypot(k.textLineMatrix[0],k.textLineMatrix[1]),t=Math.hypot(k.ctm[0],k.ctm[1])*e;if(t!==u.textAdvanceScale){if(u.vertical){u.totalHeight+=u.height*u.textAdvanceScale;u.height=0}else{u.totalWidth+=u.width*u.textAdvanceScale;u.width=0}u.textAdvanceScale=t}}function runBidiTransform(e){let t=e.str.join("");l||(t=function normalizeUnicode(e){if(!ct){ct=/([\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;Ct=new Map([["ſt","ſt"]])}return e.replaceAll(ct,((e,t,i)=>t?t.normalize("NFKC"):Ct.get(i)))}(t));const i=bidi(t,-1,e.vertical);return{str:i.str,dir:i.dir,width:Math.abs(e.totalWidth),height:Math.abs(e.totalHeight),transform:e.transform,fontName:e.fontName,hasEOL:e.hasEOL}}async function handleSetFont(e,a){const s=await p.loadFont(e,a,i);if(s.font.isType3Font)try{await s.loadType3Data(p,i,t)}catch{}k.loadedName=s.loadedName;k.font=s.font;k.fontMatrix=s.font.fontMatrix||r}function applyInverseRotation(e,t,i){const a=Math.hypot(i[0],i[1]);return[(i[0]*e+i[1]*t)/a,(i[2]*e+i[3]*t)/a]}function compareWithLastPosition(e){const t=getCurrentTextTransform();let i=t[4],a=t[5];if(k.font?.vertical){if(ic[2]||a+ec[3])return!1}else if(i+ec[2]||ac[3])return!1;if(!k.font||!u.prevTransform)return!0;let r=u.prevTransform[4],s=u.prevTransform[5];if(r===i&&s===a)return!0;let n=-1;t[0]&&0===t[1]&&0===t[2]?n=t[0]>0?0:180:t[1]&&0===t[0]&&0===t[3]&&(n=t[1]>0?90:270);switch(n){case 0:break;case 90:[i,a]=[a,i];[r,s]=[s,r];break;case 180:[i,a,r,s]=[-i,-a,-r,-s];break;case 270:[i,a]=[-a,-i];[r,s]=[-s,-r];break;default:[i,a]=applyInverseRotation(i,a,t);[r,s]=applyInverseRotation(r,s,u.prevTransform)}if(k.font.vertical){const e=(s-a)/u.textAdvanceScale,t=i-r,n=Math.sign(u.height);if(e.5*u.width){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(t)>u.width){appendEOL();return!0}e<=n*u.notASpace&&resetLastChars();if(e<=n*u.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({height:Math.abs(e)})}else u.height+=e;else if(!addFakeSpaces(e,u.prevTransform,n))if(0===u.str.length){resetLastChars();pushWhitespace({height:Math.abs(e)})}else u.height+=e;Math.abs(t)>.25*u.width&&flushTextContentItem();return!0}const o=(i-r)/u.textAdvanceScale,g=a-s,C=Math.sign(u.width);if(o.5*u.height){appendEOL();return!0}resetLastChars();flushTextContentItem();return!0}if(Math.abs(g)>u.height){appendEOL();return!0}o<=C*u.notASpace&&resetLastChars();if(o<=C*u.trackingSpaceMin)if(shouldAddWhitepsace()){resetLastChars();flushTextContentItem();pushWhitespace({width:Math.abs(o)})}else u.width+=o;else if(!addFakeSpaces(o,u.prevTransform,C))if(0===u.str.length){resetLastChars();pushWhitespace({width:Math.abs(o)})}else u.width+=o;Math.abs(g)>.25*u.height&&flushTextContentItem();return!0}function buildTextContentItem({chars:e,extraSpacing:t}){const i=k.font;if(!e){const e=k.charSpacing+t;e&&(i.vertical?k.translateTextMatrix(0,-e):k.translateTextMatrix(e*k.textHScale,0));Q&&compareWithLastPosition(0);return}const a=i.charsToGlyphs(e),r=k.fontMatrix[0]*k.fontSize;for(let e=0,s=a.length;e0){const e=y.join("");y.length=0;buildTextContentItem({chars:e,extraSpacing:0})}break;case le:if(!s.state.font){p.ensureStateFont(s.state);continue}buildTextContentItem({chars:f[0],extraSpacing:0});break;case Qe:if(!s.state.font){p.ensureStateFont(s.state);continue}k.carriageReturn();buildTextContentItem({chars:f[0],extraSpacing:0});break;case Ee:if(!s.state.font){p.ensureStateFont(s.state);continue}k.wordSpacing=f[0];k.charSpacing=f[1];k.carriageReturn();buildTextContentItem({chars:f[2],extraSpacing:0});break;case Le:flushTextContentItem();w||(w=i.get("XObject")||Dict.empty);var x=f[0]instanceof Name,U=f[0].name;if(x&&b.getByName(U))break;next(new Promise((function(e,a){if(!x)throw new FormatError("XObject must be referred to by name.");let r=w.getRaw(U);if(r instanceof Ref){if(b.getByRef(r)){e();return}if(p.globalImageCache.getData(r,p.pageIndex)){e();return}r=m.fetch(r)}if(!(r instanceof BaseStream))throw new FormatError("XObject should be a stream");const E=r.dict.get("Subtype");if(!(E instanceof Name))throw new FormatError("XObject should have a Name subtype");if("Form"!==E.name){b.set(U,r.dict.objId,!0);e();return}const u=s.state.clone(),d=new StateManager(u),f=lookupMatrix(r.dict.getArray("Matrix"),null);f&&d.transform(f);enqueueChunk();const y={enqueueInvoked:!1,enqueue(e,t){this.enqueueInvoked=!0;o.enqueue(e,t)},get desiredSize(){return o.desiredSize},get ready(){return o.ready}};p.getTextContent({stream:r,task:t,resources:r.dict.get("Resources")||i,stateManager:d,includeMarkedContent:n,sink:y,seenStyles:g,viewBox:c,lang:C,markedContentData:h,disableNormalization:l,keepWhiteSpace:Q}).then((function(){y.enqueueInvoked||b.set(U,r.dict.objId,!0);e()}),a)})).catch((function(e){if(!(e instanceof AbortException)){if(!p.options.ignoreErrors)throw e;warn(`getTextContent - ignoring XObject: "${e}".`)}})));return;case xA:x=f[0]instanceof Name;U=f[0].name;if(x&&D.getByName(U))break;next(new Promise((function(e,t){if(!x)throw new FormatError("GState must be referred to by name.");const a=i.get("ExtGState");if(!(a instanceof Dict))throw new FormatError("ExtGState should be a dictionary.");const r=a.get(U);if(!(r instanceof Dict))throw new FormatError("GState should be a dictionary.");const s=r.get("Font");if(s){flushTextContentItem();k.fontName=null;k.fontSize=s[1];handleSetFont(null,s[0]).then(e,t)}else{D.set(U,r.objId,!0);e()}})).catch((function(e){if(!(e instanceof AbortException)){if(!p.options.ignoreErrors)throw e;warn(`getTextContent - ignoring ExtGState: "${e}".`)}})));return;case Ye:flushTextContentItem();if(n){h.level++;E.items.push({type:"beginMarkedContent",tag:f[0]instanceof Name?f[0].name:null})}break;case ve:flushTextContentItem();if(n){h.level++;let e=null;f[1]instanceof Dict&&(e=f[1].get("MCID"));E.items.push({type:"beginMarkedContentProps",id:Number.isInteger(e)?`${p.idFactory.getPageObjId()}_mc${e}`:null,tag:f[0]instanceof Name?f[0].name:null})}break;case Te:flushTextContentItem();if(n){if(0===h.level)break;h.level--;E.items.push({type:"endMarkedContent"})}break;case MA:!e||e.font===k.font&&e.fontSize===k.fontSize&&e.fontName===k.fontName||flushTextContentItem()}if(E.items.length>=o.desiredSize){d=!0;break}}if(d)next(Gr);else{flushTextContentItem();enqueueChunk();e()}})).catch((e=>{if(!(e instanceof AbortException)){if(!this.options.ignoreErrors)throw e;warn(`getTextContent - ignoring errors during "${t.name}" task: "${e}".`);flushTextContentItem();enqueueChunk()}}))}async extractDataStructures(e,t){const i=this.xref;let a;const r=this.readToUnicode(t.toUnicode);if(t.composite){const i=e.get("CIDSystemInfo");i instanceof Dict&&(t.cidSystemInfo={registry:stringToPDFString(i.get("Registry")),ordering:stringToPDFString(i.get("Ordering")),supplement:i.get("Supplement")});try{const t=e.get("CIDToGIDMap");t instanceof BaseStream&&(a=t.getBytes())}catch(e){if(!this.options.ignoreErrors)throw e;warn(`extractDataStructures - ignoring CIDToGIDMap data: "${e}".`)}}const s=[];let n,o=null;if(e.has("Encoding")){n=e.get("Encoding");if(n instanceof Dict){o=n.get("BaseEncoding");o=o instanceof Name?o.name:null;if(n.has("Differences")){const e=n.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 Name))throw new FormatError(`Invalid entry in 'Differences' array: ${e}`);s[t++]=e.name}}}}else if(n instanceof Name)o=n.name;else{const e="Encoding is not a Name nor a Dict";if(!this.options.ignoreErrors)throw new FormatError(e);warn(e)}"MacRomanEncoding"!==o&&"MacExpertEncoding"!==o&&"WinAnsiEncoding"!==o&&(o=null)}const g=!t.file||t.isInternalFont,c=_i()[t.name];o&&g&&c&&(o=null);if(o)t.defaultEncoding=getEncoding(o);else{const e=!!(t.flags&Oi),i=!!(t.flags&Pi);n=mi;"TrueType"!==t.type||i||(n=yi);if(e||c){n=pi;g&&(/Symbol/i.test(t.name)?n=wi:/Dingbats/i.test(t.name)?n=bi:/Wingdings/i.test(t.name)&&(n=yi))}t.defaultEncoding=n}t.differences=s;t.baseEncodingName=o;t.hasEncoding=!!o||s.length>0;t.dict=e;t.toUnicode=await r;const C=await this.buildToUnicode(t);t.toUnicode=C;a&&(t.cidToGidMap=this.readCidToGidMap(a,C));return t}_simpleFontToUnicode(e,t=!1){assert(!e.composite,"Must be a simple font.");const i=[],a=e.defaultEncoding.slice(),r=e.baseEncodingName,s=e.differences;for(const e in s){const t=s[e];".notdef"!==t&&(a[e]=t)}const n=xi();for(const s in a){let o=a[s];if(""===o)continue;let g=n[o];if(void 0!==g){i[s]=String.fromCharCode(g);continue}let c=0;switch(o[0]){case"G":3===o.length&&(c=parseInt(o.substring(1),16));break;case"g":5===o.length&&(c=parseInt(o.substring(1),16));break;case"C":case"c":if(o.length>=3&&o.length<=4){const i=o.substring(1);if(t){c=parseInt(i,16);break}c=+i;if(Number.isNaN(c)&&Number.isInteger(parseInt(i,16)))return this._simpleFontToUnicode(e,!0)}break;case"u":g=getUnicodeForGlyph(o,n);-1!==g&&(c=g);break;default:switch(o){case"f_h":case"f_t":case"T_h":i[s]=o.replaceAll("_","");continue}}if(c>0&&c<=1114111&&Number.isInteger(c)){if(r&&c===+s){const e=getEncoding(r);if(e&&(o=e[s])){i[s]=String.fromCharCode(n[o]);continue}}i[s]=String.fromCodePoint(c)}}return i}async buildToUnicode(e){e.hasIncludedToUnicodeMap=e.toUnicode?.length>0;if(e.hasIncludedToUnicodeMap){!e.composite&&e.hasEncoding&&(e.fallbackToUnicode=this._simpleFontToUnicode(e));return e.toUnicode}if(!e.composite)return new ToUnicodeMap(this._simpleFontToUnicode(e));if(e.composite&&(e.cMap.builtInCMap&&!(e.cMap instanceof 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:i}=e.cidSystemInfo,a=Name.get(`${t}-${i}-UCS2`),r=await CMapFactory.create({encoding:a,fetchBuiltInCMap:this._fetchBuiltInCMapBound,useCMap:null}),s=[],n=[];e.cMap.forEach((function(e,t){if(t>65535)throw new FormatError("Max size of CID is 65,535");const i=r.lookup(t);if(i){n.length=0;for(let e=0,t=i.length;e>1;(0!==r||t.has(s))&&(i[s]=r)}return i}extractWidths(e,t,i){const a=this.xref;let r=[],s=0;const n=[];let o;if(i.composite){const t=e.get("DW");s="number"==typeof t?Math.ceil(t):1e3;const g=e.get("W");if(Array.isArray(g))for(let e=0,t=g.length;e{const t=g.get(e),r=new OperatorList;return a.getOperatorList({stream:t,task:i,resources:c,operatorList:r}).then((()=>{r.fnArray[0]===de&&this._removeType3ColorOperators(r,E);C[e]=r.getIR();for(const e of r.dependencies)n.add(e)})).catch((function(t){warn(`Type3 font resource "${e}" is not available.`);const i=new OperatorList;C[e]=i.getIR()}))}));this.type3Loaded=o.then((()=>{s.charProcOperatorList=C;if(this._bbox){s.isCharBBox=!0;s.bbox=this._bbox}}));return this.type3Loaded}_removeType3ColorOperators(e,t=NaN){const i=Util.normalizeRect(e.argsArray[0].slice(2)),a=i[2]-i[0],r=i[3]-i[1],s=Math.hypot(a,r);if(0===a||0===r){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],i[0]);this._bbox[1]=Math.min(this._bbox[1],i[1]);this._bbox[2]=Math.max(this._bbox[2],i[2]);this._bbox[3]=Math.max(this._bbox[3],i[3])}let n=0,o=e.length;for(;n=HA&&s<=zA;if(r.variableArgs)o>n&&info(`Command ${a}: expected [0, ${n}] args, but received ${o} args.`);else{if(o!==n){const e=this.nonProcessedArgs;for(;o>n;){e.push(t.shift());o--}for(;oEvaluatorPreprocessor.MAX_INVALID_PATH_OPS)throw new FormatError(`Invalid ${e}`);warn(`Skipping ${e}`);null!==t&&(t.length=0);continue}}this.preprocessCommand(s,t);e.fn=s;e.args=t;return!0}if(i===yt)return!1;if(null!==i){null===t&&(t=[]);t.push(i);if(t.length>33)throw new FormatError("Too many arguments")}}}preprocessCommand(e,t){switch(0|e){case UA:this.stateManager.save();break;case MA:this.stateManager.restore();break;case LA:this.stateManager.transform(t)}}}class DefaultAppearanceEvaluator extends EvaluatorPreprocessor{constructor(e){super(new 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:i,args:a}=e;switch(0|i){case ne:const[e,i]=a;e instanceof Name&&(t.fontName=e.name);"number"==typeof i&&i>0&&(t.fontSize=i);break;case ke:ColorSpace.singletons.rgb.getRgbItem(a,0,t.fontColor,0);break;case Fe:ColorSpace.singletons.gray.getRgbItem(a,0,t.fontColor,0);break;case Ne:ColorSpace.singletons.cmyk.getRgbItem(a,0,t.fontColor,0)}}}catch(e){warn(`parseDefaultAppearance - ignoring errors: "${e}".`)}return t}}function parseDefaultAppearance(e){return new DefaultAppearanceEvaluator(e).parse()}class AppearanceStreamEvaluator extends EvaluatorPreprocessor{constructor(e,t,i){super(e);this.stream=e;this.evaluatorOptions=t;this.xref=i;this.resources=e.dict?.get("Resources")}parse(){const e={fn:0,args:[]};let t={scaleFactor:1,fontSize:0,fontName:"",fontColor:new Uint8ClampedArray(3),fillColorSpace:ColorSpace.singletons.gray},i=!1;const a=[];try{for(;;){e.args.length=0;if(i||!this.read(e))break;const{fn:r,args:s}=e;switch(0|r){case UA:a.push({scaleFactor:t.scaleFactor,fontSize:t.fontSize,fontName:t.fontName,fontColor:t.fontColor.slice(),fillColorSpace:t.fillColorSpace});break;case MA:t=a.pop()||t;break;case Ce:t.scaleFactor*=Math.hypot(s[0],s[1]);break;case ne:const[e,r]=s;e instanceof Name&&(t.fontName=e.name);"number"==typeof r&&r>0&&(t.fontSize=r*t.scaleFactor);break;case pe:t.fillColorSpace=ColorSpace.parse({cs:s[0],xref:this.xref,resources:this.resources,pdfFunctionFactory:this._pdfFunctionFactory,localColorSpaceCache:this._localColorSpaceCache});break;case we:t.fillColorSpace.getRgbItem(s,0,t.fontColor,0);break;case ke:ColorSpace.singletons.rgb.getRgbItem(s,0,t.fontColor,0);break;case Fe:ColorSpace.singletons.gray.getRgbItem(s,0,t.fontColor,0);break;case Ne:ColorSpace.singletons.cmyk.getRgbItem(s,0,t.fontColor,0);break;case le:case Be:case Qe:case Ee:i=!0}}}catch(e){warn(`parseAppearanceStream - ignoring errors: "${e}".`)}this.stream.reset();delete t.scaleFactor;delete t.fillColorSpace;return t}get _localColorSpaceCache(){return shadow(this,"_localColorSpaceCache",new LocalColorSpaceCache)}get _pdfFunctionFactory(){return shadow(this,"_pdfFunctionFactory",new PDFFunctionFactory({xref:this.xref,isEvalSupported:this.evaluatorOptions.isEvalSupported}))}}function getPdfColor(e,t){if(e[0]===e[1]&&e[1]===e[2]){return`${numberToString(e[0]/255)} ${t?"g":"G"}`}return Array.from(e,(e=>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 i=new OffscreenCanvas(1,1);this.ctxMeasure=i.getContext("2d",{willReadFrequently:!0});FakeUnicodeFont._fontNameId||(FakeUnicodeFont._fontNameId=1);this.fontName=Name.get(`InvalidPDFjsFont_${t}_${FakeUnicodeFont._fontNameId++}`)}get fontDescriptorRef(){if(!FakeUnicodeFont._fontDescriptorRef){const e=new Dict(this.xref);e.set("Type",Name.get("FontDescriptor"));e.set("FontName",this.fontName);e.set("FontFamily","MyriadPro Regular");e.set("FontBBox",[0,0,0,0]);e.set("FontStretch",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 Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("CIDFontType0"));e.set("CIDToGIDMap",Name.get("Identity"));e.set("FirstChar",this.firstChar);e.set("LastChar",this.lastChar);e.set("FontDescriptor",this.fontDescriptorRef);e.set("DW",1e3);const t=[],i=[...this.widths.entries()].sort();let a=null,r=null;for(const[e,s]of i)if(a)if(e===a+r.length)r.push(s);else{t.push(a,r);a=e;r=[s]}else{a=e;r=[s]}a&&t.push(a,r);e.set("W",t);const s=new 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 Dict(this.xref);e.set("BaseFont",this.fontName);e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("Type0"));e.set("Encoding",Name.get("Identity-H"));e.set("DescendantFonts",[this.descendantFontRef]);e.set("ToUnicode",Name.get("Identity-H"));return this.xref.getNewPersistentRef(e)}get resources(){const e=new Dict(this.xref),t=new 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 i of e.split(/\r\n?|\n/))for(const e of i.split("")){const i=e.charCodeAt(0);if(this.widths.has(i))continue;const a=t.measureText(e),r=Math.ceil(a.width);this.widths.set(i,r);this.firstChar=Math.min(i,this.firstChar);this.lastChar=Math.max(i,this.lastChar)}return this.resources}static getFirstPositionInfo(e,t,i){const[a,r,o,g]=e;let c=o-a,C=g-r;t%180!=0&&([c,C]=[C,c]);const h=s*i;return{coords:[0,C+n*i-h],bbox:[0,0,c,C],matrix:0!==t?getRotationMatrix(t,C,h):void 0}}createAppearance(e,t,i,a,r,o){const g=this._createContext(),c=[];let C=-1/0;for(const t of e.split(/\r\n?|\n/)){c.push(t);const e=g.measureText(t).width;C=Math.max(C,e);for(const e of codePointIter(t)){const t=String.fromCodePoint(e);let i=this.widths.get(e);if(void 0===i){const a=g.measureText(t);i=Math.ceil(a.width);this.widths.set(e,i);this.firstChar=Math.min(e,this.firstChar);this.lastChar=Math.max(e,this.lastChar)}}}C*=a/1e3;const[h,l,Q,E]=t;let u=Q-h,d=E-l;i%180!=0&&([u,d]=[d,u]);let f=1;C>u&&(f=u/C);let p=1;const m=s*a,y=n*a,w=m*c.length;w>d&&(p=d/w);const b=a*Math.min(f,p),D=["q",`0 0 ${numberToString(u)} ${numberToString(d)} re W n`,"BT",`1 0 0 1 0 ${numberToString(d+y)} Tm 0 Tc ${getPdfColor(r,!0)}`,`/${this.fontName.name} ${numberToString(b)} Tf`],{resources:S}=this;if(1!==(o="number"==typeof o&&o>=0&&o<=1?o:1)){D.push("/R0 gs");const e=new Dict(this.xref),t=new Dict(this.xref);t.set("ca",o);t.set("CA",o);t.set("Type",Name.get("ExtGState"));e.set("R0",t);S.set("ExtGState",e)}const k=numberToString(m);for(const e of c)D.push(`0 -${k} Td <${stringToUTF16HexString(e)}> Tj`);D.push("ET","Q");const R=D.join("\n"),N=new Dict(this.xref);N.set("Subtype",Name.get("Form"));N.set("Type",Name.get("XObject"));N.set("BBox",[0,0,u,d]);N.set("Length",R.length);N.set("Resources",S);if(i){const e=getRotationMatrix(i,u,d);N.set("Matrix",e)}const G=new StringStream(R);G.dict=N;return G}}class NameOrNumberTree{constructor(e,t,i){this.constructor===NameOrNumberTree&&unreachable("Cannot initialize NameOrNumberTree.");this.root=e;this.xref=t;this._type=i}getAll(){const e=new Map;if(!this.root)return e;const t=this.xref,i=new RefSet;i.put(this.root);const a=[this.root];for(;a.length>0;){const r=t.fetchIfRef(a.shift());if(!(r instanceof Dict))continue;if(r.has("Kids")){const e=r.get("Kids");if(!Array.isArray(e))continue;for(const t of e){if(i.has(t))throw new FormatError(`Duplicate entry in "${this._type}" tree.`);a.push(t);i.put(t)}continue}const s=r.get(this._type);if(Array.isArray(s))for(let i=0,a=s.length;i10){warn(`Search depth limit reached for "${this._type}" tree.`);return null}const r=i.get("Kids");if(!Array.isArray(r))return null;let s=0,n=r.length-1;for(;s<=n;){const a=s+n>>1,o=t.fetchIfRef(r[a]),g=o.get("Limits");if(et.fetchIfRef(g[1]))){i=o;break}s=a+1}}if(s>n)return null}const r=i.get(this._type);if(Array.isArray(r)){let i=0,a=r.length-2;for(;i<=a;){const s=i+a>>1,n=s+(1&s),o=t.fetchIfRef(r[n]);if(eo))return t.fetchIfRef(r[n+1]);i=n+2}}}return null}}class NameTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Names")}}class NumberTree extends NameOrNumberTree{constructor(e,t){super(e,t,"Nums")}}function clearGlobalCaches(){!function clearPatternCaches(){ba=Object.create(null)}();!function clearPrimitiveCaches(){wt=Object.create(null);bt=Object.create(null);Dt=Object.create(null)}();!function clearUnicodeCaches(){vi.clear()}();JpxImage.cleanup()}function pickPlatformItem(e){return e instanceof Dict?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:null}class FileSpec{#S=!1;constructor(e,t,i=!1){if(e instanceof Dict){this.xref=t;this.root=e;e.has("FS")&&(this.fs=e.get("FS"));e.has("RF")&&warn("Related file specifications are not supported");i||(e.has("EF")?this.#S=!0:warn("Non-embedded file specifications are not supported"))}}get filename(){let e="";const t=pickPlatformItem(this.root);t&&"string"==typeof t&&(e=stringToPDFString(t).replaceAll("\\\\","\\").replaceAll("\\/","/").replaceAll("\\","/"));return shadow(this,"filename",e||"unnamed")}get content(){if(!this.#S)return null;this._contentRef||=pickPlatformItem(this.root?.get("EF"));let e=null;if(this._contentRef){const t=this.xref.fetchIfRef(this._contentRef);t instanceof BaseStream?e=t.getBytes():warn("Embedded file specification points to non-existing/invalid content")}else warn("Embedded file specification does not have any content");return e}get description(){let e="";const t=this.root?.get("Desc");t&&"string"==typeof t&&(e=stringToPDFString(t));return shadow(this,"description",e)}get serializable(){return{rawFilename:this.filename,filename:(e=this.filename,e.substring(e.lastIndexOf("/")+1)),content:this.content,description:this.description};var e}}const xr=0,Ur=-2,Mr=-3,Lr=-4,Hr=-5,Jr=-6,Yr=-9;function isWhitespace(e,t){const i=e[t];return" "===i||"\n"===i||"\r"===i||"\t"===i}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 i=[];let a=t;function skipWs(){for(;a"!==e[a]&&"/"!==e[a];)++a;const r=e.substring(t,a);skipWs();for(;a"!==e[a]&&"/"!==e[a]&&"?"!==e[a];){skipWs();let t="",r="";for(;a"!==e[i]&&"?"!==e[i]&&"/"!==e[i];)++i;const a=e.substring(t,i);!function skipWs(){for(;i"!==e[i+1]);)++i;return{name:a,value:e.substring(r,i),parsed:i-t}}parseXml(e){let t=0;for(;t",i);if(t<0){this.onError(Yr);return}this.onEndElement(e.substring(i,t));i=t+1;break;case"?":++i;const a=this._parseProcessingInstruction(e,i);if("?>"!==e.substring(i+a.parsed,i+a.parsed+2)){this.onError(Mr);return}this.onPi(a.name,a.value);i+=a.parsed+2;break;case"!":if("--"===e.substring(i+1,i+3)){t=e.indexOf("--\x3e",i+3);if(t<0){this.onError(Hr);return}this.onComment(e.substring(i+3,t));i=t+3}else if("[CDATA["===e.substring(i+1,i+8)){t=e.indexOf("]]>",i+8);if(t<0){this.onError(Ur);return}this.onCdata(e.substring(i+8,t));i=t+3}else{if("DOCTYPE"!==e.substring(i+1,i+8)){this.onError(Jr);return}{const a=e.indexOf("[",i+8);let r=!1;t=e.indexOf(">",i+8);if(t<0){this.onError(Lr);return}if(a>0&&t>a){t=e.indexOf("]>",i+8);if(t<0){this.onError(Lr);return}r=!0}const s=e.substring(i+8,t+(r?1:0));this.onDoctype(s);i=t+(r?2:1)}}break;default:const r=this._parseContent(e,i);if(null===r){this.onError(Jr);return}let s=!1;if("/>"===e.substring(i+r.parsed,i+r.parsed+2))s=!0;else if(">"!==e.substring(i+r.parsed,i+r.parsed+1)){this.onError(Yr);return}this.onBeginElement(r.name,r.attributes,s);i+=r.parsed+(s?2:1)}}else{for(;i0}searchNode(e,t){if(t>=e.length)return this;const i=e[t];if(i.name.startsWith("#")&&t0){a.push([r,0]);r=r.childNodes[0]}else{if(0===a.length)return null;for(;0!==a.length;){const[e,t]=a.pop(),i=t+1;if(i");for(const t of this.childNodes)t.dump(e);e.push(``)}else this.nodeValue?e.push(`>${encodeToXmlString(this.nodeValue)}`):e.push("/>")}else e.push(encodeToXmlString(this.nodeValue))}}class SimpleXMLParser extends XMLParserBase{constructor({hasAttributes:e=!1,lowerCaseName:t=!1}){super();this._currentFragment=null;this._stack=null;this._errorCode=xr;this._hasAttributes=e;this._lowerCaseName=t}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=xr;this.parseXml(e);if(this._errorCode!==xr)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onText(e){if(function isWhitespaceString(e){for(let t=0,i=e.length;t\\376\\377([^<]+)/g,(function(e,t){const i=t.replaceAll(/\\([0-3])([0-7])([0-7])/g,(function(e,t,i,a){return String.fromCharCode(64*t+8*i+1*a)})).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.`)})),a=[">"];for(let e=0,t=i.length;e=32&&t<127&&60!==t&&62!==t&&38!==t?a.push(String.fromCharCode(t)):a.push("&#x"+(65536+t).toString(16).substring(1)+";")}return a.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,i=this._getSequence(t)||[];this._metadataMap.set(e.nodeName,i.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}}}class DecryptStream extends DecodeStream{constructor(e,t,i){super(t);this.str=e;this.dict=e.dict;this.decrypt=i;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?.length>0;e=(0,this.decrypt)(e,!t);const i=this.bufferLength,a=i+e.length;this.ensureBuffer(a).set(e,i);this.bufferLength=a}}class ARCFourCipher{constructor(e){this.a=0;this.b=0;const t=new Uint8Array(256),i=e.length;for(let e=0;e<256;++e)t[e]=e;for(let a=0,r=0;a<256;++a){const s=t[a];r=r+s+e[a%i]&255;t[a]=t[r];t[r]=s}this.s=t}encryptBlock(e){let t=this.a,i=this.b;const a=this.s,r=e.length,s=new Uint8Array(r);for(let n=0;n>5&255;C[h++]=r>>13&255;C[h++]=r>>21&255;C[h++]=r>>>29&255;C[h++]=0;C[h++]=0;C[h++]=0;const E=new Int32Array(16);for(h=0;h>>32-o)|0;r=s}s=s+r|0;n=n+c|0;o=o+Q|0;g=g+u|0}return new Uint8Array([255&s,s>>8&255,s>>16&255,s>>>24&255,255&n,n>>8&255,n>>16&255,n>>>24&255,255&o,o>>8&255,o>>16&255,o>>>24&255,255&g,g>>8&255,g>>16&255,g>>>24&255])}}();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,i;if(32&e){i=this.low;t=this.high}else{t=this.low;i=this.high}e&=31;this.low=t>>>e|i<<32-e;this.high=i>>>e|t<<32-e}not(){this.high=~this.high;this.low=~this.low}add(e){const t=(this.low>>>0)+(e.low>>>0);let i=(this.high>>>0)+(e.high>>>0);t>4294967295&&(i+=1);this.low=0|t;this.high=0|i}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 Tr=function calculateSHA256Closure(){function rotr(e,t){return e>>>t|e<<32-t}function ch(e,t,i){return e&t^~e&i}function maj(e,t,i){return e&t^e&i^t&i}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,i,a){let r=1779033703,s=3144134277,n=1013904242,o=2773480762,g=1359893119,c=2600822924,C=528734635,h=1541459225;const l=64*Math.ceil((a+9)/64),Q=new Uint8Array(l);let E,u;for(E=0;E>>29&255;Q[E++]=a>>21&255;Q[E++]=a>>13&255;Q[E++]=a>>5&255;Q[E++]=a<<3&255;const f=new Uint32Array(64);for(E=0;E>>10)+f[u-7]+littleSigma(f[u-15])+f[u-16]|0;let t,i,a=r,l=s,d=n,m=o,y=g,w=c,b=C,D=h;for(u=0;u<64;++u){t=D+sigmaPrime(y)+ch(y,w,b)+e[u]+f[u];i=sigma(a)+maj(a,l,d);D=b;b=w;w=y;y=m+t|0;m=d;d=l;l=a;a=t+i|0}r=r+a|0;s=s+l|0;n=n+d|0;o=o+m|0;g=g+y|0;c=c+w|0;C=C+b|0;h=h+D|0}var p;return new Uint8Array([r>>24&255,r>>16&255,r>>8&255,255&r,s>>24&255,s>>16&255,s>>8&255,255&s,n>>24&255,n>>16&255,n>>8&255,255&n,o>>24&255,o>>16&255,o>>8&255,255&o,g>>24&255,g>>16&255,g>>8&255,255&g,c>>24&255,c>>16&255,c>>8&255,255&c,C>>24&255,C>>16&255,C>>8&255,255&C,h>>24&255,h>>16&255,h>>8&255,255&h])}}(),Kr=function calculateSHA512Closure(){function ch(e,t,i,a,r){e.assign(t);e.and(i);r.assign(t);r.not();r.and(a);e.xor(r)}function maj(e,t,i,a,r){e.assign(t);e.and(i);r.assign(t);r.and(a);e.xor(r);r.assign(i);r.and(a);e.xor(r)}function sigma(e,t,i){e.assign(t);e.rotateRight(28);i.assign(t);i.rotateRight(34);e.xor(i);i.assign(t);i.rotateRight(39);e.xor(i)}function sigmaPrime(e,t,i){e.assign(t);e.rotateRight(14);i.assign(t);i.rotateRight(18);e.xor(i);i.assign(t);i.rotateRight(41);e.xor(i)}function littleSigma(e,t,i){e.assign(t);e.rotateRight(1);i.assign(t);i.rotateRight(8);e.xor(i);i.assign(t);i.shiftRight(7);e.xor(i)}function littleSigmaPrime(e,t,i){e.assign(t);e.rotateRight(19);i.assign(t);i.rotateRight(61);e.xor(i);i.assign(t);i.shiftRight(6);e.xor(i)}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,i,a,r=!1){let s,n,o,g,c,C,h,l;if(r){s=new Word64(3418070365,3238371032);n=new Word64(1654270250,914150663);o=new Word64(2438529370,812702999);g=new Word64(355462360,4144912697);c=new Word64(1731405415,4290775857);C=new Word64(2394180231,1750603025);h=new Word64(3675008525,1694076839);l=new Word64(1203062813,3204075428)}else{s=new Word64(1779033703,4089235720);n=new Word64(3144134277,2227873595);o=new Word64(1013904242,4271175723);g=new Word64(2773480762,1595750129);c=new Word64(1359893119,2917565137);C=new Word64(2600822924,725511199);h=new Word64(528734635,4215389547);l=new Word64(1541459225,327033209)}const Q=128*Math.ceil((a+17)/128),E=new Uint8Array(Q);let u,d;for(u=0;u>>29&255;E[u++]=a>>21&255;E[u++]=a>>13&255;E[u++]=a>>5&255;E[u++]=a<<3&255;const p=new Array(80);for(u=0;u<80;u++)p[u]=new Word64(0,0);let m=new Word64(0,0),y=new Word64(0,0),w=new Word64(0,0),b=new Word64(0,0),D=new Word64(0,0),S=new Word64(0,0),k=new Word64(0,0),R=new Word64(0,0);const N=new Word64(0,0),G=new Word64(0,0),x=new Word64(0,0),U=new Word64(0,0);let M,L;for(u=0;u=1;--e){i=s[13];s[13]=s[9];s[9]=s[5];s[5]=s[1];s[1]=i;i=s[14];a=s[10];s[14]=s[6];s[10]=s[2];s[6]=i;s[2]=a;i=s[15];a=s[11];r=s[7];s[15]=s[3];s[11]=i;s[7]=a;s[3]=r;for(let e=0;e<16;++e)s[e]=this._inv_s[s[e]];for(let i=0,a=16*e;i<16;++i,++a)s[i]^=t[a];for(let e=0;e<16;e+=4){const t=this._mix[s[e]],a=this._mix[s[e+1]],r=this._mix[s[e+2]],n=this._mix[s[e+3]];i=t^a>>>8^a<<24^r>>>16^r<<16^n>>>24^n<<8;s[e]=i>>>24&255;s[e+1]=i>>16&255;s[e+2]=i>>8&255;s[e+3]=255&i}}i=s[13];s[13]=s[9];s[9]=s[5];s[5]=s[1];s[1]=i;i=s[14];a=s[10];s[14]=s[6];s[10]=s[2];s[6]=i;s[2]=a;i=s[15];a=s[11];r=s[7];s[15]=s[3];s[11]=i;s[7]=a;s[3]=r;for(let e=0;e<16;++e){s[e]=this._inv_s[s[e]];s[e]^=t[e]}return s}_encrypt(e,t){const i=this._s;let a,r,s;const n=new Uint8Array(16);n.set(e);for(let e=0;e<16;++e)n[e]^=t[e];for(let e=1;e=a;--i)if(e[i]!==t){t=0;break}o-=t;s[s.length-1]=e.subarray(0,16-t)}}const g=new Uint8Array(o);for(let e=0,t=0,i=s.length;e=256&&(o=255&(27^o))}for(let t=0;t<4;++t){i[e]=a^=i[e-32];e++;i[e]=r^=i[e-32];e++;i[e]=s^=i[e-32];e++;i[e]=n^=i[e-32];e++}}return i}}class PDF17{checkOwnerPassword(e,t,i,a){const r=new Uint8Array(e.length+56);r.set(e,0);r.set(t,e.length);r.set(i,e.length+t.length);return isArrayEqual(Tr(r,0,r.length),a)}checkUserPassword(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);return isArrayEqual(Tr(a,0,a.length),i)}getOwnerKey(e,t,i,a){const r=new Uint8Array(e.length+56);r.set(e,0);r.set(t,e.length);r.set(i,e.length+t.length);const s=Tr(r,0,r.length);return new AES256Cipher(s).decryptBlock(a,!1,new Uint8Array(16))}getUserKey(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);const r=Tr(a,0,a.length);return new AES256Cipher(r).decryptBlock(i,!1,new Uint8Array(16))}}class PDF20{_hash(e,t,i){let a=Tr(t,0,t.length).subarray(0,32),r=[0],s=0;for(;s<64||r.at(-1)>s-32;){const t=e.length+a.length+i.length,c=new Uint8Array(t);let C=0;c.set(e,C);C+=e.length;c.set(a,C);C+=a.length;c.set(i,C);const h=new Uint8Array(64*t);for(let e=0,i=0;e<64;e++,i+=t)h.set(c,i);r=new AES128Cipher(a.subarray(0,16)).encrypt(h,a.subarray(16,32));const l=r.slice(0,16).reduce(((e,t)=>e+t),0)%3;0===l?a=Tr(r,0,r.length):1===l?a=(n=r,o=0,g=r.length,Kr(n,o,g,!0)):2===l&&(a=Kr(r,0,r.length));s++}var n,o,g;return a.subarray(0,32)}checkOwnerPassword(e,t,i,a){const r=new Uint8Array(e.length+56);r.set(e,0);r.set(t,e.length);r.set(i,e.length+t.length);return isArrayEqual(this._hash(e,r,i),a)}checkUserPassword(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);return isArrayEqual(this._hash(e,a,[]),i)}getOwnerKey(e,t,i,a){const r=new Uint8Array(e.length+56);r.set(e,0);r.set(t,e.length);r.set(i,e.length+t.length);const s=this._hash(e,r,i);return new AES256Cipher(s).decryptBlock(a,!1,new Uint8Array(16))}getUserKey(e,t,i){const a=new Uint8Array(e.length+8);a.set(e,0);a.set(t,e.length);const r=this._hash(e,a,[]);return new AES256Cipher(r).decryptBlock(i,!1,new Uint8Array(16))}}class CipherTransform{constructor(e,t){this.StringCipherConstructor=e;this.StreamCipherConstructor=t}createStream(e,t){const i=new this.StreamCipherConstructor;return new DecryptStream(e,t,(function cipherTransformDecryptStream(e,t){return i.decryptBlock(e,t)}))}decryptString(e){const t=new this.StringCipherConstructor;let i=stringToBytes(e);i=t.decryptBlock(i,!0);return bytesToString(i)}encryptString(e){const t=new this.StringCipherConstructor;if(t instanceof AESBaseCipher){const i=16-e.length%16;e+=String.fromCharCode(i).repeat(i);const a=new Uint8Array(16);if("undefined"!=typeof crypto)crypto.getRandomValues(a);else for(let e=0;e<16;e++)a[e]=Math.floor(256*Math.random());let r=stringToBytes(e);r=t.encrypt(r,a);const s=new Uint8Array(16+r.length);s.set(a);s.set(r,16);return bytesToString(s)}let i=stringToBytes(e);i=t.encrypt(i);return bytesToString(i)}}class CipherTransformFactory{static#k=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]);#R(e,t,i,a,r,s,n,o,g,c,C,h){if(t){const e=Math.min(127,t.length);t=t.subarray(0,e)}else t=[];const l=6===e?new PDF20:new PDF17;return l.checkUserPassword(t,o,n)?l.getUserKey(t,g,C):t.length&&l.checkOwnerPassword(t,a,s,i)?l.getOwnerKey(t,r,s,c):null}#N(e,t,i,a,r,s,n,o){const g=40+i.length+e.length,c=new Uint8Array(g);let C,h,l=0;if(t){h=Math.min(32,t.length);for(;l>8&255;c[l++]=r>>16&255;c[l++]=r>>>24&255;for(C=0,h=e.length;C=4&&!o){c[l++]=255;c[l++]=255;c[l++]=255;c[l++]=255}let Q=vr(c,0,l);const E=n>>3;if(s>=3)for(C=0;C<50;++C)Q=vr(Q,0,E);const u=Q.subarray(0,E);let d,f;if(s>=3){for(l=0;l<32;++l)c[l]=CipherTransformFactory.#k[l];for(C=0,h=e.length;C>3;if(i>=3)for(o=0;o<50;++o)g=vr(g,0,g.length);let C,h;if(i>=3){h=t;const e=new Uint8Array(c);for(o=19;o>=0;o--){for(let t=0;t>8&255;r[n++]=e>>16&255;r[n++]=255&t;r[n++]=t>>8&255;if(a){r[n++]=115;r[n++]=65;r[n++]=108;r[n++]=84}return vr(r,0,n).subarray(0,Math.min(i.length+5,16))}#U(e,t,i,a,r){if(!(t instanceof Name))throw new FormatError("Invalid crypt filter name.");const s=this,n=e.get(t.name),o=n?.get("CFM");if(!o||"None"===o.name)return function(){return new NullCipher};if("V2"===o.name)return function(){return new ARCFourCipher(s.#x(i,a,r,!1))};if("AESV2"===o.name)return function(){return new AES128Cipher(s.#x(i,a,r,!0))};if("AESV3"===o.name)return function(){return new AES256Cipher(r)};throw new FormatError("Unknown crypto method")}constructor(e,t,i){const a=e.get("Filter");if(!isName(a,"Standard"))throw new FormatError("unknown encryption method");this.filterName=a.name;this.dict=e;const r=e.get("V");if(!Number.isInteger(r)||1!==r&&2!==r&&4!==r&&5!==r)throw new FormatError("unsupported encryption algorithm");this.algorithm=r;let s=e.get("Length");if(!s)if(r<=3)s=40;else{const t=e.get("CF"),i=e.get("StmF");if(t instanceof Dict&&i instanceof Name){t.suppressEncryption=!0;const e=t.get(i.name);s=e?.get("Length")||128;s<40&&(s<<=3)}}if(!Number.isInteger(s)||s<40||s%8!=0)throw new FormatError("invalid key length");const n=stringToBytes(e.get("O")),o=stringToBytes(e.get("U")),g=n.subarray(0,32),c=o.subarray(0,32),C=e.get("P"),h=e.get("R"),l=(4===r||5===r)&&!1!==e.get("EncryptMetadata");this.encryptMetadata=l;const Q=stringToBytes(t);let E,u;if(i){if(6===h)try{i=utf8StringToString(i)}catch{warn("CipherTransformFactory: Unable to convert UTF8 encoded password.")}E=stringToBytes(i)}if(5!==r)u=this.#N(Q,E,g,c,C,h,s,l);else{const t=n.subarray(32,40),i=n.subarray(40,48),a=o.subarray(0,48),r=o.subarray(32,40),s=o.subarray(40,48),C=stringToBytes(e.get("OE")),l=stringToBytes(e.get("UE")),Q=stringToBytes(e.get("Perms"));u=this.#R(h,E,g,t,i,a,c,r,s,C,l,Q)}if(!u&&!i)throw new PasswordException("No password given",rt);if(!u&&i){const e=this.#G(E,g,h,s);u=this.#N(Q,e,g,c,C,h,s,l)}if(!u)throw new PasswordException("Incorrect Password",st);this.encryptionKey=u;if(r>=4){const t=e.get("CF");t instanceof Dict&&(t.suppressEncryption=!0);this.cf=t;this.stmf=e.get("StmF")||Name.get("Identity");this.strf=e.get("StrF")||Name.get("Identity");this.eff=e.get("EFF")||this.stmf}}createCipherTransform(e,t){if(4===this.algorithm||5===this.algorithm)return new CipherTransform(this.#U(this.cf,this.strf,e,t,this.encryptionKey),this.#U(this.cf,this.stmf,e,t,this.encryptionKey));const i=this.#x(e,t,this.encryptionKey,!1),cipherConstructor=function(){return new ARCFourCipher(i)};return new CipherTransform(cipherConstructor,cipherConstructor)}}async function writeObject(e,t,i,{encrypt:a=null}){const r=a?.createCipherTransform(e.num,e.gen);i.push(`${e.num} ${e.gen} obj\n`);t instanceof Dict?await writeDict(t,i,r):t instanceof BaseStream?await writeStream(t,i,r):(Array.isArray(t)||ArrayBuffer.isView(t))&&await writeArray(t,i,r);i.push("\nendobj\n")}async function writeDict(e,t,i){t.push("<<");for(const a of e.getKeys()){t.push(` /${escapePDFName(a)} `);await writeValue(e.getRaw(a),t,i)}t.push(">>")}async function writeStream(e,t,i){let a=e.getBytes();const{dict:r}=e,[s,n]=await Promise.all([r.getAsync("Filter"),r.getAsync("DecodeParms")]),o=isName(Array.isArray(s)?await r.xref.fetchIfRefAsync(s[0]):s,"FlateDecode");if(a.length>=256||o)try{const e=new CompressionStream("deflate"),t=e.writable.getWriter();t.write(a);t.close();const i=await new Response(e.readable).arrayBuffer();a=new Uint8Array(i);let g,c;if(s){if(!o){g=Array.isArray(s)?[Name.get("FlateDecode"),...s]:[Name.get("FlateDecode"),s];n&&(c=Array.isArray(n)?[null,...n]:[null,n])}}else g=Name.get("FlateDecode");g&&r.set("Filter",g);c&&r.set("DecodeParms",c)}catch(e){info(`writeStream - cannot compress data: "${e}".`)}let g=bytesToString(a);i&&(g=i.encryptString(g));r.set("Length",g.length);await writeDict(r,t,i);t.push(" stream\n",g,"\nendstream")}async function writeArray(e,t,i){t.push("[");let a=!0;for(const r of e){a?a=!1:t.push(" ");await writeValue(r,t,i)}t.push("]")}async function writeValue(e,t,i){if(e instanceof Name)t.push(`/${escapePDFName(e.name)}`);else if(e instanceof Ref)t.push(`${e.num} ${e.gen} R`);else if(Array.isArray(e)||ArrayBuffer.isView(e))await writeArray(e,t,i);else if("string"==typeof e){i&&(e=i.encryptString(e));t.push(`(${escapeString(e)})`)}else"number"==typeof e?t.push(numberToString(e)):"boolean"==typeof e?t.push(e.toString()):e instanceof Dict?await writeDict(e,t,i):e instanceof BaseStream?await writeStream(e,t,i):null===e?t.push("null"):warn(`Unhandled value in writer: ${typeof e}, please file a bug.`)}function writeInt(e,t,i,a){for(let r=t+i-1;r>i-1;r--){a[r]=255&e;e>>=8}return i+t}function writeString(e,t,i){for(let a=0,r=e.length;a1&&(s=i.documentElement.searchNode([r.at(-1)],0));s?s.childNodes=Array.isArray(a)?a.map((e=>new SimpleDOMNode("value",e))):[new SimpleDOMNode("#text",a)]:warn(`Node not found for path: ${t}`)}const a=[];i.documentElement.dump(a);return a.join("")}(a.fetchIfRef(t).getString(),i)}const r=a.encrypt;if(r){e=r.createCipherTransform(t.num,t.gen).encryptString(e)}const s=`${t.num} ${t.gen} obj\n<< /Type /EmbeddedFile /Length ${e.length}>>\nstream\n`+e+"\nendstream\nendobj\n";i.push({ref:t,data:s})}function getIndexes(e){const t=[];for(const{ref:i}of e)i.num===t.at(-2)+t.at(-1)?t[t.length-1]+=1:t.push(i.num,1);return t}function computeIDs(e,t,i){if(Array.isArray(t.fileIds)&&t.fileIds.length>0){const a=function computeMD5(e,t){const i=Math.floor(Date.now()/1e3),a=t.filename||"",r=[i.toString(),a,e.toString()];let s=r.reduce(((e,t)=>e+t.length),0);for(const e of Object.values(t.info)){r.push(e);s+=e.length}const n=new Uint8Array(s);let o=0;for(const e of r){writeString(e,o,n);o+=e.length}return bytesToString(vr(n))}(e,t);i.set("ID",[t.fileIds[0],a])}}async function incrementalUpdate({originalData:e,xrefInfo:t,newRefs:i,xref:a=null,hasXfa:r=!1,xfaDatasetsRef:s=null,hasXfaDatasetsEntry:n=!1,needAppearances:o,acroFormRef:g=null,acroForm:c=null,xfaData:C=null,useXrefStream:h=!1}){await async function updateAcroform({xref:e,acroForm:t,acroFormRef:i,hasXfa:a,hasXfaDatasetsEntry:r,xfaDatasetsRef:s,needAppearances:n,newRefs:o}){!a||r||s||warn("XFA - Cannot save it");if(!n&&(!a||!s||r))return;const g=t.clone();if(a&&!r){const e=t.get("XFA").slice();e.splice(2,0,"datasets");e.splice(3,0,s);g.set("XFA",e)}n&&g.set("NeedAppearances",!0);const c=[];await writeObject(i,g,c,e);o.push({ref:i,data:c.join("")})}({xref:a,acroForm:c,acroFormRef:g,hasXfa:r,hasXfaDatasetsEntry:n,xfaDatasetsRef:s,needAppearances:o,newRefs:i});r&&updateXFA({xfaData:C,xfaDatasetsRef:s,newRefs:i,xref:a});const l=[];let Q=e.length;const E=e.at(-1);if(10!==E&&13!==E){l.push("\n");Q+=1}const u=function getTrailerDict(e,t,i){const a=new Dict(null);a.set("Prev",e.startXRef);const r=e.newRef;if(i){t.push({ref:r,data:""});a.set("Size",r.num+1);a.set("Type",Name.get("XRef"))}else a.set("Size",r.num);null!==e.rootRef&&a.set("Root",e.rootRef);null!==e.infoRef&&a.set("Info",e.infoRef);null!==e.encryptRef&&a.set("Encrypt",e.encryptRef);return a}(t,i,h);i=i.sort(((e,t)=>e.ref.num-t.ref.num));for(const{data:e}of i)null!==e&&l.push(e);await(h?async function getXRefStreamTable(e,t,i,a,r){const s=[];let n=0,o=0;for(const{ref:e,data:a}of i){let i;n=Math.max(n,t);if(null!==a){i=Math.min(e.gen,65535);s.push([1,t,i]);t+=a.length}else{i=Math.min(e.gen+1,65535);s.push([0,0,i])}o=Math.max(o,i)}a.set("Index",getIndexes(i));const g=[1,getSizeInBytes(n),getSizeInBytes(o)];a.set("W",g);computeIDs(t,e,a);const c=g.reduce(((e,t)=>e+t),0),C=new Uint8Array(c*s.length),h=new Stream(C);h.dict=a;let l=0;for(const[e,t,i]of s){l=writeInt(e,g[0],l,C);l=writeInt(t,g[1],l,C);l=writeInt(i,g[2],l,C)}await writeObject(e.newRef,h,r,{});r.push("startxref\n",t.toString(),"\n%%EOF\n")}(t,Q,i,u,l):async function getXRefTable(e,t,i,a,r){r.push("xref\n");const s=getIndexes(i);let n=0;for(const{ref:e,data:a}of i){if(e.num===s[n]){r.push(`${s[n]} ${s[n+1]}\n`);n+=2}if(null!==a){r.push(`${t.toString().padStart(10,"0")} ${Math.min(e.gen,65535).toString().padStart(5,"0")} n\r\n`);t+=a.length}else r.push(`0000000000 ${Math.min(e.gen+1,65535).toString().padStart(5,"0")} f\r\n`)}computeIDs(t,e,a);r.push("trailer\n");await writeDict(a,r);r.push("\nstartxref\n",t.toString(),"\n%%EOF\n")}(t,Q,i,u,l));const d=l.reduce(((e,t)=>e+t.length),e.length),f=new Uint8Array(d);f.set(e);let p=e.length;for(const e of l){writeString(e,p,f);p+=e.length}return f}const qr=1,Or=2,Pr=3,Wr=4,jr=5;class StructTreeRoot{constructor(e,t){this.dict=e;this.ref=t instanceof Ref?t:null;this.roleMap=new Map;this.structParentIds=null}init(){this.readRoleMap()}#M(e,t,i){if(!(e instanceof Ref)||t<0)return;this.structParentIds||=new RefSetCache;let a=this.structParentIds.get(e);if(!a){a=[];this.structParentIds.put(e,a)}a.push([t,i])}addAnnotationIdToPage(e,t){this.#M(e,t,Wr)}readRoleMap(){const e=this.dict.get("RoleMap");e instanceof Dict&&e.forEach(((e,t)=>{t instanceof Name&&this.roleMap.set(e,t.name)}))}static async canCreateStructureTree({catalogRef:e,pdfManager:t,newAnnotationsByPage:i}){if(!(e instanceof Ref)){warn("Cannot save the struct tree: no catalog reference.");return!1}let a=0,r=!0;for(const[e,s]of i){const{ref:i}=await t.getPage(e);if(!(i instanceof Ref)){warn(`Cannot save the struct tree: page ${e} has no ref.`);r=!0;break}for(const e of s)if(e.accessibilityData?.type){e.parentTreeId=a++;r=!1}}if(r){for(const e of i.values())for(const t of e)delete t.parentTreeId;return!1}return!0}static async createStructureTree({newAnnotationsByPage:e,xref:t,catalogRef:i,pdfManager:a,newRefs:r}){const s=a.catalog.cloneDict(),n=new RefSetCache;n.put(i,s);const o=t.getNewTemporaryRef();s.set("StructTreeRoot",o);const g=new Dict(t);g.set("Type",Name.get("StructTreeRoot"));const c=t.getNewTemporaryRef();g.set("ParentTree",c);const C=[];g.set("K",C);n.put(o,g);const h=new Dict(t),l=[];h.set("Nums",l);const Q=await this.#L({newAnnotationsByPage:e,structTreeRootRef:o,kids:C,nums:l,xref:t,pdfManager:a,cache:n});g.set("ParentTreeNextKey",Q);n.put(c,h);const E=[];for(const[e,i]of n.items()){E.length=0;await writeObject(e,i,E,t);r.push({ref:e,data:E.join("")})}}async canUpdateStructTree({pdfManager:e,xref:t,newAnnotationsByPage:i}){if(!this.ref){warn("Cannot update the struct tree: no root reference.");return!1}let a=this.dict.get("ParentTreeNextKey");if(!Number.isInteger(a)||a<0){warn("Cannot update the struct tree: invalid next key.");return!1}const r=this.dict.get("ParentTree");if(!(r instanceof Dict)){warn("Cannot update the struct tree: ParentTree isn't a dict.");return!1}const s=r.get("Nums");if(!Array.isArray(s)){warn("Cannot update the struct tree: nums isn't an array.");return!1}const n=new NumberTree(r,t);for(const t of i.keys()){const{pageDict:i}=await e.getPage(t);if(!i.has("StructParents"))continue;const a=i.get("StructParents");if(!Number.isInteger(a)||!Array.isArray(n.get(a))){warn(`Cannot save the struct tree: page ${t} has a wrong id.`);return!1}}let o=!0;for(const[t,r]of i){const{pageDict:i}=await e.getPage(t);StructTreeRoot.#H({elements:r,xref:this.dict.xref,pageDict:i,numberTree:n});for(const e of r)if(e.accessibilityData?.type){e.parentTreeId=a++;o=!1}}if(o){for(const e of i.values())for(const t of e){delete t.parentTreeId;delete t.structTreeParent}return!1}return!0}async updateStructureTree({newAnnotationsByPage:e,pdfManager:t,newRefs:i}){const a=this.dict.xref,r=this.dict.clone(),s=this.ref,n=new RefSetCache;n.put(s,r);let o,g=r.getRaw("ParentTree");if(g instanceof Ref)o=a.fetch(g);else{o=g;g=a.getNewTemporaryRef();r.set("ParentTree",g)}o=o.clone();n.put(g,o);let c=o.getRaw("Nums"),C=null;if(c instanceof Ref){C=c;c=a.fetch(C)}c=c.slice();C||o.set("Nums",c);const h=await StructTreeRoot.#L({newAnnotationsByPage:e,structTreeRootRef:s,kids:null,nums:c,xref:a,pdfManager:t,cache:n});r.set("ParentTreeNextKey",h);C&&n.put(C,c);const l=[];for(const[e,t]of n.items()){l.length=0;await writeObject(e,t,l,a);i.push({ref:e,data:l.join("")})}}static async#L({newAnnotationsByPage:e,structTreeRootRef:t,kids:i,nums:a,xref:r,pdfManager:s,cache:n}){const o=Name.get("OBJR");let g=-1/0;for(const[c,C]of e){const{ref:e}=await s.getPage(c),h=e instanceof Ref;for(const{accessibilityData:s,ref:c,parentTreeId:l,structTreeParent:Q}of C){if(!s?.type)continue;const{type:C,title:E,lang:u,alt:d,expanded:f,actualText:p}=s;g=Math.max(g,l);const m=r.getNewTemporaryRef(),y=new Dict(r);y.set("S",Name.get(C));E&&y.set("T",E);u&&y.set("Lang",u);d&&y.set("Alt",d);f&&y.set("E",f);p&&y.set("ActualText",p);await this.#J({structTreeParent:Q,tagDict:y,newTagRef:m,structTreeRootRef:t,fallbackKids:i,xref:r,cache:n});const w=new Dict(r);y.set("K",w);w.set("Type",o);h&&w.set("Pg",e);w.set("Obj",c);n.put(m,y);a.push(l,m)}}return g+1}static#H({elements:e,xref:t,pageDict:i,numberTree:a}){const r=new Map;for(const t of e)if(t.structTreeParentId){const e=parseInt(t.structTreeParentId.split("_mc")[1],10);let i=r.get(e);if(!i){i=[];r.set(e,i)}i.push(t)}const s=i.get("StructParents");if(!Number.isInteger(s))return;const n=a.get(s),updateElement=(e,i,a)=>{const s=r.get(e);if(s){const e=i.getRaw("P"),r=t.fetchIfRef(e);if(e instanceof Ref&&r instanceof Dict){const e={ref:a,dict:i};for(const t of s)t.structTreeParent=e}return!0}return!1};for(const e of n){if(!(e instanceof Ref))continue;const i=t.fetch(e),a=i.get("K");if(Number.isInteger(a))updateElement(a,i,e);else if(Array.isArray(a))for(let r of a){r=t.fetchIfRef(r);if(Number.isInteger(r)&&updateElement(r,i,e))break;if(!(r instanceof Dict))continue;if(!isName(r.get("Type"),"MCR"))break;const a=r.get("MCID");if(Number.isInteger(a)&&updateElement(a,i,e))break}}}static async#J({structTreeParent:e,tagDict:t,newTagRef:i,structTreeRootRef:a,fallbackKids:r,xref:s,cache:n}){let o,g=null;if(e){({ref:g}=e);o=e.dict.getRaw("P")||a}else o=a;t.set("P",o);const c=s.fetchIfRef(o);if(!c){r.push(i);return}let C=n.get(o);if(!C){C=c.clone();n.put(o,C)}const h=C.getRaw("K");let l=h instanceof Ref?n.get(h):null;if(!l){l=s.fetchIfRef(h);l=Array.isArray(l)?l.slice():[h];const e=s.getNewTemporaryRef();C.set("K",e);n.put(e,l)}const Q=l.indexOf(g);l.splice(Q>=0?Q+1:l.length,0,i)}}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 Name?e.name:"",{root:i}=this.tree;return i.roleMap.has(t)?i.roleMap.get(t):t}parseKids(){let e=null;const t=this.dict.getRaw("Pg");t instanceof Ref&&(e=t.toString());const i=this.dict.get("K");if(Array.isArray(i))for(const t of i){const i=this.parseKid(e,t);i&&this.kids.push(i)}else{const t=this.parseKid(e,i);t&&this.kids.push(t)}}parseKid(e,t){if(Number.isInteger(t))return this.tree.pageDict.objId!==e?null:new StructElement({type:qr,mcid:t,pageObjId:e});let i=null;t instanceof Ref?i=this.dict.xref.fetch(t):t instanceof Dict&&(i=t);if(!i)return null;const a=i.getRaw("Pg");a instanceof Ref&&(e=a.toString());const r=i.get("Type")instanceof Name?i.get("Type").name:null;if("MCR"===r){if(this.tree.pageDict.objId!==e)return null;const t=i.getRaw("Stm");return new StructElement({type:Or,refObjId:t instanceof Ref?t.toString():null,pageObjId:e,mcid:i.get("MCID")})}if("OBJR"===r){if(this.tree.pageDict.objId!==e)return null;const t=i.getRaw("Obj");return new StructElement({type:Pr,refObjId:t instanceof Ref?t.toString():null,pageObjId:e})}return new StructElement({type:jr,dict:i})}}class StructElement{constructor({type:e,dict:t=null,mcid:i=null,pageObjId:a=null,refObjId:r=null}){this.type=e;this.dict=t;this.mcid=i;this.pageObjId=a;this.refObjId=r;this.parentNode=null}}class StructTreePage{constructor(e,t){this.root=e;this.rootDict=e?e.dict:null;this.pageDict=t;this.nodes=[]}parse(e){if(!this.root||!this.rootDict)return;const t=this.rootDict.get("ParentTree");if(!t)return;const i=this.pageDict.get("StructParents"),a=e instanceof Ref&&this.root.structParentIds?.get(e);if(!Number.isInteger(i)&&!a)return;const r=new Map,s=new NumberTree(t,this.rootDict.xref);if(Number.isInteger(i)){const e=s.get(i);if(Array.isArray(e))for(const t of e)t instanceof Ref&&this.addNode(this.rootDict.xref.fetch(t),r)}if(a)for(const[e,t]of a){const i=s.get(e);if(i){const e=this.addNode(this.rootDict.xref.fetchIfRef(i),r);1===e?.kids?.length&&e.kids[0].type===Pr&&(e.kids[0].type=t)}}}addNode(e,t,i=0){if(i>40){warn("StructTree MAX_DEPTH reached.");return null}if(t.has(e))return t.get(e);const a=new StructElementNode(this,e);t.set(e,a);const r=e.get("P");if(!r||isName(r.get("Type"),"StructTreeRoot")){this.addTopLevelNode(e,a)||t.delete(e);return a}const s=this.addNode(r,t,i+1);if(!s)return a;let n=!1;for(const t of s.kids)if(t.type===jr&&t.dict===e){t.parentNode=a;n=!0}n||t.delete(e);return a}addTopLevelNode(e,t){const i=this.rootDict.get("K");if(!i)return!1;if(i instanceof Dict){if(i.objId!==e.objId)return!1;this.nodes[0]=t;return!0}if(!Array.isArray(i))return!0;let a=!1;for(let r=0;r40){warn("StructTree too deep to be fully serialized.");return}const a=Object.create(null);a.role=e.role;a.children=[];t.children.push(a);const r=e.dict.get("Alt");"string"==typeof r&&(a.alt=stringToPDFString(r));const s=e.dict.get("Lang");"string"==typeof s&&(a.lang=stringToPDFString(s));for(const t of e.kids){const e=t.type===jr?t.parentNode:null;e?nodeToSerializable(e,a,i+1):t.type===qr||t.type===Or?a.children.push({type:"content",id:`p${t.pageObjId}_mc${t.mcid}`}):t.type===Pr?a.children.push({type:"object",id:t.refObjId}):t.type===Wr&&a.children.push({type:"annotation",id:`pdfjs_internal_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}}function isValidExplicitDest(e){if(!Array.isArray(e)||e.length<2)return!1;const[t,i,...a]=e;if(!(t instanceof Ref||Number.isInteger(t)))return!1;if(!(i instanceof Name))return!1;let r=!0;switch(i.name){case"XYZ":if(3!==a.length)return!1;break;case"Fit":case"FitB":return 0===a.length;case"FitH":case"FitBH":case"FitV":case"FitBV":if(1!==a.length)return!1;break;case"FitR":if(4!==a.length)return!1;r=!1;break;default:return!1}for(const e of a)if(!("number"==typeof e||r&&null===e))return!1;return!0}function fetchDest(e){e instanceof Dict&&(e=e.get("D"));return isValidExplicitDest(e)?e:null}function fetchRemoteDest(e){let t=e.get("D");if(t){t instanceof Name&&(t=t.name);if("string"==typeof t)return stringToPDFString(t);if(isValidExplicitDest(t))return JSON.stringify(t)}return null}class Catalog{constructor(e,t){this.pdfManager=e;this.xref=t;this._catDict=t.getCatalogObj();if(!(this._catDict instanceof Dict))throw new FormatError("Catalog object is not a dictionary.");this.toplevelPagesDict;this._actualNumPages=null;this.fontCache=new RefSetCache;this.builtInCMapCache=new Map;this.standardFontDataCache=new Map;this.globalImageCache=new GlobalImageCache;this.pageKidsCountCache=new RefSetCache;this.pageIndexCache=new RefSetCache;this.nonBlendModesSet=new RefSet;this.systemFontCache=new Map}cloneDict(){return this._catDict.clone()}get version(){const e=this._catDict.get("Version");if(e instanceof Name){if(St.test(e.name))return shadow(this,"version",e.name);warn(`Invalid PDF catalog version: ${e.name}`)}return shadow(this,"version",null)}get lang(){const e=this._catDict.get("Lang");return shadow(this,"lang",e&&"string"==typeof e?stringToPDFString(e):null)}get needsRendering(){const e=this._catDict.get("NeedsRendering");return shadow(this,"needsRendering","boolean"==typeof e&&e)}get collection(){let e=null;try{const t=this._catDict.get("Collection");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch Collection entry; assuming no collection is present.")}return shadow(this,"collection",e)}get acroForm(){let e=null;try{const t=this._catDict.get("AcroForm");t instanceof Dict&&t.size>0&&(e=t)}catch(e){if(e instanceof MissingDataException)throw e;info("Cannot fetch AcroForm entry; assuming no forms are present.")}return shadow(this,"acroForm",e)}get acroFormRef(){const e=this._catDict.getRaw("AcroForm");return shadow(this,"acroFormRef",e instanceof Ref?e:null)}get metadata(){const e=this._catDict.getRaw("Metadata");if(!(e instanceof Ref))return shadow(this,"metadata",null);let t=null;try{const i=this.xref.fetch(e,!this.xref.encrypt?.encryptMetadata);if(i instanceof BaseStream&&i.dict instanceof Dict){const e=i.dict.get("Type"),a=i.dict.get("Subtype");if(isName(e,"Metadata")&&isName(a,"XML")){const e=stringToUTF8String(i.getString());e&&(t=new MetadataParser(e).serializable)}}}catch(e){if(e instanceof MissingDataException)throw e;info(`Skipping invalid Metadata: "${e}".`)}return shadow(this,"metadata",t)}get markInfo(){let e=null;try{e=this._readMarkInfo()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read mark info.")}return shadow(this,"markInfo",e)}_readMarkInfo(){const e=this._catDict.get("MarkInfo");if(!(e instanceof Dict))return null;const t={Marked:!1,UserProperties:!1,Suspects:!1};for(const i in t){const a=e.get(i);"boolean"==typeof a&&(t[i]=a)}return t}get structTreeRoot(){let e=null;try{e=this._readStructTreeRoot()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable read to structTreeRoot info.")}return shadow(this,"structTreeRoot",e)}_readStructTreeRoot(){const e=this._catDict.getRaw("StructTreeRoot"),t=this.xref.fetchIfRef(e);if(!(t instanceof Dict))return null;const i=new StructTreeRoot(t,e);i.init();return i}get toplevelPagesDict(){const e=this._catDict.get("Pages");if(!(e instanceof Dict))throw new FormatError("Invalid top-level pages dictionary.");return shadow(this,"toplevelPagesDict",e)}get documentOutline(){let e=null;try{e=this._readDocumentOutline()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read document outline.")}return shadow(this,"documentOutline",e)}_readDocumentOutline(){let e=this._catDict.get("Outlines");if(!(e instanceof Dict))return null;e=e.getRaw("First");if(!(e instanceof Ref))return null;const t={items:[]},i=[{obj:e,parent:t}],a=new RefSet;a.put(e);const r=this.xref,s=new Uint8ClampedArray(3);for(;i.length>0;){const t=i.shift(),n=r.fetchIfRef(t.obj);if(null===n)continue;n.has("Title")||warn("Invalid outline item encountered.");const o={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:n,resultObj:o,docBaseUrl:this.baseUrl,docAttachments:this.attachments});const g=n.get("Title"),c=n.get("F")||0,C=n.getArray("C"),h=n.get("Count");let l=s;!isNumberArray(C,3)||0===C[0]&&0===C[1]&&0===C[2]||(l=ColorSpace.singletons.rgb.getRgb(C,0));const Q={action:o.action,attachment:o.attachment,dest:o.dest,url:o.url,unsafeUrl:o.unsafeUrl,newWindow:o.newWindow,setOCGState:o.setOCGState,title:"string"==typeof g?stringToPDFString(g):"",color:l,count:Number.isInteger(h)?h:void 0,bold:!!(2&c),italic:!!(1&c),items:[]};t.parent.items.push(Q);e=n.getRaw("First");if(e instanceof Ref&&!a.has(e)){i.push({obj:e,parent:Q});a.put(e)}e=n.getRaw("Next");if(e instanceof Ref&&!a.has(e)){i.push({obj:e,parent:t.parent});a.put(e)}}return t.items.length>0?t.items:null}get permissions(){let e=null;try{e=this._readPermissions()}catch(e){if(e instanceof MissingDataException)throw e;warn("Unable to read permissions.")}return shadow(this,"permissions",e)}_readPermissions(){const e=this.xref.trailer.get("Encrypt");if(!(e instanceof Dict))return null;let t=e.get("P");if("number"!=typeof t)return null;t+=2**32;const i=[];for(const e in y){const a=y[e];t&a&&i.push(a)}return i}get optionalContentConfig(){let e=null;try{const t=this._catDict.get("OCProperties");if(!t)return shadow(this,"optionalContentConfig",null);const i=t.get("D");if(!i)return shadow(this,"optionalContentConfig",null);const a=t.get("OCGs");if(!Array.isArray(a))return shadow(this,"optionalContentConfig",null);const r=[],s=new RefSet;for(const e of a)if(e instanceof Ref&&!s.has(e)){s.put(e);r.push(this.#Y(e))}e=this.#v(i,s);e.groups=r}catch(e){if(e instanceof MissingDataException)throw e;warn(`Unable to read optional content config: ${e}`)}return shadow(this,"optionalContentConfig",e)}#Y(e){const t=this.xref.fetch(e),i={id:e.toString(),name:null,intent:null,usage:{print:null,view:null}},a=t.get("Name");"string"==typeof a&&(i.name=stringToPDFString(a));let r=t.getArray("Intent");Array.isArray(r)||(r=[r]);r.every((e=>e instanceof Name))&&(i.intent=r.map((e=>e.name)));const s=t.get("Usage");if(!(s instanceof Dict))return i;const n=i.usage,o=s.get("Print");if(o instanceof Dict){const e=o.get("PrintState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":n.print={printState:e.name}}}const g=s.get("View");if(g instanceof Dict){const e=g.get("ViewState");if(e instanceof Name)switch(e.name){case"ON":case"OFF":n.view={viewState:e.name}}}return i}#v(e,t){function parseOnOff(e){const i=[];if(Array.isArray(e))for(const a of e)a instanceof Ref&&t.has(a)&&i.push(a.toString());return i}function parseOrder(e,i=0){if(!Array.isArray(e))return null;const r=[];for(const s of e){if(s instanceof Ref&&t.has(s)){a.put(s);r.push(s.toString());continue}const e=parseNestedOrder(s,i);e&&r.push(e)}if(i>0)return r;const s=[];for(const e of t)a.has(e)||s.push(e.toString());s.length&&r.push({name:null,order:s});return r}function parseNestedOrder(e,t){if(++t>r){warn("parseNestedOrder - reached MAX_NESTED_LEVELS.");return null}const a=i.fetchIfRef(e);if(!Array.isArray(a))return null;const s=i.fetchIfRef(a[0]);if("string"!=typeof s)return null;const n=parseOrder(a.slice(1),t);return n&&n.length?{name:stringToPDFString(s),order:n}:null}const i=this.xref,a=new RefSet,r=10;return{name:"string"==typeof e.get("Name")?stringToPDFString(e.get("Name")):null,creator:"string"==typeof e.get("Creator")?stringToPDFString(e.get("Creator")):null,baseState:e.get("BaseState")instanceof 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 FormatError("Page count in top-level pages dictionary is not an integer.");return 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 NameTree)for(const[i,a]of e.getAll()){const e=fetchDest(a);e&&(t[stringToPDFString(i)]=e)}else e instanceof Dict&&e.forEach((function(e,i){const a=fetchDest(i);a&&(t[e]=a)}));return shadow(this,"destinations",t)}getDestination(e){const t=this._readDests();if(t instanceof NameTree){const i=fetchDest(t.get(e));if(i)return i;const a=this.destinations[e];if(a){warn(`Found "${e}" at an incorrect position in the NameTree.`);return a}}else if(t instanceof Dict){const i=fetchDest(t.get(e));if(i)return i}return null}_readDests(){const e=this._catDict.get("Names");return e?.has("Dests")?new 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 MissingDataException)throw e;warn("Unable to read page labels.")}return shadow(this,"pageLabels",e)}_readPageLabels(){const e=this._catDict.getRaw("PageLabels");if(!e)return null;const t=new Array(this.numPages);let i=null,a="";const r=new NumberTree(e,this.xref).getAll();let s="",n=1;for(let e=0,o=this.numPages;e=1))throw new FormatError("Invalid start in PageLabel dictionary.");n=e}else n=1}switch(i){case"D":s=n;break;case"R":case"r":s=toRomanNumerals(n,"r"===i);break;case"A":case"a":const e=26,t="a"===i?97:65,a=n-1;s=String.fromCharCode(t+a%e).repeat(Math.floor(a/e)+1);break;default:if(i)throw new FormatError(`Invalid style "${i}" in PageLabel dictionary.`);s=""}t[e]=a+s;n++}return t}get pageLayout(){const e=this._catDict.get("PageLayout");let t="";if(e instanceof Name)switch(e.name){case"SinglePage":case"OneColumn":case"TwoColumnLeft":case"TwoColumnRight":case"TwoPageLeft":case"TwoPageRight":t=e.name}return shadow(this,"pageLayout",t)}get pageMode(){const e=this._catDict.get("PageMode");let t="UseNone";if(e instanceof Name)switch(e.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"FullScreen":case"UseOC":case"UseAttachments":t=e.name}return shadow(this,"pageMode",t)}get viewerPreferences(){const e=this._catDict.get("ViewerPreferences");if(!(e instanceof Dict))return shadow(this,"viewerPreferences",null);let t=null;for(const i of e.getKeys()){const a=e.get(i);let r;switch(i){case"HideToolbar":case"HideMenubar":case"HideWindowUI":case"FitWindow":case"CenterWindow":case"DisplayDocTitle":case"PickTrayByPDFSize":"boolean"==typeof a&&(r=a);break;case"NonFullScreenPageMode":if(a instanceof Name)switch(a.name){case"UseNone":case"UseOutlines":case"UseThumbs":case"UseOC":r=a.name;break;default:r="UseNone"}break;case"Direction":if(a instanceof Name)switch(a.name){case"L2R":case"R2L":r=a.name;break;default:r="L2R"}break;case"ViewArea":case"ViewClip":case"PrintArea":case"PrintClip":if(a instanceof Name)switch(a.name){case"MediaBox":case"CropBox":case"BleedBox":case"TrimBox":case"ArtBox":r=a.name;break;default:r="CropBox"}break;case"PrintScaling":if(a instanceof Name)switch(a.name){case"None":case"AppDefault":r=a.name;break;default:r="AppDefault"}break;case"Duplex":if(a instanceof Name)switch(a.name){case"Simplex":case"DuplexFlipShortEdge":case"DuplexFlipLongEdge":r=a.name;break;default:r="None"}break;case"PrintPageRange":if(Array.isArray(a)&&a.length%2==0){a.every(((e,t,i)=>Number.isInteger(e)&&e>0&&(0===t||e>=i[t-1])&&e<=this.numPages))&&(r=a)}break;case"NumCopies":Number.isInteger(a)&&a>0&&(r=a);break;default:warn(`Ignoring non-standard key in ViewerPreferences: ${i}.`);continue}if(void 0!==r){t||(t=Object.create(null));t[i]=r}else warn(`Bad value, for key "${i}", in ViewerPreferences: ${a}.`)}return shadow(this,"viewerPreferences",t)}get openAction(){const e=this._catDict.get("OpenAction"),t=Object.create(null);if(e instanceof Dict){const i=new Dict(this.xref);i.set("A",e);const a={url:null,dest:null,action:null};Catalog.parseDestDictionary({destDict:i,resultObj:a});Array.isArray(a.dest)?t.dest=a.dest:a.action&&(t.action=a.action)}else Array.isArray(e)&&(t.dest=e);return shadow(this,"openAction",objectSize(t)>0?t:null)}get attachments(){const e=this._catDict.get("Names");let t=null;if(e instanceof Dict&&e.has("EmbeddedFiles")){const i=new NameTree(e.getRaw("EmbeddedFiles"),this.xref);for(const[e,a]of i.getAll()){const i=new FileSpec(a,this.xref);t||(t=Object.create(null));t[stringToPDFString(e)]=i.serializable}}return shadow(this,"attachments",t)}get xfaImages(){const e=this._catDict.get("Names");let t=null;if(e instanceof Dict&&e.has("XFAImages")){const i=new NameTree(e.getRaw("XFAImages"),this.xref);for(const[e,a]of i.getAll()){t||(t=new Dict(this.xref));t.set(stringToPDFString(e),a)}}return shadow(this,"xfaImages",t)}_collectJavaScript(){const e=this._catDict.get("Names");let t=null;function appendIfJavaScriptDict(e,i){if(!(i instanceof Dict))return;if(!isName(i.get("S"),"JavaScript"))return;let a=i.get("JS");if(a instanceof BaseStream)a=a.getString();else if("string"!=typeof a)return;a=stringToPDFString(a).replaceAll("\0","");a&&(t||=new Map).set(e,a)}if(e instanceof Dict&&e.has("JavaScript")){const t=new NameTree(e.getRaw("JavaScript"),this.xref);for(const[e,i]of t.getAll())appendIfJavaScriptDict(stringToPDFString(e),i)}const i=this._catDict.get("OpenAction");i&&appendIfJavaScriptDict("OpenAction",i);return t}get jsActions(){const e=this._collectJavaScript();let t=collectActions(this.xref,this._catDict,pA);if(e){t||=Object.create(null);for(const[i,a]of e)i in t?t[i].push(a):t[i]=[a]}return shadow(this,"jsActions",t)}async fontFallback(e,t){const i=await Promise.all(this.fontCache);for(const a of i)if(a.loadedName===e){a.fallback(t);return}}async cleanup(e=!1){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();this.systemFontCache.clear()}async getPageDict(e){const t=[this.toplevelPagesDict],i=new RefSet,a=this._catDict.getRaw("Pages");a instanceof Ref&&i.put(a);const r=this.xref,s=this.pageKidsCountCache,n=this.pageIndexCache;let o=0;for(;t.length;){const a=t.pop();if(a instanceof Ref){const g=s.get(a);if(g>=0&&o+g<=e){o+=g;continue}if(i.has(a))throw new FormatError("Pages tree contains circular reference.");i.put(a);const c=await r.fetchAsync(a);if(c instanceof Dict){let t=c.getRaw("Type");t instanceof Ref&&(t=await r.fetchAsync(t));if(isName(t,"Page")||!c.has("Kids")){s.has(a)||s.put(a,1);n.has(a)||n.put(a,o);if(o===e)return[c,a];o++;continue}}t.push(c);continue}if(!(a instanceof Dict))throw new FormatError("Page dictionary kid reference points to wrong type of object.");const{objId:g}=a;let c=a.getRaw("Count");c instanceof Ref&&(c=await r.fetchAsync(c));if(Number.isInteger(c)&&c>=0){g&&!s.has(g)&&s.put(g,c);if(o+c<=e){o+=c;continue}}let C=a.getRaw("Kids");C instanceof Ref&&(C=await r.fetchAsync(C));if(!Array.isArray(C)){let t=a.getRaw("Type");t instanceof Ref&&(t=await r.fetchAsync(t));if(isName(t,"Page")||!a.has("Kids")){if(o===e)return[a,null];o++;continue}throw new FormatError("Page dictionary kids object is not an array.")}for(let e=C.length-1;e>=0;e--)t.push(C[e])}throw new Error(`Page index ${e} not found.`)}async getAllPageDicts(e=!1){const{ignoreErrors:t}=this.pdfManager.evaluatorOptions,i=[{currentNode:this.toplevelPagesDict,posInKids:0}],a=new RefSet,r=this._catDict.getRaw("Pages");r instanceof Ref&&a.put(r);const s=new Map,n=this.xref,o=this.pageIndexCache;let g=0;function addPageDict(e,t){t&&!o.has(t)&&o.put(t,g);s.set(g++,[e,t])}function addPageError(i){if(i instanceof XRefEntryException&&!e)throw i;if(e&&t&&0===g){warn(`getAllPageDicts - Skipping invalid first page: "${i}".`);i=Dict.empty}s.set(g++,[i,null])}for(;i.length>0;){const e=i.at(-1),{currentNode:t,posInKids:r}=e;let s=t.getRaw("Kids");if(s instanceof Ref)try{s=await n.fetchAsync(s)}catch(e){addPageError(e);break}if(!Array.isArray(s)){addPageError(new FormatError("Page dictionary kids object is not an array."));break}if(r>=s.length){i.pop();continue}const o=s[r];let g;if(o instanceof Ref){if(a.has(o)){addPageError(new FormatError("Pages tree contains circular reference."));break}a.put(o);try{g=await n.fetchAsync(o)}catch(e){addPageError(e);break}}else g=o;if(!(g instanceof Dict)){addPageError(new FormatError("Page dictionary kid reference points to wrong type of object."));break}let c=g.getRaw("Type");if(c instanceof Ref)try{c=await n.fetchAsync(c)}catch(e){addPageError(e);break}isName(c,"Page")||!g.has("Kids")?addPageDict(g,o instanceof Ref?o:null):i.push({currentNode:g,posInKids:0});e.posInKids++}return s}getPageIndex(e){const t=this.pageIndexCache.get(e);if(void 0!==t)return Promise.resolve(t);const i=this.xref;let a=0;const next=t=>function pagesBeforeRef(t){let a,r=0;return i.fetchAsync(t).then((function(i){if(isRefsEqual(t,e)&&!isDict(i,"Page")&&!(i instanceof Dict&&!i.has("Type")&&i.has("Contents")))throw new FormatError("The reference does not point to a /Page dictionary.");if(!i)return null;if(!(i instanceof Dict))throw new FormatError("Node must be a dictionary.");a=i.getRaw("Parent");return i.getAsync("Parent")})).then((function(e){if(!e)return null;if(!(e instanceof Dict))throw new FormatError("Parent must be a dictionary.");return e.getAsync("Kids")})).then((function(e){if(!e)return null;const s=[];let n=!1;for(const a of e){if(!(a instanceof Ref))throw new FormatError("Kid must be a reference.");if(isRefsEqual(a,t)){n=!0;break}s.push(i.fetchAsync(a).then((function(e){if(!(e instanceof Dict))throw new FormatError("Kid node must be a dictionary.");e.has("Count")?r+=e.get("Count"):r++})))}if(!n)throw new FormatError("Kid reference not found in parent's kids.");return Promise.all(s).then((function(){return[r,a]}))}))}(t).then((t=>{if(!t){this.pageIndexCache.put(e,a);return a}const[i,r]=t;a+=i;return next(r)}));return next(e)}get baseUrl(){const e=this._catDict.get("URI");if(e instanceof Dict){const t=e.get("Base");if("string"==typeof t){const e=createValidAbsoluteUrl(t,null,{tryConvertEncoding:!0});if(e)return shadow(this,"baseUrl",e.href)}}return shadow(this,"baseUrl",this.pdfManager.docBaseUrl)}static parseDestDictionary({destDict:e,resultObj:t,docBaseUrl:i=null,docAttachments:a=null}){if(!(e instanceof Dict)){warn("parseDestDictionary: `destDict` must be a dictionary.");return}let r,s,n=e.get("A");if(!(n instanceof Dict))if(e.has("Dest"))n=e.get("Dest");else{n=e.get("AA");n instanceof Dict&&(n.has("D")?n=n.get("D"):n.has("U")&&(n=n.get("U")))}if(n instanceof Dict){const e=n.get("S");if(!(e instanceof Name)){warn("parseDestDictionary: Invalid type in Action dictionary.");return}const i=e.name;switch(i){case"ResetForm":const e=n.get("Flags"),o=0==(1&("number"==typeof e?e:0)),g=[],c=[];for(const e of n.get("Fields")||[])e instanceof Ref?c.push(e.toString()):"string"==typeof e&&g.push(stringToPDFString(e));t.resetForm={fields:g,refs:c,include:o};break;case"URI":r=n.get("URI");r instanceof Name&&(r="/"+r.name);break;case"GoTo":s=n.get("D");break;case"Launch":case"GoToR":const C=n.get("F");if(C instanceof Dict){const e=new FileSpec(C,null,!0),{rawFilename:t}=e.serializable;r=t}else"string"==typeof C&&(r=C);const h=fetchRemoteDest(n);h&&"string"==typeof r&&(r=r.split("#",1)[0]+"#"+h);const l=n.get("NewWindow");"boolean"==typeof l&&(t.newWindow=l);break;case"GoToE":const Q=n.get("T");let E;if(a&&Q instanceof Dict){const e=Q.get("R"),t=Q.get("N");isName(e,"C")&&"string"==typeof t&&(E=a[stringToPDFString(t)])}if(E){t.attachment=E;const e=fetchRemoteDest(n);e&&(t.attachmentDest=e)}else warn('parseDestDictionary - unimplemented "GoToE" action.');break;case"Named":const u=n.get("N");u instanceof Name&&(t.action=u.name);break;case"SetOCGState":const d=n.get("State"),f=n.get("PreserveRB");if(!Array.isArray(d)||0===d.length)break;const p=[];for(const e of d)if(e instanceof Name)switch(e.name){case"ON":case"OFF":case"Toggle":p.push(e.name)}else e instanceof Ref&&p.push(e.toString());if(p.length!==d.length)break;t.setOCGState={state:p,preserveRB:"boolean"!=typeof f||f};break;case"JavaScript":const m=n.get("JS");let y;m instanceof BaseStream?y=m.getString():"string"==typeof m&&(y=m);const w=y&&recoverJsURL(stringToPDFString(y));if(w){r=w.url;t.newWindow=w.newWindow;break}default:if("JavaScript"===i||"SubmitForm"===i)break;warn(`parseDestDictionary - unsupported action: "${i}".`)}}else e.has("Dest")&&(s=e.get("Dest"));if("string"==typeof r){const e=createValidAbsoluteUrl(r,i,{addDefaultProtocol:!0,tryConvertEncoding:!0});e&&(t.url=e.href);t.unsafeUrl=r}if(s){s instanceof Name&&(s=s.name);"string"==typeof s?t.dest=stringToPDFString(s):isValidExplicitDest(s)&&(t.dest=s)}}}function addChildren(e,t){if(e instanceof Dict)e=e.getRawValues();else if(e instanceof BaseStream)e=e.dict.getRawValues();else if(!Array.isArray(e))return;for(const a of e)((i=a)instanceof Ref||i instanceof Dict||i instanceof BaseStream||Array.isArray(i))&&t.push(a);var i}class ObjectLoader{constructor(e,t,i){this.dict=e;this.keys=t;this.xref=i;this.refSet=null}async load(){if(this.xref.stream.isDataLoaded)return;const{keys:e,dict:t}=this;this.refSet=new RefSet;const i=[];for(const a of e){const e=t.getRaw(a);void 0!==e&&i.push(e)}return this._walk(i)}async _walk(e){const t=[],i=[];for(;e.length;){let a=e.pop();if(a instanceof Ref){if(this.refSet.has(a))continue;try{this.refSet.put(a);a=this.xref.fetch(a)}catch(e){if(!(e instanceof MissingDataException)){warn(`ObjectLoader._walk - requesting all data: "${e}".`);this.refSet=null;const{manager:t}=this.xref.stream;return t.requestAllChunks()}t.push(a);i.push({begin:e.begin,end:e.end})}}if(a instanceof BaseStream){const e=a.getBaseStreams();if(e){let r=!1;for(const t of e)if(!t.isDataLoaded){r=!0;i.push({begin:t.start,end:t.end})}r&&t.push(a)}}addChildren(a,e)}if(i.length){await this.xref.stream.manager.requestRanges(i);for(const e of t)e instanceof Ref&&this.refSet.remove(e);return this._walk(t)}this.refSet=null}}const Xr=Symbol(),Zr=Symbol(),Vr=Symbol(),_r=Symbol(),zr=Symbol(),$r=Symbol(),As=Symbol(),es=Symbol(),ts=Symbol(),is=Symbol("content"),as=Symbol("data"),rs=Symbol(),ss=Symbol("extra"),ns=Symbol(),os=Symbol(),gs=Symbol(),Is=Symbol(),cs=Symbol(),Cs=Symbol(),hs=Symbol(),ls=Symbol(),Bs=Symbol(),Qs=Symbol(),Es=Symbol(),us=Symbol(),ds=Symbol(),fs=Symbol(),ps=Symbol(),ms=Symbol(),ys=Symbol(),ws=Symbol(),bs=Symbol(),Ds=Symbol(),Fs=Symbol(),Ss=Symbol(),ks=Symbol(),Rs=Symbol(),Ns=Symbol(),Gs=Symbol(),xs=Symbol(),Us=Symbol(),Ms=Symbol(),Ls=Symbol(),Hs=Symbol(),Js=Symbol(),Ys=Symbol("namespaceId"),vs=Symbol("nodeName"),Ts=Symbol(),Ks=Symbol(),qs=Symbol(),Os=Symbol(),Ws=Symbol(),js=Symbol(),Xs=Symbol(),Zs=Symbol(),Vs=Symbol("root"),_s=Symbol(),zs=Symbol(),$s=Symbol(),An=Symbol(),en=Symbol(),tn=Symbol(),an=Symbol(),rn=Symbol(),sn=Symbol(),nn=Symbol(),on=Symbol(),gn=Symbol("uid"),In=Symbol(),cn={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}},Cn={pt:e=>e,cm:e=>e/2.54*72,mm:e=>e/25.4*72,in:e=>72*e,px:e=>e},hn=/([+-]?\d+\.?\d*)(.*)/;function stripQuotes(e){return e.startsWith("'")||e.startsWith('"')?e.slice(1,-1):e}function getInteger({data:e,defaultValue:t,validate:i}){if(!e)return t;e=e.trim();const a=parseInt(e,10);return!isNaN(a)&&i(a)?a:t}function getFloat({data:e,defaultValue:t,validate:i}){if(!e)return t;e=e.trim();const a=parseFloat(e);return!isNaN(a)&&i(a)?a:t}function getKeyword({data:e,defaultValue:t,validate:i}){return e&&i(e=e.trim())?e:t}function getStringOption(e,t){return getKeyword({data:e,defaultValue:t[0],validate:e=>t.includes(e)})}function getMeasurement(e,t="0"){t||="0";if(!e)return getMeasurement(t);const i=e.trim().match(hn);if(!i)return getMeasurement(t);const[,a,r]=i,s=parseFloat(a);if(isNaN(s))return getMeasurement(t);if(0===s)return 0;const n=Cn[r];return n?n(s):s}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[i,a]=t;return{num:i,den:a}}function getRelevant(e){return e?e.trim().split(/\s+/).map((e=>({excluded:"-"===e[0],viewname:e.substring(1)}))):[]}class HTMLResult{static get FAILURE(){return shadow(this,"FAILURE",new HTMLResult(!1,null,null,null))}static get EMPTY(){return shadow(this,"EMPTY",new HTMLResult(!0,null,null,null))}constructor(e,t,i,a){this.success=e;this.html=t;this.bbox=i;this.breakNode=a}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)}}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 i=this.fonts.get("PdfJS-Fallback-PdfJS-XFA");for(const e of t)this.fonts.set(e,i)}addPdfFont(e){const t=e.cssFontInfo,i=t.fontFamily;let a=this.fonts.get(i);if(!a){a=Object.create(null);this.fonts.set(i,a);this.defaultFont||(this.defaultFont=a)}let r="";const s=parseFloat(t.fontWeight);0!==parseFloat(t.italicAngle)?r=s>=700?"bolditalic":"italic":s>=700&&(r="bold");if(!r){(e.name.includes("Bold")||e.psName?.includes("Bold"))&&(r="bold");(e.name.includes("Italic")||e.name.endsWith("It")||e.psName?.includes("Italic")||e.psName?.endsWith("It"))&&(r+="italic")}r||(r="regular");a[r]=e}getDefault(){return this.defaultFont}find(e,t=!0){let i=this.fonts.get(e)||this.cache.get(e);if(i)return i;const a=/,|-|_| |bolditalic|bold|italic|regular|it/gi;let r=e.replaceAll(a,"");i=this.fonts.get(r);if(i){this.cache.set(e,i);return i}r=r.toLowerCase();const s=[];for(const[e,t]of this.fonts.entries())e.replaceAll(a,"").toLowerCase().startsWith(r)&&s.push(t);if(0===s.length)for(const[,e]of this.fonts.entries())e.regular.name?.replaceAll(a,"").toLowerCase().startsWith(r)&&s.push(e);if(0===s.length){r=r.replaceAll(/psmt|mt/gi,"");for(const[e,t]of this.fonts.entries())e.replaceAll(a,"").toLowerCase().startsWith(r)&&s.push(t)}if(0===s.length)for(const e of this.fonts.values())e.regular.name?.replaceAll(a,"").toLowerCase().startsWith(r)&&s.push(e);if(s.length>=1){1!==s.length&&t&&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);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}class FontInfo{constructor(e,t,i,a){this.lineHeight=i;this.paraMargin=t||{top:0,bottom:0,left:0,right:0};if(!e){[this.pdfFont,this.xfaFont]=this.defaultFont(a);return}this.xfaFont={typeface:e.typeface,posture:e.posture,weight:e.weight,size:e.size,letterSpacing:e.letterSpacing};const r=a.find(e.typeface);if(r){this.pdfFont=selectFont(e,r);this.pdfFont||([this.pdfFont,this.xfaFont]=this.defaultFont(a))}else[this.pdfFont,this.xfaFont]=this.defaultFont(a)}defaultFont(e){const t=e.find("Helvetica",!1)||e.find("Myriad Pro",!1)||e.find("Arial",!1)||e.getDefault();if(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,i,a){this.fontFinder=a;this.stack=[new FontInfo(e,t,i,a)]}pushData(e,t,i){const a=this.stack.at(-1);for(const t of["typeface","posture","weight","size","letterSpacing"])e[t]||(e[t]=a.xfaFont[t]);for(const e of["top","bottom","left","right"])isNaN(t[e])&&(t[e]=a.paraMargin[e]);const r=new FontInfo(e,t,i||a.lineHeight,this.fontFinder);r.pdfFont||(r.pdfFont=a.pdfFont);this.stack.push(r)}popFont(){this.stack.pop()}topFont(){return this.stack.at(-1)}}class TextMeasure{constructor(e,t,i,a){this.glyphs=[];this.fontSelector=new FontSelector(e,t,i,a);this.extraHeight=0}pushData(e,t,i){this.fontSelector.pushData(e,t,i)}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(),i=t.xfaFont.size;if(t.pdfFont){const a=t.xfaFont.letterSpacing,r=t.pdfFont,s=r.lineHeight||1.2,n=t.lineHeight||Math.max(1.2,s)*i,o=s-(void 0===r.lineGap?.2:r.lineGap),g=Math.max(1,o)*i,c=i/1e3,C=r.defaultWidth||r.charsToGlyphs(" ")[0].width;for(const t of e.split(/[\u2029\n]/)){const e=r.encodeString(t).join(""),i=r.charsToGlyphs(e);for(const e of i){const t=e.width||C;this.glyphs.push([t*c+a,n,g,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([i,1.2*i,i,e,!1]);this.glyphs.push([0,0,0,"\n",!0])}this.glyphs.pop()}}compute(e){let t=-1,i=0,a=0,r=0,s=0,n=0,o=!1,g=!0;for(let c=0,C=this.glyphs.length;ce){a=Math.max(a,s);s=0;r+=n;n=d;t=-1;i=0;o=!0;g=!1}else{n=Math.max(d,n);i=s;s+=C;t=c}else if(s+C>e){r+=n;n=d;if(-1!==t){c=t;a=Math.max(a,i);s=0;t=-1;i=0}else{a=Math.max(a,s);s=C}o=!0;g=!1}else{s+=C;n=Math.max(d,n)}}a=Math.max(a,s);r+=n+this.extraHeight;return{width:1.02*a,height:r,isBroken:o}}}const ln=/^[^.[]+/,Bn=/^[^\]]+/,Qn={dot:0,dotDot:1,dotHash:2,dotBracket:3,dotParen:4},En=new Map([["$data",(e,t)=>e.datasets?e.datasets.data:e],["$record",(e,t)=>(e.datasets?e.datasets.data:e)[us]()[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]]),un=new WeakMap;function parseExpression(e,t,i=!0){let a=e.match(ln);if(!a)return null;let[r]=a;const s=[{name:r,cacheName:"."+r,index:0,js:null,formCalc:null,operator:Qn.dot}];let n=r.length;for(;n0&&C.push(e)}if(0!==C.length||o||0!==g)e=isFinite(c)?C.filter((e=>ce[c])):C.flat();else{const i=t[ms]();if(!(t=i))return null;g=-1;e=[t]}}return 0===e.length?null:e}function createDataNode(e,t,i){const a=parseExpression(i);if(!a)return null;if(a.some((e=>e.operator===Qn.dotDot)))return null;const r=En.get(a[0].name);let s=0;if(r){e=r(e,t);s=1}else e=t||e;for(let t=a.length;se[an]())).join("")}get[pn](){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 shadow(this,pn,e._attributes)}[Gs](e){let t=this;for(;t;){if(t===e)return!0;t=t[ms]()}return!1}[ms](){return this[Gn]}[ps](){return this[ms]()}[us](e=null){return e?this[e]:this[mn]}[rs](){const e=Object.create(null);this[is]&&(e.$content=this[is]);for(const t of Object.getOwnPropertyNames(this)){const i=this[t];null!==i&&(i instanceof XFAObject?e[t]=i[rs]():i instanceof XFAObjectArray?i.isEmpty()||(e[t]=i.dump()):e[t]=i)}return e}[on](){return null}[sn](){return HTMLResult.EMPTY}*[ds](){for(const e of this[us]())yield e}*[Dn](e,t){for(const i of this[ds]())if(!e||t===e.has(i[vs])){const e=this[cs](),t=i[sn](e);t.success||(this[ss].failingNode=i);yield t}}[os](){return null}[Zr](e,t){this[ss].children.push(e)}[cs](){}[_r]({filter:e=null,include:t=!0}){if(this[ss].generator){const e=this[cs](),t=this[ss].failingNode[sn](e);if(!t.success)return t;t.html&&this[Zr](t.html,t.bbox);delete this[ss].failingNode}else this[ss].generator=this[Dn](e,t);for(;;){const e=this[ss].generator.next();if(e.done)break;const t=e.value;if(!t.success)return t;t.html&&this[Zr](t.html,t.bbox)}this[ss].generator=null;return HTMLResult.EMPTY}[An](e){this[Un]=new Set(Object.keys(e))}[Sn](e){const t=this[pn],i=this[Un];return[...e].filter((e=>t.has(e)&&!i.has(e)))}[_s](e,t=new Set){for(const i of this[mn])i[xn](e,t)}[xn](e,t){const i=this[Fn](e,t);i?this[dn](i,e,t):this[_s](e,t)}[Fn](e,t){const{use:i,usehref:a}=this;if(!i&&!a)return null;let r=null,s=null,n=null,o=i;if(a){o=a;a.startsWith("#som(")&&a.endsWith(")")?s=a.slice(5,-1):a.startsWith(".#som(")&&a.endsWith(")")?s=a.slice(6,-1):a.startsWith("#")?n=a.slice(1):a.startsWith(".#")&&(n=a.slice(2))}else i.startsWith("#")?n=i.slice(1):s=i;this.use=this.usehref="";if(n)r=e.get(n);else{r=searchNode(e.get(Vs),this,s,!0,!1);r&&(r=r[0])}if(!r){warn(`XFA - Invalid prototype reference: ${o}.`);return null}if(r[vs]!==this[vs]){warn(`XFA - Incompatible prototype: ${r[vs]} !== ${this[vs]}.`);return null}if(t.has(r)){warn("XFA - Cycle detected in prototypes use.");return null}t.add(r);const g=r[Fn](e,t);g&&r[dn](g,e,t);r[_s](e,t);t.delete(r);return r}[dn](e,t,i){if(i.has(e)){warn("XFA - Cycle detected in prototypes use.");return}!this[is]&&e[is]&&(this[is]=e[is]);new Set(i).add(e);for(const t of this[Sn](e[Un])){this[t]=e[t];this[Un]&&this[Un].add(t)}for(const a of Object.getOwnPropertyNames(this)){if(this[pn].has(a))continue;const r=this[a],s=e[a];if(r instanceof XFAObjectArray){for(const e of r[mn])e[xn](t,i);for(let a=r[mn].length,n=s[mn].length;aXFAObject[yn](e))):"object"==typeof e&&null!==e?Object.assign({},e):e}[es](){const e=Object.create(Object.getPrototypeOf(this));for(const t of Object.getOwnPropertySymbols(this))try{e[t]=this[t]}catch{shadow(e,t,this[t])}e[gn]=`${e[vs]}${Ln++}`;e[mn]=[];for(const t of Object.getOwnPropertyNames(this)){if(this[pn].has(t)){e[t]=XFAObject[yn](this[t]);continue}const i=this[t];e[t]=i instanceof XFAObjectArray?new XFAObjectArray(i[Rn]):null}for(const t of this[mn]){const i=t[vs],a=t[es]();e[mn].push(a);a[Gn]=e;null===e[i]?e[i]=a:e[i][mn].push(a)}return e}[us](e=null){return e?this[mn].filter((t=>t[vs]===e)):this[mn]}[Cs](e){return this[e]}[hs](e,t,i=!0){return Array.from(this[ls](e,t,i))}*[ls](e,t,i=!0){if("parent"!==e){for(const i of this[mn]){i[vs]===e&&(yield i);i.name===e&&(yield i);(t||i[Ls]())&&(yield*i[ls](e,t,!1))}i&&this[pn].has(e)&&(yield new XFAAttribute(this,e,this[e]))}else yield this[Gn]}}class XFAObjectArray{constructor(e=1/0){this[Rn]=e;this[mn]=[]}get isXFAObject(){return!1}get isXFAObjectArray(){return!0}push(e){if(this[mn].length<=this[Rn]){this[mn].push(e);return!0}warn(`XFA - node "${e[vs]}" accepts no more than ${this[Rn]} children`);return!1}isEmpty(){return 0===this[mn].length}dump(){return 1===this[mn].length?this[mn][0][rs]():this[mn].map((e=>e[rs]()))}[es](){const e=new XFAObjectArray(this[Rn]);e[mn]=this[mn].map((e=>e[es]()));return e}get children(){return this[mn]}clear(){this[mn].length=0}}class XFAAttribute{constructor(e,t,i){this[Gn]=e;this[vs]=t;this[is]=i;this[ts]=!1;this[gn]="attribute"+Ln++}[ms](){return this[Gn]}[Ns](){return!0}[Bs](){return this[is].trim()}[en](e){e=e.value||"";this[is]=e.toString()}[an](){return this[is]}[Gs](e){return this[Gn]===e||this[Gn][Gs](e)}}class XmlObject extends XFAObject{constructor(e,t,i={}){super(e,t);this[is]="";this[wn]=null;if("#text"!==t){const e=new Map;this[fn]=e;for(const[t,a]of Object.entries(i))e.set(t,new XFAAttribute(this,t,a));if(i.hasOwnProperty(Ts)){const e=i[Ts].xfa.dataNode;void 0!==e&&("dataGroup"===e?this[wn]=!1:"dataValue"===e&&(this[wn]=!0))}}this[ts]=!1}[nn](e){const t=this[vs];if("#text"===t){e.push(encodeToXmlString(this[is]));return}const i=utf8StringToString(t),a=this[Ys]===Hn?"xfa:":"";e.push(`<${a}${i}`);for(const[t,i]of this[fn].entries()){const a=utf8StringToString(t);e.push(` ${a}="${encodeToXmlString(i[is])}"`)}null!==this[wn]&&(this[wn]?e.push(' xfa:dataNode="dataValue"'):e.push(' xfa:dataNode="dataGroup"'));if(this[is]||0!==this[mn].length){e.push(">");if(this[is])"string"==typeof this[is]?e.push(encodeToXmlString(this[is])):this[is][nn](e);else for(const t of this[mn])t[nn](e);e.push(``)}else e.push("/>")}[Ks](e){if(this[is]){const e=new XmlObject(this[Ys],"#text");this[Vr](e);e[is]=this[is];this[is]=""}this[Vr](e);return!0}[Os](e){this[is]+=e}[ns](){if(this[is]&&this[mn].length>0){const e=new XmlObject(this[Ys],"#text");this[Vr](e);e[is]=this[is];delete this[is]}}[sn](){return"#text"===this[vs]?HTMLResult.success({name:"#text",value:this[is]}):HTMLResult.EMPTY}[us](e=null){return e?this[mn].filter((t=>t[vs]===e)):this[mn]}[Is](){return this[fn]}[Cs](e){const t=this[fn].get(e);return void 0!==t?t:this[us](e)}*[ls](e,t){const i=this[fn].get(e);i&&(yield i);for(const i of this[mn]){i[vs]===e&&(yield i);t&&(yield*i[ls](e,t))}}*[gs](e,t){const i=this[fn].get(e);!i||t&&i[ts]||(yield i);for(const i of this[mn])yield*i[gs](e,t)}*[Es](e,t,i){for(const a of this[mn]){a[vs]!==e||i&&a[ts]||(yield a);t&&(yield*a[Es](e,t,i))}}[Ns](){return null===this[wn]?0===this[mn].length||this[mn][0][Ys]===cn.xhtml.id:this[wn]}[Bs](){return null===this[wn]?0===this[mn].length?this[is].trim():this[mn][0][Ys]===cn.xhtml.id?this[mn][0][an]().trim():null:this[is].trim()}[en](e){e=e.value||"";this[is]=e.toString()}[rs](e=!1){const t=Object.create(null);e&&(t.$ns=this[Ys]);this[is]&&(t.$content=this[is]);t.$name=this[vs];t.children=[];for(const i of this[mn])t.children.push(i[rs](e));t.attributes=Object.create(null);for(const[e,i]of this[fn])t.attributes[e]=i[is];return t}}class ContentObject extends XFAObject{constructor(e,t){super(e,t);this[is]=""}[Os](e){this[is]+=e}[ns](){}}class OptionObject extends ContentObject{constructor(e,t,i){super(e,t);this[Nn]=i}[ns](){this[is]=getKeyword({data:this[is],defaultValue:this[Nn][0],validate:e=>this[Nn].includes(e)})}[zr](e){super[zr](e);delete this[Nn]}}class StringObject extends ContentObject{[ns](){this[is]=this[is].trim()}}class IntegerObject extends ContentObject{constructor(e,t,i,a){super(e,t);this[bn]=i;this[Mn]=a}[ns](){this[is]=getInteger({data:this[is],defaultValue:this[bn],validate:this[Mn]})}[zr](e){super[zr](e);delete this[bn];delete this[Mn]}}class Option01 extends IntegerObject{constructor(e,t){super(e,t,0,(e=>1===e))}}class Option10 extends IntegerObject{constructor(e,t){super(e,t,1,(e=>0===e))}}function measureToString(e){return"string"==typeof e?"0px":Number.isInteger(e)?`${e}px`:`${e.toFixed(2)}px`}const Jn={anchorType(e,t){const i=e[ps]();if(i&&(!i.layout||"position"===i.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 i=e[ps]();let a=e.w;const r=e.h;if(i.layout?.includes("row")){const t=i[ss],r=e.colSpan;let s;if(-1===r){s=t.columnWidths.slice(t.currentColumn).reduce(((e,t)=>e+t),0);t.currentColumn=0}else{s=t.columnWidths.slice(t.currentColumn,t.currentColumn+r).reduce(((e,t)=>e+t),0);t.currentColumn=(t.currentColumn+e.colSpan)%t.columnWidths.length}isNaN(s)||(a=e.w=s)}t.width=""!==a?measureToString(a):"auto";t.height=""!==r?measureToString(r):"auto"},position(e,t){const i=e[ps]();if(!i?.layout||"position"===i.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[vs])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[on]().margin)}};function setMinMaxDimensions(e,t){if("position"===e[ps]().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))}}function layoutText(e,t,i,a,r,s){const n=new TextMeasure(t,i,a,r);"string"==typeof e?n.addString(e):e[Ws](n);return n.compute(s)}function layoutNode(e,t){let i=null,a=null,r=!1;if((!e.w||!e.h)&&e.value){let s=0,n=0;if(e.margin){s=e.margin.leftInset+e.margin.rightInset;n=e.margin.topInset+e.margin.bottomInset}let o=null,g=null;if(e.para){g=Object.create(null);o=""===e.para.lineHeight?null:e.para.lineHeight;g.top=""===e.para.spaceAbove?0:e.para.spaceAbove;g.bottom=""===e.para.spaceBelow?0:e.para.spaceBelow;g.left=""===e.para.marginLeft?0:e.para.marginLeft;g.right=""===e.para.marginRight?0:e.para.marginRight}let c=e.font;if(!c){const t=e[ys]();let i=e[ms]();for(;i&&i!==t;){if(i.font){c=i.font;break}i=i[ms]()}}const C=(e.w||t.width)-s,h=e[ws].fontFinder;if(e.value.exData&&e.value.exData[is]&&"text/html"===e.value.exData.contentType){const t=layoutText(e.value.exData[is],c,g,o,h,C);a=t.width;i=t.height;r=t.isBroken}else{const t=e.value[an]();if(t){const e=layoutText(t,c,g,o,h,C);a=e.width;i=e.height;r=e.isBroken}}null===a||e.w||(a+=s);null===i||e.h||(i+=n)}return{w:a,h:i,isBroken:r}}function computeBbox(e,t,i){let a;if(""!==e.w&&""!==e.h)a=[e.x,e.y,e.w,e.h];else{if(!i)return null;let r=e.w;if(""===r){if(0===e.maxW){const t=e[ps]();r="position"===t.layout&&""!==t.w?0:e.minW}else r=Math.min(e.maxW,i.width);t.attributes.style.width=measureToString(r)}let s=e.h;if(""===s){if(0===e.maxH){const t=e[ps]();s="position"===t.layout&&""!==t.h?0:e.minH}else s=Math.min(e.maxH,i.height);t.attributes.style.height=measureToString(s)}a=[e.x,e.y,r,s]}return a}function fixDimensions(e){const t=e[ps]();if(t.layout?.includes("row")){const i=t[ss],a=e.colSpan;let r;r=-1===a?i.columnWidths.slice(i.currentColumn).reduce(((e,t)=>e+t),0):i.columnWidths.slice(i.currentColumn,i.currentColumn+a).reduce(((e,t)=>e+t),0);isNaN(r)||(e.w=r)}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))}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"}}function toStyle(e,...t){const i=Object.create(null);for(const a of t){const t=e[a];if(null!==t)if(Jn.hasOwnProperty(a))Jn[a](e,i);else if(t instanceof XFAObject){const e=t[on]();e?Object.assign(i,e):warn(`(DEBUG) - XFA - style for ${a} not implemented yet`)}}return i}function createWrapper(e,t){const{attributes:i}=t,{style:a}=i,r={name:"div",attributes:{class:["xfaWrapper"],style:Object.create(null)},children:[]};i.class.push("xfaWrapped");if(e.border){const{widths:i,insets:s}=e.border[ss];let n,o,g=s[0],c=s[3];const C=s[0]+s[2],h=s[1]+s[3];switch(e.border.hand){case"even":g-=i[0]/2;c-=i[3]/2;n=`calc(100% + ${(i[1]+i[3])/2-h}px)`;o=`calc(100% + ${(i[0]+i[2])/2-C}px)`;break;case"left":g-=i[0];c-=i[3];n=`calc(100% + ${i[1]+i[3]-h}px)`;o=`calc(100% + ${i[0]+i[2]-C}px)`;break;case"right":n=h?`calc(100% - ${h}px)`:"100%";o=C?`calc(100% - ${C}px)`:"100%"}const l=["xfaBorder"];isPrintOnly(e.border)&&l.push("xfaPrintOnly");const Q={name:"div",attributes:{class:l,style:{top:`${g}px`,left:`${c}px`,width:n,height:o}},children:[]};for(const e of["border","borderWidth","borderColor","borderRadius","borderStyle"])if(void 0!==a[e]){Q.attributes.style[e]=a[e];delete a[e]}r.children.push(Q,t)}else r.children.push(t);for(const e of["background","backgroundClip","top","left","width","height","minWidth","minHeight","maxWidth","maxHeight","transform","transformOrigin","visibility"])if(void 0!==a[e]){r.attributes.style[e]=a[e];delete a[e]}r.attributes.style.position="absolute"===a.position?"absolute":"relative";delete a.position;if(a.alignSelf){r.attributes.style.alignSelf=a.alignSelf;delete a.alignSelf}return r}function fixTextIndent(e){const t=getMeasurement(e.textIndent,"0px");if(t>=0)return;const i="padding"+("left"===("right"===e.textAlign?"right":"left")?"Left":"Right"),a=getMeasurement(e[i],"0px");e[i]=a-t+"px"}function setAccess(e,t){switch(e.access){case"nonInteractive":t.push("xfaNonInteractive");break;case"readOnly":t.push("xfaReadOnly");break;case"protected":t.push("xfaDisabled")}}function isPrintOnly(e){return e.relevant.length>0&&!e.relevant[0].excluded&&"print"===e.relevant[0].viewname}function getCurrentPara(e){const t=e[ys]()[ss].paraStack;return t.length?t.at(-1):null}function setPara(e,t,i){if(i.attributes.class?.includes("xfaRich")){if(t){""===e.h&&(t.height="auto");""===e.w&&(t.width="auto")}const a=getCurrentPara(e);if(a){const e=i.attributes.style;e.display="flex";e.flexDirection="column";switch(a.vAlign){case"top":e.justifyContent="start";break;case"bottom":e.justifyContent="end";break;case"middle":e.justifyContent="center"}const t=a[on]();for(const[i,a]of Object.entries(t))i in e||(e[i]=a)}}}function setFontFamily(e,t,i,a){if(!i){delete a.fontFamily;return}const r=stripQuotes(e.typeface);a.fontFamily=`"${r}"`;const s=i.find(r);if(s){const{fontFamily:i}=s.regular.cssFontInfo;i!==r&&(a.fontFamily=`"${i}"`);const n=getCurrentPara(t);if(n&&""!==n.lineHeight)return;if(a.lineHeight)return;const o=selectFont(e,s);o&&(a.lineHeight=Math.max(1.2,o.lineHeight))}}function fixURL(e){const t=createValidAbsoluteUrl(e,null,{addDefaultProtocol:!0,tryConvertEncoding:!0});return t?t.href:null}function createLine(e,t){return{name:"div",attributes:{class:["lr-tb"===e.layout?"xfaLr":"xfaRl"]},children:t}}function flushHTML(e){if(!e[ss])return null;const t={name:"div",attributes:e[ss].attributes,children:e[ss].children};if(e[ss].failingNode){const i=e[ss].failingNode[os]();i&&(e.layout.endsWith("-tb")?t.children.push(createLine(e,[i])):t.children.push(i))}return 0===t.children.length?null:t}function addHTML(e,t,i){const a=e[ss],r=a.availableSpace,[s,n,o,g]=i;switch(e.layout){case"position":a.width=Math.max(a.width,s+o);a.height=Math.max(a.height,n+g);a.children.push(t);break;case"lr-tb":case"rl-tb":if(!a.line||1===a.attempt){a.line=createLine(e,[]);a.children.push(a.line);a.numberInLine=0}a.numberInLine+=1;a.line.children.push(t);if(0===a.attempt){a.currentWidth+=o;a.height=Math.max(a.height,a.prevHeight+g)}else{a.currentWidth=o;a.prevHeight=a.height;a.height+=g;a.attempt=0}a.width=Math.max(a.width,a.currentWidth);break;case"rl-row":case"row":{a.children.push(t);a.width+=o;a.height=Math.max(a.height,g);const e=measureToString(a.height);for(const t of a.children)t.attributes.style.height=e;break}case"table":case"tb":a.width=Math.min(r.width,Math.max(a.width,o));a.height+=g;a.children.push(t)}}function getAvailableSpace(e){const t=e[ss].availableSpace,i=e.margin?e.margin.topInset+e.margin.bottomInset:0,a=e.margin?e.margin.leftInset+e.margin.rightInset:0;switch(e.layout){case"lr-tb":case"rl-tb":return 0===e[ss].attempt?{width:t.width-a-e[ss].currentWidth,height:t.height-i-e[ss].prevHeight}:{width:t.width-a,height:t.height-i-e[ss].height};case"rl-row":case"row":return{width:e[ss].columnWidths.slice(e[ss].currentColumn).reduce(((e,t)=>e+t)),height:t.height-a};case"table":case"tb":return{width:t.width-a,height:t.height-i-e[ss].height};default:return t}}function checkDimensions(e,t){if(null===e[ys]()[ss].firstUnsplittable)return!0;if(0===e.w||0===e.h)return!0;const i=e[ps](),a=i[ss]?.attempt||0,[,r,s,n]=function getTransformedBBox(e){let t,i,a=""===e.w?NaN:e.w,r=""===e.h?NaN:e.h,[s,n]=[0,0];switch(e.anchorType||""){case"bottomCenter":[s,n]=[a/2,r];break;case"bottomLeft":[s,n]=[0,r];break;case"bottomRight":[s,n]=[a,r];break;case"middleCenter":[s,n]=[a/2,r/2];break;case"middleLeft":[s,n]=[0,r/2];break;case"middleRight":[s,n]=[a,r/2];break;case"topCenter":[s,n]=[a/2,0];break;case"topRight":[s,n]=[a,0]}switch(e.rotate||0){case 0:[t,i]=[-s,-n];break;case 90:[t,i]=[-n,s];[a,r]=[r,-a];break;case 180:[t,i]=[s,n];[a,r]=[-a,-r];break;case 270:[t,i]=[n,-s];[a,r]=[-r,a]}return[e.x+t+Math.min(0,a),e.y+i+Math.min(0,r),Math.abs(a),Math.abs(r)]}(e);switch(i.layout){case"lr-tb":case"rl-tb":return 0===a?e[ys]()[ss].noLayoutFailure?""!==e.w?Math.round(s-t.width)<=2:t.width>2:!(""!==e.h&&Math.round(n-t.height)>2)&&(""!==e.w?Math.round(s-t.width)<=2||0===i[ss].numberInLine&&t.height>2:t.width>2):!!e[ys]()[ss].noLayoutFailure||!(""!==e.h&&Math.round(n-t.height)>2)&&((""===e.w||Math.round(s-t.width)<=2||!i[Ms]())&&t.height>2);case"table":case"tb":return!!e[ys]()[ss].noLayoutFailure||(""===e.h||e[Us]()?(""===e.w||Math.round(s-t.width)<=2||!i[Ms]())&&t.height>2:Math.round(n-t.height)<=2);case"position":if(e[ys]()[ss].noLayoutFailure)return!0;if(""===e.h||Math.round(n+r-t.height)<=2)return!0;return n+r>e[ys]()[ss].currentContentArea.h;case"rl-row":case"row":return!!e[ys]()[ss].noLayoutFailure||(""===e.h||Math.round(n-t.height)<=2);default:return!0}}const Yn=cn.template.id,vn="http://www.w3.org/2000/svg",Tn=/^H(\d+)$/,Kn=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"]),qn=[[[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[Qs]();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[Vr](t);e.value=t}e.value[en](t)}function*getContainedChildren(e){for(const t of e[us]())t instanceof SubformSet?yield*t[ds]():yield t}function isRequired(e){return"error"===e.validate?.nullTest}function setTabIndex(e){for(;e;){if(!e.traversal){e[tn]=e[ms]()[tn];return}if(e[tn])return;let t=null;for(const i of e.traversal[us]())if("next"===i.operation){t=i;break}if(!t||!t.ref){e[tn]=e[ms]()[tn];return}const i=e[ys]();e[tn]=++i[tn];const a=i[zs](t.ref,e);if(!a)return;e=a[0]}}function applyAssist(e,t){const i=e.assist;if(i){const e=i[sn]();e&&(t.title=e);const a=i.role.match(Tn);if(a){const e="heading",i=a[1];t.role=e;t["aria-level"]=i}}if("table"===e.layout)t.role="table";else if("row"===e.layout)t.role="row";else{const i=e[ms]();"row"===i.layout&&(t.role="TH"===i.assist?.role?"columnheader":"cell")}}function ariaLabel(e){if(!e.assist)return null;const t=e.assist;return t.speak&&""!==t.speak[is]?t.speak[is]:t.toolTip?t.toolTip[is]:null}function valueToHtml(e){return 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[ys]();if(null===t[ss].firstUnsplittable){t[ss].firstUnsplittable=e;t[ss].noLayoutFailure=!0}}function unsetFirstUnsplittable(e){const t=e[ys]();t[ss].firstUnsplittable===e&&(t[ss].noLayoutFailure=!1)}function handleBreak(e){if(e[ss])return!1;e[ss]=Object.create(null);if("auto"===e.targetType)return!1;const t=e[ys]();let i=null;if(e.target){i=t[zs](e.target,e[ms]());if(!i)return!1;i=i[0]}const{currentPageArea:a,currentContentArea:r}=t[ss];if("pageArea"===e.targetType){i instanceof PageArea||(i=null);if(e.startNew){e[ss].target=i||a;return!0}if(i&&i!==a){e[ss].target=i;return!0}return!1}i instanceof ContentArea||(i=null);const s=i&&i[ms]();let n,o=s;if(e.startNew)if(i){const e=s.contentArea.children,t=e.indexOf(r),a=e.indexOf(i);-1!==t&&te;a[ss].noLayoutFailure=!0;const n=t[sn](i);e[Zr](n.html,n.bbox);a[ss].noLayoutFailure=r;t[ps]=s}class AppearanceFilter extends StringObject{constructor(e){super(Yn,"appearanceFilter");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Arc extends XFAObject{constructor(e){super(Yn,"arc",!0);this.circular=getInteger({data:e.circular,defaultValue:0,validate:e=>1===e});this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.startAngle=getFloat({data:e.startAngle,defaultValue:0,validate:e=>!0});this.sweepAngle=getFloat({data:e.sweepAngle,defaultValue:360,validate:e=>!0});this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null;this.fill=null}[sn](){const e=this.edge||new Edge({}),t=e[on](),i=Object.create(null);"visible"===this.fill?.presence?Object.assign(i,this.fill[on]()):i.fill="transparent";i.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);i.stroke=t.color;let a;const r={xmlns:vn,style:{width:"100%",height:"100%",overflow:"visible"}};if(360===this.sweepAngle)a={name:"ellipse",attributes:{xmlns:vn,cx:"50%",cy:"50%",rx:"50%",ry:"50%",style:i}};else{const e=this.startAngle*Math.PI/180,t=this.sweepAngle*Math.PI/180,s=this.sweepAngle>180?1:0,[n,o,g,c]=[50*(1+Math.cos(e)),50*(1-Math.sin(e)),50*(1+Math.cos(e+t)),50*(1-Math.sin(e+t))];a={name:"path",attributes:{xmlns:vn,d:`M ${n} ${o} A 50 50 0 ${s} 0 ${g} ${c}`,vectorEffect:"non-scaling-stroke",style:i}};Object.assign(r,{viewBox:"0 0 100 100",preserveAspectRatio:"none"})}const s={name:"svg",children:[a],attributes:r};if(hasMargin(this[ms]()[ms]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[s]});s.attributes.style.position="absolute";return HTMLResult.success(s)}}class Area extends XFAObject{constructor(e){super(Yn,"area",!0);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null;this.area=new XFAObjectArray;this.draw=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[ds](){yield*getContainedChildren(this)}[Ls](){return!0}[Rs](){return!0}[Zr](e,t){const[i,a,r,s]=t;this[ss].width=Math.max(this[ss].width,i+r);this[ss].height=Math.max(this[ss].height,a+s);this[ss].children.push(e)}[cs](){return this[ss].availableSpace}[sn](e){const t=toStyle(this,"position"),i={style:t,id:this[gn],class:["xfaArea"]};isPrintOnly(this)&&i.class.push("xfaPrintOnly");this.name&&(i.xfaName=this.name);const a=[];this[ss]={children:a,width:0,height:0,availableSpace:e};const r=this[_r]({filter:new Set(["area","draw","field","exclGroup","subform","subformSet"]),include:!0});if(!r.success){if(r.isBreak())return r;delete this[ss];return HTMLResult.FAILURE}t.width=measureToString(this[ss].width);t.height=measureToString(this[ss].height);const s={name:"div",attributes:i,children:a},n=[this.x,this.y,this[ss].width,this[ss].height];delete this[ss];return HTMLResult.success(s,n)}}class Assist extends XFAObject{constructor(e){super(Yn,"assist",!0);this.id=e.id||"";this.role=e.role||"";this.use=e.use||"";this.usehref=e.usehref||"";this.speak=null;this.toolTip=null}[sn](){return this.toolTip?.[is]||null}}class Barcode extends XFAObject{constructor(e){super(Yn,"barcode",!0);this.charEncoding=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=getStringOption(e.checksum,["none","1mod10","1mod10_1mod11","2mod10","auto"]);this.dataColumnCount=getInteger({data:e.dataColumnCount,defaultValue:-1,validate:e=>e>=0});this.dataLength=getInteger({data:e.dataLength,defaultValue:-1,validate:e=>e>=0});this.dataPrep=getStringOption(e.dataPrep,["none","flateCompress"]);this.dataRowCount=getInteger({data:e.dataRowCount,defaultValue:-1,validate:e=>e>=0});this.endChar=e.endChar||"";this.errorCorrectionLevel=getInteger({data:e.errorCorrectionLevel,defaultValue:-1,validate:e=>e>=0&&e<=8});this.id=e.id||"";this.moduleHeight=getMeasurement(e.moduleHeight,"5mm");this.moduleWidth=getMeasurement(e.moduleWidth,"0.25mm");this.printCheckDigit=getInteger({data:e.printCheckDigit,defaultValue:0,validate:e=>1===e});this.rowColumnRatio=getRatio(e.rowColumnRatio);this.startChar=e.startChar||"";this.textLocation=getStringOption(e.textLocation,["below","above","aboveEmbedded","belowEmbedded","none"]);this.truncate=getInteger({data:e.truncate,defaultValue:0,validate:e=>1===e});this.type=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=getStringOption(e.upsMode,["usCarrier","internationalCarrier","secureSymbol","standardSymbol"]);this.use=e.use||"";this.usehref=e.usehref||"";this.wideNarrowRatio=getRatio(e.wideNarrowRatio);this.encrypt=null;this.extras=null}}class Bind extends XFAObject{constructor(e){super(Yn,"bind",!0);this.match=getStringOption(e.match,["once","dataRef","global","none"]);this.ref=e.ref||"";this.picture=null}}class BindItems extends XFAObject{constructor(e){super(Yn,"bindItems");this.connection=e.connection||"";this.labelRef=e.labelRef||"";this.ref=e.ref||"";this.valueRef=e.valueRef||""}}class Bookend extends XFAObject{constructor(e){super(Yn,"bookend");this.id=e.id||"";this.leader=e.leader||"";this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||""}}class BooleanElement extends Option01{constructor(e){super(Yn,"boolean");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[sn](e){return valueToHtml(1===this[is]?"1":"0")}}class Border extends XFAObject{constructor(e){super(Yn,"border",!0);this.break=getStringOption(e.break,["close","open"]);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.extras=null;this.fill=null;this.margin=null}[Qs](){if(!this[ss]){const e=this.edge.children.slice();if(e.length<4){const t=e.at(-1)||new Edge({});for(let i=e.length;i<4;i++)e.push(t)}const t=e.map((e=>e.thickness)),i=[0,0,0,0];if(this.margin){i[0]=this.margin.topInset;i[1]=this.margin.rightInset;i[2]=this.margin.bottomInset;i[3]=this.margin.leftInset}this[ss]={widths:t,insets:i,edges:e}}return this[ss]}[on](){const{edges:e}=this[Qs](),t=e.map((e=>{const t=e[on]();t.color||="#000000";return t})),i=Object.create(null);this.margin&&Object.assign(i,this.margin[on]());"visible"===this.fill?.presence&&Object.assign(i,this.fill[on]());if(this.corner.children.some((e=>0!==e.radius))){const e=this.corner.children.map((e=>e[on]()));if(2===e.length||3===e.length){const t=e.at(-1);for(let i=e.length;i<4;i++)e.push(t)}i.borderRadius=e.map((e=>e.radius)).join(" ")}switch(this.presence){case"invisible":case"hidden":i.borderStyle="";break;case"inactive":i.borderStyle="none";break;default:i.borderStyle=t.map((e=>e.style)).join(" ")}i.borderWidth=t.map((e=>e.width)).join(" ");i.borderColor=t.map((e=>e.color)).join(" ");return i}}class Break extends XFAObject{constructor(e){super(Yn,"break",!0);this.after=getStringOption(e.after,["auto","contentArea","pageArea","pageEven","pageOdd"]);this.afterTarget=e.afterTarget||"";this.before=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=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class BreakAfter extends XFAObject{constructor(e){super(Yn,"breakAfter",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}}class BreakBefore extends XFAObject{constructor(e){super(Yn,"breakBefore",!0);this.id=e.id||"";this.leader=e.leader||"";this.startNew=getInteger({data:e.startNew,defaultValue:0,validate:e=>1===e});this.target=e.target||"";this.targetType=getStringOption(e.targetType,["auto","contentArea","pageArea"]);this.trailer=e.trailer||"";this.use=e.use||"";this.usehref=e.usehref||"";this.script=null}[sn](e){this[ss]={};return HTMLResult.FAILURE}}class Button extends XFAObject{constructor(e){super(Yn,"button",!0);this.highlight=getStringOption(e.highlight,["inverted","none","outline","push"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[sn](e){const t=this[ms]()[ms](),i={name:"button",attributes:{id:this[gn],class:["xfaButton"],style:{}},children:[]};for(const e of t.event.children){if("click"!==e.activity||!e.script)continue;const t=recoverJsURL(e.script[is]);if(!t)continue;const a=fixURL(t.url);a&&i.children.push({name:"a",attributes:{id:"link"+this[gn],href:a,newWindow:t.newWindow,class:["xfaLink"],style:{}},children:[]})}return HTMLResult.success(i)}}class Calculate extends XFAObject{constructor(e){super(Yn,"calculate",!0);this.id=e.id||"";this.override=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 XFAObject{constructor(e){super(Yn,"caption",!0);this.id=e.id||"";this.placement=getStringOption(e.placement,["left","bottom","inline","right","top"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.reserve=Math.ceil(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}[en](e){_setValue(this,e)}[Qs](e){if(!this[ss]){let{width:t,height:i}=e;switch(this.placement){case"left":case"right":case"inline":t=this.reserve<=0?t:this.reserve;break;case"top":case"bottom":i=this.reserve<=0?i:this.reserve}this[ss]=layoutNode(this,{width:t,height:i})}return this[ss]}[sn](e){if(!this.value)return HTMLResult.EMPTY;this[Xs]();const t=this.value[sn](e).html;if(!t){this[js]();return HTMLResult.EMPTY}const i=this.reserve;if(this.reserve<=0){const{w:t,h:i}=this[Qs](e);switch(this.placement){case"left":case"right":case"inline":this.reserve=t;break;case"top":case"bottom":this.reserve=i}}const a=[];"string"==typeof t?a.push({name:"#text",value:t}):a.push(t);const r=toStyle(this,"font","margin","visibility");switch(this.placement){case"left":case"right":this.reserve>0&&(r.width=measureToString(this.reserve));break;case"top":case"bottom":this.reserve>0&&(r.height=measureToString(this.reserve))}setPara(this,null,t);this[js]();this.reserve=i;return HTMLResult.success({name:"div",attributes:{style:r,class:["xfaCaption"]},children:a})}}class Certificate extends StringObject{constructor(e){super(Yn,"certificate");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Certificates extends XFAObject{constructor(e){super(Yn,"certificates",!0);this.credentialServerPolicy=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 XFAObject{constructor(e){super(Yn,"checkButton",!0);this.id=e.id||"";this.mark=getStringOption(e.mark,["default","check","circle","cross","diamond","square","star"]);this.shape=getStringOption(e.shape,["square","round"]);this.size=getMeasurement(e.size,"10pt");this.use=e.use||"";this.usehref=e.usehref||"";this.border=null;this.extras=null;this.margin=null}[sn](e){const t=toStyle("margin"),i=measureToString(this.size);t.width=t.height=i;let a,r,s;const n=this[ms]()[ms](),o=n.items.children.length&&n.items.children[0][sn]().html||[],g={on:(void 0!==o[0]?o[0]:"on").toString(),off:(void 0!==o[1]?o[1]:"off").toString()},c=(n.value?.[an]()||"off")===g.on||void 0,C=n[ps](),h=n[gn];let l;if(C instanceof ExclGroup){s=C[gn];a="radio";r="xfaRadio";l=C[as]?.[gn]||C[gn]}else{a="checkbox";r="xfaCheckbox";l=n[as]?.[gn]||n[gn]}const Q={name:"input",attributes:{class:[r],style:t,fieldId:h,dataId:l,type:a,checked:c,xfaOn:g.on,xfaOff:g.off,"aria-label":ariaLabel(n),"aria-required":!1}};s&&(Q.attributes.name=s);if(isRequired(n)){Q.attributes["aria-required"]=!0;Q.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[Q]})}}class ChoiceList extends XFAObject{constructor(e){super(Yn,"choiceList",!0);this.commitOn=getStringOption(e.commitOn,["select","exit"]);this.id=e.id||"";this.open=getStringOption(e.open,["userControl","always","multiSelect","onEntry"]);this.textEntry=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}[sn](e){const t=toStyle(this,"border","margin"),i=this[ms]()[ms](),a={fontSize:`calc(${i.font?.size||10}px * var(--scale-factor))`},r=[];if(i.items.children.length>0){const e=i.items;let t=0,s=0;if(2===e.children.length){t=e.children[0].save;s=1-t}const n=e.children[t][sn]().html,o=e.children[s][sn]().html;let g=!1;const c=i.value?.[an]()||"";for(let e=0,t=n.length;eMath.min(Math.max(0,parseInt(e.trim(),10)),255))).map((e=>isNaN(e)?0:e));if(s.length<3)return{r:i,g:a,b:r};[i,a,r]=s;return{r:i,g:a,b:r}}(e.value):"";this.extras=null}[bs](){return!1}[on](){return this.value?Util.makeHexColor(this.value.r,this.value.g,this.value.b):null}}class Comb extends XFAObject{constructor(e){super(Yn,"comb");this.id=e.id||"";this.numberOfCells=getInteger({data:e.numberOfCells,defaultValue:0,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||""}}class Connect extends XFAObject{constructor(e){super(Yn,"connect",!0);this.connection=e.connection||"";this.id=e.id||"";this.ref=e.ref||"";this.usage=getStringOption(e.usage,["exportAndImport","exportOnly","importOnly"]);this.use=e.use||"";this.usehref=e.usehref||"";this.picture=null}}class ContentArea extends XFAObject{constructor(e){super(Yn,"contentArea",!0);this.h=getMeasurement(e.h);this.id=e.id||"";this.name=e.name||"";this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=getMeasurement(e.w);this.x=getMeasurement(e.x,"0pt");this.y=getMeasurement(e.y,"0pt");this.desc=null;this.extras=null}[sn](e){const t={left:measureToString(this.x),top:measureToString(this.y),width:measureToString(this.w),height:measureToString(this.h)},i=["xfaContentarea"];isPrintOnly(this)&&i.push("xfaPrintOnly");return HTMLResult.success({name:"div",children:[],attributes:{style:t,class:i,id:this[gn]}})}}class Corner extends XFAObject{constructor(e){super(Yn,"corner",!0);this.id=e.id||"";this.inverted=getInteger({data:e.inverted,defaultValue:0,validate:e=>1===e});this.join=getStringOption(e.join,["square","round"]);this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.radius=getMeasurement(e.radius);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[on](){const e=toStyle(this,"visibility");e.radius=measureToString("square"===this.join?0:this.radius);return e}}class DateElement extends ContentObject{constructor(e){super(Yn,"date");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=this[is].trim();this[is]=e?new Date(e):null}[sn](e){return valueToHtml(this[is]?this[is].toString():"")}}class DateTime extends ContentObject{constructor(e){super(Yn,"dateTime");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=this[is].trim();this[is]=e?new Date(e):null}[sn](e){return valueToHtml(this[is]?this[is].toString():"")}}class DateTimeEdit extends XFAObject{constructor(e){super(Yn,"dateTimeEdit",!0);this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.picker=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}[sn](e){const t=toStyle(this,"border","font","margin"),i=this[ms]()[ms](),a={name:"input",attributes:{type:"text",fieldId:i[gn],dataId:i[as]?.[gn]||i[gn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}};if(isRequired(i)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Decimal extends ContentObject{constructor(e){super(Yn,"decimal");this.fracDigits=getInteger({data:e.fracDigits,defaultValue:2,validate:e=>!0});this.id=e.id||"";this.leadDigits=getInteger({data:e.leadDigits,defaultValue:-1,validate:e=>!0});this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=parseFloat(this[is].trim());this[is]=isNaN(e)?null:e}[sn](e){return valueToHtml(null!==this[is]?this[is].toString():"")}}class DefaultUi extends XFAObject{constructor(e){super(Yn,"defaultUi",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class Desc extends XFAObject{constructor(e){super(Yn,"desc",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class DigestMethod extends OptionObject{constructor(e){super(Yn,"digestMethod",["","SHA1","SHA256","SHA512","RIPEMD160"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class DigestMethods extends XFAObject{constructor(e){super(Yn,"digestMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.digestMethod=new XFAObjectArray}}class Draw extends XFAObject{constructor(e){super(Yn,"draw",!0);this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=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 XFAObjectArray}[en](e){_setValue(this,e)}[sn](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;fixDimensions(this);this[Xs]();const t=this.w,i=this.h,{w:a,h:r,isBroken:s}=layoutNode(this,e);if(a&&""===this.w){if(s&&this[ps]()[Ms]()){this[js]();return HTMLResult.FAILURE}this.w=a}r&&""===this.h&&(this.h=r);setFirstUnsplittable(this);if(!checkDimensions(this,e)){this.w=t;this.h=i;this[js]();return HTMLResult.FAILURE}unsetFirstUnsplittable(this);const n=toStyle(this,"font","hAlign","dimensions","position","presence","rotate","anchorType","border","margin");setMinMaxDimensions(this,n);if(n.margin){n.padding=n.margin;delete n.margin}const o=["xfaDraw"];this.font&&o.push("xfaFont");isPrintOnly(this)&&o.push("xfaPrintOnly");const g={style:n,id:this[gn],class:o};this.name&&(g.xfaName=this.name);const c={name:"div",attributes:g,children:[]};applyAssist(this,g);const C=computeBbox(this,c,e),h=this.value?this.value[sn](e).html:null;if(null===h){this.w=t;this.h=i;this[js]();return HTMLResult.success(createWrapper(this,c),C)}c.children.push(h);setPara(this,n,h);this.w=t;this.h=i;this[js]();return HTMLResult.success(createWrapper(this,c),C)}}class Edge extends XFAObject{constructor(e){super(Yn,"edge",!0);this.cap=getStringOption(e.cap,["square","butt","round"]);this.id=e.id||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.stroke=getStringOption(e.stroke,["solid","dashDot","dashDotDot","dashed","dotted","embossed","etched","lowered","raised"]);this.thickness=getMeasurement(e.thickness,"0.5pt");this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[on](){const e=toStyle(this,"visibility");Object.assign(e,{linecap:this.cap,width:measureToString(this.thickness),color:this.color?this.color[on]():"#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 OptionObject{constructor(e){super(Yn,"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 XFAObject{constructor(e){super(Yn,"encodings",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encoding=new XFAObjectArray}}class Encrypt extends XFAObject{constructor(e){super(Yn,"encrypt",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=null}}class EncryptData extends XFAObject{constructor(e){super(Yn,"encryptData",!0);this.id=e.id||"";this.operation=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 XFAObject{constructor(e){super(Yn,"encryption",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class EncryptionMethod extends OptionObject{constructor(e){super(Yn,"encryptionMethod",["","AES256-CBC","TRIPLEDES-CBC","AES128-CBC","AES192-CBC"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EncryptionMethods extends XFAObject{constructor(e){super(Yn,"encryptionMethods",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.encryptionMethod=new XFAObjectArray}}class Event extends XFAObject{constructor(e){super(Yn,"event",!0);this.activity=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=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 ContentObject{constructor(e){super(Yn,"exData");this.contentType=e.contentType||"";this.href=e.href||"";this.id=e.id||"";this.maxLength=getInteger({data:e.maxLength,defaultValue:-1,validate:e=>e>=-1});this.name=e.name||"";this.rid=e.rid||"";this.transferEncoding=getStringOption(e.transferEncoding,["none","base64","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[ks](){return"text/html"===this.contentType}[Ks](e){if("text/html"===this.contentType&&e[Ys]===cn.xhtml.id){this[is]=e;return!0}if("text/xml"===this.contentType){this[is]=e;return!0}return!1}[sn](e){return"text/html"===this.contentType&&this[is]?this[is][sn](e):HTMLResult.EMPTY}}class ExObject extends XFAObject{constructor(e){super(Yn,"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 XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}}class ExclGroup extends XFAObject{constructor(e){super(Yn,"exclGroup",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.accessKey=e.accessKey||"";this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=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 XFAObjectArray;this.event=new XFAObjectArray;this.field=new XFAObjectArray;this.setProperty=new XFAObjectArray}[Rs](){return!0}[bs](){return!0}[en](e){for(const t of this.field.children){if(!t.value){const e=new Value({});t[Vr](e);t.value=e}t.value[en](e)}}[Ms](){return this.layout.endsWith("-tb")&&0===this[ss].attempt&&this[ss].numberInLine>0||this[ms]()[Ms]()}[Us](){const e=this[ps]();if(!e[Us]())return!1;if(void 0!==this[ss]._isSplittable)return this[ss]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[ss]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[ss].numberInLine)return!1;this[ss]._isSplittable=!0;return!0}[os](){return flushHTML(this)}[Zr](e,t){addHTML(this,e,t)}[cs](){return getAvailableSpace(this)}[sn](e){setTabIndex(this);if("hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;fixDimensions(this);const t=[],i={id:this[gn],class:[]};setAccess(this,i.class);this[ss]||(this[ss]=Object.create(null));Object.assign(this[ss],{children:t,attributes:i,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 a=this[Us]();a||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const r=new Set(["field"]);if(this.layout.includes("row")){const e=this[ps]().columnWidths;if(Array.isArray(e)&&e.length>0){this[ss].columnWidths=e;this[ss].currentColumn=0}}const s=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),n=["xfaExclgroup"],o=layoutClass(this);o&&n.push(o);isPrintOnly(this)&&n.push("xfaPrintOnly");i.style=s;i.class=n;this.name&&(i.xfaName=this.name);this[Xs]();const g="lr-tb"===this.layout||"rl-tb"===this.layout,c=g?2:1;for(;this[ss].attempte>=1||-1===e});this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.rotate=getInteger({data:e.rotate,defaultValue:0,validate:e=>e%90==0});this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=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 XFAObjectArray(2);this.keep=null;this.margin=null;this.para=null;this.traversal=null;this.ui=null;this.validate=null;this.value=null;this.bindItems=new XFAObjectArray;this.connect=new XFAObjectArray;this.event=new XFAObjectArray;this.setProperty=new XFAObjectArray}[Rs](){return!0}[en](e){_setValue(this,e)}[sn](e){setTabIndex(this);if(!this.ui){this.ui=new Ui({});this.ui[ws]=this[ws];this[Vr](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[Vr](e)}if(!this.ui||"hidden"===this.presence||"inactive"===this.presence||0===this.h||0===this.w)return HTMLResult.EMPTY;this.caption&&delete this.caption[ss];this[Xs]();const t=this.caption?this.caption[sn](e).html:null,i=this.w,a=this.h;let r=0,s=0;if(this.margin){r=this.margin.leftInset+this.margin.rightInset;s=this.margin.topInset+this.margin.bottomInset}let n=null;if(""===this.w||""===this.h){let t=null,i=null,a=0,o=0;if(this.ui.checkButton)a=o=this.ui.checkButton.size;else{const{w:t,h:i}=layoutNode(this,e);if(null!==t){a=t;o=i}else o=function fonts_getMetrics(e,t=!1){let i=null;if(e){const t=stripQuotes(e.typeface),a=e[ws].fontFinder.find(t);i=selectFont(e,a)}if(!i)return{lineHeight:12,lineGap:2,lineNoGap:10};const a=e.size||10,r=i.lineHeight?Math.max(t?0:1.2,i.lineHeight):1.2,s=void 0===i.lineGap?.2:i.lineGap;return{lineHeight:r*a,lineGap:s*a,lineNoGap:Math.max(1,r-s)*a}}(this.font,!0).lineNoGap}n=getBorderDims(this.ui[Qs]());a+=n.w;o+=n.h;if(this.caption){const{w:r,h:s,isBroken:n}=this.caption[Qs](e);if(n&&this[ps]()[Ms]()){this[js]();return HTMLResult.FAILURE}t=r;i=s;switch(this.caption.placement){case"left":case"right":case"inline":t+=a;break;case"top":case"bottom":i+=o}}else{t=a;i=o}if(t&&""===this.w){t+=r;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 ContentObject{constructor(e){super(Yn,"float");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=parseFloat(this[is].trim());this[is]=isNaN(e)?null:e}[sn](e){return valueToHtml(null!==this[is]?this[is].toString():"")}}class template_Font extends XFAObject{constructor(e){super(Yn,"font",!0);this.baselineShift=getMeasurement(e.baselineShift);this.fontHorizontalScale=getFloat({data:e.fontHorizontalScale,defaultValue:100,validate:e=>e>=0});this.fontVerticalScale=getFloat({data:e.fontVerticalScale,defaultValue:100,validate:e=>e>=0});this.id=e.id||"";this.kerningMode=getStringOption(e.kerningMode,["none","pair"]);this.letterSpacing=getMeasurement(e.letterSpacing,"0");this.lineThrough=getInteger({data:e.lineThrough,defaultValue:0,validate:e=>1===e||2===e});this.lineThroughPeriod=getStringOption(e.lineThroughPeriod,["all","word"]);this.overline=getInteger({data:e.overline,defaultValue:0,validate:e=>1===e||2===e});this.overlinePeriod=getStringOption(e.overlinePeriod,["all","word"]);this.posture=getStringOption(e.posture,["normal","italic"]);this.size=getMeasurement(e.size,"10pt");this.typeface=e.typeface||"Courier";this.underline=getInteger({data:e.underline,defaultValue:0,validate:e=>1===e||2===e});this.underlinePeriod=getStringOption(e.underlinePeriod,["all","word"]);this.use=e.use||"";this.usehref=e.usehref||"";this.weight=getStringOption(e.weight,["normal","bold"]);this.extras=null;this.fill=null}[zr](e){super[zr](e);this[ws].usedTypefaces.add(this.typeface)}[on](){const e=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=measureToString(this.baselineShift));e.fontKerning="none"===this.kerningMode?"none":"normal";e.letterSpacing=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=measureToString(.99*this.size);setFontFamily(this,this,this[ws].fontFinder,e);if(0!==this.underline){e.textDecoration="underline";2===this.underline&&(e.textDecorationStyle="double")}e.fontWeight=this.weight;return e}}class Format extends XFAObject{constructor(e){super(Yn,"format",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.picture=null}}class Handler extends StringObject{constructor(e){super(Yn,"handler");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Hyphenation extends XFAObject{constructor(e){super(Yn,"hyphenation");this.excludeAllCaps=getInteger({data:e.excludeAllCaps,defaultValue:0,validate:e=>1===e});this.excludeInitialCap=getInteger({data:e.excludeInitialCap,defaultValue:0,validate:e=>1===e});this.hyphenate=getInteger({data:e.hyphenate,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.pushCharacterCount=getInteger({data:e.pushCharacterCount,defaultValue:3,validate:e=>e>=0});this.remainCharacterCount=getInteger({data:e.remainCharacterCount,defaultValue:3,validate:e=>e>=0});this.use=e.use||"";this.usehref=e.usehref||"";this.wordCharacterCount=getInteger({data:e.wordCharacterCount,defaultValue:7,validate:e=>e>=0})}}class Image extends StringObject{constructor(e){super(Yn,"image");this.aspect=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=getStringOption(e.transferEncoding,["base64","none","package"]);this.use=e.use||"";this.usehref=e.usehref||""}[sn](){if(this.contentType&&!Kn.has(this.contentType.toLowerCase()))return HTMLResult.EMPTY;let e=this[ws].images&&this[ws].images.get(this.href);if(!e&&(this.href||!this[is]))return HTMLResult.EMPTY;e||"base64"!==this.transferEncoding||(e=stringToBytes(atob(this[is])));if(!e)return HTMLResult.EMPTY;if(!this.contentType){for(const[t,i]of qn)if(e.length>t.length&&t.every(((t,i)=>t===e[i]))){this.contentType=i;break}if(!this.contentType)return HTMLResult.EMPTY}const t=new Blob([e],{type:this.contentType});let i;switch(this.aspect){case"fit":case"actual":break;case"height":i={height:"100%",objectFit:"fill"};break;case"none":i={width:"100%",height:"100%",objectFit:"fill"};break;case"width":i={width:"100%",objectFit:"fill"}}const a=this[ms]();return HTMLResult.success({name:"img",attributes:{class:["xfaImage"],style:i,src:URL.createObjectURL(t),alt:a?ariaLabel(a[ms]()):null}})}}class ImageEdit extends XFAObject{constructor(e){super(Yn,"imageEdit",!0);this.data=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}[sn](e){return"embed"===this.data?HTMLResult.success({name:"div",children:[],attributes:{}}):HTMLResult.EMPTY}}class Integer extends ContentObject{constructor(e){super(Yn,"integer");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=parseInt(this[is].trim(),10);this[is]=isNaN(e)?null:e}[sn](e){return valueToHtml(null!==this[is]?this[is].toString():"")}}class Issuers extends XFAObject{constructor(e){super(Yn,"issuers",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Items extends XFAObject{constructor(e){super(Yn,"items",!0);this.id=e.id||"";this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.ref=e.ref||"";this.save=getInteger({data:e.save,defaultValue:0,validate:e=>1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[sn](){const e=[];for(const t of this[us]())e.push(t[an]());return HTMLResult.success(e)}}class Keep extends XFAObject{constructor(e){super(Yn,"keep",!0);this.id=e.id||"";const t=["none","contentArea","pageArea"];this.intact=getStringOption(e.intact,t);this.next=getStringOption(e.next,t);this.previous=getStringOption(e.previous,t);this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}}class KeyUsage extends XFAObject{constructor(e){super(Yn,"keyUsage");const t=["","yes","no"];this.crlSign=getStringOption(e.crlSign,t);this.dataEncipherment=getStringOption(e.dataEncipherment,t);this.decipherOnly=getStringOption(e.decipherOnly,t);this.digitalSignature=getStringOption(e.digitalSignature,t);this.encipherOnly=getStringOption(e.encipherOnly,t);this.id=e.id||"";this.keyAgreement=getStringOption(e.keyAgreement,t);this.keyCertSign=getStringOption(e.keyCertSign,t);this.keyEncipherment=getStringOption(e.keyEncipherment,t);this.nonRepudiation=getStringOption(e.nonRepudiation,t);this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Line extends XFAObject{constructor(e){super(Yn,"line",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.slope=getStringOption(e.slope,["\\","/"]);this.use=e.use||"";this.usehref=e.usehref||"";this.edge=null}[sn](){const e=this[ms]()[ms](),t=this.edge||new Edge({}),i=t[on](),a=Object.create(null),r="visible"===t.presence?t.thickness:0;a.strokeWidth=measureToString(r);a.stroke=i.color;let s,n,o,g,c="100%",C="100%";if(e.w<=r){[s,n,o,g]=["50%",0,"50%","100%"];c=a.strokeWidth}else if(e.h<=r){[s,n,o,g]=[0,"50%","100%","50%"];C=a.strokeWidth}else"\\"===this.slope?[s,n,o,g]=[0,0,"100%","100%"]:[s,n,o,g]=[0,"100%","100%",0];const h={name:"svg",children:[{name:"line",attributes:{xmlns:vn,x1:s,y1:n,x2:o,y2:g,style:a}}],attributes:{xmlns:vn,width:c,height:C,style:{overflow:"visible"}}};if(hasMargin(e))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[h]});h.attributes.style.position="absolute";return HTMLResult.success(h)}}class Linear extends XFAObject{constructor(e){super(Yn,"linear",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toRight","toBottom","toLeft","toTop"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[on](e){e=e?e[on]():"#FFFFFF";return`linear-gradient(${this.type.replace(/([RBLT])/," $1").toLowerCase()}, ${e}, ${this.color?this.color[on]():"#000000"})`}}class LockDocument extends ContentObject{constructor(e){super(Yn,"lockDocument");this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}[ns](){this[is]=getStringOption(this[is],["auto","0","1"])}}class Manifest extends XFAObject{constructor(e){super(Yn,"manifest",!0);this.action=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 XFAObjectArray}}class Margin extends XFAObject{constructor(e){super(Yn,"margin",!0);this.bottomInset=getMeasurement(e.bottomInset,"0");this.id=e.id||"";this.leftInset=getMeasurement(e.leftInset,"0");this.rightInset=getMeasurement(e.rightInset,"0");this.topInset=getMeasurement(e.topInset,"0");this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[on](){return{margin:measureToString(this.topInset)+" "+measureToString(this.rightInset)+" "+measureToString(this.bottomInset)+" "+measureToString(this.leftInset)}}}class Mdp extends XFAObject{constructor(e){super(Yn,"mdp");this.id=e.id||"";this.permissions=getInteger({data:e.permissions,defaultValue:2,validate:e=>1===e||3===e});this.signatureType=getStringOption(e.signatureType,["filler","author"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Medium extends XFAObject{constructor(e){super(Yn,"medium");this.id=e.id||"";this.imagingBBox=function getBBox(e){const t=-1;if(!e)return{x:t,y:t,width:t,height:t};const i=e.trim().split(/\s*,\s*/).map((e=>getMeasurement(e,"-1")));if(i.length<4||i[2]<0||i[3]<0)return{x:t,y:t,width:t,height:t};const[a,r,s,n]=i;return{x:a,y:r,width:s,height:n}}(e.imagingBBox);this.long=getMeasurement(e.long);this.orientation=getStringOption(e.orientation,["portrait","landscape"]);this.short=getMeasurement(e.short);this.stock=e.stock||"";this.trayIn=getStringOption(e.trayIn,["auto","delegate","pageFront"]);this.trayOut=getStringOption(e.trayOut,["auto","delegate"]);this.use=e.use||"";this.usehref=e.usehref||""}}class Message extends XFAObject{constructor(e){super(Yn,"message",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.text=new XFAObjectArray}}class NumericEdit extends XFAObject{constructor(e){super(Yn,"numericEdit",!0);this.hScrollPolicy=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}[sn](e){const t=toStyle(this,"border","font","margin"),i=this[ms]()[ms](),a={name:"input",attributes:{type:"text",fieldId:i[gn],dataId:i[as]?.[gn]||i[gn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(i),"aria-required":!1}};if(isRequired(i)){a.attributes["aria-required"]=!0;a.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[a]})}}class Occur extends XFAObject{constructor(e){super(Yn,"occur",!0);this.id=e.id||"";this.initial=""!==e.initial?getInteger({data:e.initial,defaultValue:"",validate:e=>!0}):"";this.max=""!==e.max?getInteger({data:e.max,defaultValue:1,validate:e=>!0}):"";this.min=""!==e.min?getInteger({data:e.min,defaultValue:1,validate:e=>!0}):"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[zr](){const e=this[ms](),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=getInteger({data:e.numbered,defaultValue:1,validate:e=>!0});this.oddOrEven=getStringOption(e.oddOrEven,["any","even","odd"]);this.pagePosition=getStringOption(e.pagePosition,["any","first","last","only","rest"]);this.relevant=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 XFAObjectArray;this.contentArea=new XFAObjectArray;this.draw=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.subform=new XFAObjectArray}[Hs](){if(!this[ss]){this[ss]={numberOfUse:0};return!0}return!this.occur||-1===this.occur.max||this[ss].numberOfUsee.oddOrEven===t&&e.pagePosition===i));if(a)return a;a=this.pageArea.children.find((e=>"any"===e.oddOrEven&&e.pagePosition===i));if(a)return a;a=this.pageArea.children.find((e=>"any"===e.oddOrEven&&"any"===e.pagePosition));return a||this.pageArea.children[0]}}class Para extends XFAObject{constructor(e){super(Yn,"para",!0);this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.lineHeight=e.lineHeight?getMeasurement(e.lineHeight,"0pt"):"";this.marginLeft=e.marginLeft?getMeasurement(e.marginLeft,"0pt"):"";this.marginRight=e.marginRight?getMeasurement(e.marginRight,"0pt"):"";this.orphans=getInteger({data:e.orphans,defaultValue:0,validate:e=>e>=0});this.preserve=e.preserve||"";this.radixOffset=e.radixOffset?getMeasurement(e.radixOffset,"0pt"):"";this.spaceAbove=e.spaceAbove?getMeasurement(e.spaceAbove,"0pt"):"";this.spaceBelow=e.spaceBelow?getMeasurement(e.spaceBelow,"0pt"):"";this.tabDefault=e.tabDefault?getMeasurement(this.tabDefault):"";this.tabStops=(e.tabStops||"").trim().split(/\s+/).map(((e,t)=>t%2==1?getMeasurement(e):e));this.textIndent=e.textIndent?getMeasurement(e.textIndent,"0pt"):"";this.use=e.use||"";this.usehref=e.usehref||"";this.vAlign=getStringOption(e.vAlign,["top","bottom","middle"]);this.widows=getInteger({data:e.widows,defaultValue:0,validate:e=>e>=0});this.hyphenation=null}[on](){const e=toStyle(this,"hAlign");""!==this.marginLeft&&(e.paddingLeft=measureToString(this.marginLeft));""!==this.marginRight&&(e.paddingight=measureToString(this.marginRight));""!==this.spaceAbove&&(e.paddingTop=measureToString(this.spaceAbove));""!==this.spaceBelow&&(e.paddingBottom=measureToString(this.spaceBelow));if(""!==this.textIndent){e.textIndent=measureToString(this.textIndent);fixTextIndent(e)}this.lineHeight>0&&(e.lineHeight=measureToString(this.lineHeight));""!==this.tabDefault&&(e.tabSize=measureToString(this.tabDefault));this.tabStops.length;this.hyphenatation&&Object.assign(e,this.hyphenatation[on]());return e}}class PasswordEdit extends XFAObject{constructor(e){super(Yn,"passwordEdit",!0);this.hScrollPolicy=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 template_Pattern extends XFAObject{constructor(e){super(Yn,"pattern",!0);this.id=e.id||"";this.type=getStringOption(e.type,["crossHatch","crossDiagonal","diagonalLeft","diagonalRight","horizontal","vertical"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[on](e){e=e?e[on]():"#FFFFFF";const t=this.color?this.color[on]():"#000000",i="repeating-linear-gradient",a=`${e},${e} 5px,${t} 5px,${t} 10px`;switch(this.type){case"crossHatch":return`${i}(to top,${a}) ${i}(to right,${a})`;case"crossDiagonal":return`${i}(45deg,${a}) ${i}(-45deg,${a})`;case"diagonalLeft":return`${i}(45deg,${a})`;case"diagonalRight":return`${i}(-45deg,${a})`;case"horizontal":return`${i}(to top,${a})`;case"vertical":return`${i}(to right,${a})`}return""}}class Picture extends StringObject{constructor(e){super(Yn,"picture");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Proto extends XFAObject{constructor(e){super(Yn,"proto",!0);this.appearanceFilter=new XFAObjectArray;this.arc=new XFAObjectArray;this.area=new XFAObjectArray;this.assist=new XFAObjectArray;this.barcode=new XFAObjectArray;this.bindItems=new XFAObjectArray;this.bookend=new XFAObjectArray;this.boolean=new XFAObjectArray;this.border=new XFAObjectArray;this.break=new XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.button=new XFAObjectArray;this.calculate=new XFAObjectArray;this.caption=new XFAObjectArray;this.certificate=new XFAObjectArray;this.certificates=new XFAObjectArray;this.checkButton=new XFAObjectArray;this.choiceList=new XFAObjectArray;this.color=new XFAObjectArray;this.comb=new XFAObjectArray;this.connect=new XFAObjectArray;this.contentArea=new XFAObjectArray;this.corner=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.dateTimeEdit=new XFAObjectArray;this.decimal=new XFAObjectArray;this.defaultUi=new XFAObjectArray;this.desc=new XFAObjectArray;this.digestMethod=new XFAObjectArray;this.digestMethods=new XFAObjectArray;this.draw=new XFAObjectArray;this.edge=new XFAObjectArray;this.encoding=new XFAObjectArray;this.encodings=new XFAObjectArray;this.encrypt=new XFAObjectArray;this.encryptData=new XFAObjectArray;this.encryption=new XFAObjectArray;this.encryptionMethod=new XFAObjectArray;this.encryptionMethods=new XFAObjectArray;this.event=new XFAObjectArray;this.exData=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.execute=new XFAObjectArray;this.extras=new XFAObjectArray;this.field=new XFAObjectArray;this.fill=new XFAObjectArray;this.filter=new XFAObjectArray;this.float=new XFAObjectArray;this.font=new XFAObjectArray;this.format=new XFAObjectArray;this.handler=new XFAObjectArray;this.hyphenation=new XFAObjectArray;this.image=new XFAObjectArray;this.imageEdit=new XFAObjectArray;this.integer=new XFAObjectArray;this.issuers=new XFAObjectArray;this.items=new XFAObjectArray;this.keep=new XFAObjectArray;this.keyUsage=new XFAObjectArray;this.line=new XFAObjectArray;this.linear=new XFAObjectArray;this.lockDocument=new XFAObjectArray;this.manifest=new XFAObjectArray;this.margin=new XFAObjectArray;this.mdp=new XFAObjectArray;this.medium=new XFAObjectArray;this.message=new XFAObjectArray;this.numericEdit=new XFAObjectArray;this.occur=new XFAObjectArray;this.oid=new XFAObjectArray;this.oids=new XFAObjectArray;this.overflow=new XFAObjectArray;this.pageArea=new XFAObjectArray;this.pageSet=new XFAObjectArray;this.para=new XFAObjectArray;this.passwordEdit=new XFAObjectArray;this.pattern=new XFAObjectArray;this.picture=new XFAObjectArray;this.radial=new XFAObjectArray;this.reason=new XFAObjectArray;this.reasons=new XFAObjectArray;this.rectangle=new XFAObjectArray;this.ref=new XFAObjectArray;this.script=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.signData=new XFAObjectArray;this.signature=new XFAObjectArray;this.signing=new XFAObjectArray;this.solid=new XFAObjectArray;this.speak=new XFAObjectArray;this.stipple=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray;this.subjectDN=new XFAObjectArray;this.subjectDNs=new XFAObjectArray;this.submit=new XFAObjectArray;this.text=new XFAObjectArray;this.textEdit=new XFAObjectArray;this.time=new XFAObjectArray;this.timeStamp=new XFAObjectArray;this.toolTip=new XFAObjectArray;this.traversal=new XFAObjectArray;this.traverse=new XFAObjectArray;this.ui=new XFAObjectArray;this.validate=new XFAObjectArray;this.value=new XFAObjectArray;this.variables=new XFAObjectArray}}class Radial extends XFAObject{constructor(e){super(Yn,"radial",!0);this.id=e.id||"";this.type=getStringOption(e.type,["toEdge","toCenter"]);this.use=e.use||"";this.usehref=e.usehref||"";this.color=null;this.extras=null}[on](e){e=e?e[on]():"#FFFFFF";const t=this.color?this.color[on]():"#000000";return`radial-gradient(circle at center, ${"toEdge"===this.type?`${e},${t}`:`${t},${e}`})`}}class Reason extends StringObject{constructor(e){super(Yn,"reason");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Reasons extends XFAObject{constructor(e){super(Yn,"reasons",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.reason=new XFAObjectArray}}class Rectangle extends XFAObject{constructor(e){super(Yn,"rectangle",!0);this.hand=getStringOption(e.hand,["even","left","right"]);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.corner=new XFAObjectArray(4);this.edge=new XFAObjectArray(4);this.fill=null}[sn](){const e=this.edge.children.length?this.edge.children[0]:new Edge({}),t=e[on](),i=Object.create(null);"visible"===this.fill?.presence?Object.assign(i,this.fill[on]()):i.fill="transparent";i.strokeWidth=measureToString("visible"===e.presence?e.thickness:0);i.stroke=t.color;const a=(this.corner.children.length?this.corner.children[0]:new Corner({}))[on](),r={name:"svg",children:[{name:"rect",attributes:{xmlns:vn,width:"100%",height:"100%",x:0,y:0,rx:a.radius,ry:a.radius,style:i}}],attributes:{xmlns:vn,style:{overflow:"visible"},width:"100%",height:"100%"}};if(hasMargin(this[ms]()[ms]()))return HTMLResult.success({name:"div",attributes:{style:{display:"inline",width:"100%",height:"100%"}},children:[r]});r.attributes.style.position="absolute";return HTMLResult.success(r)}}class RefElement extends StringObject{constructor(e){super(Yn,"ref");this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Script extends StringObject{constructor(e){super(Yn,"script");this.binding=e.binding||"";this.contentType=e.contentType||"";this.id=e.id||"";this.name=e.name||"";this.runAt=getStringOption(e.runAt,["client","both","server"]);this.use=e.use||"";this.usehref=e.usehref||""}}class SetProperty extends XFAObject{constructor(e){super(Yn,"setProperty");this.connection=e.connection||"";this.ref=e.ref||"";this.target=e.target||""}}class SignData extends XFAObject{constructor(e){super(Yn,"signData",!0);this.id=e.id||"";this.operation=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 XFAObject{constructor(e){super(Yn,"signature",!0);this.id=e.id||"";this.type=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 XFAObject{constructor(e){super(Yn,"signing",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.certificate=new XFAObjectArray}}class Solid extends XFAObject{constructor(e){super(Yn,"solid",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null}[on](e){return e?e[on]():"#FFFFFF"}}class Speak extends StringObject{constructor(e){super(Yn,"speak");this.disable=getInteger({data:e.disable,defaultValue:0,validate:e=>1===e});this.id=e.id||"";this.priority=getStringOption(e.priority,["custom","caption","name","toolTip"]);this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Stipple extends XFAObject{constructor(e){super(Yn,"stipple",!0);this.id=e.id||"";this.rate=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}[on](e){const t=this.rate/100;return 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 XFAObject{constructor(e){super(Yn,"subform",!0);this.access=getStringOption(e.access,["open","nonInteractive","protected","readOnly"]);this.allowMacro=getInteger({data:e.allowMacro,defaultValue:0,validate:e=>1===e});this.anchorType=getStringOption(e.anchorType,["topLeft","bottomCenter","bottomLeft","bottomRight","middleCenter","middleLeft","middleRight","topCenter","topRight"]);this.colSpan=getInteger({data:e.colSpan,defaultValue:1,validate:e=>e>=1||-1===e});this.columnWidths=(e.columnWidths||"").trim().split(/\s+/).map((e=>"-1"===e?-1:getMeasurement(e)));this.h=e.h?getMeasurement(e.h):"";this.hAlign=getStringOption(e.hAlign,["left","center","justify","justifyAll","radix","right"]);this.id=e.id||"";this.layout=getStringOption(e.layout,["position","lr-tb","rl-row","rl-tb","row","table","tb"]);this.locale=e.locale||"";this.maxH=getMeasurement(e.maxH,"0pt");this.maxW=getMeasurement(e.maxW,"0pt");this.mergeMode=getStringOption(e.mergeMode,["consumeData","matchTemplate"]);this.minH=getMeasurement(e.minH,"0pt");this.minW=getMeasurement(e.minW,"0pt");this.name=e.name||"";this.presence=getStringOption(e.presence,["visible","hidden","inactive","invisible"]);this.relevant=getRelevant(e.relevant);this.restoreState=getStringOption(e.restoreState,["manual","auto"]);this.scope=getStringOption(e.scope,["name","none"]);this.use=e.use||"";this.usehref=e.usehref||"";this.w=e.w?getMeasurement(e.w):"";this.x=getMeasurement(e.x,"0pt");this.y=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 XFAObjectArray;this.breakAfter=new XFAObjectArray;this.breakBefore=new XFAObjectArray;this.connect=new XFAObjectArray;this.draw=new XFAObjectArray;this.event=new XFAObjectArray;this.exObject=new XFAObjectArray;this.exclGroup=new XFAObjectArray;this.field=new XFAObjectArray;this.proto=new XFAObjectArray;this.setProperty=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}[ps](){const e=this[ms]();return e instanceof SubformSet?e[ps]():e}[Rs](){return!0}[Ms](){return this.layout.endsWith("-tb")&&0===this[ss].attempt&&this[ss].numberInLine>0||this[ms]()[Ms]()}*[ds](){yield*getContainedChildren(this)}[os](){return flushHTML(this)}[Zr](e,t){addHTML(this,e,t)}[cs](){return getAvailableSpace(this)}[Us](){const e=this[ps]();if(!e[Us]())return!1;if(void 0!==this[ss]._isSplittable)return this[ss]._isSplittable;if("position"===this.layout||this.layout.includes("row")){this[ss]._isSplittable=!1;return!1}if(this.keep&&"none"!==this.keep.intact){this[ss]._isSplittable=!1;return!1}if(e.layout?.endsWith("-tb")&&0!==e[ss].numberInLine)return!1;this[ss]._isSplittable=!0;return!0}[sn](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[ws]=this[ws];this[Vr](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[ws]=this[ws];this[Vr](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[ws]=this[ws];this[Vr](e);this.overflow.push(e)}this[Zs](this.break);this.break=null}if("hidden"===this.presence||"inactive"===this.presence)return HTMLResult.EMPTY;(this.breakBefore.children.length>1||this.breakAfter.children.length>1)&&warn("XFA - Several breakBefore or breakAfter in subforms: please file a bug.");if(this.breakBefore.children.length>=1){const e=this.breakBefore.children[0];if(handleBreak(e))return HTMLResult.breakNode(e)}if(this[ss]?.afterBreakAfter)return HTMLResult.EMPTY;fixDimensions(this);const t=[],i={id:this[gn],class:[]};setAccess(this,i.class);this[ss]||(this[ss]=Object.create(null));Object.assign(this[ss],{children:t,line:null,attributes:i,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 a=this[ys](),r=a[ss].noLayoutFailure,s=this[Us]();s||setFirstUnsplittable(this);if(!checkDimensions(this,e))return HTMLResult.FAILURE;const n=new Set(["area","draw","exclGroup","field","subform","subformSet"]);if(this.layout.includes("row")){const e=this[ps]().columnWidths;if(Array.isArray(e)&&e.length>0){this[ss].columnWidths=e;this[ss].currentColumn=0}}const o=toStyle(this,"anchorType","dimensions","position","presence","border","margin","hAlign"),g=["xfaSubform"],c=layoutClass(this);c&&g.push(c);i.style=o;i.class=g;this.name&&(i.xfaName=this.name);if(this.overflow){const t=this.overflow[Qs]();if(t.addLeader){t.addLeader=!1;handleOverflow(this,t.leader,e)}}this[Xs]();const C="lr-tb"===this.layout||"rl-tb"===this.layout,h=C?2:1;for(;this[ss].attempt=1){const e=this.breakAfter.children[0];if(handleBreak(e)){this[ss].afterBreakAfter=p;return HTMLResult.breakNode(e)}}delete this[ss];return p}}class SubformSet extends XFAObject{constructor(e){super(Yn,"subformSet",!0);this.id=e.id||"";this.name=e.name||"";this.relation=getStringOption(e.relation,["ordered","choice","unordered"]);this.relevant=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 XFAObjectArray;this.breakBefore=new XFAObjectArray;this.subform=new XFAObjectArray;this.subformSet=new XFAObjectArray}*[ds](){yield*getContainedChildren(this)}[ps](){let e=this[ms]();for(;!(e instanceof Subform);)e=e[ms]();return e}[Rs](){return!0}}class SubjectDN extends ContentObject{constructor(e){super(Yn,"subjectDN");this.delimiter=e.delimiter||",";this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){this[is]=new Map(this[is].split(this.delimiter).map((e=>{(e=e.split("=",2))[0]=e[0].trim();return e})))}}class SubjectDNs extends XFAObject{constructor(e){super(Yn,"subjectDNs",!0);this.id=e.id||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||"";this.subjectDN=new XFAObjectArray}}class Submit extends XFAObject{constructor(e){super(Yn,"submit",!0);this.embedPDF=getInteger({data:e.embedPDF,defaultValue:0,validate:e=>1===e});this.format=getStringOption(e.format,["xdp","formdata","pdf","urlencoded","xfd","xml"]);this.id=e.id||"";this.target=e.target||"";this.textEncoding=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 XFAObjectArray;this.signData=new XFAObjectArray}}class Template extends XFAObject{constructor(e){super(Yn,"template",!0);this.baseProfile=getStringOption(e.baseProfile,["full","interactiveForms"]);this.extras=null;this.subform=new XFAObjectArray}[ns](){0===this.subform.children.length&&warn("XFA - No subforms in template node.");this.subform.children.length>=2&&warn("XFA - Several subforms in template node: please file a bug.");this[tn]=5e3}[Us](){return!0}[zs](e,t){return e.startsWith("#")?[this[Ds].get(e.slice(1))]:searchNode(this,t,e,!0,!0)}*[rn](){if(!this.subform.children.length)return HTMLResult.success({name:"div",children:[]});this[ss]={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]();const t=e.pageSet.pageArea.children,i={name:"div",children:[]};let a=null,r=null,s=null;if(e.breakBefore.children.length>=1){r=e.breakBefore.children[0];s=r.target}else if(e.subform.children.length>=1&&e.subform.children[0].breakBefore.children.length>=1){r=e.subform.children[0].breakBefore.children[0];s=r.target}else if(e.break?.beforeTarget){r=e.break;s=r.beforeTarget}else if(e.subform.children.length>=1&&e.subform.children[0].break?.beforeTarget){r=e.subform.children[0].break;s=r.beforeTarget}if(r){const e=this[zs](s,r[ms]());if(e instanceof PageArea){a=e;r[ss]={}}}a||(a=t[0]);a[ss]={numberOfUse:1};const n=a[ms]();n[ss]={numberOfUse:1,pageIndex:n.pageArea.children.indexOf(a),pageSetIndex:0};let o,g=null,c=null,C=!0,h=0,l=0;for(;;){if(C)h=0;else{i.children.pop();if(3==++h){warn("XFA - Something goes wrong: please file a bug.");return i}}o=null;this[ss].currentPageArea=a;const t=a[sn]().html;i.children.push(t);if(g){this[ss].noLayoutFailure=!0;t.children.push(g[sn](a[ss].space).html);g=null}if(c){this[ss].noLayoutFailure=!0;t.children.push(c[sn](a[ss].space).html);c=null}const r=a.contentArea.children,s=t.children.filter((e=>e.attributes.class.includes("xfaContentarea")));C=!1;this[ss].firstUnsplittable=null;this[ss].noLayoutFailure=!1;const flush=t=>{const i=e[os]();if(i){C||=i.children?.length>0;s[t].children.push(i)}};for(let t=l,a=r.length;t0;s[t].children.push(h.html)}else!C&&i.children.length>1&&i.children.pop();return i}if(h.isBreak()){const e=h.breakNode;flush(t);if("auto"===e.targetType)continue;if(e.leader){g=this[zs](e.leader,e[ms]());g=g?g[0]:null}if(e.trailer){c=this[zs](e.trailer,e[ms]());c=c?c[0]:null}if("pageArea"===e.targetType){o=e[ss].target;t=1/0}else if(e[ss].target){o=e[ss].target;l=e[ss].index+1;t=1/0}else t=e[ss].index}else if(this[ss].overflowNode){const e=this[ss].overflowNode;this[ss].overflowNode=null;const i=e[Qs](),a=i.target;i.addLeader=null!==i.leader;i.addTrailer=null!==i.trailer;flush(t);const s=t;t=1/0;if(a instanceof PageArea)o=a;else if(a instanceof ContentArea){const e=r.indexOf(a);if(-1!==e)e>s?t=e-1:l=e;else{o=a[ms]();l=o.contentArea.children.indexOf(a)}}}else flush(t)}this[ss].pageNumber+=1;o&&(o[Hs]()?o[ss].numberOfUse+=1:o=null);a=o||a[fs]();yield null}}}class Text extends ContentObject{constructor(e){super(Yn,"text");this.id=e.id||"";this.maxChars=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||""}[Xr](){return!0}[Ks](e){if(e[Ys]===cn.xhtml.id){this[is]=e;return!0}warn(`XFA - Invalid content in Text: ${e[vs]}.`);return!1}[Os](e){this[is]instanceof XFAObject||super[Os](e)}[ns](){"string"==typeof this[is]&&(this[is]=this[is].replaceAll("\r\n","\n"))}[Qs](){return"string"==typeof this[is]?this[is].split(/[\u2029\u2028\n]/).reduce(((e,t)=>{t&&e.push(t);return e}),[]).join("\n"):this[is][an]()}[sn](e){if("string"==typeof this[is]){const e=valueToHtml(this[is]).html;if(this[is].includes("\u2029")){e.name="div";e.children=[];this[is].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[is])){e.name="div";e.children=[];this[is].split(/[\u2028\n]/).forEach((t=>{e.children.push({name:"span",value:t},{name:"br"})}))}return HTMLResult.success(e)}return this[is][sn](e)}}class TextEdit extends XFAObject{constructor(e){super(Yn,"textEdit",!0);this.allowRichText=getInteger({data:e.allowRichText,defaultValue:0,validate:e=>1===e});this.hScrollPolicy=getStringOption(e.hScrollPolicy,["auto","off","on"]);this.id=e.id||"";this.multiLine=getInteger({data:e.multiLine,defaultValue:"",validate:e=>0===e||1===e});this.use=e.use||"";this.usehref=e.usehref||"";this.vScrollPolicy=getStringOption(e.vScrollPolicy,["auto","off","on"]);this.border=null;this.comb=null;this.extras=null;this.margin=null}[sn](e){const t=toStyle(this,"border","font","margin");let i;const a=this[ms]()[ms]();""===this.multiLine&&(this.multiLine=a instanceof Draw?1:0);i=1===this.multiLine?{name:"textarea",attributes:{dataId:a[as]?.[gn]||a[gn],fieldId:a[gn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}}:{name:"input",attributes:{type:"text",dataId:a[as]?.[gn]||a[gn],fieldId:a[gn],class:["xfaTextfield"],style:t,"aria-label":ariaLabel(a),"aria-required":!1}};if(isRequired(a)){i.attributes["aria-required"]=!0;i.attributes.required=!0}return HTMLResult.success({name:"label",attributes:{class:["xfaLabel"]},children:[i]})}}class Time extends StringObject{constructor(e){super(Yn,"time");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}[ns](){const e=this[is].trim();this[is]=e?new Date(e):null}[sn](e){return valueToHtml(this[is]?this[is].toString():"")}}class TimeStamp extends XFAObject{constructor(e){super(Yn,"timeStamp");this.id=e.id||"";this.server=e.server||"";this.type=getStringOption(e.type,["optional","required"]);this.use=e.use||"";this.usehref=e.usehref||""}}class ToolTip extends StringObject{constructor(e){super(Yn,"toolTip");this.id=e.id||"";this.rid=e.rid||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Traversal extends XFAObject{constructor(e){super(Yn,"traversal",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.extras=null;this.traverse=new XFAObjectArray}}class Traverse extends XFAObject{constructor(e){super(Yn,"traverse",!0);this.id=e.id||"";this.operation=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}[Ls](){return!1}}class Ui extends XFAObject{constructor(e){super(Yn,"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}[Qs](){if(void 0===this[ss]){for(const e of Object.getOwnPropertyNames(this)){if("extras"===e||"picture"===e)continue;const t=this[e];if(t instanceof XFAObject){this[ss]=t;return t}}this[ss]=null}return this[ss]}[sn](e){const t=this[Qs]();return t?t[sn](e):HTMLResult.EMPTY}}class Validate extends XFAObject{constructor(e){super(Yn,"validate",!0);this.formatTest=getStringOption(e.formatTest,["warning","disabled","error"]);this.id=e.id||"";this.nullTest=getStringOption(e.nullTest,["disabled","error","warning"]);this.scriptTest=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 XFAObject{constructor(e){super(Yn,"value",!0);this.id=e.id||"";this.override=getInteger({data:e.override,defaultValue:0,validate:e=>1===e});this.relevant=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}[en](e){const t=this[ms]();if(t instanceof Field&&t.ui?.imageEdit){if(!this.image){this.image=new Image({});this[Vr](this.image)}this.image[is]=e[is];return}const i=e[vs];if(null===this[i]){for(const e of Object.getOwnPropertyNames(this)){const t=this[e];if(t instanceof XFAObject){this[e]=null;this[Zs](t)}}this[e[vs]]=e;this[Vr](e)}else this[i][is]=e[is]}[an](){if(this.exData)return"string"==typeof this.exData[is]?this.exData[is].trim():this.exData[is][an]().trim();for(const e of Object.getOwnPropertyNames(this)){if("image"===e)continue;const t=this[e];if(t instanceof XFAObject)return(t[is]||"").toString().trim()}return null}[sn](e){for(const t of Object.getOwnPropertyNames(this)){const i=this[t];if(i instanceof XFAObject)return i[sn](e)}return HTMLResult.EMPTY}}class Variables extends XFAObject{constructor(e){super(Yn,"variables",!0);this.id=e.id||"";this.use=e.use||"";this.usehref=e.usehref||"";this.boolean=new XFAObjectArray;this.date=new XFAObjectArray;this.dateTime=new XFAObjectArray;this.decimal=new XFAObjectArray;this.exData=new XFAObjectArray;this.float=new XFAObjectArray;this.image=new XFAObjectArray;this.integer=new XFAObjectArray;this.manifest=new XFAObjectArray;this.script=new XFAObjectArray;this.text=new XFAObjectArray;this.time=new XFAObjectArray}[Ls](){return!0}}class TemplateNamespace{static[In](e,t){if(TemplateNamespace.hasOwnProperty(e)){const i=TemplateNamespace[e](t);i[An](t);return i}}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 template_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 template_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)}}const On=cn.datasets.id;function createText(e){const t=new Text({});t[is]=e;return t}class Binder{constructor(e){this.root=e;this.datasets=e.datasets;this.data=e.datasets?.data||new XmlObject(cn.datasets.id,"data");this.emptyMerge=0===this.data[us]().length;this.root.form=this.form=e.template[es]()}_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,i){e[as]=t;if(e[bs]())if(t[Ns]()){const i=t[Bs]();e[en](createText(i))}else if(e instanceof Field&&"multiSelect"===e.ui?.choiceList?.open){const i=t[us]().map((e=>e[is].trim())).join("\n");e[en](createText(i))}else this._isConsumeData()&&warn("XFA - Nodes haven't the same type.");else!t[Ns]()||this._isMatchTemplate()?this._bindElement(e,t):warn("XFA - Nodes haven't the same type.")}_findDataByNameToConsume(e,t,i,a){if(!e)return null;let r,s;for(let a=0;a<3;a++){r=i[Es](e,!1,!0);for(;;){s=r.next().value;if(!s)break;if(t===s[Ns]())return s}if(i[Ys]===cn.datasets.id&&"data"===i[vs])break;i=i[ms]()}if(!a)return null;r=this.data[Es](e,!0,!1);s=r.next().value;if(s)return s;r=this.data[gs](e,!0);s=r.next().value;return s?.[Ns]()?s:null}_setProperties(e,t){if(e.hasOwnProperty("setProperty"))for(const{ref:i,target:a,connection:r}of e.setProperty.children){if(r)continue;if(!i)continue;const s=searchNode(this.root,t,i,!1,!1);if(!s){warn(`XFA - Invalid reference: ${i}.`);continue}const[n]=s;if(!n[Gs](this.data)){warn("XFA - Invalid node: must be a data node.");continue}const o=searchNode(this.root,e,a,!1,!1);if(!o){warn(`XFA - Invalid target: ${a}.`);continue}const[g]=o;if(!g[Gs](e)){warn("XFA - Invalid target: must be a property or subproperty.");continue}const c=g[ms]();if(g instanceof SetProperty||c instanceof SetProperty){warn("XFA - Invalid target: cannot be a setProperty or one of its properties.");continue}if(g instanceof BindItems||c instanceof BindItems){warn("XFA - Invalid target: cannot be a bindItems or one of its properties.");continue}const C=n[an](),h=g[vs];if(g instanceof XFAAttribute){const e=Object.create(null);e[h]=C;const t=Reflect.construct(Object.getPrototypeOf(c).constructor,[e]);c[h]=t[h]}else if(g.hasOwnProperty(is)){g[as]=n;g[is]=C;g[ns]()}else 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[Zs](t);e.items.clear();const i=new Items({}),a=new Items({});e[Vr](i);e.items.push(i);e[Vr](a);e.items.push(a);for(const{ref:r,labelRef:s,valueRef:n,connection:o}of e.bindItems.children){if(o)continue;if(!r)continue;const e=searchNode(this.root,t,r,!1,!1);if(e)for(const t of e){if(!t[Gs](this.datasets)){warn(`XFA - Invalid ref (${r}): must be a datasets child.`);continue}const e=searchNode(this.root,t,s,!0,!1);if(!e){warn(`XFA - Invalid label: ${s}.`);continue}const[o]=e;if(!o[Gs](this.datasets)){warn("XFA - Invalid label: must be a datasets child.");continue}const g=searchNode(this.root,t,n,!0,!1);if(!g){warn(`XFA - Invalid value: ${n}.`);continue}const[c]=g;if(!c[Gs](this.datasets)){warn("XFA - Invalid value: must be a datasets child.");continue}const C=createText(o[an]()),h=createText(c[an]());i[Vr](C);i.text.push(C);a[Vr](h);a.text.push(h)}else warn(`XFA - Invalid reference: ${r}.`)}}_bindOccurrences(e,t,i){let a;if(t.length>1){a=e[es]();a[Zs](a.occur);a.occur=null}this._bindValue(e,t[0],i);this._setProperties(e,t[0]);this._bindItems(e,t[0]);if(1===t.length)return;const r=e[ms](),s=e[vs],n=r[Fs](e);for(let e=1,o=t.length;et.name===e.name)).length:i[a].children.length;const s=i[Fs](e)+1,n=t.initial-r;if(n){const t=e[es]();t[Zs](t.occur);t.occur=null;i[a].push(t);i[Ss](s,t);for(let e=1;e0)this._bindOccurrences(a,[e[0]],null);else if(this.emptyMerge){const e=t[Ys]===On?-1:t[Ys],i=a[as]=new XmlObject(e,a.name||"root");t[Vr](i);this._bindElement(a,i)}continue}if(!a[Rs]())continue;let e=!1,r=null,s=null,n=null;if(a.bind){switch(a.bind.match){case"none":this._setAndBind(a,t);continue;case"global":e=!0;break;case"dataRef":if(!a.bind.ref){warn(`XFA - ref is empty in node ${a[vs]}.`);this._setAndBind(a,t);continue}s=a.bind.ref}a.bind.picture&&(r=a.bind.picture[is])}const[o,g]=this._getOccurInfo(a);if(s){n=searchNode(this.root,t,s,!0,!1);if(null===n){n=createDataNode(this.data,t,s);if(!n)continue;this._isConsumeData()&&(n[ts]=!0);this._setAndBind(a,n);continue}this._isConsumeData()&&(n=n.filter((e=>!e[ts])));n.length>g?n=n.slice(0,g):0===n.length&&(n=null);n&&this._isConsumeData()&&n.forEach((e=>{e[ts]=!0}))}else{if(!a.name){this._setAndBind(a,t);continue}if(this._isConsumeData()){const i=[];for(;i.length0?i:null}else{n=t[Es](a.name,!1,this.emptyMerge).next().value;if(!n){if(0===o){i.push(a);continue}const e=t[Ys]===On?-1:t[Ys];n=a[as]=new XmlObject(e,a.name);this.emptyMerge&&(n[ts]=!0);t[Vr](n);this._setAndBind(a,n);continue}this.emptyMerge&&(n[ts]=!0);n=[n]}}n?this._bindOccurrences(a,n,r):o>0?this._setAndBind(a,t):i.push(a)}i.forEach((e=>e[ms]()[Zs](e)))}}class DataHandler{constructor(e,t){this.data=t;this.dataset=e.datasets||null}serialize(e){const t=[[-1,this.data[us]()]];for(;t.length>0;){const i=t.at(-1),[a,r]=i;if(a+1===r.length){t.pop();continue}const s=r[++i[0]],n=e.get(s[gn]);if(n)s[en](n);else{const t=s[Is]();for(const i of t.values()){const t=e.get(i[gn]);if(t){i[en](t);break}}}const o=s[us]();o.length>0&&t.push([-1,o])}const i=[''];if(this.dataset)for(const e of this.dataset[us]())"data"!==e[vs]&&e[nn](i);this.data[nn](i);i.push("");return i.join("")}}const Pn=cn.config.id;class Acrobat extends XFAObject{constructor(e){super(Pn,"acrobat",!0);this.acrobat7=null;this.autoSave=null;this.common=null;this.validate=null;this.validateApprovalSignatures=null;this.submitUrl=new XFAObjectArray}}class Acrobat7 extends XFAObject{constructor(e){super(Pn,"acrobat7",!0);this.dynamicRender=null}}class ADBE_JSConsole extends OptionObject{constructor(e){super(Pn,"ADBE_JSConsole",["delegate","Enable","Disable"])}}class ADBE_JSDebugger extends OptionObject{constructor(e){super(Pn,"ADBE_JSDebugger",["delegate","Enable","Disable"])}}class AddSilentPrint extends Option01{constructor(e){super(Pn,"addSilentPrint")}}class AddViewerPreferences extends Option01{constructor(e){super(Pn,"addViewerPreferences")}}class AdjustData extends Option10{constructor(e){super(Pn,"adjustData")}}class AdobeExtensionLevel extends IntegerObject{constructor(e){super(Pn,"adobeExtensionLevel",0,(e=>e>=1&&e<=8))}}class Agent extends XFAObject{constructor(e){super(Pn,"agent",!0);this.name=e.name?e.name.trim():"";this.common=new XFAObjectArray}}class AlwaysEmbed extends ContentObject{constructor(e){super(Pn,"alwaysEmbed")}}class Amd extends StringObject{constructor(e){super(Pn,"amd")}}class config_Area extends XFAObject{constructor(e){super(Pn,"area");this.level=getInteger({data:e.level,defaultValue:0,validate:e=>e>=1&&e<=3});this.name=getStringOption(e.name,["","barcode","coreinit","deviceDriver","font","general","layout","merge","script","signature","sourceSet","templateCache"])}}class Attributes extends OptionObject{constructor(e){super(Pn,"attributes",["preserve","delegate","ignore"])}}class AutoSave extends OptionObject{constructor(e){super(Pn,"autoSave",["disabled","enabled"])}}class Base extends StringObject{constructor(e){super(Pn,"base")}}class BatchOutput extends XFAObject{constructor(e){super(Pn,"batchOutput");this.format=getStringOption(e.format,["none","concat","zip","zipCompress"])}}class BehaviorOverride extends ContentObject{constructor(e){super(Pn,"behaviorOverride")}[ns](){this[is]=new Map(this[is].trim().split(/\s+/).filter((e=>e.includes(":"))).map((e=>e.split(":",2))))}}class Cache extends XFAObject{constructor(e){super(Pn,"cache",!0);this.templateCache=null}}class Change extends Option01{constructor(e){super(Pn,"change")}}class Common extends XFAObject{constructor(e){super(Pn,"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 XFAObjectArray}}class Compress extends XFAObject{constructor(e){super(Pn,"compress");this.scope=getStringOption(e.scope,["imageOnly","document"])}}class CompressLogicalStructure extends Option01{constructor(e){super(Pn,"compressLogicalStructure")}}class CompressObjectStream extends Option10{constructor(e){super(Pn,"compressObjectStream")}}class Compression extends XFAObject{constructor(e){super(Pn,"compression",!0);this.compressLogicalStructure=null;this.compressObjectStream=null;this.level=null;this.type=null}}class Config extends XFAObject{constructor(e){super(Pn,"config",!0);this.acrobat=null;this.present=null;this.trace=null;this.agent=new XFAObjectArray}}class Conformance extends OptionObject{constructor(e){super(Pn,"conformance",["A","B"])}}class ContentCopy extends Option01{constructor(e){super(Pn,"contentCopy")}}class Copies extends IntegerObject{constructor(e){super(Pn,"copies",1,(e=>e>=1))}}class Creator extends StringObject{constructor(e){super(Pn,"creator")}}class CurrentPage extends IntegerObject{constructor(e){super(Pn,"currentPage",0,(e=>e>=0))}}class Data extends XFAObject{constructor(e){super(Pn,"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 XFAObjectArray;this.transform=new XFAObjectArray}}class Debug extends XFAObject{constructor(e){super(Pn,"debug",!0);this.uri=null}}class DefaultTypeface extends ContentObject{constructor(e){super(Pn,"defaultTypeface");this.writingScript=getStringOption(e.writingScript,["*","Arabic","Cyrillic","EastEuropeanRoman","Greek","Hebrew","Japanese","Korean","Roman","SimplifiedChinese","Thai","TraditionalChinese","Vietnamese"])}}class Destination extends OptionObject{constructor(e){super(Pn,"destination",["pdf","pcl","ps","webClient","zpl"])}}class DocumentAssembly extends Option01{constructor(e){super(Pn,"documentAssembly")}}class Driver extends XFAObject{constructor(e){super(Pn,"driver",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class DuplexOption extends OptionObject{constructor(e){super(Pn,"duplexOption",["simplex","duplexFlipLongEdge","duplexFlipShortEdge"])}}class DynamicRender extends OptionObject{constructor(e){super(Pn,"dynamicRender",["forbidden","required"])}}class Embed extends Option01{constructor(e){super(Pn,"embed")}}class config_Encrypt extends Option01{constructor(e){super(Pn,"encrypt")}}class config_Encryption extends XFAObject{constructor(e){super(Pn,"encryption",!0);this.encrypt=null;this.encryptionLevel=null;this.permissions=null}}class EncryptionLevel extends OptionObject{constructor(e){super(Pn,"encryptionLevel",["40bit","128bit"])}}class Enforce extends StringObject{constructor(e){super(Pn,"enforce")}}class Equate extends XFAObject{constructor(e){super(Pn,"equate");this.force=getInteger({data:e.force,defaultValue:1,validate:e=>0===e});this.from=e.from||"";this.to=e.to||""}}class EquateRange extends XFAObject{constructor(e){super(Pn,"equateRange");this.from=e.from||"";this.to=e.to||"";this._unicodeRange=e.unicodeRange||""}get unicodeRange(){const e=[],t=/U\+([0-9a-fA-F]+)/,i=this._unicodeRange;for(let a of i.split(",").map((e=>e.trim())).filter((e=>!!e))){a=a.split("-",2).map((e=>{const i=e.match(t);return i?parseInt(i[1],16):0}));1===a.length&&a.push(a[0]);e.push(a)}return shadow(this,"unicodeRange",e)}}class Exclude extends ContentObject{constructor(e){super(Pn,"exclude")}[ns](){this[is]=this[is].trim().split(/\s+/).filter((e=>e&&["calculate","close","enter","exit","initialize","ready","validate"].includes(e)))}}class ExcludeNS extends StringObject{constructor(e){super(Pn,"excludeNS")}}class FlipLabel extends OptionObject{constructor(e){super(Pn,"flipLabel",["usePrinterSetting","on","off"])}}class config_FontInfo extends XFAObject{constructor(e){super(Pn,"fontInfo",!0);this.embed=null;this.map=null;this.subsetBelow=null;this.alwaysEmbed=new XFAObjectArray;this.defaultTypeface=new XFAObjectArray;this.neverEmbed=new XFAObjectArray}}class FormFieldFilling extends Option01{constructor(e){super(Pn,"formFieldFilling")}}class GroupParent extends StringObject{constructor(e){super(Pn,"groupParent")}}class IfEmpty extends OptionObject{constructor(e){super(Pn,"ifEmpty",["dataValue","dataGroup","ignore","remove"])}}class IncludeXDPContent extends StringObject{constructor(e){super(Pn,"includeXDPContent")}}class IncrementalLoad extends OptionObject{constructor(e){super(Pn,"incrementalLoad",["none","forwardOnly"])}}class IncrementalMerge extends Option01{constructor(e){super(Pn,"incrementalMerge")}}class Interactive extends Option01{constructor(e){super(Pn,"interactive")}}class Jog extends OptionObject{constructor(e){super(Pn,"jog",["usePrinterSetting","none","pageSet"])}}class LabelPrinter extends XFAObject{constructor(e){super(Pn,"labelPrinter",!0);this.name=getStringOption(e.name,["zpl","dpl","ipl","tcpl"]);this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class Layout extends OptionObject{constructor(e){super(Pn,"layout",["paginate","panel"])}}class Level extends IntegerObject{constructor(e){super(Pn,"level",0,(e=>e>0))}}class Linearized extends Option01{constructor(e){super(Pn,"linearized")}}class Locale extends StringObject{constructor(e){super(Pn,"locale")}}class LocaleSet extends StringObject{constructor(e){super(Pn,"localeSet")}}class Log extends XFAObject{constructor(e){super(Pn,"log",!0);this.mode=null;this.threshold=null;this.to=null;this.uri=null}}class MapElement extends XFAObject{constructor(e){super(Pn,"map",!0);this.equate=new XFAObjectArray;this.equateRange=new XFAObjectArray}}class MediumInfo extends XFAObject{constructor(e){super(Pn,"mediumInfo",!0);this.map=null}}class config_Message extends XFAObject{constructor(e){super(Pn,"message",!0);this.msgId=null;this.severity=null}}class Messaging extends XFAObject{constructor(e){super(Pn,"messaging",!0);this.message=new XFAObjectArray}}class Mode extends OptionObject{constructor(e){super(Pn,"mode",["append","overwrite"])}}class ModifyAnnots extends Option01{constructor(e){super(Pn,"modifyAnnots")}}class MsgId extends IntegerObject{constructor(e){super(Pn,"msgId",1,(e=>e>=1))}}class NameAttr extends StringObject{constructor(e){super(Pn,"nameAttr")}}class NeverEmbed extends ContentObject{constructor(e){super(Pn,"neverEmbed")}}class NumberOfCopies extends IntegerObject{constructor(e){super(Pn,"numberOfCopies",null,(e=>e>=2&&e<=5))}}class OpenAction extends XFAObject{constructor(e){super(Pn,"openAction",!0);this.destination=null}}class Output extends XFAObject{constructor(e){super(Pn,"output",!0);this.to=null;this.type=null;this.uri=null}}class OutputBin extends StringObject{constructor(e){super(Pn,"outputBin")}}class OutputXSL extends XFAObject{constructor(e){super(Pn,"outputXSL",!0);this.uri=null}}class Overprint extends OptionObject{constructor(e){super(Pn,"overprint",["none","both","draw","field"])}}class Packets extends StringObject{constructor(e){super(Pn,"packets")}[ns](){"*"!==this[is]&&(this[is]=this[is].trim().split(/\s+/).filter((e=>["config","datasets","template","xfdf","xslt"].includes(e))))}}class PageOffset extends XFAObject{constructor(e){super(Pn,"pageOffset");this.x=getInteger({data:e.x,defaultValue:"useXDCSetting",validate:e=>!0});this.y=getInteger({data:e.y,defaultValue:"useXDCSetting",validate:e=>!0})}}class PageRange extends StringObject{constructor(e){super(Pn,"pageRange")}[ns](){const e=this[is].trim().split(/\s+/).map((e=>parseInt(e,10))),t=[];for(let i=0,a=e.length;i!1))}}class Pcl extends XFAObject{constructor(e){super(Pn,"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 XFAObject{constructor(e){super(Pn,"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 XFAObject{constructor(e){super(Pn,"pdfa",!0);this.amd=null;this.conformance=null;this.includeXDPContent=null;this.part=null}}class Permissions extends XFAObject{constructor(e){super(Pn,"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 Option01{constructor(e){super(Pn,"pickTrayByPDFSize")}}class config_Picture extends StringObject{constructor(e){super(Pn,"picture")}}class PlaintextMetadata extends Option01{constructor(e){super(Pn,"plaintextMetadata")}}class Presence extends OptionObject{constructor(e){super(Pn,"presence",["preserve","dissolve","dissolveStructure","ignore","remove"])}}class Present extends XFAObject{constructor(e){super(Pn,"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 XFAObjectArray;this.labelPrinter=new XFAObjectArray;this.pcl=new XFAObjectArray;this.pdf=new XFAObjectArray;this.ps=new XFAObjectArray;this.submitUrl=new XFAObjectArray;this.webClient=new XFAObjectArray;this.zpl=new XFAObjectArray}}class Print extends Option01{constructor(e){super(Pn,"print")}}class PrintHighQuality extends Option01{constructor(e){super(Pn,"printHighQuality")}}class PrintScaling extends OptionObject{constructor(e){super(Pn,"printScaling",["appdefault","noScaling"])}}class PrinterName extends StringObject{constructor(e){super(Pn,"printerName")}}class Producer extends StringObject{constructor(e){super(Pn,"producer")}}class Ps extends XFAObject{constructor(e){super(Pn,"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 ContentObject{constructor(e){super(Pn,"range")}[ns](){this[is]=this[is].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 ContentObject{constructor(e){super(Pn,"record")}[ns](){this[is]=this[is].trim();const e=parseInt(this[is],10);!isNaN(e)&&e>=0&&(this[is]=e)}}class Relevant extends ContentObject{constructor(e){super(Pn,"relevant")}[ns](){this[is]=this[is].trim().split(/\s+/)}}class Rename extends ContentObject{constructor(e){super(Pn,"rename")}[ns](){this[is]=this[is].trim();(this[is].toLowerCase().startsWith("xml")||new RegExp("[\\p{L}_][\\p{L}\\d._\\p{M}-]*","u").test(this[is]))&&warn("XFA - Rename: invalid XFA name")}}class RenderPolicy extends OptionObject{constructor(e){super(Pn,"renderPolicy",["server","client"])}}class RunScripts extends OptionObject{constructor(e){super(Pn,"runScripts",["both","client","none","server"])}}class config_Script extends XFAObject{constructor(e){super(Pn,"script",!0);this.currentPage=null;this.exclude=null;this.runScripts=null}}class ScriptModel extends OptionObject{constructor(e){super(Pn,"scriptModel",["XFA","none"])}}class Severity extends OptionObject{constructor(e){super(Pn,"severity",["ignore","error","information","trace","warning"])}}class SilentPrint extends XFAObject{constructor(e){super(Pn,"silentPrint",!0);this.addSilentPrint=null;this.printerName=null}}class Staple extends XFAObject{constructor(e){super(Pn,"staple");this.mode=getStringOption(e.mode,["usePrinterSetting","on","off"])}}class StartNode extends StringObject{constructor(e){super(Pn,"startNode")}}class StartPage extends IntegerObject{constructor(e){super(Pn,"startPage",0,(e=>!0))}}class SubmitFormat extends OptionObject{constructor(e){super(Pn,"submitFormat",["html","delegate","fdf","xml","pdf"])}}class SubmitUrl extends StringObject{constructor(e){super(Pn,"submitUrl")}}class SubsetBelow extends IntegerObject{constructor(e){super(Pn,"subsetBelow",100,(e=>e>=0&&e<=100))}}class SuppressBanner extends Option01{constructor(e){super(Pn,"suppressBanner")}}class Tagged extends Option01{constructor(e){super(Pn,"tagged")}}class config_Template extends XFAObject{constructor(e){super(Pn,"template",!0);this.base=null;this.relevant=null;this.startPage=null;this.uri=null;this.xsl=null}}class Threshold extends OptionObject{constructor(e){super(Pn,"threshold",["trace","error","information","warning"])}}class To extends OptionObject{constructor(e){super(Pn,"to",["null","memory","stderr","stdout","system","uri"])}}class TemplateCache extends XFAObject{constructor(e){super(Pn,"templateCache");this.maxEntries=getInteger({data:e.maxEntries,defaultValue:5,validate:e=>e>=0})}}class Trace extends XFAObject{constructor(e){super(Pn,"trace",!0);this.area=new XFAObjectArray}}class Transform extends XFAObject{constructor(e){super(Pn,"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 OptionObject{constructor(e){super(Pn,"type",["none","ascii85","asciiHex","ccittfax","flate","lzw","runLength","native","xdp","mergedXDP"])}}class Uri extends StringObject{constructor(e){super(Pn,"uri")}}class config_Validate extends OptionObject{constructor(e){super(Pn,"validate",["preSubmit","prePrint","preExecute","preSave"])}}class ValidateApprovalSignatures extends ContentObject{constructor(e){super(Pn,"validateApprovalSignatures")}[ns](){this[is]=this[is].trim().split(/\s+/).filter((e=>["docReady","postSign"].includes(e)))}}class ValidationMessaging extends OptionObject{constructor(e){super(Pn,"validationMessaging",["allMessagesIndividually","allMessagesTogether","firstMessageOnly","noMessages"])}}class Version extends OptionObject{constructor(e){super(Pn,"version",["1.7","1.6","1.5","1.4","1.3","1.2"])}}class VersionControl extends XFAObject{constructor(e){super(Pn,"VersionControl");this.outputBelow=getStringOption(e.outputBelow,["warn","error","update"]);this.sourceAbove=getStringOption(e.sourceAbove,["warn","error"]);this.sourceBelow=getStringOption(e.sourceBelow,["update","maintain"])}}class ViewerPreferences extends XFAObject{constructor(e){super(Pn,"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 XFAObject{constructor(e){super(Pn,"webClient",!0);this.name=e.name?e.name.trim():"";this.fontInfo=null;this.xdc=null}}class Whitespace extends OptionObject{constructor(e){super(Pn,"whitespace",["preserve","ltrim","normalize","rtrim","trim"])}}class Window extends ContentObject{constructor(e){super(Pn,"window")}[ns](){const e=this[is].trim().split(/\s*,\s*/,2).map((e=>parseInt(e,10)));if(e.some((e=>isNaN(e))))this[is]=[0,0];else{1===e.length&&e.push(e[0]);this[is]=e}}}class Xdc extends XFAObject{constructor(e){super(Pn,"xdc",!0);this.uri=new XFAObjectArray;this.xsl=new XFAObjectArray}}class Xdp extends XFAObject{constructor(e){super(Pn,"xdp",!0);this.packets=null}}class Xsl extends XFAObject{constructor(e){super(Pn,"xsl",!0);this.debug=null;this.uri=null}}class Zpl extends XFAObject{constructor(e){super(Pn,"zpl",!0);this.name=e.name?e.name.trim():"";this.batchOutput=null;this.flipLabel=null;this.fontInfo=null;this.xdc=null}}class ConfigNamespace{static[In](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 config_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 config_Encrypt(e)}static encryption(e){return new config_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 config_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 config_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 config_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 config_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 config_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 config_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)}}const Wn=cn.connectionSet.id;class ConnectionSet extends XFAObject{constructor(e){super(Wn,"connectionSet",!0);this.wsdlConnection=new XFAObjectArray;this.xmlConnection=new XFAObjectArray;this.xsdConnection=new XFAObjectArray}}class EffectiveInputPolicy extends XFAObject{constructor(e){super(Wn,"effectiveInputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class EffectiveOutputPolicy extends XFAObject{constructor(e){super(Wn,"effectiveOutputPolicy");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class Operation extends StringObject{constructor(e){super(Wn,"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 StringObject{constructor(e){super(Wn,"rootElement");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAction extends StringObject{constructor(e){super(Wn,"soapAction");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class SoapAddress extends StringObject{constructor(e){super(Wn,"soapAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class connection_set_Uri extends StringObject{constructor(e){super(Wn,"uri");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlAddress extends StringObject{constructor(e){super(Wn,"wsdlAddress");this.id=e.id||"";this.name=e.name||"";this.use=e.use||"";this.usehref=e.usehref||""}}class WsdlConnection extends XFAObject{constructor(e){super(Wn,"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 XFAObject{constructor(e){super(Wn,"xmlConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.uri=null}}class XsdConnection extends XFAObject{constructor(e){super(Wn,"xsdConnection",!0);this.dataDescription=e.dataDescription||"";this.name=e.name||"";this.rootElement=null;this.uri=null}}class ConnectionSetNamespace{static[In](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 connection_set_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)}}const jn=cn.datasets.id;class datasets_Data extends XmlObject{constructor(e){super(jn,"data",e)}[xs](){return!0}}class Datasets extends XFAObject{constructor(e){super(jn,"datasets",!0);this.data=null;this.Signature=null}[Ks](e){const t=e[vs];("data"===t&&e[Ys]===jn||"Signature"===t&&e[Ys]===cn.signature.id)&&(this[t]=e);this[Vr](e)}}class DatasetsNamespace{static[In](e,t){if(DatasetsNamespace.hasOwnProperty(e))return DatasetsNamespace[e](t)}static datasets(e){return new Datasets(e)}static data(e){return new datasets_Data(e)}}const Xn=cn.localeSet.id;class CalendarSymbols extends XFAObject{constructor(e){super(Xn,"calendarSymbols",!0);this.name="gregorian";this.dayNames=new XFAObjectArray(2);this.eraNames=null;this.meridiemNames=null;this.monthNames=new XFAObjectArray(2)}}class CurrencySymbol extends StringObject{constructor(e){super(Xn,"currencySymbol");this.name=getStringOption(e.name,["symbol","isoname","decimal"])}}class CurrencySymbols extends XFAObject{constructor(e){super(Xn,"currencySymbols",!0);this.currencySymbol=new XFAObjectArray(3)}}class DatePattern extends StringObject{constructor(e){super(Xn,"datePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class DatePatterns extends XFAObject{constructor(e){super(Xn,"datePatterns",!0);this.datePattern=new XFAObjectArray(4)}}class DateTimeSymbols extends ContentObject{constructor(e){super(Xn,"dateTimeSymbols")}}class Day extends StringObject{constructor(e){super(Xn,"day")}}class DayNames extends XFAObject{constructor(e){super(Xn,"dayNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.day=new XFAObjectArray(7)}}class Era extends StringObject{constructor(e){super(Xn,"era")}}class EraNames extends XFAObject{constructor(e){super(Xn,"eraNames",!0);this.era=new XFAObjectArray(2)}}class locale_set_Locale extends XFAObject{constructor(e){super(Xn,"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 locale_set_LocaleSet extends XFAObject{constructor(e){super(Xn,"localeSet",!0);this.locale=new XFAObjectArray}}class Meridiem extends StringObject{constructor(e){super(Xn,"meridiem")}}class MeridiemNames extends XFAObject{constructor(e){super(Xn,"meridiemNames",!0);this.meridiem=new XFAObjectArray(2)}}class Month extends StringObject{constructor(e){super(Xn,"month")}}class MonthNames extends XFAObject{constructor(e){super(Xn,"monthNames",!0);this.abbr=getInteger({data:e.abbr,defaultValue:0,validate:e=>1===e});this.month=new XFAObjectArray(12)}}class NumberPattern extends StringObject{constructor(e){super(Xn,"numberPattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class NumberPatterns extends XFAObject{constructor(e){super(Xn,"numberPatterns",!0);this.numberPattern=new XFAObjectArray(4)}}class NumberSymbol extends StringObject{constructor(e){super(Xn,"numberSymbol");this.name=getStringOption(e.name,["decimal","grouping","percent","minus","zero"])}}class NumberSymbols extends XFAObject{constructor(e){super(Xn,"numberSymbols",!0);this.numberSymbol=new XFAObjectArray(5)}}class TimePattern extends StringObject{constructor(e){super(Xn,"timePattern");this.name=getStringOption(e.name,["full","long","med","short"])}}class TimePatterns extends XFAObject{constructor(e){super(Xn,"timePatterns",!0);this.timePattern=new XFAObjectArray(4)}}class TypeFace extends XFAObject{constructor(e){super(Xn,"typeFace",!0);this.name=""|e.name}}class TypeFaces extends XFAObject{constructor(e){super(Xn,"typeFaces",!0);this.typeFace=new XFAObjectArray}}class LocaleSetNamespace{static[In](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_set_Locale(e)}static localeSet(e){return new locale_set_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)}}const Zn=cn.signature.id;class signature_Signature extends XFAObject{constructor(e){super(Zn,"signature",!0)}}class SignatureNamespace{static[In](e,t){if(SignatureNamespace.hasOwnProperty(e))return SignatureNamespace[e](t)}static signature(e){return new signature_Signature(e)}}const Vn=cn.stylesheet.id;class Stylesheet extends XFAObject{constructor(e){super(Vn,"stylesheet",!0)}}class StylesheetNamespace{static[In](e,t){if(StylesheetNamespace.hasOwnProperty(e))return StylesheetNamespace[e](t)}static stylesheet(e){return new Stylesheet(e)}}const _n=cn.xdp.id;class xdp_Xdp extends 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 XFAObjectArray;this.template=null}[qs](e){const t=cn[e[vs]];return t&&e[Ys]===t.id}}class XdpNamespace{static[In](e,t){if(XdpNamespace.hasOwnProperty(e))return XdpNamespace[e](t)}static xdp(e){return new xdp_Xdp(e)}}const zn=cn.xhtml.id,$n=Symbol(),Ao=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"]),eo=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)=>measureToString(.99*(e=t.fontSize=getMeasurement(e)))],["letter-spacing",e=>measureToString(getMeasurement(e))],["line-height",e=>measureToString(getMeasurement(e))],["margin",e=>measureToString(getMeasurement(e))],["margin-bottom",e=>measureToString(getMeasurement(e))],["margin-left",e=>measureToString(getMeasurement(e))],["margin-right",e=>measureToString(getMeasurement(e))],["margin-top",e=>measureToString(getMeasurement(e))],["text-indent",e=>measureToString(getMeasurement(e))],["font-family",e=>e],["vertical-align",e=>measureToString(getMeasurement(e))]]),to=/\s+/g,io=/[\r\n]+/g,ao=/\r\n?/g;function mapStyle(e,t,i){const a=Object.create(null);if(!e)return a;const r=Object.create(null);for(const[t,i]of e.split(";").map((e=>e.split(":",2)))){const e=eo.get(t);if(""===e)continue;let s=i;e&&(s="string"==typeof e?e:e(i,r));t.endsWith("scale")?a.transform=a.transform?`${a[t]} ${s}`:s:a[t.replaceAll(/-([a-zA-Z])/g,((e,t)=>t.toUpperCase()))]=s}a.fontFamily&&setFontFamily({typeface:a.fontFamily,weight:a.fontWeight||"normal",posture:a.fontStyle||"normal",size:r.fontSize||0},t,t[ws].fontFinder,a);if(i&&a.verticalAlign&&"0px"!==a.verticalAlign&&a.fontSize){const e=.583,t=.333,i=getMeasurement(a.fontSize);a.fontSize=measureToString(i*e);a.verticalAlign=measureToString(Math.sign(getMeasurement(a.verticalAlign))*i*t)}i&&a.fontSize&&(a.fontSize=`calc(${a.fontSize} * var(--scale-factor))`);fixTextIndent(a);return a}const ro=new Set(["body","html"]);class XhtmlObject extends XmlObject{constructor(e,t){super(zn,t);this[$n]=!1;this.style=e.style||""}[zr](e){super[zr](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,i])=>{"font-family"===t&&e[ws].usedTypefaces.add(i);return Ao.has(t)})).map((e=>e.join(":"))).join(";"):""}(this)}[Xr](){return!ro.has(this[vs])}[Os](e,t=!1){if(t)this[$n]=!0;else{e=e.replaceAll(io,"");this.style.includes("xfa-spacerun:yes")||(e=e.replaceAll(to," "))}e&&(this[is]+=e)}[Ws](e,t=!0){const i=Object.create(null),a={top:NaN,bottom:NaN,left:NaN,right:NaN};let r=null;for(const[e,t]of this.style.split(";").map((e=>e.split(":",2))))switch(e){case"font-family":i.typeface=stripQuotes(t);break;case"font-size":i.size=getMeasurement(t);break;case"font-weight":i.weight=t;break;case"font-style":i.posture=t;break;case"letter-spacing":i.letterSpacing=getMeasurement(t);break;case"margin":const e=t.split(/ \t/).map((e=>getMeasurement(e)));switch(e.length){case 1:a.top=a.bottom=a.left=a.right=e[0];break;case 2:a.top=a.bottom=e[0];a.left=a.right=e[1];break;case 3:a.top=e[0];a.bottom=e[2];a.left=a.right=e[1];break;case 4:a.top=e[0];a.left=e[1];a.bottom=e[2];a.right=e[3]}break;case"margin-top":a.top=getMeasurement(t);break;case"margin-bottom":a.bottom=getMeasurement(t);break;case"margin-left":a.left=getMeasurement(t);break;case"margin-right":a.right=getMeasurement(t);break;case"line-height":r=getMeasurement(t)}e.pushData(i,a,r);if(this[is])e.addString(this[is]);else for(const t of this[us]())"#text"!==t[vs]?t[Ws](e):e.addString(t[is]);t&&e.popFont()}[sn](e){const t=[];this[ss]={children:t};this[_r]({});if(0===t.length&&!this[is])return HTMLResult.EMPTY;let i;i=this[$n]?this[is]?this[is].replaceAll(ao,"\n"):void 0:this[is]||void 0;return HTMLResult.success({name:this[vs],attributes:{href:this.href,style:mapStyle(this.style,this,this[$n])},children:t,value:i})}}class A extends XhtmlObject{constructor(e){super(e,"a");this.href=fixURL(e.href)||""}}class B extends XhtmlObject{constructor(e){super(e,"b")}[Ws](e){e.pushFont({weight:"bold"});super[Ws](e);e.popFont()}}class Body extends XhtmlObject{constructor(e){super(e,"body")}[sn](e){const t=super[sn](e),{html:i}=t;if(!i)return HTMLResult.EMPTY;i.name="div";i.attributes.class=["xfaRich"];return t}}class Br extends XhtmlObject{constructor(e){super(e,"br")}[an](){return"\n"}[Ws](e){e.addString("\n")}[sn](e){return HTMLResult.success({name:"br"})}}class Html extends XhtmlObject{constructor(e){super(e,"html")}[sn](e){const t=[];this[ss]={children:t};this[_r]({});if(0===t.length)return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},value:this[is]||""});if(1===t.length){const e=t[0];if(e.attributes?.class.includes("xfaRich"))return HTMLResult.success(e)}return HTMLResult.success({name:"div",attributes:{class:["xfaRich"],style:{}},children:t})}}class I extends XhtmlObject{constructor(e){super(e,"i")}[Ws](e){e.pushFont({posture:"italic"});super[Ws](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")}[Ws](e){super[Ws](e,!1);e.addString("\n");e.addPara();e.popFont()}[an](){return this[ms]()[us]().at(-1)===this?super[an]():super[an]()+"\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[In](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)}}const so={config:ConfigNamespace,connection:ConnectionSetNamespace,datasets:DatasetsNamespace,localeSet:LocaleSetNamespace,signature:SignatureNamespace,stylesheet:StylesheetNamespace,template:TemplateNamespace,xdp:XdpNamespace,xhtml:XhtmlNamespace};class UnknownNamespace{constructor(e){this.namespaceId=e}[In](e,t){return new XmlObject(this.namespaceId,e,t)}}class Root extends XFAObject{constructor(e){super(-1,"root",Object.create(null));this.element=null;this[Ds]=e}[Ks](e){this.element=e;return!0}[ns](){super[ns]();if(this.element.template instanceof Template){this[Ds].set(Vs,this.element);this.element.template[_s](this[Ds]);this.element.template[Ds]=this[Ds]}}}class Empty extends XFAObject{constructor(){super(-1,"",Object.create(null))}[Ks](e){return!1}}class Builder{constructor(e=null){this._namespaceStack=[];this._nsAgnosticLevel=0;this._namespacePrefixes=new Map;this._namespaces=new Map;this._nextNsId=Math.max(...Object.values(cn).map((({id:e})=>e)));this._currentNamespace=e||new UnknownNamespace(++this._nextNsId)}buildRoot(e){return new Root(e)}build({nsPrefix:e,name:t,attributes:i,namespace:a,prefixes:r}){const s=null!==a;if(s){this._namespaceStack.push(this._currentNamespace);this._currentNamespace=this._searchNamespace(a)}r&&this._addNamespacePrefix(r);if(i.hasOwnProperty(Ts)){const e=so.datasets,t=i[Ts];let a=null;for(const[i,r]of Object.entries(t)){if(this._getNamespaceToUse(i)===e){a={xfa:r};break}}a?i[Ts]=a:delete i[Ts]}const n=this._getNamespaceToUse(e),o=n?.[In](t,i)||new Empty;o[xs]()&&this._nsAgnosticLevel++;(s||r||o[xs]())&&(o[As]={hasNamespace:s,prefixes:r,nsAgnostic:o[xs]()});return o}isNsAgnostic(){return this._nsAgnosticLevel>0}_searchNamespace(e){let t=this._namespaces.get(e);if(t)return t;for(const[i,{check:a}]of Object.entries(cn))if(a(e)){t=so[i];if(t){this._namespaces.set(e,t);return t}break}t=new UnknownNamespace(++this._nextNsId);this._namespaces.set(e,t);return t}_addNamespacePrefix(e){for(const{prefix:t,value:i}of e){const e=this._searchNamespace(i);let a=this._namespacePrefixes.get(t);if(!a){a=[];this._namespacePrefixes.set(t,a)}a.push(e)}}_getNamespaceToUse(e){if(!e)return this._currentNamespace;const t=this._namespacePrefixes.get(e);if(t?.length>0)return t.at(-1);warn(`Unknown namespace prefix: ${e}.`);return null}clean(e){const{hasNamespace:t,prefixes:i,nsAgnostic:a}=e;t&&(this._currentNamespace=this._namespaceStack.pop());i&&i.forEach((({prefix:e})=>{this._namespacePrefixes.get(e).pop()}));a&&this._nsAgnosticLevel--}}class XFAParser extends XMLParserBase{constructor(e=null,t=!1){super();this._builder=new Builder(e);this._stack=[];this._globalData={usedTypefaces:new Set};this._ids=new Map;this._current=this._builder.buildRoot(this._ids);this._errorCode=xr;this._whiteRegex=/^\s+$/;this._nbsps=/\xa0+/g;this._richText=t}parse(e){this.parseXml(e);if(this._errorCode===xr){this._current[ns]();return this._current.element}}onText(e){e=e.replace(this._nbsps,(e=>e.slice(1)+" "));this._richText||this._current[Xr]()?this._current[Os](e,this._richText):this._whiteRegex.test(e)||this._current[Os](e.trim())}onCdata(e){this._current[Os](e)}_mkAttributes(e,t){let i=null,a=null;const r=Object.create({});for(const{name:s,value:n}of e)if("xmlns"===s)i?warn(`XFA - multiple namespace definition in <${t}>`):i=n;else if(s.startsWith("xmlns:")){const e=s.substring(6);a||(a=[]);a.push({prefix:e,value:n})}else{const e=s.indexOf(":");if(-1===e)r[s]=n;else{let t=r[Ts];t||(t=r[Ts]=Object.create(null));const[i,a]=[s.slice(0,e),s.slice(e+1)];(t[i]||=Object.create(null))[a]=n}}return[i,a,r]}_getNameAndPrefix(e,t){const i=e.indexOf(":");return-1===i?[e,null]:[e.substring(i+1),t?"":e.substring(0,i)]}onBeginElement(e,t,i){const[a,r,s]=this._mkAttributes(t,e),[n,o]=this._getNameAndPrefix(e,this._builder.isNsAgnostic()),g=this._builder.build({nsPrefix:o,name:n,attributes:s,namespace:a,prefixes:r});g[ws]=this._globalData;if(i){g[ns]();this._current[Ks](g)&&g[$s](this._ids);g[zr](this._builder)}else{this._stack.push(this._current);this._current=g}}onEndElement(e){const t=this._current;if(t[ks]()&&"string"==typeof t[is]){const e=new XFAParser;e._globalData=this._globalData;const i=e.parse(t[is]);t[is]=null;t[Ks](i)}t[ns]();this._current=this._stack.pop();this._current[Ks](t)&&t[$s](this._ids);t[zr](this._builder)}onError(e){this._errorCode=e}}class XFAFactory{constructor(e){try{this.root=(new XFAParser).parse(XFAFactory._createDocument(e));const t=new Binder(this.root);this.form=t.bind();this.dataHandler=new DataHandler(this.root,t.getData());this.form[ws].template=this.form}catch(e){warn(`XFA - an error occurred during parsing and binding: ${e}`)}}isValid(){return this.root&&this.form}_createPagesHelper(){const e=this.form[rn]();return new Promise(((t,i)=>{const nextIteration=()=>{try{const i=e.next();i.done?t(i.value):setTimeout(nextIteration,0)}catch(e){i(e)}};setTimeout(nextIteration,0)}))}async _createPages(){try{this.pages=await this._createPagesHelper();this.dims=this.pages.children.map((e=>{const{width:t,height:i}=e.attributes.style;return[0,0,parseInt(t),parseInt(i)]}))}catch(e){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[ws].images=e}setFonts(e){this.form[ws].fontFinder=new FontFinder(e);const t=[];for(let e of this.form[ws].usedTypefaces){e=stripQuotes(e);this.form[ws].fontFinder.find(e)||t.push(e)}return t.length>0?t:null}appendFonts(e,t){this.form[ws].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 XFAParser(XhtmlNamespace,!0).parse(e);if(!["body","xhtml"].includes(t[vs])){const e=XhtmlNamespace.body({});e[Vr](t);t=e}const i=t[sn]();if(!i.success)return null;const{html:a}=i,{attributes:r}=a;if(r){r.class&&(r.class=r.class.filter((e=>!e.startsWith("xfa"))));r.dir="auto"}return{html:a,str:t[an]()}}catch(e){warn(`XFA - an error occurred during parsing of rich text: ${e}`)}return null}}class AnnotationFactory{static createGlobals(e){return Promise.all([e.ensureCatalog("acroForm"),e.ensureDoc("xfaDatasets"),e.ensureCatalog("structTreeRoot"),e.ensureCatalog("baseUrl"),e.ensureCatalog("attachments")]).then((([t,i,a,r,s])=>({pdfManager:e,acroForm:t instanceof Dict?t:Dict.empty,xfaDatasets:i,structTreeRoot:a,baseUrl:r,attachments:s})),(e=>{warn(`createGlobals: "${e}".`);return null}))}static async create(e,t,i,a,r,s){const n=r?await this._getPageIndex(e,t,i.pdfManager):null;return i.pdfManager.ensure(this,"_create",[e,t,i,a,r,n,s])}static _create(e,t,i,a,r=!1,s=null,n=null){const o=e.fetchIfRef(t);if(!(o instanceof Dict))return;const{acroForm:g,pdfManager:c}=i,C=t instanceof Ref?t.toString():`annot_${a.createObjId()}`;let h=o.get("Subtype");h=h instanceof Name?h.name:null;const l={xref:e,ref:t,dict:o,subtype:h,id:C,annotationGlobals:i,collectFields:r,needAppearances:!r&&!0===g.get("NeedAppearances"),pageIndex:s,evaluatorOptions:c.evaluatorOptions,pageRef:n};switch(h){case"Link":return new LinkAnnotation(l);case"Text":return new TextAnnotation(l);case"Widget":let e=getInheritableProperty({dict:o,key:"FT"});e=e instanceof Name?e.name:null;switch(e){case"Tx":return new TextWidgetAnnotation(l);case"Btn":return new ButtonWidgetAnnotation(l);case"Ch":return new ChoiceWidgetAnnotation(l);case"Sig":return new SignatureWidgetAnnotation(l)}warn(`Unimplemented widget field type "${e}", falling back to base field type.`);return new WidgetAnnotation(l);case"Popup":return new PopupAnnotation(l);case"FreeText":return new FreeTextAnnotation(l);case"Line":return new LineAnnotation(l);case"Square":return new SquareAnnotation(l);case"Circle":return new CircleAnnotation(l);case"PolyLine":return new PolylineAnnotation(l);case"Polygon":return new PolygonAnnotation(l);case"Caret":return new CaretAnnotation(l);case"Ink":return new InkAnnotation(l);case"Highlight":return new HighlightAnnotation(l);case"Underline":return new UnderlineAnnotation(l);case"Squiggly":return new SquigglyAnnotation(l);case"StrikeOut":return new StrikeOutAnnotation(l);case"Stamp":return new StampAnnotation(l);case"FileAttachment":return new FileAttachmentAnnotation(l);default:r||warn(h?`Unimplemented annotation type "${h}", falling back to base annotation.`:"Annotation is missing the required /Subtype.");return new Annotation(l)}}static async _getPageIndex(e,t,i){try{const a=await e.fetchIfRefAsync(t);if(!(a instanceof Dict))return-1;const r=a.getRaw("P");if(r instanceof Ref)try{return await i.ensureCatalog("getPageIndex",[r])}catch(e){info(`_getPageIndex -- not a valid page reference: "${e}".`)}if(a.has("Kids"))return-1;const s=await i.ensureDoc("numPages");for(let e=0;ee/255))}function getQuadPoints(e,t){const i=e.getArray("QuadPoints");if(!isNumberArray(i,null)||0===i.length||i.length%8>0)return null;const a=new Float32Array(i.length);for(let e=0,r=i.length;et[2]||Et[3]))return null;a.set([l,u,Q,u,l,E,Q,E],e)}return a}function getTransformMatrix(e,t,i){const[a,r,s,n]=Util.getAxialAlignedBoundingBox(t,i);if(a===s||r===n)return[1,0,0,1,e[0],e[1]];const o=(e[2]-e[0])/(s-a),g=(e[3]-e[1])/(n-r);return[o,0,0,g,e[0]-a*o,e[1]-r*g]}class Annotation{constructor(e){const{dict:t,xref:i,annotationGlobals: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 r=t.get("MK");this.setBorderAndBackgroundColors(r);this.setRotation(r,t);this.ref=e.ref instanceof Ref?e.ref:null;this._streams=[];this.appearance&&this._streams.push(this.appearance);const s=!!(this.flags&tA),n=!!(this.flags&iA);if(a.structTreeRoot){let i=t.get("StructParent");i=Number.isInteger(i)&&i>=0?i:-1;a.structTreeRoot.addAnnotationIdToPage(e.pageRef,i)}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&AA),noHTML:s&&n};if(e.collectFields){const a=t.get("Kids");if(Array.isArray(a)){const e=[];for(const t of a)t instanceof Ref&&e.push(t.toString());0!==e.length&&(this.data.kidIds=e)}this.data.actions=collectActions(i,t,fA);this.data.fieldName=this._constructFieldName(t);this.data.pageIndex=e.pageIndex}this._isOffscreenCanvasSupported=e.evaluatorOptions.isOffscreenCanvasSupported;this._fallbackFontDict=null;this._needAppearances=!1}_hasFlag(e,t){return!!(e&t)}_isViewable(e){return!this._hasFlag(e,_)&&!this._hasFlag(e,eA)}_isPrintable(e){return this._hasFlag(e,$)&&!this._hasFlag(e,z)&&!this._hasFlag(e,_)}mustBeViewed(e,t){const i=e?.get(this.data.id)?.noView;return void 0!==i?!i:this.viewable&&!this._hasFlag(this.flags,z)}mustBePrinted(e){const t=e?.get(this.data.id)?.noPrint;return void 0!==t?!t: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?stringToPDFString(e):"";return{str:t,dir:t&&"rtl"===bidi(t).dir?"rtl":"ltr"}}setDefaultAppearance(e){const{dict:t,annotationGlobals:i}=e,a=getInheritableProperty({dict:t,key:"DA"})||i.acroForm.get("DA");this._defaultAppearance="string"==typeof a?a:"";this.data.defaultAppearanceData=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;this.flags&_&&"Annotation"!==this.constructor.name&&(this.flags^=_)}hasFlag(e){return this._hasFlag(this.flags,e)}setRectangle(e){this.rectangle=lookupNormalRect(e,[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 i=e[t];if(i instanceof Name)switch(i.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]=i.name;continue}warn(`Ignoring invalid lineEnding: ${i}`)}}setRotation(e,t){this.rotation=0;let i=e instanceof Dict?e.get("R")||0:t.get("Rotate")||0;if(Number.isInteger(i)&&0!==i){i%=360;i<0&&(i+=360);i%90==0&&(this.rotation=i)}}setBorderAndBackgroundColors(e){if(e instanceof 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 Dict)if(e.has("BS")){const t=e.get("BS");if(t instanceof Dict){const e=t.get("Type");if(!e||isName(e,"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 Dict))return;const i=t.get("N");if(i instanceof BaseStream){this.appearance=i;return}if(!(i instanceof Dict))return;const a=e.get("AS");if(!(a instanceof Name&&i.has(a.name)))return;const r=i.get(a.name);r instanceof BaseStream&&(this.appearance=r)}setOptionalContent(e){this.oc=null;const t=e.get("OC");t instanceof Name?warn("setOptionalContent: Support for /Name-entry is not implemented."):t instanceof Dict&&(this.oc=t)}loadResources(e,t){return t.dict.getAsync("Resources").then((t=>{if(!t)return;return new ObjectLoader(t,e,t.xref).load().then((function(){return t}))}))}async getOperatorList(e,t,i,r,s){const{hasOwnCanvas:n,id:o,rect:g}=this.data;let C=this.appearance;const h=!!(n&&i&c);if(h&&(g[0]===g[2]||g[1]===g[3])){this.data.hasOwnCanvas=!1;return{opList:new OperatorList,separateForm:!1,separateCanvas:!1}}if(!C){if(!h)return{opList:new OperatorList,separateForm:!1,separateCanvas:!1};C=new StringStream("");C.dict=new Dict}const l=C.dict,Q=await this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"],C),E=lookupRect(l.getArray("BBox"),[0,0,1,1]),u=lookupMatrix(l.getArray("Matrix"),a),d=getTransformMatrix(g,E,u),f=new OperatorList;let p;this.oc&&(p=await e.parseMarkedContentProps(this.oc,null));void 0!==p&&f.addOp(ve,["OC",p]);f.addOp(Xe,[o,g,d,u,h]);await e.getOperatorList({stream:C,task:t,resources:Q,operatorList:f,fallbackFontDict:this._fallbackFontDict});f.addOp(Ze,[]);void 0!==p&&f.addOp(Te,[]);this.reset();return{opList:f,separateForm:!1,separateCanvas:h}}async save(e,t,i){return null}get hasTextContent(){return!1}async extractTextContent(e,t,i){if(!this.appearance)return;const a=await this.loadResources(["ExtGState","Font","Properties","XObject"],this.appearance),r=[],s=[];let n=null;const o={desiredSize:Math.Infinity,ready:!0,enqueue(e,t){for(const t of e.items)if(void 0!==t.str){n||=t.transform.slice(-2);s.push(t.str);if(t.hasEOL){r.push(s.join("").trimEnd());s.length=0}}}};await e.getTextContent({stream:this.appearance,task:t,resources:a,includeMarkedContent:!0,keepWhiteSpace:!0,sink:o,viewBox:i});this.reset();s.length&&r.push(s.join("").trimEnd());if(r.length>1||r[0]){const e=this.appearance.dict,t=lookupRect(e.getArray("BBox"),null),i=lookupMatrix(e.getArray("Matrix"),null);this.data.textPosition=this._transformPoint(n,t,i);this.data.textContent=r}}_transformPoint(e,t,i){const{rect:a}=this.data;t||=[0,0,1,1];i||=[1,0,0,1,0,0];const r=getTransformMatrix(a,t,i);r[4]-=a[0];r[5]-=a[1];e=Util.applyTransform(e,r);return Util.applyTransform(e,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")){warn("Unknown field name, falling back to empty field name.");return""}if(!e.has("Parent"))return stringToPDFString(e.get("T"));const t=[];e.has("T")&&t.unshift(stringToPDFString(e.get("T")));let i=e;const a=new RefSet;e.objId&&a.put(e.objId);for(;i.has("Parent");){i=i.get("Parent");if(!(i instanceof Dict)||i.objId&&a.has(i.objId))break;i.objId&&a.put(i.objId);i.has("T")&&t.unshift(stringToPDFString(i.get("T")))}return t.join(".")}}class AnnotationBorderStyle{constructor(){this.width=1;this.style=BA;this.dashArray=[3];this.horizontalCornerRadius=0;this.verticalCornerRadius=0}setWidth(e,t=[0,0,0,0]){if(e instanceof Name)this.width=0;else if("number"==typeof e){if(e>0){const i=(t[2]-t[0])/2,a=(t[3]-t[1])/2;if(i>0&&a>0&&(e>i||e>a)){warn(`AnnotationBorderStyle.setWidth - ignoring width: ${e}`);e=1}}this.width=e}}setStyle(e){if(e instanceof Name)switch(e.name){case"S":this.style=BA;break;case"D":this.style=QA;break;case"B":this.style=EA;break;case"I":this.style=uA;break;case"U":this.style=dA}}setDashArray(e,t=!1){if(Array.isArray(e)){let i=!0,a=!0;for(const t of e){if(!(+t>=0)){i=!1;break}t>0&&(a=!1)}if(0===e.length||i&&!a){this.dashArray=e;t&&this.setStyle(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)}}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 Ref?e.toString():null;const i=t.get("RT");this.data.replyType=i instanceof Name?i.name:V}let i=null;if(this.data.replyType===Z){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;i=e.getRaw("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;i=t.getRaw("Popup");t.has("C")||(this.data.color=null)}this.data.popupRef=i instanceof Ref?i.toString():null;t.has("RC")&&(this.data.richText=XFAFactory.getRichTextAsHtml(t.get("RC")))}setCreationDate(e){this.creationDate="string"==typeof e?e:null}_setDefaultAppearance({xref:e,extra:t,strokeColor:i,fillColor:a,blendMode:r,strokeAlpha:s,fillAlpha:n,pointsCallback:o}){let g=Number.MAX_VALUE,c=Number.MAX_VALUE,C=Number.MIN_VALUE,h=Number.MIN_VALUE;const l=["q"];t&&l.push(t);i&&l.push(`${i[0]} ${i[1]} ${i[2]} RG`);a&&l.push(`${a[0]} ${a[1]} ${a[2]} rg`);let Q=this.data.quadPoints;Q||(Q=Float32Array.from([this.rectangle[0],this.rectangle[3],this.rectangle[2],this.rectangle[3],this.rectangle[0],this.rectangle[1],this.rectangle[2],this.rectangle[1]]));for(let e=0,t=Q.length;e"string"==typeof e)).map((e=>stringToPDFString(e))):e instanceof Name?stringToPDFString(e.name):"string"==typeof e?stringToPDFString(e):null}hasFieldFlag(e){return!!(this.data.fieldFlags&e)}_isViewable(e){return!0}mustBeViewed(e,t){return t?this.viewable:super.mustBeViewed(e,t)&&!this._hasFlag(this.flags,eA)}getRotationMatrix(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);if(0===t)return a;return getRotationMatrix(t,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1])}getBorderAndBackgroundAppearances(e){let t=e?.get(this.data.id)?.rotation;void 0===t&&(t=this.rotation);if(!this.backgroundColor&&!this.borderColor)return"";const i=this.data.rect[2]-this.data.rect[0],a=this.data.rect[3]-this.data.rect[1],r=0===t||180===t?`0 0 ${i} ${a} re`:`0 0 ${a} ${i} re`;let s="";this.backgroundColor&&(s=`${getPdfColor(this.backgroundColor,!0)} ${r} f `);if(this.borderColor){s+=`${this.borderStyle.width||1} w ${getPdfColor(this.borderColor,!1)} ${r} S `}return s}async getOperatorList(e,t,i,a,r){if(a&&!(this instanceof SignatureWidgetAnnotation)&&!this.data.noHTML&&!this.data.hasOwnCanvas)return{opList:new OperatorList,separateForm:!0,separateCanvas:!1};if(!this._hasText)return super.getOperatorList(e,t,i,a,r);const s=await this._getAppearance(e,t,i,r);if(this.appearance&&null===s)return super.getOperatorList(e,t,i,a,r);const n=new OperatorList;if(!this._defaultAppearance||null===s)return{opList:n,separateForm:!1,separateCanvas:!1};const o=!!(this.data.hasOwnCanvas&&i&c),g=[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]],C=getTransformMatrix(this.data.rect,g,[1,0,0,1,0,0]);let h;this.oc&&(h=await e.parseMarkedContentProps(this.oc,null));void 0!==h&&n.addOp(ve,["OC",h]);n.addOp(Xe,[this.data.id,this.data.rect,C,this.getRotationMatrix(r),o]);const l=new StringStream(s);await e.getOperatorList({stream:l,task:t,resources:this._fieldResources.mergedResources,operatorList:n});n.addOp(Ze,[]);void 0!==h&&n.addOp(Te,[]);return{opList:n,separateForm:!1,separateCanvas:o}}_getMKDict(e){const t=new 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,i){const r=i?.get(this.data.id);let s=r?.value,n=r?.rotation;if(s===this.data.fieldValue||void 0===s){if(!this._hasValueFromXFA&&void 0===n)return null;s||=this.data.fieldValue}if(void 0===n&&!this._hasValueFromXFA&&Array.isArray(s)&&Array.isArray(this.data.fieldValue)&&s.length===this.data.fieldValue.length&&s.every(((e,t)=>e===this.data.fieldValue[t])))return null;void 0===n&&(n=this.rotation);let o=null;if(!this._needAppearances){o=await this._getAppearance(e,t,h,i);if(null===o)return null}let g=!1;if(o?.needAppearances){g=!0;o=null}const{xref:c}=e,C=c.fetchIfRef(this.ref);if(!(C instanceof Dict))return null;const l=new Dict(c);for(const e of C.getKeys())"AP"!==e&&l.set(e,C.getRaw(e));const Q={path:this.data.fieldName,value:s},encoder=e=>isAscii(e)?e:stringToUTF16String(e,!0);l.set("V",Array.isArray(s)?s.map(encoder):encoder(s));this.amendSavedDict(i,l);const E=this._getMKDict(n);E&&l.set("MK",E);const u=[],d=[{ref:this.ref,data:"",xfa:Q,needAppearances:g}];if(null!==o){const e=c.getNewTemporaryRef(),t=new Dict(c);l.set("AP",t);t.set("N",e);const r=this._getSaveFieldResources(c),s=new StringStream(o),n=s.dict=new Dict(c);n.set("Subtype",Name.get("Form"));n.set("Resources",r);n.set("BBox",[0,0,this.data.rect[2]-this.data.rect[0],this.data.rect[3]-this.data.rect[1]]);const g=this.getRotationMatrix(i);g!==a&&n.set("Matrix",g);await writeObject(e,s,u,c);d.push({ref:e,data:u.join(""),xfa:null,needAppearances:!1});u.length=0}l.set("M",`D:${getModificationDate()}`);await writeObject(this.ref,l,u,c);d[0].data=u.join("");return d}async _getAppearance(e,t,i,a){if(this.hasFieldFlag(nA))return null;const r=a?.get(this.data.id);let s,n;if(r){s=r.formattedValue||r.value;n=r.rotation}if(void 0===n&&void 0===s&&!this._needAppearances&&(!this._hasValueFromXFA||this.appearance))return null;const g=this.getBorderAndBackgroundAppearances(a);if(void 0===s){s=this.data.fieldValue;if(!s)return`/Tx BMC q ${g}Q EMC`}Array.isArray(s)&&1===s.length&&(s=s[0]);assert("string"==typeof s,"Expected `value` to be a string.");s=s.trim();if(this.data.combo){const e=this.data.options.find((({exportValue:e})=>s===e));s=e?.displayValue||s}if(""===s)return`/Tx BMC q ${g}Q EMC`;void 0===n&&(n=this.rotation);let c,C=-1;if(this.data.multiLine){c=s.split(/\r\n?|\n/).map((e=>e.normalize("NFC")));C=c.length}else c=[s.replace(/\r\n?|\n/,"").normalize("NFC")];let l=this.data.rect[3]-this.data.rect[1],Q=this.data.rect[2]-this.data.rect[0];90!==n&&270!==n||([Q,l]=[l,Q]);this._defaultAppearance||(this.data.defaultAppearanceData=parseDefaultAppearance(this._defaultAppearance="/Helvetica 0 Tf 0 g"));let E,u,d,f=await WidgetAnnotation._getFontData(e,t,this.data.defaultAppearanceData,this._fieldResources.mergedResources);const p=[];let m=!1;for(const e of c){const t=f.encodeString(e);t.length>1&&(m=!0);p.push(t.join(""))}if(m&&i&h)return{needAppearances:!0};if(m&&this._isOffscreenCanvasSupported){const i=this.data.comb?"monospace":"sans-serif",a=new FakeUnicodeFont(e.xref,i),r=a.createFontResources(c.join("")),n=r.getRaw("Font");if(this._fieldResources.mergedResources.has("Font")){const e=this._fieldResources.mergedResources.get("Font");for(const t of n.getKeys())e.set(t,n.getRaw(t))}else this._fieldResources.mergedResources.set("Font",n);const o=a.fontName.name;f=await WidgetAnnotation._getFontData(e,t,{fontName:o,fontSize:0},r);for(let e=0,t=p.length;e2)return`/Tx BMC q ${g}BT `+E+` 1 0 0 1 ${numberToString(2)} ${numberToString(D)} Tm (${escapeString(p[0])}) Tj ET Q EMC`;return`/Tx BMC q ${g}BT `+E+` 1 0 0 1 0 0 Tm ${this._renderText(p[0],f,u,Q,b,{shift:0},2,D)} ET Q EMC`}static async _getFontData(e,t,i,a){const r=new OperatorList,s={font:null,clone(){return this}},{fontName:n,fontSize:o}=i;await e.handleSetFont(a,[n&&Name.get(n),o],null,r,t,s,null);return s.font}_getTextWidth(e,t){return t.charsToGlyphs(e).reduce(((e,t)=>e+t.width),0)/1e3}_computeFontSize(e,t,i,a,r){let{fontSize:n}=this.data.defaultAppearanceData,o=(n||12)*s,g=Math.round(e/o);if(!n){const roundWithTwoDigits=e=>Math.floor(100*e)/100;if(-1===r){const r=this._getTextWidth(i,a);n=roundWithTwoDigits(Math.min(e/s,r>t?t/r:1/0));g=1}else{const c=i.split(/\r\n?|\n/),C=[];for(const e of c){const t=a.encodeString(e).join(""),i=a.charsToGlyphs(t),r=a.getCharPositions(t);C.push({line:t,glyphs:i,positions:r})}const isTooBig=i=>{let r=0;for(const s of C){r+=this._splitLine(null,a,i,t,s).length*i;if(r>e)return!0}return!1};g=Math.max(g,r);for(;;){o=e/g;n=roundWithTwoDigits(o/s);if(!isTooBig(n))break;g++}}const{fontName:c,fontColor:C}=this.data.defaultAppearanceData;this._defaultAppearance=function createDefaultAppearance({fontSize:e,fontName:t,fontColor:i}){return`/${escapePDFName(t)} ${e} Tf ${getPdfColor(i,!0)}`}({fontSize:n,fontName:c,fontColor:C})}return[this._defaultAppearance,n,e/g]}_renderText(e,t,i,a,r,s,n,o){let g;if(1===r){g=(a-this._getTextWidth(e,t)*i)/2}else if(2===r){g=a-this._getTextWidth(e,t)*i-n}else g=n;const c=numberToString(g-s.shift);s.shift=g;return`${c} ${o=numberToString(o)} Td (${escapeString(e)}) Tj`}_getSaveFieldResources(e){const{localResources:t,appearanceResources:i,acroFormResources:a}=this._fieldResources,r=this.data.defaultAppearanceData?.fontName;if(!r)return t||Dict.empty;for(const e of[t,i])if(e instanceof Dict){const t=e.get("Font");if(t instanceof Dict&&t.has(r))return e}if(a instanceof Dict){const i=a.get("Font");if(i instanceof Dict&&i.has(r)){const a=new Dict(e);a.set(r,i.getRaw(r));const s=new Dict(e);s.set("Font",a);return Dict.merge({xref:e,dictArray:[s,t],mergeSubDicts:!0})}}return t||Dict.empty}getFieldObject(){return null}}class TextWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t}=e;if(t.has("PMD")){this.flags|=z;this.data.hidden=!0;warn("Barcodes are not supported")}this.data.hasOwnCanvas=this.data.readOnly&&!this.data.noHTML;this._hasText=!0;"string"!=typeof this.data.fieldValue&&(this.data.fieldValue="");let i=getInheritableProperty({dict:t,key:"Q"});(!Number.isInteger(i)||i<0||i>2)&&(i=null);this.data.textAlignment=i;let a=getInheritableProperty({dict:t,key:"MaxLen"});(!Number.isInteger(a)||a<0)&&(a=0);this.data.maxLen=a;this.data.multiLine=this.hasFieldFlag(sA);this.data.comb=this.hasFieldFlag(lA)&&!this.hasFieldFlag(sA)&&!this.hasFieldFlag(nA)&&!this.hasFieldFlag(cA)&&0!==this.data.maxLen;this.data.doNotScroll=this.hasFieldFlag(hA)}get hasTextContent(){return!!this.appearance&&!this._needAppearances}_getCombAppearance(e,t,i,a,r,s,n,o,g,c,C){const h=r/this.data.maxLen,l=this.getBorderAndBackgroundAppearances(C),Q=[],E=t.getCharPositions(i);for(const[e,t]of E)Q.push(`(${escapeString(i.substring(e,t))}) Tj`);const u=Q.join(` ${numberToString(h)} 0 Td `);return`/Tx BMC q ${l}BT `+e+` 1 0 0 1 ${numberToString(n)} ${numberToString(o+g)} Tm ${u} ET Q EMC`}_getMultilineAppearance(e,t,i,a,r,s,n,o,g,c,C,h){const l=[],Q=r-2*o,E={shift:0};for(let e=0,s=t.length;ea){g.push(e.substring(l,i));l=i;Q=u;c=-1;h=-1}else{Q+=u;c=i;C=r;h=t}else if(Q+u>a)if(-1!==c){g.push(e.substring(l,C));l=C;t=h+1;c=-1;Q=0}else{g.push(e.substring(l,i));l=i;Q=u}else Q+=u}l"Off"!==e));s.length=0;s.push("Off",e)}s.includes(this.data.fieldValue)||(this.data.fieldValue="Off");this.data.exportValue=s[1];const n=i.get(this.data.exportValue);this.checkedAppearance=n instanceof BaseStream?n:null;const o=i.get("Off");this.uncheckedAppearance=o instanceof BaseStream?o:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"check");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processRadioButton(e){this.data.buttonValue=null;const t=e.dict.get("Parent");if(t instanceof Dict){this.parent=e.dict.getRaw("Parent");const i=t.get("V");i instanceof Name&&(this.data.fieldValue=this._decodeFormValue(i))}const i=e.dict.get("AP");if(!(i instanceof Dict))return;const a=i.get("N");if(!(a instanceof Dict))return;for(const e of a.getKeys())if("Off"!==e){this.data.buttonValue=this._decodeFormValue(e);break}const r=a.get(this.data.buttonValue);this.checkedAppearance=r instanceof BaseStream?r:null;const s=a.get("Off");this.uncheckedAppearance=s instanceof BaseStream?s:null;this.checkedAppearance?this._streams.push(this.checkedAppearance):this._getDefaultCheckedAppearance(e,"disc");this.uncheckedAppearance&&this._streams.push(this.uncheckedAppearance);this._fallbackFontDict=this.fallbackFontDict;null===this.data.defaultFieldValue&&(this.data.defaultFieldValue="Off")}_processPushButton(e){const{dict:t,annotationGlobals:i}=e;if(t.has("A")||t.has("AA")||this.data.alternativeText){this.data.isTooltipOnly=!t.has("A")&&!t.has("AA");Catalog.parseDestDictionary({destDict:t,resultObj:this.data,docBaseUrl:i.baseUrl,docAttachments:i.attachments})}else 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 Dict;e.set("BaseFont",Name.get("ZapfDingbats"));e.set("Type",Name.get("FallbackType"));e.set("Subtype",Name.get("FallbackType"));e.set("Encoding",Name.get("ZapfDingbatsEncoding"));return shadow(this,"fallbackFontDict",e)}}class ChoiceWidgetAnnotation extends WidgetAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.indices=t.getArray("I");this.hasIndices=Array.isArray(this.indices)&&this.indices.length>0;this.data.options=[];const a=getInheritableProperty({dict:t,key:"Opt"});if(Array.isArray(a))for(let e=0,t=a.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;let i=e?.get(this.data.id)?.value;Array.isArray(i)||(i=[i]);const a=[],{options:r}=this.data;for(let e=0,t=0,s=r.length;ei){i=a;t=e}}[Q,E]=this._computeFontSize(e,c-4,t,l,-1)}const u=E*s,d=(u-E)/2,f=Math.floor(g/u);let p=0;if(h.length>0){const e=Math.min(...h),t=Math.max(...h);p=Math.max(0,t-f+1);p>e&&(p=e)}const m=Math.min(p+f+1,C),y=["/Tx BMC q",`1 1 ${c} ${g} re W n`];if(h.length){y.push("0.600006 0.756866 0.854904 rg");for(const e of h)p<=e&&ee.trimEnd()));const{coords:e,bbox:t,matrix:i}=FakeUnicodeFont.getFirstPositionInfo(this.rectangle,this.rotation,a);this.data.textPosition=this._transformPoint(e,t,i)}if(this._isOffscreenCanvasSupported){const r=e.dict.get("CA"),s=new FakeUnicodeFont(i,"sans-serif");this.appearance=s.createAppearance(this._contents.str,this.rectangle,this.rotation,a,t,r);this._streams.push(this.appearance)}else warn("FreeTextAnnotation: OffscreenCanvas is not supported, annotation may not render correctly.")}}get hasTextContent(){return this._hasAppearance}static createNewDict(e,t,{apRef:i,ap:a}){const{color:r,fontSize:s,rect:n,rotation:o,user:g,value:c}=e,C=new Dict(t);C.set("Type",Name.get("Annot"));C.set("Subtype",Name.get("FreeText"));C.set("CreationDate",`D:${getModificationDate()}`);C.set("Rect",n);const h=`/Helv ${s} Tf ${getPdfColor(r,!0)}`;C.set("DA",h);C.set("Contents",isAscii(c)?c:stringToUTF16String(c,!0));C.set("F",4);C.set("Border",[0,0,0]);C.set("Rotate",o);g&&C.set("T",isAscii(g)?g:stringToUTF16String(g,!0));if(i||a){const e=new Dict(t);C.set("AP",e);i?e.set("N",i):e.set("N",a)}return C}static async createNewAppearanceStream(e,t,i){const{baseFontRef:a,evaluator:r,task:n}=i,{color:o,fontSize:g,rect:c,rotation:C,value:h}=e,l=new Dict(t),Q=new Dict(t);if(a)Q.set("Helv",a);else{const e=new Dict(t);e.set("BaseFont",Name.get("Helvetica"));e.set("Type",Name.get("Font"));e.set("Subtype",Name.get("Type1"));e.set("Encoding",Name.get("WinAnsiEncoding"));Q.set("Helv",e)}l.set("Font",Q);const E=await WidgetAnnotation._getFontData(r,n,{fontName:"Helv",fontSize:g},l),[u,d,f,p]=c;let m=f-u,y=p-d;C%180!=0&&([m,y]=[y,m]);const w=h.split("\n"),b=g/1e3;let D=-1/0;const S=[];for(let e of w){const t=E.encodeString(e);if(t.length>1)return null;e=t.join("");S.push(e);let i=0;const a=E.charsToGlyphs(e);for(const e of a)i+=e.width*b;D=Math.max(D,i)}let k=1;D>m&&(k=m/D);let R=1;const N=s*g,G=1*g,x=N*w.length;x>y&&(R=y/x);const U=g*Math.min(k,R);let M,L,H;switch(C){case 0:H=[1,0,0,1];L=[c[0],c[1],m,y];M=[c[0],c[3]-G];break;case 90:H=[0,1,-1,0];L=[c[1],-c[2],m,y];M=[c[1],-c[0]-G];break;case 180:H=[-1,0,0,-1];L=[-c[2],-c[3],m,y];M=[-c[2],-c[1]-G];break;case 270:H=[0,-1,1,0];L=[-c[3],c[0],m,y];M=[-c[3],c[2]-G]}const J=["q",`${H.join(" ")} 0 0 cm`,`${L.join(" ")} re W n`,"BT",`${getPdfColor(o,!0)}`,`0 Tc /Helv ${numberToString(U)} Tf`];J.push(`${M.join(" ")} Td (${escapeString(S[0])}) Tj`);const Y=numberToString(N);for(let e=1,t=S.length;e{e.push(`${a[0]} ${a[1]} m`,`${a[2]} ${a[3]} l`,"S");return[t[0]-g,t[2]+g,t[7]-g,t[3]+g]}})}}}class SquareAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=U;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),r=getRgbColor(t.getArray("IC"),null),s=r?getPdfColorArray(r):null,n=s?a:null;if(0===this.borderStyle.width&&!s)return;this._setDefaultAppearance({xref:i,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:s,strokeAlpha:a,fillAlpha:n,pointsCallback:(e,t)=>{const i=t[4]+this.borderStyle.width/2,a=t[5]+this.borderStyle.width/2,r=t[6]-t[4]-this.borderStyle.width,n=t[3]-t[7]-this.borderStyle.width;e.push(`${i} ${a} ${r} ${n} re`);s?e.push("B"):e.push("S");return[t[0],t[2],t[7],t[3]]}})}}}class CircleAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=M;if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),r=getRgbColor(t.getArray("IC"),null),s=r?getPdfColorArray(r):null,n=s?a:null;if(0===this.borderStyle.width&&!s)return;const o=4/3*Math.tan(Math.PI/8);this._setDefaultAppearance({xref:i,extra:`${this.borderStyle.width} w`,strokeColor:e,fillColor:s,strokeAlpha:a,fillAlpha:n,pointsCallback:(e,t)=>{const i=t[0]+this.borderStyle.width/2,a=t[1]-this.borderStyle.width/2,r=t[6]-this.borderStyle.width/2,n=t[7]+this.borderStyle.width/2,g=i+(r-i)/2,c=a+(n-a)/2,C=(r-i)/2*o,h=(n-a)/2*o;e.push(`${g} ${n} m`,`${g+C} ${n} ${r} ${c+h} ${r} ${c} c`,`${r} ${c-h} ${g+C} ${a} ${g} ${a} c`,`${g-C} ${a} ${i} ${c-h} ${i} ${c} c`,`${i} ${c+h} ${g-C} ${n} ${g} ${n} c`,"h");s?e.push("B"):e.push("S");return[t[0],t[2],t[7],t[3]]}})}}}class PolylineAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=H;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1;this.data.vertices=null;if(!(this instanceof PolygonAnnotation)){this.setLineEndings(t.getArray("LE"));this.data.lineEndings=this.lineEndings}const a=t.getArray("Vertices");if(!isNumberArray(a,null))return;const r=this.data.vertices=Float32Array.from(a);if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA"),s=this.borderStyle.width||1,n=2*s,o=[1/0,1/0,-1/0,-1/0];for(let e=0,t=r.length;e{for(let t=0,i=r.length;t{for(const t of this.data.inkLists){for(let i=0,a=t.length;ie.points)));h.set("F",4);h.set("Rotate",c);o&&h.set("IT",Name.get("InkHighlight"));const l=new Dict(t);h.set("BS",l);l.set("W",C);h.set("C",Array.from(r,(e=>e/255)));h.set("CA",s);const Q=new Dict(t);h.set("AP",Q);i?Q.set("N",i):Q.set("N",a);return h}static async createNewAppearanceStream(e,t,i){if(e.outlines)return this.createNewAppearanceStreamForHighlight(e,t,i);const{color:a,rect:r,paths:s,thickness:n,opacity:o}=e,g=[`${n} w 1 J 1 j`,`${getPdfColor(a,!1)}`];1!==o&&g.push("/R0 gs");const c=[];for(const{bezier:e}of s){c.length=0;c.push(`${numberToString(e[0])} ${numberToString(e[1])} m`);if(2===e.length)c.push(`${numberToString(e[0])} ${numberToString(e[1])} l S`);else{for(let t=2,i=e.length;t{e.push(`${t[0]} ${t[1]} m`,`${t[2]} ${t[3]} l`,`${t[6]} ${t[7]} l`,`${t[4]} ${t[5]} l`,"f");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}static createNewDict(e,t,{apRef:i,ap:a}){const{color:r,opacity:s,rect:n,rotation:o,user:g,quadPoints:c}=e,C=new Dict(t);C.set("Type",Name.get("Annot"));C.set("Subtype",Name.get("Highlight"));C.set("CreationDate",`D:${getModificationDate()}`);C.set("Rect",n);C.set("F",4);C.set("Border",[0,0,0]);C.set("Rotate",o);C.set("QuadPoints",c);C.set("C",Array.from(r,(e=>e/255)));C.set("CA",s);g&&C.set("T",isAscii(g)?g:stringToUTF16String(g,!0));if(i||a){const e=new Dict(t);C.set("AP",e);e.set("N",i||a)}return C}static async createNewAppearanceStream(e,t,i){const{color:a,rect:r,outlines:s,opacity:n}=e,o=[`${getPdfColor(a,!0)}`,"/R0 gs"],g=[];for(const e of s){g.length=0;g.push(`${numberToString(e[0])} ${numberToString(e[1])} m`);for(let t=2,i=e.length;t{e.push(`${t[4]} ${t[5]+1.3} m`,`${t[6]} ${t[7]+1.3} l`,"S");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}}class SquigglyAnnotation extends MarkupAnnotation{constructor(e){super(e);const{dict:t,xref:i}=e;this.data.annotationType=v;if(this.data.quadPoints=getQuadPoints(t,null)){if(!this.appearance){const e=this.color?getPdfColorArray(this.color):[0,0,0],a=t.get("CA");this._setDefaultAppearance({xref:i,extra:"[] 0 d 1 w",strokeColor:e,strokeAlpha:a,pointsCallback:(e,t)=>{const i=(t[1]-t[5])/6;let a=i,r=t[4];const s=t[5],n=t[6];e.push(`${r} ${s+a} m`);do{r+=2;a=0===a?i:0;e.push(`${r} ${s+a} l`)}while(r{e.push((t[0]+t[4])/2+" "+(t[1]+t[5])/2+" m",(t[2]+t[6])/2+" "+(t[3]+t[7])/2+" l","S");return[t[0],t[2],t[7],t[3]]}})}}else this.data.popupRef=null}}class StampAnnotation extends MarkupAnnotation{constructor(e){super(e);this.data.annotationType=K;this.data.hasOwnCanvas=this.data.noRotate;this.data.noHTML=!1}static async createImage(e,t){const{width:i,height:a}=e,r=new OffscreenCanvas(i,a),s=r.getContext("2d",{alpha:!0});s.drawImage(e,0,0);const n=s.getImageData(0,0,i,a).data,o=new Uint32Array(n.buffer),g=o.some(FeatureTest.isLittleEndian?e=>e>>>24!=255:e=>255!=(255&e));if(g){s.fillStyle="white";s.fillRect(0,0,i,a);s.drawImage(e,0,0)}const c=r.convertToBlob({type:"image/jpeg",quality:1}).then((e=>e.arrayBuffer())),C=Name.get("XObject"),h=Name.get("Image"),l=new Dict(t);l.set("Type",C);l.set("Subtype",h);l.set("BitsPerComponent",8);l.set("ColorSpace",Name.get("DeviceRGB"));l.set("Filter",Name.get("DCTDecode"));l.set("BBox",[0,0,i,a]);l.set("Width",i);l.set("Height",a);let Q=null;if(g){const e=new Uint8Array(o.length);if(FeatureTest.isLittleEndian)for(let t=0,i=o.length;t>>24;else for(let t=0,i=o.length;t=0&&s<=1?s:null}}function decodeString(e){try{return stringToUTF8String(e)}catch(t){warn(`UTF-8 decoding failed: "${t}".`);return e}}class DatasetXMLParser extends 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.")}}}class DatasetReader{constructor(e){if(e.datasets)this.node=new SimpleXMLParser({hasAttributes:!0}).parseFromString(e.datasets).documentElement;else{const t=new DatasetXMLParser({hasAttributes:!0});try{t.parseFromString(e["xdp:xdp"])}catch{}this.node=t.node}}getValue(e){if(!this.node||!e)return"";const t=this.node.searchNode(parseXFAPath(e),0);if(!t)return"";const i=t.firstChild;return"value"===i?.nodeName?t.children.map((e=>decodeString(e.textContent))):decodeString(t.textContent)}}class XRef{#T=null;constructor(e,t){this.stream=e;this.pdfManager=t;this.entries=[];this._xrefStms=new Set;this._cacheMap=new Map;this._pendingRefs=new RefSet;this._newPersistentRefNum=null;this._newTemporaryRefNum=null;this._persistentRefsCache=null}getNewPersistentRef(e){null===this._newPersistentRefNum&&(this._newPersistentRefNum=this.entries.length||1);const t=this._newPersistentRefNum++;this._cacheMap.set(t,e);return Ref.get(t,0)}getNewTemporaryRef(){if(null===this._newTemporaryRefNum){this._newTemporaryRefNum=this.entries.length||1;if(this._newPersistentRefNum){this._persistentRefsCache=new Map;for(let e=this._newTemporaryRefNum;e0;){const[n,o]=s;if(!Number.isInteger(n)||!Number.isInteger(o))throw new FormatError(`Invalid XRef range fields: ${n}, ${o}`);if(!Number.isInteger(i)||!Number.isInteger(a)||!Number.isInteger(r))throw new FormatError(`Invalid XRef entry fields length: ${n}, ${o}`);for(let s=t.entryNum;s=e.length);){i+=String.fromCharCode(a);a=e[t]}return i}function skipUntil(e,t,i){const a=i.length,r=e.length;let s=0;for(;t=a)break;t++;s++}return s}const e=/\b(endobj|\d+\s+\d+\s+obj|xref|trailer\s*<<)\b/g,t=/\b(startxref|\d+\s+\d+\s+obj)\b/g,i=/^(\d+)\s+(\d+)\s+obj\b/,a=new Uint8Array([116,114,97,105,108,101,114]),r=new Uint8Array([115,116,97,114,116,120,114,101,102]),s=new Uint8Array([47,88,82,101,102]);this.entries.length=0;this._cacheMap.clear();const n=this.stream;n.pos=0;const o=n.getBytes(),g=bytesToString(o),c=o.length;let C=n.start;const h=[],l=[];for(;C=c)break;Q=o[C]}while(10!==Q&&13!==Q);continue}const E=readToken(o,C);let u;if(E.startsWith("xref")&&(4===E.length||/\s/.test(E[4]))){C+=skipUntil(o,C,a);h.push(C);C+=skipUntil(o,C,r)}else if(u=i.exec(E)){const t=0|u[1],i=0|u[2],a=C+E.length;let r,h=!1;if(this.entries[t]){if(this.entries[t].gen===i)try{new Parser({lexer:new Lexer(n.makeSubStream(a))}).getObj();h=!0}catch(e){e instanceof ParserEOFException?warn(`indexObjects -- checking object (${E}): "${e}".`):h=!0}}else h=!0;h&&(this.entries[t]={offset:C-n.start,gen:i,uncompressed:!0});e.lastIndex=a;const Q=e.exec(g);if(Q){r=e.lastIndex+1-C;if("endobj"!==Q[1]){warn(`indexObjects: Found "${Q[1]}" inside of another "obj", caused by missing "endobj" -- trying to recover.`);r-=Q[1].length+1}}else r=c-C;const d=o.subarray(C,C+r),f=skipUntil(d,0,s);if(f0?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 Ref?this.fetch(e,t):e}fetch(e,t=!1){if(!(e instanceof Ref))throw new Error("ref object is not a reference");const i=e.num,a=this._cacheMap.get(i);if(void 0!==a){a instanceof Dict&&!a.objId&&(a.objId=e.toString());return a}let r=this.getEntry(i);if(null===r){this._cacheMap.set(i,r);return r}if(this._pendingRefs.has(e)){this._pendingRefs.remove(e);warn(`Ignoring circular reference: ${e}.`);return mt}this._pendingRefs.put(e);try{r=r.uncompressed?this.fetchUncompressed(e,r,t):this.fetchCompressed(e,r,t);this._pendingRefs.remove(e)}catch(t){this._pendingRefs.remove(e);throw t}r instanceof Dict?r.objId=e.toString():r instanceof BaseStream&&(r.dict.objId=e.toString());return r}fetchUncompressed(e,t,i=!1){const a=e.gen;let r=e.num;if(t.gen!==a){const s=`Inconsistent generation in XRef: ${e}`;if(this._generationFallback&&t.gen0&&t[3]-t[1]>0)return t;warn(`Empty, or invalid, /${e} entry.`)}return null}get mediaBox(){return shadow(this,"mediaBox",this._getBoundingBox("MediaBox")||no)}get cropBox(){return shadow(this,"cropBox",this._getBoundingBox("CropBox")||this.mediaBox)}get userUnit(){let e=this.pageDict.get("UserUnit");("number"!=typeof e||e<=0)&&(e=1);return shadow(this,"userUnit",e)}get view(){const{cropBox:e,mediaBox:t}=this;if(e!==t&&!isArrayEqual(e,t)){const i=Util.intersect(e,t);if(i&&i[2]-i[0]>0&&i[3]-i[1]>0)return shadow(this,"view",i);warn("Empty /CropBox and /MediaBox intersection.")}return 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 shadow(this,"rotate",e)}_onSubStreamError(e,t){if(!this.evaluatorOptions.ignoreErrors)throw e;warn(`getContentStream - ignoring sub-stream (${t}): "${e}".`)}getContentStream(){return this.pdfManager.ensure(this,"content").then((e=>e instanceof BaseStream?e:Array.isArray(e)?new StreamsSequenceStream(e,this._onSubStreamError.bind(this)):new NullStream))}get xfaData(){return shadow(this,"xfaData",this.xfaFactory?{bbox:this.xfaFactory.getBoundingBox(this.pageIndex)}:null)}#K(e,t,i){for(const a of e)if(a.id){const e=Ref.fromString(a.id);if(!e){warn(`A non-linked annotation cannot be modified: ${a.id}`);continue}if(a.deleted){t.put(e,e);continue}i?.put(e);a.ref=e;delete a.id}}async saveNewAnnotations(e,t,i,a){if(this.xfaFactory)throw new Error("XFA: Cannot save new annotations.");const r=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}),s=new RefSetCache,n=new RefSet;this.#K(i,s,n);const o=this.pageDict,g=this.annotations.filter((e=>!(e instanceof Ref&&s.has(e)))),c=await AnnotationFactory.saveNewAnnotations(r,t,i,a);for(const{ref:e}of c.annotations)e instanceof Ref&&!n.has(e)&&g.push(e);const C=o.get("Annots");o.set("Annots",g);const h=[];await writeObject(this.ref,o,h,this.xref);C&&o.set("Annots",C);const l=c.dependencies;l.push({ref:this.ref,data:h.join("")},...c.annotations);for(const e of s)l.push({ref:e,data:null});return l}save(e,t,i){const a=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions});return this._parsedAnnotations.then((function(e){const r=[];for(const s of e)s.mustBePrinted(i)&&r.push(s.save(a,t,i).catch((function(e){warn(`save - ignoring annotation data during "${t.name}" task: "${e}".`);return null})));return Promise.all(r).then((function(e){return e.filter((e=>!!e))}))}))}loadResources(e){this.resourcesPromise||=this.pdfManager.ensure(this,"resources");return this.resourcesPromise.then((()=>new ObjectLoader(this.resources,e,this.xref).load()))}getOperatorList({handler:e,sink:t,task:i,intent:a,cacheKey:r,annotationStorage:s=null}){const n=this.getContentStream(),o=this.loadResources(["ColorSpace","ExtGState","Font","Pattern","Properties","Shading","XObject"]),h=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}),E=this.xfaFactory?null:getNewAnnotationsMap(s),d=E?.get(this.pageIndex);let f=Promise.resolve(null),p=null;if(d){const e=this.pdfManager.ensureDoc("annotationGlobals");let t;const a=new Set;for(const{bitmapId:e,bitmap:t}of d)!e||t||a.has(e)||a.add(e);const{isOffscreenCanvasSupported:r}=this.evaluatorOptions;if(a.size>0){const e=d.slice();for(const[t,i]of s)t.startsWith(u)&&i.bitmap&&a.has(i.bitmapId)&&e.push(i);t=AnnotationFactory.generateImages(e,this.xref,r)}else t=AnnotationFactory.generateImages(d,this.xref,r);p=new RefSet;this.#K(d,p,null);f=e.then((e=>e?AnnotationFactory.printNewAnnotations(e,h,i,d,t):null))}const m=Promise.all([n,o]).then((([s])=>{const n=new OperatorList(a,t);e.send("StartRenderPage",{transparency:h.hasBlendModes(this.resources,this.nonBlendModesSet),pageIndex:this.pageIndex,cacheKey:r});return h.getOperatorList({stream:s,task:i,resources:this.resources,operatorList:n}).then((function(){return n}))}));return Promise.all([m,this._parsedAnnotations,f]).then((function([e,t,r]){if(r){t=t.filter((e=>!(e.ref&&p.has(e.ref))));for(let e=0,i=r.length;ee.ref&&isRefsEqual(e.ref,a.refToReplace)));if(s>=0){t.splice(s,1,a);r.splice(e--,1);i--}}}t=t.concat(r)}if(0===t.length||a&Q){e.flush(!0);return{length:e.totalLength}}const n=!!(a&l),o=!!(a&g),E=!!(a&c),u=!!(a&C),d=[];for(const e of t)(o||E&&e.mustBeViewed(s,n)||u&&e.mustBePrinted(s))&&d.push(e.getOperatorList(h,i,a,n,s).catch((function(e){warn(`getOperatorList - ignoring annotation data during "${i.name}" task: "${e}".`);return{opList:null,separateForm:!1,separateCanvas:!1}})));return Promise.all(d).then((function(t){let i=!1,a=!1;for(const{opList:r,separateForm:s,separateCanvas:n}of t){e.addOpList(r);i||=s;a||=n}e.flush(!0,{form:i,canvas:a});return{length:e.totalLength}}))}))}async extractTextContent({handler:e,task:t,includeMarkedContent:i,disableNormalization:a,sink:r}){const s=this.getContentStream(),n=this.loadResources(["ExtGState","Font","Properties","XObject"]),o=this.pdfManager.ensureCatalog("lang"),[g,,c]=await Promise.all([s,n,o]);return new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions}).getTextContent({stream:g,task:t,resources:this.resources,includeMarkedContent:i,disableNormalization:a,sink:r,viewBox:this.view,lang:c})}async getStructTree(){const e=await this.pdfManager.ensureCatalog("structTreeRoot");if(!e)return null;await this._parsedAnnotations;return(await this.pdfManager.ensure(this,"_parseStructTree",[e])).serializable}_parseStructTree(e){const t=new StructTreePage(e,this.pageDict);t.parse(this.ref);return t}async getAnnotationsData(e,t,i){const a=await this._parsedAnnotations;if(0===a.length)return a;const r=[],s=[];let n;const o=!!(i&g),h=!!(i&c),l=!!(i&C);for(const i of a){const a=o||h&&i.viewable;(a||l&&i.printable)&&r.push(i.data);if(i.hasTextContent&&a){n||=new PartialEvaluator({xref:this.xref,handler:e,pageIndex:this.pageIndex,idFactory:this._localIdFactory,fontCache:this.fontCache,builtInCMapCache:this.builtInCMapCache,standardFontDataCache:this.standardFontDataCache,globalImageCache:this.globalImageCache,systemFontCache:this.systemFontCache,options:this.evaluatorOptions});s.push(i.extractTextContent(n,t,[-1/0,-1/0,1/0,1/0]).catch((function(e){warn(`getAnnotationsData - ignoring textContent during "${t.name}" task: "${e}".`)})))}}await Promise.all(s);return r}get annotations(){const e=this._getInheritableProperty("Annots");return shadow(this,"annotations",Array.isArray(e)?e:[])}get _parsedAnnotations(){return shadow(this,"_parsedAnnotations",this.pdfManager.ensure(this,"annotations").then((async e=>{if(0===e.length)return e;const t=await this.pdfManager.ensureDoc("annotationGlobals");if(!t)return[];const i=[];for(const a of e)i.push(AnnotationFactory.create(this.xref,a,t,this._localIdFactory,!1,this.ref).catch((function(e){warn(`_parsedAnnotations: "${e}".`);return null})));const a=[];let r,s;for(const e of await Promise.all(i))e&&(e instanceof WidgetAnnotation?(s||=[]).push(e):e instanceof PopupAnnotation?(r||=[]).push(e):a.push(e));s&&a.push(...s);r&&a.push(...r);return a})))}get jsActions(){return shadow(this,"jsActions",collectActions(this.xref,this.pageDict,mA))}}const oo=new Uint8Array([37,80,68,70,45]),go=new Uint8Array([115,116,97,114,116,120,114,101,102]),Io=new Uint8Array([101,110,100,111,98,106]);function find(e,t,i=1024,a=!1){const r=t.length,s=e.peekBytes(i),n=s.length-r;if(n<=0)return!1;if(a){const i=r-1;let a=s.length-1;for(;a>=i;){let n=0;for(;n=r){e.pos+=a-i;return!0}a--}}else{let i=0;for(;i<=n;){let a=0;for(;a=r){e.pos+=i;return!0}i++}}return!1}class PDFDocument{constructor(e,t){if(t.length<=0)throw new InvalidPDFException("The PDF file is empty, i.e. its size is zero bytes.");this.pdfManager=e;this.stream=t;this.xref=new XRef(t,e);this._pagePromises=new Map;this._version=null;const i={font:0};this._globalIdFactory=class{static getDocId(){return`g_${e.docId}`}static createFontId(){return"f"+ ++i.font}static createObjId(){unreachable("Abstract method `createObjId` called.")}static getPageObjId(){unreachable("Abstract method `getPageObjId` called.")}}}parse(e){this.xref.parse(e);this.catalog=new Catalog(this.pdfManager,this.xref)}get linearization(){let e=null;try{e=Linearization.create(this.stream)}catch(e){if(e instanceof MissingDataException)throw e;info(e)}return shadow(this,"linearization",e)}get startXRef(){const e=this.stream;let t=0;if(this.linearization){e.reset();if(find(e,Io)){e.skip(6);let i=e.peekByte();for(;isWhiteSpace(i);){e.pos++;i=e.peekByte()}t=e.pos-e.start}}else{const i=1024,a=go.length;let r=!1,s=e.end;for(;!r&&s>0;){s-=i-a;s<0&&(s=0);e.pos=s;r=find(e,go,i,!0)}if(r){e.skip(9);let i;do{i=e.getByte()}while(isWhiteSpace(i));let a="";for(;i>=32&&i<=57;){a+=String.fromCharCode(i);i=e.getByte()}t=parseInt(a,10);isNaN(t)&&(t=0)}}return shadow(this,"startXRef",t)}checkHeader(){const e=this.stream;e.reset();if(!find(e,oo))return;e.moveStart();e.skip(oo.length);let t,i="";for(;(t=e.getByte())>32&&i.length<7;)i+=String.fromCharCode(t);St.test(i)?this._version=i:warn(`Invalid PDF header version: ${i}`)}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 shadow(this,"numPages",e)}_hasOnlyDocumentSignatures(e,t=0){return!!Array.isArray(e)&&e.every((e=>{if(!((e=this.xref.fetchIfRef(e))instanceof Dict))return!1;if(e.has("Kids")){if(++t>10){warn("_hasOnlyDocumentSignatures: maximum recursion depth reached");return!1}return this._hasOnlyDocumentSignatures(e.get("Kids"),t)}const i=isName(e.get("FT"),"Sig"),a=e.get("Rect"),r=Array.isArray(a)&&a.every((e=>0===e));return i&&r}))}get _xfaStreams(){const e=this.catalog.acroForm;if(!e)return null;const t=e.get("XFA"),i={"xdp:xdp":"",template:"",datasets:"",config:"",connectionSet:"",localeSet:"",stylesheet:"","/xdp:xdp":""};if(t instanceof BaseStream&&!t.isEmpty){i["xdp:xdp"]=t;return i}if(!Array.isArray(t)||0===t.length)return null;for(let e=0,a=t.length;e{h.set(e,t)}));const l=[];for(const[e,i]of h){const r=i.get("FontDescriptor");if(!(r instanceof Dict))continue;let s=r.get("FontFamily");s=s.replaceAll(/[ ]+(\d)/g,"$1");const n={fontFamily:s,fontWeight:r.get("FontWeight"),italicAngle:-r.get("ItalicAngle")};validateCSSFont(n)&&l.push(o.handleSetFont(a,[Name.get(e),1],null,g,t,C,null,n).catch((function(e){warn(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(l);const Q=this.xfaFactory.setFonts(c);if(!Q)return;n.ignoreErrors=!0;l.length=0;c.length=0;const E=new Set;for(const e of Q)getXfaFontName(`${e}-Regular`)||E.add(e);E.size&&Q.push("PdfJS-Fallback");for(const e of Q)if(!E.has(e))for(const i 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 r=`${e}-${i.name}`,s=getXfaFontDict(r);l.push(o.handleSetFont(a,[Name.get(r),1],null,g,t,C,s,{fontFamily:e,fontWeight:i.fontWeight,italicAngle:i.italicAngle}).catch((function(e){warn(`loadXfaFonts: "${e}".`);return null})))}await Promise.all(l);this.xfaFactory.appendFonts(c,E)}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 shadow(this,"formInfo",e);try{const i=t.get("Fields"),a=Array.isArray(i)&&i.length>0;e.hasFields=a;const r=t.get("XFA");e.hasXfa=Array.isArray(r)&&r.length>0||r instanceof BaseStream&&!r.isEmpty;const s=!!(1&t.get("SigFlags")),n=s&&this._hasOnlyDocumentSignatures(i);e.hasAcroForm=a&&!n;e.hasSignatures=s}catch(e){if(e instanceof MissingDataException)throw e;warn(`Cannot fetch form information: "${e}".`)}return 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 MissingDataException)throw e;info("The document information dictionary is invalid.")}if(!(t instanceof Dict))return shadow(this,"documentInfo",e);for(const i of t.getKeys()){const a=t.get(i);switch(i){case"Title":case"Author":case"Subject":case"Keywords":case"Creator":case"Producer":case"CreationDate":case"ModDate":if("string"==typeof a){e[i]=stringToPDFString(a);continue}break;case"Trapped":if(a instanceof Name){e[i]=a;continue}break;default:let t;switch(typeof a){case"string":t=stringToPDFString(a);break;case"number":case"boolean":t=a;break;default:a instanceof Name&&(t=a)}if(void 0===t){warn(`Bad value, for custom key "${i}", in Info: ${a}.`);continue}e.Custom||(e.Custom=Object.create(null));e.Custom[i]=t;continue}warn(`Bad value, for key "${i}", in Info: ${a}.`)}return 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 i of e){const e=i.toString(16);t.push(e.padStart(2,"0"))}return t.join("")}const e=this.xref.trailer.get("ID");let t,i;if(Array.isArray(e)&&validate(e[0])){t=stringToBytes(e[0]);e[1]!==e[0]&&validate(e[1])&&(i=stringToBytes(e[1]))}else t=vr(this.stream.getByteRange(0,1024),0,1024);return shadow(this,"fingerprints",[hexString(t),i?hexString(i):null])}async _getLinearizationPage(e){const{catalog:t,linearization:i,xref:a}=this,r=Ref.get(i.objectNumberFirst,0);try{const e=await a.fetchAsync(r);if(e instanceof Dict){let i=e.getRaw("Type");i instanceof Ref&&(i=await a.fetchAsync(i));if(isName(i,"Page")||!e.has("Type")&&!e.has("Kids")&&e.has("Contents")){t.pageKidsCountCache.has(r)||t.pageKidsCountCache.put(r,1);t.pageIndexCache.has(r)||t.pageIndexCache.put(r,0);return[e,r]}}throw new FormatError("The Linearization dictionary doesn't point to a valid Page dictionary.")}catch(i){warn(`_getLinearizationPage: "${i.message}".`);return t.getPageDict(e)}}getPage(e){const t=this._pagePromises.get(e);if(t)return t;const{catalog:i,linearization:a,xfaFactory:r}=this;let s;s=r?Promise.resolve([Dict.empty,null]):a?.pageFirst===e?this._getLinearizationPage(e):i.getPageDict(e);s=s.then((([t,a])=>new Page({pdfManager:this.pdfManager,xref:this.xref,pageIndex:e,pageDict:t,ref:a,globalIdFactory:this._globalIdFactory,fontCache:i.fontCache,builtInCMapCache:i.builtInCMapCache,standardFontDataCache:i.standardFontDataCache,globalImageCache:i.globalImageCache,systemFontCache:i.systemFontCache,nonBlendModesSet:i.nonBlendModesSet,xfaFactory:r})));this._pagePromises.set(e,s);return s}async checkFirstPage(e=!1){if(!e)try{await this.getPage(0)}catch(e){if(e instanceof XRefEntryException){this._pagePromises.delete(0);await this.cleanup();throw new XRefParseException}}}async checkLastPage(e=!1){const{catalog:t,pdfManager:i}=this;t.setActualNumPages();let a;try{await Promise.all([i.ensureDoc("xfaFactory"),i.ensureDoc("linearization"),i.ensureCatalog("numPages")]);if(this.xfaFactory)return;a=this.linearization?this.linearization.numPages:t.numPages;if(!Number.isInteger(a))throw new FormatError("Page count is not an integer.");if(a<=1)return;await this.getPage(a-1)}catch(r){this._pagePromises.delete(a-1);await this.cleanup();if(r instanceof XRefEntryException&&!e)throw new XRefParseException;warn(`checkLastPage - invalid /Pages tree /Count: ${a}.`);let s;try{s=await t.getAllPageDicts(e)}catch(i){if(i instanceof XRefEntryException&&!e)throw new XRefParseException;t.setActualNumPages(1);return}for(const[e,[a,r]]of s){let s;if(a instanceof Error){s=Promise.reject(a);s.catch((()=>{}))}else s=Promise.resolve(new Page({pdfManager:i,xref:this.xref,pageIndex:e,pageDict:a,ref:r,globalIdFactory:this._globalIdFactory,fontCache:t.fontCache,builtInCMapCache:t.builtInCMapCache,standardFontDataCache:t.standardFontDataCache,globalImageCache:t.globalImageCache,systemFontCache:t.systemFontCache,nonBlendModesSet:t.nonBlendModesSet,xfaFactory:null}));this._pagePromises.set(e,s)}t.setActualNumPages(s.size)}}fontFallback(e,t){return this.catalog.fontFallback(e,t)}async cleanup(e=!1){return this.catalog?this.catalog.cleanup(e):clearGlobalCaches()}async#q(e,t,i,a,r){const{xref:s}=this;if(!(t instanceof Ref)||r.has(t))return;r.put(t);const n=await s.fetchAsync(t);if(!(n instanceof Dict))return;if(n.has("T")){const t=stringToPDFString(await n.getAsync("T"));e=""===e?t:`${e}.${t}`}else{let t=n;for(;;){t=t.getRaw("Parent");if(t instanceof Ref){if(r.has(t))break;t=await s.fetchAsync(t)}if(!(t instanceof Dict))break;if(t.has("T")){const i=stringToPDFString(await t.getAsync("T"));e=""===e?i:`${e}.${i}`;break}}}i.has(e)||i.set(e,[]);i.get(e).push(AnnotationFactory.create(s,t,a,null,!0,null).then((e=>e?.getFieldObject())).catch((function(e){warn(`#collectFieldObjects: "${e}".`);return null})));if(!n.has("Kids"))return;const o=await n.getAsync("Kids");if(Array.isArray(o))for(const t of o)await this.#q(e,t,i,a,r)}get fieldObjects(){if(!this.formInfo.hasFields)return shadow(this,"fieldObjects",Promise.resolve(null));return shadow(this,"fieldObjects",Promise.all([this.pdfManager.ensureDoc("annotationGlobals"),this.pdfManager.ensureCatalog("acroForm")]).then((async([e,t])=>{if(!e)return null;const i=new RefSet,a=Object.create(null),r=new Map;for(const a of await t.getAsync("Fields"))await this.#q("",a,r,e,i);const s=[];for(const[e,t]of r)s.push(Promise.all(t).then((t=>{(t=t.filter((e=>!!e))).length>0&&(a[e]=t)})));await Promise.all(s);return a})))}get hasJSActions(){return shadow(this,"hasJSActions",this.pdfManager.ensureDoc("_parseHasJSActions"))}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?.has("CO"))return shadow(this,"calculationOrderIds",null);const t=e.get("CO");if(!Array.isArray(t)||0===t.length)return shadow(this,"calculationOrderIds",null);const i=[];for(const e of t)e instanceof Ref&&i.push(e.toString());return 0===i.length?shadow(this,"calculationOrderIds",null):shadow(this,"calculationOrderIds",i)}get annotationGlobals(){return shadow(this,"annotationGlobals",AnnotationFactory.createGlobals(this.pdfManager))}}class BasePdfManager{constructor(e){this.constructor===BasePdfManager&&unreachable("Cannot initialize BasePdfManager.");this._docBaseUrl=function parseDocBaseUrl(e){if(e){const t=createValidAbsoluteUrl(e);if(t)return t.href;warn(`Invalid absolute docBaseUrl: "${e}".`)}return null}(e.docBaseUrl);this._docId=e.docId;this._password=e.password;this.enableXfa=e.enableXfa;e.evaluatorOptions.isOffscreenCanvasSupported&&=FeatureTest.isOffscreenCanvasSupported;this.evaluatorOptions=Object.freeze(e.evaluatorOptions)}get docId(){return this._docId}get password(){return this._password}get docBaseUrl(){return this._docBaseUrl}get catalog(){return this.pdfDocument.catalog}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,i){unreachable("Abstract method `ensure` called")}requestRange(e,t){unreachable("Abstract method `requestRange` called")}requestLoadedStream(e=!1){unreachable("Abstract method `requestLoadedStream` called")}sendProgressiveData(e){unreachable("Abstract method `sendProgressiveData` called")}updatePassword(e){this._password=e}terminate(e){unreachable("Abstract method `terminate` called")}}class LocalPdfManager extends BasePdfManager{constructor(e){super(e);const t=new Stream(e.source);this.pdfDocument=new PDFDocument(this,t);this._loadedStreamPromise=Promise.resolve(t)}async ensure(e,t,i){const a=e[t];return"function"==typeof a?a.apply(e,i):a}requestRange(e,t){return Promise.resolve()}requestLoadedStream(e=!1){return this._loadedStreamPromise}terminate(e){}}class NetworkPdfManager extends BasePdfManager{constructor(e){super(e);this.streamManager=new ChunkedStreamManager(e.source,{msgHandler:e.handler,length:e.length,disableAutoFetch:e.disableAutoFetch,rangeChunkSize:e.rangeChunkSize});this.pdfDocument=new PDFDocument(this,this.streamManager.getStream())}async ensure(e,t,i){try{const a=e[t];return"function"==typeof a?a.apply(e,i):a}catch(a){if(!(a instanceof MissingDataException))throw a;await this.requestRange(a.begin,a.end);return this.ensure(e,t,i)}}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)}}const co=1,Co=2,ho=1,lo=2,Bo=3,Qo=4,Eo=5,uo=6,fo=7,po=8;function wrapReason(e){e instanceof Error||"object"==typeof e&&null!==e||unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');switch(e.name){case"AbortException":return new AbortException(e.message);case"MissingPDFException":return new MissingPDFException(e.message);case"PasswordException":return new PasswordException(e.message,e.code);case"UnexpectedResponseException":return new UnexpectedResponseException(e.message,e.status);case"UnknownErrorException":return new UnknownErrorException(e.message,e.details);default:return new UnknownErrorException(e.message,e.toString())}}class MessageHandler{constructor(e,t,i){this.sourceName=e;this.targetName=t;this.comObj=i;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.#O(t);return}if(t.callback){const e=t.callbackId,i=this.callbackCapabilities[e];if(!i)throw new Error(`Cannot resolve callback ${e}`);delete this.callbackCapabilities[e];if(t.callback===co)i.resolve(t.data);else{if(t.callback!==Co)throw new Error("Unexpected callback case");i.reject(wrapReason(t.reason))}return}const a=this.actionHandler[t.action];if(!a)throw new Error(`Unknown action from worker: ${t.action}`);if(t.callbackId){const e=this.sourceName,r=t.sourceName;new Promise((function(e){e(a(t.data))})).then((function(a){i.postMessage({sourceName:e,targetName:r,callback:co,callbackId:t.callbackId,data:a})}),(function(a){i.postMessage({sourceName:e,targetName:r,callback:Co,callbackId:t.callbackId,reason:wrapReason(a)})}))}else t.streamId?this.#P(t):a(t.data)};i.addEventListener("message",this._onComObjOnMessage)}on(e,t){const i=this.actionHandler;if(i[e])throw new Error(`There is already an actionName called "${e}"`);i[e]=t}send(e,t,i){this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},i)}sendWithPromise(e,t,i){const a=this.callbackId++,r=Promise.withResolvers();this.callbackCapabilities[a]=r;try{this.comObj.postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:a,data:t},i)}catch(e){r.reject(e)}return r.promise}sendWithStream(e,t,i,a){const r=this.streamId++,s=this.sourceName,n=this.targetName,o=this.comObj;return new ReadableStream({start:i=>{const g=Promise.withResolvers();this.streamControllers[r]={controller:i,startCall:g,pullCall:null,cancelCall:null,isClosed:!1};o.postMessage({sourceName:s,targetName:n,action:e,streamId:r,data:t,desiredSize:i.desiredSize},a);return g.promise},pull:e=>{const t=Promise.withResolvers();this.streamControllers[r].pullCall=t;o.postMessage({sourceName:s,targetName:n,stream:uo,streamId:r,desiredSize:e.desiredSize});return t.promise},cancel:e=>{assert(e instanceof Error,"cancel must have a valid reason");const t=Promise.withResolvers();this.streamControllers[r].cancelCall=t;this.streamControllers[r].isClosed=!0;o.postMessage({sourceName:s,targetName:n,stream:ho,streamId:r,reason:wrapReason(e)});return t.promise}},i)}#P(e){const t=e.streamId,i=this.sourceName,a=e.sourceName,r=this.comObj,s=this,n=this.actionHandler[e.action],o={enqueue(e,s=1,n){if(this.isCancelled)return;const o=this.desiredSize;this.desiredSize-=s;if(o>0&&this.desiredSize<=0){this.sinkCapability=Promise.withResolvers();this.ready=this.sinkCapability.promise}r.postMessage({sourceName:i,targetName:a,stream:Qo,streamId:t,chunk:e},n)},close(){if(!this.isCancelled){this.isCancelled=!0;r.postMessage({sourceName:i,targetName:a,stream:Bo,streamId:t});delete s.streamSinks[t]}},error(e){assert(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;r.postMessage({sourceName:i,targetName:a,stream:Eo,streamId:t,reason:wrapReason(e)})}},sinkCapability:Promise.withResolvers(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};o.sinkCapability.resolve();o.ready=o.sinkCapability.promise;this.streamSinks[t]=o;new Promise((function(t){t(n(e.data,o))})).then((function(){r.postMessage({sourceName:i,targetName:a,stream:po,streamId:t,success:!0})}),(function(e){r.postMessage({sourceName:i,targetName:a,stream:po,streamId:t,reason:wrapReason(e)})}))}#O(e){const t=e.streamId,i=this.sourceName,a=e.sourceName,r=this.comObj,s=this.streamControllers[t],n=this.streamSinks[t];switch(e.stream){case po:e.success?s.startCall.resolve():s.startCall.reject(wrapReason(e.reason));break;case fo:e.success?s.pullCall.resolve():s.pullCall.reject(wrapReason(e.reason));break;case uo:if(!n){r.postMessage({sourceName:i,targetName:a,stream:fo,streamId:t,success:!0});break}n.desiredSize<=0&&e.desiredSize>0&&n.sinkCapability.resolve();n.desiredSize=e.desiredSize;new Promise((function(e){e(n.onPull?.())})).then((function(){r.postMessage({sourceName:i,targetName:a,stream:fo,streamId:t,success:!0})}),(function(e){r.postMessage({sourceName:i,targetName:a,stream:fo,streamId:t,reason:wrapReason(e)})}));break;case Qo:assert(s,"enqueue should have stream controller");if(s.isClosed)break;s.controller.enqueue(e.chunk);break;case Bo:assert(s,"close should have stream controller");if(s.isClosed)break;s.isClosed=!0;s.controller.close();this.#W(s,t);break;case Eo:assert(s,"error should have stream controller");s.controller.error(wrapReason(e.reason));this.#W(s,t);break;case lo:e.success?s.cancelCall.resolve():s.cancelCall.reject(wrapReason(e.reason));this.#W(s,t);break;case ho:if(!n)break;new Promise((function(t){t(n.onCancel?.(wrapReason(e.reason)))})).then((function(){r.postMessage({sourceName:i,targetName:a,stream:lo,streamId:t,success:!0})}),(function(e){r.postMessage({sourceName:i,targetName:a,stream:lo,streamId:t,reason:wrapReason(e)})}));n.sinkCapability.reject(wrapReason(e.reason));n.isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async#W(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)}}class PDFWorkerStream{constructor(e){this._msgHandler=e;this._contentLength=null;this._fullRequestReader=null;this._rangeRequestReaders=[]}getFullReader(){assert(!this._fullRequestReader,"PDFWorkerStream.getFullReader can only be called once.");this._fullRequestReader=new PDFWorkerStreamReader(this._msgHandler);return this._fullRequestReader}getRangeReader(e,t){const i=new PDFWorkerStreamRangeReader(e,t,this._msgHandler);this._rangeRequestReaders.push(i);return i}cancelAllRequests(e){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,i){this._msgHandler=i;this.onProgress=null;const a=this._msgHandler.sendWithStream("GetRangeReader",{begin:e,end:t});this._reader=a.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)}}class WorkerTask{constructor(e){this.name=e;this.terminated=!1;this._capability=Promise.withResolvers()}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")}}class WorkerMessageHandler{static setup(e,t){let i=!1;e.on("test",(function(t){if(!i){i=!0;e.send("test",t instanceof Uint8Array)}}));e.on("configure",(function(e){!function setVerbosityLevel(e){Number.isInteger(e)&&(nt=e)}(e.verbosity)}));e.on("GetDocRequest",(function(e){return WorkerMessageHandler.createDocumentHandler(e,t)}))}static createDocumentHandler(e,t){let i,a=!1,r=null;const s=new Set,n=getVerbosityLevel(),{docId:o,apiVersion:g}=e,c="4.4.168";if(g!==c)throw new Error(`The API version "${g}" does not match the Worker version "${c}".`);const C=[];for(const e in[])C.push(e);if(C.length)throw new Error("The `Array.prototype` contains unexpected enumerable properties: "+C.join(", ")+"; thus breaking e.g. `for...in` iteration of `Array`s.");const h=o+"_worker";let l=new MessageHandler(h,o,t);function ensureNotTerminated(){if(a)throw new Error("Worker was terminated")}function startWorkerTask(e){s.add(e)}function finishWorkerTask(e){e.finish();s.delete(e)}async function loadDocument(e){await i.ensureDoc("checkHeader");await i.ensureDoc("parseStartXRef");await i.ensureDoc("parse",[e]);await i.ensureDoc("checkFirstPage",[e]);await i.ensureDoc("checkLastPage",[e]);const t=await i.ensureDoc("isPureXfa");if(t){const e=new WorkerTask("loadXfaFonts");startWorkerTask(e);await Promise.all([i.loadXfaFonts(l,e).catch((e=>{})).then((()=>finishWorkerTask(e))),i.loadXfaImages()])}const[a,r]=await Promise.all([i.ensureDoc("numPages"),i.ensureDoc("fingerprints")]);return{numPages:a,fingerprints:r,htmlForXfa:t?await i.ensureDoc("htmlForXfa"):null}}function getPdfManager({data:e,password:t,disableAutoFetch:i,rangeChunkSize:a,length:s,docBaseUrl:n,enableXfa:g,evaluatorOptions:c}){const C={source:null,disableAutoFetch:i,docBaseUrl:n,docId:o,enableXfa:g,evaluatorOptions:c,handler:l,length:s,password:t,rangeChunkSize:a},h=Promise.withResolvers();let Q;if(e){try{C.source=e;Q=new LocalPdfManager(C);h.resolve(Q)}catch(e){h.reject(e)}return h.promise}let E,u=[];try{E=new PDFWorkerStream(l)}catch(e){h.reject(e);return h.promise}const d=E.getFullReader();d.headersReady.then((function(){if(d.isRangeSupported){C.source=E;C.length=d.contentLength;C.disableAutoFetch||=d.isStreamingSupported;Q=new NetworkPdfManager(C);for(const e of u)Q.sendProgressiveData(e);u=[];h.resolve(Q);r=null}})).catch((function(e){h.reject(e);r=null}));let f=0;new Promise((function(e,t){const readChunk=function({value:e,done:i}){try{ensureNotTerminated();if(i){Q||function(){const e=arrayBuffersToBytes(u);s&&e.length!==s&&warn("reported HTTP length is different from actual");try{C.source=e;Q=new LocalPdfManager(C);h.resolve(Q)}catch(e){h.reject(e)}u=[]}();r=null;return}f+=e.byteLength;d.isStreamingSupported||l.send("DocProgress",{loaded:f,total:Math.max(f,d.contentLength||0)});Q?Q.sendProgressiveData(e):u.push(e);d.read().then(readChunk,t)}catch(e){t(e)}};d.read().then(readChunk,t)})).catch((function(e){h.reject(e);r=null}));r=function(e){E.cancelAllRequests(e)};return h.promise}l.on("GetPage",(function(e){return i.getPage(e.pageIndex).then((function(e){return Promise.all([i.ensure(e,"rotate"),i.ensure(e,"ref"),i.ensure(e,"userUnit"),i.ensure(e,"view")]).then((function([e,t,i,a]){return{rotate:e,ref:t,refStr:t?.toString()??null,userUnit:i,view:a}}))}))}));l.on("GetPageIndex",(function(e){const t=Ref.get(e.num,e.gen);return i.ensureCatalog("getPageIndex",[t])}));l.on("GetDestinations",(function(e){return i.ensureCatalog("destinations")}));l.on("GetDestination",(function(e){return i.ensureCatalog("getDestination",[e.id])}));l.on("GetPageLabels",(function(e){return i.ensureCatalog("pageLabels")}));l.on("GetPageLayout",(function(e){return i.ensureCatalog("pageLayout")}));l.on("GetPageMode",(function(e){return i.ensureCatalog("pageMode")}));l.on("GetViewerPreferences",(function(e){return i.ensureCatalog("viewerPreferences")}));l.on("GetOpenAction",(function(e){return i.ensureCatalog("openAction")}));l.on("GetAttachments",(function(e){return i.ensureCatalog("attachments")}));l.on("GetDocJSActions",(function(e){return i.ensureCatalog("jsActions")}));l.on("GetPageJSActions",(function({pageIndex:e}){return i.getPage(e).then((function(e){return i.ensure(e,"jsActions")}))}));l.on("GetOutline",(function(e){return i.ensureCatalog("documentOutline")}));l.on("GetOptionalContentConfig",(function(e){return i.ensureCatalog("optionalContentConfig")}));l.on("GetPermissions",(function(e){return i.ensureCatalog("permissions")}));l.on("GetMetadata",(function(e){return Promise.all([i.ensureDoc("documentInfo"),i.ensureCatalog("metadata")])}));l.on("GetMarkInfo",(function(e){return i.ensureCatalog("markInfo")}));l.on("GetData",(function(e){return i.requestLoadedStream().then((function(e){return e.bytes}))}));l.on("GetAnnotations",(function({pageIndex:e,intent:t}){return i.getPage(e).then((function(i){const a=new WorkerTask(`GetAnnotations: page ${e}`);startWorkerTask(a);return i.getAnnotationsData(l,a,t).then((e=>{finishWorkerTask(a);return e}),(e=>{finishWorkerTask(a);throw e}))}))}));l.on("GetFieldObjects",(function(e){return i.ensureDoc("fieldObjects")}));l.on("HasJSActions",(function(e){return i.ensureDoc("hasJSActions")}));l.on("GetCalculationOrderIds",(function(e){return i.ensureDoc("calculationOrderIds")}));l.on("SaveDocument",(async function({isPureXfa:e,numPages:t,annotationStorage:a,filename:r}){const s=[i.requestLoadedStream(),i.ensureCatalog("acroForm"),i.ensureCatalog("acroFormRef"),i.ensureDoc("startXRef"),i.ensureDoc("xref"),i.ensureDoc("linearization"),i.ensureCatalog("structTreeRoot")],n=[],o=e?null:getNewAnnotationsMap(a),[g,c,C,h,Q,E,u]=await Promise.all(s),d=Q.trailer.getRaw("Root")||null;let f;if(o){u?await u.canUpdateStructTree({pdfManager:i,xref:Q,newAnnotationsByPage:o})&&(f=u):await StructTreeRoot.canCreateStructureTree({catalogRef:d,pdfManager:i,newAnnotationsByPage:o})&&(f=null);const e=AnnotationFactory.generateImages(a.values(),Q,i.evaluatorOptions.isOffscreenCanvasSupported),t=void 0===f?n:[];for(const[a,r]of o)t.push(i.getPage(a).then((t=>{const i=new WorkerTask(`Save (editor): page ${a}`);return t.saveNewAnnotations(l,i,r,e).finally((function(){finishWorkerTask(i)}))})));null===f?n.push(Promise.all(t).then((async e=>{await StructTreeRoot.createStructureTree({newAnnotationsByPage:o,xref:Q,catalogRef:d,pdfManager:i,newRefs:e});return e}))):f&&n.push(Promise.all(t).then((async e=>{await f.updateStructureTree({newAnnotationsByPage:o,pdfManager:i,newRefs:e});return e})))}if(e)n.push(i.serializeXfaData(a));else for(let e=0;ee.needAppearances)),b=c instanceof Dict&&c.get("XFA")||null;let D=null,S=!1;if(Array.isArray(b)){for(let e=0,t=b.length;e{"string"==typeof i&&(e[t]=stringToPDFString(i))}));k={rootRef:d,encryptRef:Q.trailer.getRaw("Encrypt")||null,newRef:Q.getNewTemporaryRef(),infoRef:Q.trailer.getRaw("Info")||null,info:e,fileIds:Q.trailer.get("ID")||null,startXRef:E?h:Q.lastXRefStreamPos??h,filename:r}}return incrementalUpdate({originalData:g.bytes,xrefInfo:k,newRefs:m,xref:Q,hasXfa:!!b,xfaDatasetsRef:D,hasXfaDatasetsEntry:S,needAppearances:w,acroFormRef:C,acroForm:c,xfaData:y,useXrefStream:isDict(Q.topDict,"XRef")}).finally((()=>{Q.resetNewTemporaryRef()}))}));l.on("GetOperatorList",(function(e,t){const a=e.pageIndex;i.getPage(a).then((function(i){const r=new WorkerTask(`GetOperatorList: page ${a}`);startWorkerTask(r);const s=n>=yA.INFOS?Date.now():0;i.getOperatorList({handler:l,sink:t,task:r,intent:e.intent,cacheKey:e.cacheKey,annotationStorage:e.annotationStorage}).then((function(e){finishWorkerTask(r);s&&info(`page=${a+1} - getOperatorList: time=${Date.now()-s}ms, len=${e.length}`);t.close()}),(function(e){finishWorkerTask(r);r.terminated||t.error(e)}))}))}));l.on("GetTextContent",(function(e,t){const{pageIndex:a,includeMarkedContent:r,disableNormalization:s}=e;i.getPage(a).then((function(e){const i=new WorkerTask("GetTextContent: page "+a);startWorkerTask(i);const o=n>=yA.INFOS?Date.now():0;e.extractTextContent({handler:l,task:i,sink:t,includeMarkedContent:r,disableNormalization:s}).then((function(){finishWorkerTask(i);o&&info(`page=${a+1} - getTextContent: time=`+(Date.now()-o)+"ms");t.close()}),(function(e){finishWorkerTask(i);i.terminated||t.error(e)}))}))}));l.on("GetStructTree",(function(e){return i.getPage(e.pageIndex).then((function(e){return i.ensure(e,"getStructTree")}))}));l.on("FontFallback",(function(e){return i.fontFallback(e.id,l)}));l.on("Cleanup",(function(e){return i.cleanup(!0)}));l.on("Terminate",(function(e){a=!0;const t=[];if(i){i.terminate(new AbortException("Worker was terminated."));const e=i.cleanup();t.push(e);i=null}else clearGlobalCaches();r&&r(new AbortException("Worker was terminated."));for(const e of s){t.push(e.finished);e.terminate()}return Promise.all(t).then((function(){l.destroy();l=null}))}));l.on("Ready",(function(t){!function setupDoc(e){function onSuccess(e){ensureNotTerminated();l.send("GetDoc",{pdfInfo:e})}function onFailure(e){ensureNotTerminated();if(e instanceof PasswordException){const t=new WorkerTask(`PasswordException: response ${e.code}`);startWorkerTask(t);l.sendWithPromise("PasswordRequest",e).then((function({password:e}){finishWorkerTask(t);i.updatePassword(e);pdfManagerReady()})).catch((function(){finishWorkerTask(t);l.send("DocException",e)}))}else e instanceof InvalidPDFException||e instanceof MissingPDFException||e instanceof UnexpectedResponseException||e instanceof UnknownErrorException?l.send("DocException",e):l.send("DocException",new UnknownErrorException(e.message,e.toString()))}function pdfManagerReady(){ensureNotTerminated();loadDocument(!1).then(onSuccess,(function(e){ensureNotTerminated();e instanceof XRefParseException?i.requestLoadedStream().then((function(){ensureNotTerminated();loadDocument(!0).then(onSuccess,onFailure)})):onFailure(e)}))}ensureNotTerminated();getPdfManager(e).then((function(e){if(a){e.terminate(new AbortException("Worker was terminated."));throw new Error("Worker was terminated")}i=e;i.requestLoadedStream(!0).then((e=>{l.send("DataLoaded",{length:e.bytes.byteLength})}))})).then(pdfManagerReady,onFailure)}(e);e=null}));return h}static initializeFromPort(e){const t=new MessageHandler("worker","main",e);WorkerMessageHandler.setup(t,e);t.send("ready",null)}}"undefined"==typeof window&&!i&&"undefined"!=typeof self&&function isMessagePort(e){return"function"==typeof e.postMessage&&"onmessage"in e}(self)&&WorkerMessageHandler.initializeFromPort(self);var mo=__webpack_exports__.WorkerMessageHandler;export{mo as WorkerMessageHandler}; \ No newline at end of file From 47df0c0febf3671c721eeb021b0b8881bc738ad1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81sd=C3=ADs=20Erna=20Gu=C3=B0mundsd=C3=B3ttir?= Date: Fri, 4 Oct 2024 14:47:59 +0000 Subject: [PATCH 07/20] fix(service-portal): fix defender info and alert (#16275) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../domains/law-and-order/src/lib/law-and-order.service.ts | 2 +- .../src/components/DocumentLine/DocumentLineV3.tsx | 6 ++++-- .../law-and-order/src/screens/Subpoena/Subpoena.tsx | 5 ++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libs/api/domains/law-and-order/src/lib/law-and-order.service.ts b/libs/api/domains/law-and-order/src/lib/law-and-order.service.ts index 3b38f29db9b1..964b2c2b4f9d 100644 --- a/libs/api/domains/law-and-order/src/lib/law-and-order.service.ts +++ b/libs/api/domains/law-and-order/src/lib/law-and-order.service.ts @@ -126,7 +126,7 @@ export class LawAndOrderService { const subpoena: SubpoenaResponse | undefined | null = await this.api.getSubpoena(id, user, locale) - const defenderChoice = subpoena?.defenderInfo.defenderChoice + const defenderChoice = subpoena?.defenderInfo?.defenderChoice const message = defenderChoice ? formatMessage( DefenseChoices[subpoena?.defenderInfo.defenderChoice].message, diff --git a/libs/service-portal/documents/src/components/DocumentLine/DocumentLineV3.tsx b/libs/service-portal/documents/src/components/DocumentLine/DocumentLineV3.tsx index bff0538f0760..394d1be3a6dd 100644 --- a/libs/service-portal/documents/src/components/DocumentLine/DocumentLineV3.tsx +++ b/libs/service-portal/documents/src/components/DocumentLine/DocumentLineV3.tsx @@ -106,6 +106,7 @@ export const DocumentLineV3: FC = ({ const displayPdf = ( content?: DocumentV2Content, actions?: Array, + alertMessageData?: DocumentV2Action, ) => { setActiveDocument({ document: { @@ -121,7 +122,7 @@ export const DocumentLineV3: FC = ({ img, categoryId: documentLine.categoryId ?? undefined, actions: actions, - alert: documentLine.alert ?? undefined, + alert: alertMessageData ?? undefined, }) window.scrollTo({ top: 0, @@ -155,8 +156,9 @@ export const DocumentLineV3: FC = ({ } else { const docContent = data?.documentV2?.content const actions = data?.documentV2?.actions ?? undefined + const alert = data?.documentV2?.alert ?? undefined if (docContent) { - displayPdf(docContent, actions) + displayPdf(docContent, actions, alert) setDocumentDisplayError(undefined) setLocalRead([...localRead, documentLine.id]) } else { diff --git a/libs/service-portal/law-and-order/src/screens/Subpoena/Subpoena.tsx b/libs/service-portal/law-and-order/src/screens/Subpoena/Subpoena.tsx index 605062c6166e..bbf546763e78 100644 --- a/libs/service-portal/law-and-order/src/screens/Subpoena/Subpoena.tsx +++ b/libs/service-portal/law-and-order/src/screens/Subpoena/Subpoena.tsx @@ -44,7 +44,6 @@ const Subpoena = () => { const subpoena = data?.lawAndOrderSubpoena const [defenderPopUp, setDefenderPopUp] = useState(false) - if ( subpoena?.data && (!isDefined(subpoena.data.hasBeenServed) || @@ -121,7 +120,7 @@ const Subpoena = () => { action: () => { setDefenderPopUp(true) }, - disabled: !subpoena.data.canEditDefenderChoice, + disabled: subpoena.data.canEditDefenderChoice === false, tooltip: subpoena.data.canEditDefenderChoice ? undefined : subpoena.data.courtContactInfo ?? '', @@ -138,7 +137,7 @@ const Subpoena = () => { {formatMessage(messages.subpoenaInfoText2)} - {!loading && !subpoena?.data.defenderChoice && ( + {!loading && subpoena.data.canEditDefenderChoice === null && ( )} From 33fe31c07877bdee4c68ade78fd2a839a4e250ee Mon Sep 17 00:00:00 2001 From: Kristofer Date: Fri, 4 Oct 2024 15:05:03 +0000 Subject: [PATCH 08/20] chore(scripts): Formatting (#16241) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../api/scripts/run-xroad-proxy.sh | 18 ++-- .../search-indexer/bin/generate-es-config.sh | 54 ++++++------ infra/scripts/build-docker-container.sh | 6 +- .../ci/diff-chart-values-all-charts.sh | 11 ++- infra/scripts/ci/diff-chart-values.sh | 22 ++--- infra/scripts/ci/git-check-dirty.sh | 1 - infra/scripts/ci/test-unit.sh | 7 +- .../scripts/container-scripts/destroy-dbs.sh | 13 ++- infra/scripts/format-yaml.sh | 2 +- infra/scripts/helm-diff.sh | 21 +++-- scripts/ci/00_prepare-base-tags.sh | 12 +-- scripts/ci/10_prepare-docker-deps.sh | 2 +- scripts/ci/10_prepare-host-deps.sh | 4 +- scripts/ci/20_check-formatting.sh | 2 +- scripts/ci/30_test.sh | 5 +- scripts/ci/50_upload-coverage.sh | 4 +- scripts/ci/90_docker-express.sh | 2 +- scripts/ci/90_docker-jest.sh | 2 +- scripts/ci/90_docker-next.sh | 2 +- scripts/ci/90_docker-playwright.sh | 2 +- scripts/ci/90_docker-static.sh | 2 +- scripts/ci/_common.sh | 4 +- scripts/ci/_nx-affected-targets.sh | 2 +- scripts/ci/cache/generate-files.sh | 2 +- scripts/ci/ci.sh | 2 +- scripts/ci/docker-login-ecr.sh | 2 +- scripts/ci/generate-build-chunks.sh | 13 ++- scripts/ci/generate-chunks.sh | 6 +- scripts/ci/list-unaffected.sh | 20 ++--- scripts/ci/retag-unaffected.sh | 2 +- scripts/ci/run-affected-in-parallel.sh | 2 +- scripts/ci/run-in-parallel-native.sh | 5 +- scripts/ci/run-in-parallel.sh | 4 +- scripts/create-secret.sh | 83 ++++++++++--------- .../bash/extract-environment.sh | 2 +- scripts/stop-test-proxies.sh | 5 +- 36 files changed, 177 insertions(+), 171 deletions(-) diff --git a/apps/financial-aid/api/scripts/run-xroad-proxy.sh b/apps/financial-aid/api/scripts/run-xroad-proxy.sh index edb2e6ef14f5..ba1fd41f25f8 100755 --- a/apps/financial-aid/api/scripts/run-xroad-proxy.sh +++ b/apps/financial-aid/api/scripts/run-xroad-proxy.sh @@ -1,17 +1,17 @@ #!/bin/bash INSTANCE_ID=$( - aws ec2 describe-instances \ - --filters "Name=tag:Name,Values=Bastion Host" "Name=instance-state-name,Values=running" \ - --query "Reservations[0].Instances[0].InstanceId" \ - --region eu-west-1 \ - --output text + aws ec2 describe-instances \ + --filters "Name=tag:Name,Values=Bastion Host" "Name=instance-state-name,Values=running" \ + --query "Reservations[0].Instances[0].InstanceId" \ + --region eu-west-1 \ + --output text ) echo "Starting port forwarding session with instance $INSTANCE_ID for profile $AWS_PROFILE" aws ssm start-session \ - --target "$INSTANCE_ID" \ - --document-name AWS-StartPortForwardingSession \ - --parameters '{"portNumber":["8081"],"localPortNumber":["5050"]}' \ - --region eu-west-1 + --target "$INSTANCE_ID" \ + --document-name AWS-StartPortForwardingSession \ + --parameters '{"portNumber":["8081"],"localPortNumber":["5050"]}' \ + --region eu-west-1 diff --git a/apps/services/search-indexer/bin/generate-es-config.sh b/apps/services/search-indexer/bin/generate-es-config.sh index dd9ebe9d0a63..fa3c86eb0649 100755 --- a/apps/services/search-indexer/bin/generate-es-config.sh +++ b/apps/services/search-indexer/bin/generate-es-config.sh @@ -1,60 +1,60 @@ #!/usr/bin/env bash APP="$0" -APPDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +APPDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" usage() { - echo "Usage: $APP language type [ > template.js ]" - echo -e "\tlanguage: is|en|..." - echo -e "\ttype: slim|full" + echo "Usage: $APP language type [ > template.js ]" + echo -e "\tlanguage: is|en|..." + echo -e "\ttype: slim|full" } if [ "$1" == "" ]; then - echo "Error: missing language" - usage - exit 1 + echo "Error: missing language" + usage + exit 1 fi if [[ "$2" != "slim" ]] && [[ "$2" != "full" ]]; then - echo "Error: wrong type: $2" - usage - exit 1 + echo "Error: wrong type: $2" + usage + exit 1 fi TEMPLATE="$APPDIR/../config/template-is.json" if [ ! -f "$TEMPLATE" ]; then - echo "Error: could not find template file: '$TEMPLATE'" - exit 1 + echo "Error: could not find template file: '$TEMPLATE'" + exit 1 fi JQ="$(which jq)" if [ ! -x "$JQ" ]; then - echo "Error: could not find 'jq'. Please install" - exit 1 + echo "Error: could not find 'jq'. Please install" + exit 1 fi replace_slim() { - sed -E 's@"rules_path":.*?(,?\s*)$@"rules": []\1@' | \ - sed -E 's@"stopwords_path":.*?(,?\s*)$@"stopwords": []\1@' | \ - sed -E 's@"keywords_path":.*?(,?\s*)$@"keywords": []\1@' | \ - sed -E 's@"synonyms_path":.*?(,?\s*)$@"synonyms": []\1@' + sed -E 's@"rules_path":.*?(,?\s*)$@"rules": []\1@' | + sed -E 's@"stopwords_path":.*?(,?\s*)$@"stopwords": []\1@' | + sed -E 's@"keywords_path":.*?(,?\s*)$@"keywords": []\1@' | + sed -E 's@"synonyms_path":.*?(,?\s*)$@"synonyms": []\1@' } replace_full() { - sed -E 's@"rules_path":.*?(,?\s*)$@"rules_path": "analysis/stemmer.txt"\1@' | \ - sed -E 's@"stopwords_path":.*?(,?\s*)$@"stopwords_path": "analysis/stopwords.txt"\1@' | \ - sed -E 's@"keywords_path":.*?(,?\s*)$@"keywords_path": "analysis/keywords.txt"\1@' | \ - sed -E 's@"synonyms_path":.*?(,?\s*)$@"synonyms_path": "analysis/synonyms.txt"\1@' + sed -E 's@"rules_path":.*?(,?\s*)$@"rules_path": "analysis/stemmer.txt"\1@' | + sed -E 's@"stopwords_path":.*?(,?\s*)$@"stopwords_path": "analysis/stopwords.txt"\1@' | + sed -E 's@"keywords_path":.*?(,?\s*)$@"keywords_path": "analysis/keywords.txt"\1@' | + sed -E 's@"synonyms_path":.*?(,?\s*)$@"synonyms_path": "analysis/synonyms.txt"\1@' } main() { - # local lang="$1" - local type="$2" - local func="replace_$type" + # local lang="$1" + local type="$2" + local func="replace_$type" - jq '.settings, .mappings' < "$TEMPLATE" | $func + jq '.settings, .mappings' <"$TEMPLATE" | $func } -main "$1" "$2" \ No newline at end of file +main "$1" "$2" diff --git a/infra/scripts/build-docker-container.sh b/infra/scripts/build-docker-container.sh index 60ab6f876241..460fb419fd26 100755 --- a/infra/scripts/build-docker-container.sh +++ b/infra/scripts/build-docker-container.sh @@ -1,6 +1,6 @@ #!/bin/bash set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" DOCKER_REGISTRY=${DOCKER_REGISTRY:-821090935708.dkr.ecr.eu-west-1.amazonaws.com/} PUBLISH=${PUBLISH:-false} @@ -10,6 +10,6 @@ DOCKER_TAG=$1 # shellcheck disable=SC2086 docker build -f "$DIR"/Dockerfile ${EXTRA_DOCKER_BUILD_ARGS:-} -t "$DOCKER_IMAGE":"${DOCKER_TAG}" "$DIR"/../.. -if [[ "true" = "$PUBLISH" ]] ; then - docker push "$DOCKER_IMAGE":"${DOCKER_TAG}" +if [[ "true" = "$PUBLISH" ]]; then + docker push "$DOCKER_IMAGE":"${DOCKER_TAG}" fi diff --git a/infra/scripts/ci/diff-chart-values-all-charts.sh b/infra/scripts/ci/diff-chart-values-all-charts.sh index 992655ad4019..b38d583f238e 100755 --- a/infra/scripts/ci/diff-chart-values-all-charts.sh +++ b/infra/scripts/ci/diff-chart-values-all-charts.sh @@ -2,9 +2,12 @@ ### Use for local testing - this will run tests for all the charts sequentially set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" ROOT=$DIR/../../.. -for chart in $(cd "$ROOT" ; python -c 'import os, json; print(" ".join([os.path.splitext(f)[0] for f in os.listdir("infra/src/uber-charts/")]))'); do - "$DIR"/diff-chart-values.sh "$chart" -done \ No newline at end of file +for chart in $( + cd "$ROOT" + python -c 'import os, json; print(" ".join([os.path.splitext(f)[0] for f in os.listdir("infra/src/uber-charts/")]))' +); do + "$DIR"/diff-chart-values.sh "$chart" +done diff --git a/infra/scripts/ci/diff-chart-values.sh b/infra/scripts/ci/diff-chart-values.sh index 5748c8425308..4eb0e39d3e25 100755 --- a/infra/scripts/ci/diff-chart-values.sh +++ b/infra/scripts/ci/diff-chart-values.sh @@ -1,19 +1,19 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" ROOT="$DIR/../.." export PATH=$ROOT/node_modules/.bin:$PATH case "$1" in - "islandis" | "judicial-system" | "air-discount-scheme" | 'identity-server') - ENVS=("dev" "staging" "prod") - cd "$ROOT" - for env in "${ENVS[@]}"; do - node -r esbuild-register "$ROOT"/src/cli/cli render-env --chart="$1" --env="${env}" | diff "$ROOT"/../charts/"$1"/values."${env}".yaml - - done - ;; - *) - echo "No diffing support for $1 yet or ever" - ;; +"islandis" | "judicial-system" | "air-discount-scheme" | 'identity-server') + ENVS=("dev" "staging" "prod") + cd "$ROOT" + for env in "${ENVS[@]}"; do + node -r esbuild-register "$ROOT"/src/cli/cli render-env --chart="$1" --env="${env}" | diff "$ROOT"/../charts/"$1"/values."${env}".yaml - + done + ;; +*) + echo "No diffing support for $1 yet or ever" + ;; esac diff --git a/infra/scripts/ci/git-check-dirty.sh b/infra/scripts/ci/git-check-dirty.sh index f15b15843022..8bbf2a5c2a9b 100755 --- a/infra/scripts/ci/git-check-dirty.sh +++ b/infra/scripts/ci/git-check-dirty.sh @@ -34,4 +34,3 @@ if [[ $(git diff --stat "$abs_path") != '' ]]; then else echo "found no unstaged files from $action, nothing to commit" fi - diff --git a/infra/scripts/ci/test-unit.sh b/infra/scripts/ci/test-unit.sh index 960e68957b07..9e2ed8fe9844 100755 --- a/infra/scripts/ci/test-unit.sh +++ b/infra/scripts/ci/test-unit.sh @@ -3,7 +3,10 @@ set -euxo pipefail # Run code tests -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" ROOT="$DIR/../.." -(cd "$ROOT"; "$ROOT"/node_modules/.bin/jest) +( + cd "$ROOT" + "$ROOT"/node_modules/.bin/jest +) diff --git a/infra/scripts/container-scripts/destroy-dbs.sh b/infra/scripts/container-scripts/destroy-dbs.sh index e410925d8155..c52d1b226a51 100755 --- a/infra/scripts/container-scripts/destroy-dbs.sh +++ b/infra/scripts/container-scripts/destroy-dbs.sh @@ -8,15 +8,14 @@ export PGPASSWORD set -x FEATURE_NAME=$1 - -psql -tc "SELECT datname FROM pg_database WHERE datname like 'feature_${FEATURE_NAME}_%'" --field-separator ' ' --no-align --quiet \ -| while read -r dbname; do +psql -tc "SELECT datname FROM pg_database WHERE datname like 'feature_${FEATURE_NAME}_%'" --field-separator ' ' --no-align --quiet | + while read -r dbname; do psql -c "DROP DATABASE $dbname" -done + done -psql -tc "SELECT rolname FROM pg_roles WHERE rolname like 'feature_${FEATURE_NAME}_%'" --field-separator ' ' --no-align --quiet \ -| while read -r rolname; do +psql -tc "SELECT rolname FROM pg_roles WHERE rolname like 'feature_${FEATURE_NAME}_%'" --field-separator ' ' --no-align --quiet | + while read -r rolname; do psql -c "DROP USER $rolname" -done + done node secrets delete /k8s/feature-"$FEATURE_NAME"- diff --git a/infra/scripts/format-yaml.sh b/infra/scripts/format-yaml.sh index 809cd91f36a3..b77cfe44af01 100755 --- a/infra/scripts/format-yaml.sh +++ b/infra/scripts/format-yaml.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" ROOT="$DIR/.." cd "$ROOT" diff --git a/infra/scripts/helm-diff.sh b/infra/scripts/helm-diff.sh index 94252e806779..b856f6b13ab5 100755 --- a/infra/scripts/helm-diff.sh +++ b/infra/scripts/helm-diff.sh @@ -6,25 +6,24 @@ # - pip install --upgrade ydiff # https://github.com/ymattw/ydiff -if ! command -v ydiff &> /dev/null -then - echo "Please install ydiff via pip or brew" - echo "https://github.com/ymattw/ydiff" - exit 1 +if ! command -v ydiff &>/dev/null; then + echo "Please install ydiff via pip or brew" + echo "https://github.com/ymattw/ydiff" + exit 1 fi if [ -z "${1}" ]; then - echo "Specify older commit/tag/branch" - exit 1 + echo "Specify older commit/tag/branch" + exit 1 fi if [ -z "${2}" ]; then - echo "Specify newer commit/tag/branch" - exit 1 + echo "Specify newer commit/tag/branch" + exit 1 fi # curl https://api.github.com/repos/island-is/island.is/contents/charts/islandis/values.prod.yaml | jq -r ".content" | base64 --decode -curl -s -H "Accept: application/json" 'https://api.github.com/repos/island-is/island.is/contents/charts/islandis/values.prod.yaml?ref='${1}'' | jq -r ".content" | base64 --decode > current-release.json -curl -s -H "Accept: application/json" 'https://api.github.com/repos/island-is/island.is/contents/charts/islandis/values.prod.yaml?ref='${2}'' | jq -r ".content" | base64 --decode > new-release.json +curl -s -H "Accept: application/json" 'https://api.github.com/repos/island-is/island.is/contents/charts/islandis/values.prod.yaml?ref='${1}'' | jq -r ".content" | base64 --decode >current-release.json +curl -s -H "Accept: application/json" 'https://api.github.com/repos/island-is/island.is/contents/charts/islandis/values.prod.yaml?ref='${2}'' | jq -r ".content" | base64 --decode >new-release.json diff -u ./current-release.json ./new-release.json | ydiff -w 0 -s rm -f ./new-release.json rm -f ./current-release.json diff --git a/scripts/ci/00_prepare-base-tags.sh b/scripts/ci/00_prepare-base-tags.sh index 0646576795c9..00f58ac95dae 100755 --- a/scripts/ci/00_prepare-base-tags.sh +++ b/scripts/ci/00_prepare-base-tags.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" ROOT="$DIR/../.." tempRepo=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir') @@ -10,7 +10,7 @@ cp -r "$ROOT/.github/actions/dist/." "$tempRepo" LAST_GOOD_BUILD=$(DEBUG="*,-simple-git" REPO_ROOT="$ROOT" node $tempRepo/main.js) if echo "$LAST_GOOD_BUILD" | grep -q 'full_rebuild_needed'; then export NX_AFFECTED_ALL=true - echo "NX_AFFECTED_ALL=$NX_AFFECTED_ALL" >> $GITHUB_ENV + echo "NX_AFFECTED_ALL=$NX_AFFECTED_ALL" >>$GITHUB_ENV exit 0 fi echo "Stickman done" @@ -23,13 +23,13 @@ if [[ "$BUILD_REF" != "$LAST_GOOD_BUILD_SHA" ]]; then echo "This will be an incremental build from a previous successful run in this PR. See parents of the commit below." git log -1 "$BUILD_REF" fi -LAST_GOOD_BUILD_DOCKER_BRANCH_TAG=$(echo "${LAST_GOOD_BUILD_BRANCH}" | tr "/." "-" ) +LAST_GOOD_BUILD_DOCKER_BRANCH_TAG=$(echo "${LAST_GOOD_BUILD_BRANCH}" | tr "/." "-") export LAST_GOOD_BUILD_DOCKER_TAG=${LAST_GOOD_BUILD_DOCKER_BRANCH_TAG:0:45}_${LAST_GOOD_BUILD_SHA:0:10}_${LAST_GOOD_BUILD_RUN_NUMBER} if [[ "$BUILD_REF" == "null" || "$BUILD_REF" == "" ]]; then - curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"Change detection failed for $HTML_URL\"}" "$ISSUE_REPORTING_SLACK_WEBHOOK_URL" - exit 1 + curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"Change detection failed for $HTML_URL\"}" "$ISSUE_REPORTING_SLACK_WEBHOOK_URL" + exit 1 else - BASE="$BUILD_REF" + BASE="$BUILD_REF" fi export BASE >&2 echo "Last successful docker tag '$LAST_GOOD_BUILD_DOCKER_TAG'" diff --git a/scripts/ci/10_prepare-docker-deps.sh b/scripts/ci/10_prepare-docker-deps.sh index d0513560c150..e35bd21c9891 100755 --- a/scripts/ci/10_prepare-docker-deps.sh +++ b/scripts/ci/10_prepare-docker-deps.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/10_prepare-host-deps.sh b/scripts/ci/10_prepare-host-deps.sh index 8a879ba4415d..878e49b66b0d 100755 --- a/scripts/ci/10_prepare-host-deps.sh +++ b/scripts/ci/10_prepare-host-deps.sh @@ -1,9 +1,9 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh -yarn install --immutable \ No newline at end of file +yarn install --immutable diff --git a/scripts/ci/20_check-formatting.sh b/scripts/ci/20_check-formatting.sh index d43b2b4f403c..6759377120b4 100755 --- a/scripts/ci/20_check-formatting.sh +++ b/scripts/ci/20_check-formatting.sh @@ -1,4 +1,4 @@ #!/bin/bash set -euxo pipefail action=${1:-"check"} -yarn nx format:"${action}" --all \ No newline at end of file +yarn nx format:"${action}" --all diff --git a/scripts/ci/30_test.sh b/scripts/ci/30_test.sh index 1d760b6e021d..1e41c58fd19d 100755 --- a/scripts/ci/30_test.sh +++ b/scripts/ci/30_test.sh @@ -25,7 +25,6 @@ else IS_FLAKY_TEST=false fi - projects_uncollectible_coverage=( "application-templates-no-debt-certificate" "api-domains-email-signup" @@ -48,10 +47,10 @@ export DD_CIVISIBILITY_AGENTLESS_ENABLED \ FLAKY_TEST_RETRIES=$(if [[ "$IS_FLAKY_TEST" == true ]]; then echo "$FLAKY_TEST_RETRIES"; else echo 1; fi) -for ((i=1; i<=FLAKY_TEST_RETRIES; i++)); do +for ((i = 1; i <= FLAKY_TEST_RETRIES; i++)); do echo "Running test ${APP} (attempt: ${i}/${FLAKY_TEST_RETRIES})" if yarn run test "${APP}" ${EXTRA_OPTS} --verbose --no-watchman "$@"; then exit 0 fi done -exit 1 \ No newline at end of file +exit 1 diff --git a/scripts/ci/50_upload-coverage.sh b/scripts/ci/50_upload-coverage.sh index 2db6866bee36..cbc62bb8d0e3 100755 --- a/scripts/ci/50_upload-coverage.sh +++ b/scripts/ci/50_upload-coverage.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh @@ -16,7 +16,7 @@ if [[ ! -f "$COVERAGE_FILE" ]]; then exit 0 fi -COVERAGE_CONTENT=$(jq "." -cr < $COVERAGE_FILE) +COVERAGE_CONTENT=$(jq "." -cr <$COVERAGE_FILE) if [[ "$COVERAGE_CONTENT" == "{}" ]]; then echo "Coverage report is empty" exit 0 diff --git a/scripts/ci/90_docker-express.sh b/scripts/ci/90_docker-express.sh index ebc6212b9584..3c81fe76b117 100755 --- a/scripts/ci/90_docker-express.sh +++ b/scripts/ci/90_docker-express.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/90_docker-jest.sh b/scripts/ci/90_docker-jest.sh index 90ffe36b9bfa..df31e7d441e1 100755 --- a/scripts/ci/90_docker-jest.sh +++ b/scripts/ci/90_docker-jest.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/90_docker-next.sh b/scripts/ci/90_docker-next.sh index f7b46e824465..ce6a35c27015 100755 --- a/scripts/ci/90_docker-next.sh +++ b/scripts/ci/90_docker-next.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/90_docker-playwright.sh b/scripts/ci/90_docker-playwright.sh index c26ce2ab7e8f..eb7bd5bb0fc0 100755 --- a/scripts/ci/90_docker-playwright.sh +++ b/scripts/ci/90_docker-playwright.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/90_docker-static.sh b/scripts/ci/90_docker-static.sh index 8dfec28c98ce..d859c0750451 100755 --- a/scripts/ci/90_docker-static.sh +++ b/scripts/ci/90_docker-static.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/_common.sh b/scripts/ci/_common.sh index 5f16494aebc4..ae0ad87ffe3a 100755 --- a/scripts/ci/_common.sh +++ b/scripts/ci/_common.sh @@ -1,6 +1,6 @@ #!/bin/bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" BRANCH=${BRANCH:-$(git branch --show-current)} export DOCKER_REGISTRY=${DOCKER_REGISTRY:-} @@ -9,4 +9,4 @@ export DOCKER_BUILDKIT=1 export CHUNK_SIZE=${CHUNK_SIZE:-2} export NODE_OPTIONS="--max-old-space-size=8192" PROJECT_ROOT=$(git -C "$DIR" rev-parse --show-toplevel) -export PROJECT_ROOT BRANCH \ No newline at end of file +export PROJECT_ROOT BRANCH diff --git a/scripts/ci/_nx-affected-targets.sh b/scripts/ci/_nx-affected-targets.sh index 3d861a2a0194..e8d346f9729d 100755 --- a/scripts/ci/_nx-affected-targets.sh +++ b/scripts/ci/_nx-affected-targets.sh @@ -14,7 +14,7 @@ TEST_EVERYTHING=${TEST_EVERYTHING:-} AFFECTED_ALL=${AFFECTED_ALL:-} # Could be used for forcing all projects to be affected (set or create `secret` in GitHub with the name of this variable set to the name of the branch that should be affected, prefixed with the magic string `7913-`) BRANCH=${BRANCH:-$GITHUB_HEAD_REF} -if [[ (-n "$BRANCH" && -n "$AFFECTED_ALL" && "$AFFECTED_ALL" == "7913-$BRANCH") || (-n "$NX_AFFECTED_ALL" && "$NX_AFFECTED_ALL" == "true") || (-n "$TEST_EVERYTHING" && "$TEST_EVERYTHING" == "true")]]; then +if [[ (-n "$BRANCH" && -n "$AFFECTED_ALL" && "$AFFECTED_ALL" == "7913-$BRANCH") || (-n "$NX_AFFECTED_ALL" && "$NX_AFFECTED_ALL" == "true") || (-n "$TEST_EVERYTHING" && "$TEST_EVERYTHING" == "true") ]]; then EXTRA_ARGS="" else EXTRA_ARGS=(--affected --base "$BASE" --head "$HEAD") diff --git a/scripts/ci/cache/generate-files.sh b/scripts/ci/cache/generate-files.sh index c87b4de95536..41bf3fe8f006 100755 --- a/scripts/ci/cache/generate-files.sh +++ b/scripts/ci/cache/generate-files.sh @@ -3,4 +3,4 @@ set -euo pipefail export NODE_OPTIONS=--max-old-space-size=4096 # shellcheck disable=SC2046 -tar zcvf generated_files.tar.gz $(./scripts/ci/get-files-touched-by.sh yarn codegen --skip-cache | xargs realpath --relative-to $(pwd)) \ No newline at end of file +tar zcvf generated_files.tar.gz $(./scripts/ci/get-files-touched-by.sh yarn codegen --skip-cache | xargs realpath --relative-to $(pwd)) diff --git a/scripts/ci/ci.sh b/scripts/ci/ci.sh index 91c0c107be9a..bd20f541479a 100755 --- a/scripts/ci/ci.sh +++ b/scripts/ci/ci.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/docker-login-ecr.sh b/scripts/ci/docker-login-ecr.sh index a08e8309161b..f3f491abc514 100755 --- a/scripts/ci/docker-login-ecr.sh +++ b/scripts/ci/docker-login-ecr.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/generate-build-chunks.sh b/scripts/ci/generate-build-chunks.sh index 9fab557ebcd9..41840bf9395a 100755 --- a/scripts/ci/generate-build-chunks.sh +++ b/scripts/ci/generate-build-chunks.sh @@ -1,17 +1,16 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh chunks='[]' -for target in "$@" -do - affected_chunks=$("$PROJECT_ROOT"/scripts/ci/generate-chunks.sh $target) - if [[ "$affected_chunks" != "" ]]; then - chunks=$(echo "$chunks" | jq -cM --argjson target "$affected_chunks" '. + ($target | map({projects: ., docker_type: "'$target'"}))') - fi +for target in "$@"; do + affected_chunks=$("$PROJECT_ROOT"/scripts/ci/generate-chunks.sh $target) + if [[ "$affected_chunks" != "" ]]; then + chunks=$(echo "$chunks" | jq -cM --argjson target "$affected_chunks" '. + ($target | map({projects: ., docker_type: "'$target'"}))') + fi done >&2 echo "Map: ${chunks}" diff --git a/scripts/ci/generate-chunks.sh b/scripts/ci/generate-chunks.sh index 502104728e34..c3ca04673ea4 100755 --- a/scripts/ci/generate-chunks.sh +++ b/scripts/ci/generate-chunks.sh @@ -1,15 +1,14 @@ #!/bin/bash set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh BRANCH=${BRANCH:-$GITHUB_HEAD_REF} SKIP_TESTS_ON_BRANCH=${SKIP_TESTS_ON_BRANCH:-} -if [[ "$SKIP_TESTS_ON_BRANCH" == "7913-$BRANCH" ]] -then +if [[ "$SKIP_TESTS_ON_BRANCH" == "7913-$BRANCH" ]]; then #Skipping tests echo "[]" else @@ -19,4 +18,3 @@ else >&2 echo "Chunks: $CHUNKS" echo "$CHUNKS" fi - diff --git a/scripts/ci/list-unaffected.sh b/scripts/ci/list-unaffected.sh index ecfdbe7d8b95..3e1500b66549 100755 --- a/scripts/ci/list-unaffected.sh +++ b/scripts/ci/list-unaffected.sh @@ -2,18 +2,18 @@ set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # This script re-tags all unaffected Docker images with the newest tag. UNAFFECTED="" -for TARGET in "$@" -do - AFFECTED=$("$DIR"/_nx-affected-targets.sh $TARGET | tr -d '\n') - ALL=$(AFFECTED_ALL=7913-${BRANCH} "$DIR"/_nx-affected-targets.sh $TARGET | tr -d '\n') +for TARGET in "$@"; do + AFFECTED=$("$DIR"/_nx-affected-targets.sh $TARGET | tr -d '\n') + ALL=$(AFFECTED_ALL=7913-${BRANCH} "$DIR"/_nx-affected-targets.sh $TARGET | tr -d '\n') - UNAFFECTED_ADD=$(node << EOM + UNAFFECTED_ADD=$( + node < e.trim()).filter(e => e.length > 0) const allProjects = "$ALL".split(",").map(e => e.trim()).filter(e => e.length > 0) console.error('All projects: [' + allProjects + ']') @@ -22,10 +22,10 @@ do if (unaffected.length === 0) console.error('Everything is affected') console.log(unaffected.join(' ')) EOM -) - if [[ -n $UNAFFECTED_ADD ]] ; then - UNAFFECTED="$UNAFFECTED $UNAFFECTED_ADD" - fi + ) + if [[ -n $UNAFFECTED_ADD ]]; then + UNAFFECTED="$UNAFFECTED $UNAFFECTED_ADD" + fi done >&2 echo "Unaffected Docker images: ${UNAFFECTED}" diff --git a/scripts/ci/retag-unaffected.sh b/scripts/ci/retag-unaffected.sh index 411b9d5f270a..b9b88c9f4f7a 100755 --- a/scripts/ci/retag-unaffected.sh +++ b/scripts/ci/retag-unaffected.sh @@ -2,7 +2,7 @@ set -euxo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # This script re-tags all unaffected Docker images with the newest tag. echo "$1" | tr ' ' '\n' | xargs -P 8 -n 1 -I {} bash -c "IMAGE={} $DIR/_retag.sh" # exit code 255 makes xargs fail fast diff --git a/scripts/ci/run-affected-in-parallel.sh b/scripts/ci/run-affected-in-parallel.sh index fd381313ee60..0834a429ec37 100755 --- a/scripts/ci/run-affected-in-parallel.sh +++ b/scripts/ci/run-affected-in-parallel.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh diff --git a/scripts/ci/run-in-parallel-native.sh b/scripts/ci/run-in-parallel-native.sh index b9f17de8bdd4..2427f5afdae0 100755 --- a/scripts/ci/run-in-parallel-native.sh +++ b/scripts/ci/run-in-parallel-native.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh @@ -9,8 +9,7 @@ MAX_JOBS=${MAX_JOBS:-2} AFFECTED_PROJECTS=$(echo "${AFFECTED_PROJECTS}" | tr -d '\n[:space:]') echo "Running '$AFFECTED_PROJECTS' in parallel of ${MAX_JOBS} for target $1" -if [ -n "$AFFECTED_PROJECTS" ] -then +if [ -n "$AFFECTED_PROJECTS" ]; then echo "Affected projects for target $1 are '$AFFECTED_PROJECTS'" yarn run nx run-many --target="$1" --projects="$AFFECTED_PROJECTS" --parallel --maxParallel="$MAX_JOBS" else diff --git a/scripts/ci/run-in-parallel.sh b/scripts/ci/run-in-parallel.sh index e39a41cefeab..53bedb1fc4db 100755 --- a/scripts/ci/run-in-parallel.sh +++ b/scripts/ci/run-in-parallel.sh @@ -1,7 +1,7 @@ #!/bin/bash set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" # shellcheck disable=SC1091 source "$DIR"/_common.sh @@ -10,7 +10,7 @@ MAX_JOBS=${MAX_JOBS:-2} AFFECTED_PROJECTS=$(echo "${AFFECTED_PROJECTS}" | tr '\n,' ' ') echo "Running '$AFFECTED_PROJECTS' in parallel of ${MAX_JOBS} for target $1" -IFS=" " read -ra AFFECTED_PROJECTS <<< "$AFFECTED_PROJECTS" +IFS=" " read -ra AFFECTED_PROJECTS <<<"$AFFECTED_PROJECTS" # This is a helper script to run in parallel a list of provided projects for a specific target exec parallel --halt soon,fail=1 --lb -j "$MAX_JOBS" APP={} "$DIR"/"$1".sh ::: "${AFFECTED_PROJECTS[@]}" diff --git a/scripts/create-secret.sh b/scripts/create-secret.sh index 54165f7f8074..113dff697dd2 100755 --- a/scripts/create-secret.sh +++ b/scripts/create-secret.sh @@ -29,45 +29,45 @@ HAS_SLASH_END="[^\/]" # Complete pattern # PATTERN=$ALPHANUMERIC_DASH$MIN_LENGTH$HAS_SLASH_END$END -__error_exit () { +__error_exit() { # printf "${RED}[ERROR]: $*${NOSTYLE}" >&2; exit 1; - printf "%s[ERROR]: $*%s" "$RED" "$RESET" >&2; exit 1; + printf "%s[ERROR]: $*%s" "$RED" "$RESET" >&2 + exit 1 } -error_empty () { +error_empty() { printf "%sNo empty values %s\n" "$RED" "$RESET" exit 0 } -validate_empty () { - [[ -d $1 ]] || { printf "%sNo empty values%s" "$RED" "$RESET" >&2; exit 1; } +validate_empty() { + [[ -d $1 ]] || { + printf "%sNo empty values%s" "$RED" "$RESET" >&2 + exit 1 + } } -validate_slash () { +validate_slash() { [[ ! $1 =~ $HAS_SLASH_END ]] printf "%sNo ending slash: Ok!%s" "$GREEN" "$RESET" } -validate_whitespace () { - if [ ! ${1+x} ] - then +validate_whitespace() { + if [ ! ${1+x} ]; then error_empty fi # No whitespace - if [[ $1 = "$ILLEGAL_CHARS" ]] - then + if [[ $1 = "$ILLEGAL_CHARS" ]]; then printf "%sWhitespaces are not allowed%s\n" "$RED" "$RESET" exit 0 fi - } +} -validate_chars () { - if [ ! ${1+x} ] - then +validate_chars() { + if [ ! ${1+x} ]; then error_empty fi - if [[ $1 =~ $ALPHANUMERIC_DASH$ONE_OR_MORE ]] - then + if [[ $1 =~ $ALPHANUMERIC_DASH$ONE_OR_MORE ]]; then printf "%sName: Ok! %s\n" "$GREEN" "$RESET" else printf "%sSecret name can only contain letters, numbers, hyphens and underscores %s\n" "$RED" "$RESET" @@ -75,16 +75,14 @@ validate_chars () { fi } -validate_length () { +validate_length() { # Unset parameter is an empty user input - if [ ! ${1+x} ] - then + if [ ! ${1+x} ]; then error_empty fi # Validate minimum length - if ((${#1} < MIN_LENGTH || ${#1} > MAX_LENGTH)) - then + if ((${#1} < MIN_LENGTH || ${#1} > MAX_LENGTH)); then printf "%sToo short, should be 6-256 characters long.%s\n" "$RED" "$RESET" exit 0 else @@ -93,7 +91,7 @@ validate_length () { } #-------------------CREATE SECRET--------------------------# -prepare_secret () { +prepare_secret() { # Prompt user for secret name read -erp "${BLUE}Secret name: ${RESET}${SSM_PREFIX}" SECRET_NAME validate_whitespace "$SECRET_NAME" @@ -107,8 +105,7 @@ prepare_secret () { # Prompt user for secret type read -erp "${BLUE}SecureString [Y/n]? ${RESET}" - if [[ $REPLY =~ ^[Nn]$ ]] - then + if [[ $REPLY =~ ^[Nn]$ ]]; then SECRET_TYPE="String" else SECRET_TYPE="SecureString" @@ -118,13 +115,11 @@ prepare_secret () { # Prompt user for adding tags TAGS="" read -erp "${BLUE}Add tags? [y/N]? ${RESET}" - if [[ $REPLY =~ ^[Yy]$ ]] - then + if [[ $REPLY =~ ^[Yy]$ ]]; then read -erp "${YELLOW}Example: Key=Foo,Value=Bar Key=Another,Value=Tag: ${RESET}" TAGS fi read -erp "${YELLOW}Are you sure [Y/n]? ${RESET}" - if [[ $REPLY =~ ^[Nn]$ ]] - then + if [[ $REPLY =~ ^[Nn]$ ]]; then printf "%sAborting...%s" "$RED" "$RESET" else printf "%sCreating secret....%s\n" "$GREEN" "$RESET" @@ -132,15 +127,14 @@ prepare_secret () { fi } -create_secret () { +create_secret() { SECRET_NAME=$1 SECRET_VALUE=$2 SECRET_TYPE=$3 TAGS=$4 CMD="aws ssm put-parameter --name $SSM_PREFIX$SECRET_NAME --value $SECRET_VALUE --type $SECRET_TYPE" - if [ -n "$TAGS" ] - then + if [ -n "$TAGS" ]; then CMD="$CMD --tags $TAGS" fi eval "$CMD" @@ -148,11 +142,26 @@ create_secret () { } case $1 in - validate_length) "$@"; exit;; - validate_chars) "$@"; exit;; - validate_whitespace) "$@"; exit;; - validate_empty) "$@"; exit;; - __error_exit) "$@"; exit;; +validate_length) + "$@" + exit + ;; +validate_chars) + "$@" + exit + ;; +validate_whitespace) + "$@" + exit + ;; +validate_empty) + "$@" + exit + ;; +__error_exit) + "$@" + exit + ;; esac prepare_secret diff --git a/scripts/dockerfile-assets/bash/extract-environment.sh b/scripts/dockerfile-assets/bash/extract-environment.sh index de404e339b13..45fdfd95efc1 100755 --- a/scripts/dockerfile-assets/bash/extract-environment.sh +++ b/scripts/dockerfile-assets/bash/extract-environment.sh @@ -1,5 +1,5 @@ #!/bin/bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" node "$DIR/extract-environment.js" "$@" diff --git a/scripts/stop-test-proxies.sh b/scripts/stop-test-proxies.sh index 51b852eab4ff..e209e5bb32f2 100755 --- a/scripts/stop-test-proxies.sh +++ b/scripts/stop-test-proxies.sh @@ -12,9 +12,8 @@ function stop_proxy() { builder=${1:-docker} -array=( socat-xroad es-proxy ) +array=(socat-xroad es-proxy) -for proxy in "${array[@]}" -do +for proxy in "${array[@]}"; do stop_proxy "${proxy}" "${builder}" || true done From d40e9817fceb1085fd04109d2d03ea73cf619955 Mon Sep 17 00:00:00 2001 From: mannipje <135017126+mannipje@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:15:27 +0000 Subject: [PATCH 09/20] fix(web): Syslumenn remove link to fasteignaskra (#16276) * Remove link to fasteignaskra * Fix padding in auctions --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../Organization/Syslumenn/Auctions.tsx | 22 +++++-------------- .../Organization/Syslumenn/Homestay.tsx | 16 +------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/apps/web/screens/Organization/Syslumenn/Auctions.tsx b/apps/web/screens/Organization/Syslumenn/Auctions.tsx index 1e47a0936844..31a013dd41cf 100644 --- a/apps/web/screens/Organization/Syslumenn/Auctions.tsx +++ b/apps/web/screens/Organization/Syslumenn/Auctions.tsx @@ -844,22 +844,12 @@ const Auctions: Screen = ({ {auction.lotName} {/* Real Estate link */} - {auction.lotId && - auction.lotType === LOT_TYPES.REAL_ESTATE && ( - - )} + {auction.lotId && auction.lotType === LOT_TYPES.REAL_ESTATE && ( + + {n('auctionRealEstateNumberPrefix', 'Fasteign nr. ')} + {auction.lotId} + + )} {/* Vehicle link */} {auction.lotId && auction.lotType === LOT_TYPES.VEHICLE && ( diff --git a/apps/web/screens/Organization/Syslumenn/Homestay.tsx b/apps/web/screens/Organization/Syslumenn/Homestay.tsx index 1f02f538e61f..ff72e3e59cd4 100644 --- a/apps/web/screens/Organization/Syslumenn/Homestay.tsx +++ b/apps/web/screens/Organization/Syslumenn/Homestay.tsx @@ -275,21 +275,7 @@ const Homestay: Screen = ({ > {n('homestayRealEstateNumberPrefix', 'Fasteign nr.')}{' '} - - {homestay.propertyId} - + {homestay.propertyId} From 1fe61c1b79405db1e9609da141d64b7da0b61a69 Mon Sep 17 00:00:00 2001 From: juni-haukur <158475136+juni-haukur@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:30:38 +0000 Subject: [PATCH 10/20] chore(signature-collection): Refactor report pdf creation (#16278) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../DownloadReports/index.tsx | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/libs/portals/admin/signature-collection/src/screens-parliamentary/DownloadReports/index.tsx b/libs/portals/admin/signature-collection/src/screens-parliamentary/DownloadReports/index.tsx index de8d51335eaa..9a32fc9c13a1 100644 --- a/libs/portals/admin/signature-collection/src/screens-parliamentary/DownloadReports/index.tsx +++ b/libs/portals/admin/signature-collection/src/screens-parliamentary/DownloadReports/index.tsx @@ -22,13 +22,14 @@ export const DownloadReports = ({ const { formatMessage } = useLocale() const [modalDownloadReportsIsOpen, setModalDownloadReportsIsOpen] = useState(false) + const [pdfState, setPdfState] = useState({ areaId: '', pdfUrl: '' }) const [runGetSummaryReport, { data }] = useLazyQuery( SignatureCollectionAreaSummaryReportDocument, ) const [document, updateDocument] = usePDF({ - document: ( + document: data && ( { + // Fetch the report if it has not been fetched yet + if (area !== pdfState.areaId) { + runGetSummaryReport({ + variables: { + input: { + areaId: area, + collectionId: collectionId, + }, + }, + }) + setPdfState({ ...pdfState, areaId: area }) + } else { + // Open the document in a new tab if it has already been fetched + window.open(document?.url?.toString(), '_blank') + } + } + + // Update pdf document after correct data is fetched useEffect(() => { - if (data?.signatureCollectionAreaSummaryReport) { + if (data?.signatureCollectionAreaSummaryReport?.id === pdfState.areaId) { updateDocument() } - }, [data]) + }, [data, pdfState, updateDocument]) // Open the document in a new tab when it has been generated useEffect(() => { - if (!document.loading && document.url) { + if (document.url && document.url !== pdfState.pdfUrl) { window.open(document.url, '_blank') + setPdfState({ ...pdfState, pdfUrl: document?.url ?? '' }) } - }, [document.loading, document.url]) + }, [document.url, pdfState]) return ( @@ -86,16 +106,7 @@ export const DownloadReports = ({ variant: 'text', icon: 'download', iconType: 'outline', - onClick: () => { - runGetSummaryReport({ - variables: { - input: { - areaId: area.id, - collectionId: collectionId, - }, - }, - }) - }, + onClick: () => handleDownloadClick(area.id), }} /> ))} From b204713c7d252404b5812e644e6474c1fb386cfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafn=20=C3=81rnason?= Date: Fri, 4 Oct 2024 15:45:15 +0000 Subject: [PATCH 11/20] =?UTF-8?q?feat(passport-application):=20=C3=9Ej?= =?UTF-8?q?=C3=B3=C3=B0skr=C3=A1=20as=20fixed=20deliveryaddress=20(#16272)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixed delivery address * cleanup * cleanup * chore: nx format:write update dirty files * fix comments * chore: nx format:write update dirty files --------- Co-authored-by: andes-it Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../templates/passport/passport.service.ts | 4 +-- .../templates/passport/src/forms/Draft.ts | 32 ++----------------- .../forms/overviewSection/childsOverview.ts | 13 +------- .../forms/overviewSection/personalOverview.ts | 12 +------ .../templates/passport/src/lib/dataSchema.ts | 2 +- .../templates/passport/src/lib/messages.ts | 5 +++ 6 files changed, 12 insertions(+), 56 deletions(-) diff --git a/libs/application/template-api-modules/src/lib/modules/templates/passport/passport.service.ts b/libs/application/template-api-modules/src/lib/modules/templates/passport/passport.service.ts index 8181d7e4ca72..4d7a15447f2e 100644 --- a/libs/application/template-api-modules/src/lib/modules/templates/passport/passport.service.ts +++ b/libs/application/template-api-modules/src/lib/modules/templates/passport/passport.service.ts @@ -180,7 +180,7 @@ export class PassportService extends BaseTemplateApiService { guid: application.id, appliedForPersonId: auth.nationalId, priority: service.type === 'regular' ? 0 : 1, - deliveryName: service.dropLocation, + deliveryName: undefined, // intentionally undefined deprecated contactInfo: { phoneAtHome: personalInfo.phoneNumber, phoneAtWork: personalInfo.phoneNumber, @@ -195,7 +195,7 @@ export class PassportService extends BaseTemplateApiService { guid: application.id, appliedForPersonId: childsPersonalInfo.nationalId, priority: service.type === 'regular' ? 0 : 1, - deliveryName: service.dropLocation, + deliveryName: undefined, // intentionally undefined deprecated approvalA: { personId: childsPersonalInfo.guardian1.nationalId.replace('-', ''), name: childsPersonalInfo.guardian1.name, diff --git a/libs/application/templates/passport/src/forms/Draft.ts b/libs/application/templates/passport/src/forms/Draft.ts index 96cd1b108435..c50b7c2d7e61 100644 --- a/libs/application/templates/passport/src/forms/Draft.ts +++ b/libs/application/templates/passport/src/forms/Draft.ts @@ -7,9 +7,7 @@ import { buildMultiField, buildRadioField, buildSection, - buildSelectField, buildSubmitField, - getValueViaPath, } from '@island.is/application/core' import { Application, @@ -19,16 +17,11 @@ import { PassportsApi, } from '@island.is/application/types' import { - DeliveryAddressApi, SyslumadurPaymentCatalogApi, UserInfoApi, NationalRegistryUser, } from '../dataProviders' -import { - DistrictCommissionerAgencies, - Passport, - Services, -} from '../lib/constants' +import { Services } from '../lib/constants' import { m } from '../lib/messages' import { childsPersonalInfo } from './infoSection/childsPersonalInfo' import { personalInfo } from './infoSection/personalInfo' @@ -73,10 +66,6 @@ export const Draft: Form = buildForm({ provider: SyslumadurPaymentCatalogApi, title: '', }), - buildDataProviderItem({ - provider: DeliveryAddressApi, - title: '', - }), ], }), ], @@ -162,26 +151,9 @@ export const Draft: Form = buildForm({ title: m.dropLocation, titleVariant: 'h3', space: 2, - description: m.dropLocationDescription, + description: m.dropLocationTitleFixedValue, marginBottom: 'gutter', }), - buildSelectField({ - id: 'service.dropLocation', - title: m.dropLocation, - placeholder: m.dropLocationPlaceholder.defaultMessage, - options: ({ - externalData: { - deliveryAddress: { data }, - }, - }) => { - return (data as DistrictCommissionerAgencies[])?.map( - ({ key, name }) => ({ - value: key, - label: name, - }), - ) - }, - }), ], }), ], diff --git a/libs/application/templates/passport/src/forms/overviewSection/childsOverview.ts b/libs/application/templates/passport/src/forms/overviewSection/childsOverview.ts index 28e280821de1..96b1105d5d34 100644 --- a/libs/application/templates/passport/src/forms/overviewSection/childsOverview.ts +++ b/libs/application/templates/passport/src/forms/overviewSection/childsOverview.ts @@ -8,7 +8,6 @@ import { Application } from '@island.is/application/types' import { formatPhoneNumber } from '@island.is/application/ui-components' import { ChildsPersonalInfo, - DistrictCommissionerAgencies, Passport, Service, Services, @@ -237,17 +236,7 @@ export const childsOverview = buildMultiField({ buildKeyValueField({ label: m.dropLocation, width: 'half', - value: ({ - externalData: { - deliveryAddress: { data }, - }, - answers, - }) => { - const district = (data as DistrictCommissionerAgencies[]).find( - (d) => d.key === (answers.service as Service).dropLocation, - ) - return `${district?.name}` - }, + value: m.dropLocationTitleFixedValue, }), ], }) diff --git a/libs/application/templates/passport/src/forms/overviewSection/personalOverview.ts b/libs/application/templates/passport/src/forms/overviewSection/personalOverview.ts index 7cedc0f2908b..f83d4906b57a 100644 --- a/libs/application/templates/passport/src/forms/overviewSection/personalOverview.ts +++ b/libs/application/templates/passport/src/forms/overviewSection/personalOverview.ts @@ -124,17 +124,7 @@ export const personalOverview = buildMultiField({ buildKeyValueField({ label: m.dropLocation, width: 'half', - value: ({ - externalData: { - deliveryAddress: { data }, - }, - answers, - }) => { - const district = (data as DistrictCommissionerAgencies[]).find( - (d) => d.key === (answers.service as Service).dropLocation, - ) - return `${district?.name}` - }, + value: 'Þjóðskrá', }), ], }) diff --git a/libs/application/templates/passport/src/lib/dataSchema.ts b/libs/application/templates/passport/src/lib/dataSchema.ts index d84515d167cf..7a5c8f0af405 100644 --- a/libs/application/templates/passport/src/lib/dataSchema.ts +++ b/libs/application/templates/passport/src/lib/dataSchema.ts @@ -59,7 +59,7 @@ export const dataSchema = z.object({ }), service: z.object({ type: z.enum([Services.REGULAR, Services.EXPRESS]), - dropLocation: z.string().min(1), + dropLocation: z.string().nullable().optional(), }), approveExternalDataParentB: z.boolean().refine((v) => v), chargeItemCode: z.string(), diff --git a/libs/application/templates/passport/src/lib/messages.ts b/libs/application/templates/passport/src/lib/messages.ts index 3d34dbd20e8c..430bb7dee154 100644 --- a/libs/application/templates/passport/src/lib/messages.ts +++ b/libs/application/templates/passport/src/lib/messages.ts @@ -307,6 +307,11 @@ export const m = defineMessages({ defaultMessage: 'Greiða', description: 'Some description', }, + dropLocationTitleFixedValue: { + id: 'pa.application:overview.dropLocationTitle', + defaultMessage: 'Þjóðskrá', + description: 'Some description', + }, /* Payment Section */ paymentSection: { From e66d89b59ef02842b2c62e0c65754c40b6af7b88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3r=C3=B0ur=20H?= Date: Fri, 4 Oct 2024 15:58:57 +0000 Subject: [PATCH 12/20] fix(island-ui): pdf viewer worker url (#16280) * Update url * Update url * Update url --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx b/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx index c7ce3d348d20..294b59e435c7 100644 --- a/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx +++ b/libs/island-ui/core/src/lib/PdfViewer/PdfViewer.tsx @@ -45,8 +45,12 @@ export const PdfViewer: FC> = ({ useEffect(() => { import('react-pdf') .then((pdf) => { - pdf.pdfjs.GlobalWorkerOptions.workerSrc = - 'https://assets.ctfassets.net/8k0h54kbe6bj/8dqL0H07pYWZEkXwLtgBp/1c347f9a4f2bb255f78389b42cf40b97/pdf.worker.min.mjs' + const path = window.location.origin + const isLocalhost = path.includes('localhost') + const workerUrl = isLocalhost + ? 'https://assets.ctfassets.net/8k0h54kbe6bj/8dqL0H07pYWZEkXwLtgBp/1c347f9a4f2bb255f78389b42cf40b97/pdf.worker.min.mjs' + : `${path}/assets/pdf.worker.min.mjs` + pdf.pdfjs.GlobalWorkerOptions.workerSrc = workerUrl setPdfLib(pdf) }) .catch((e) => { From 1482e0744ddb01b79ceb53fa1aa8724b90e69db1 Mon Sep 17 00:00:00 2001 From: mannipje <135017126+mannipje@users.noreply.github.com> Date: Fri, 4 Oct 2024 16:47:35 +0000 Subject: [PATCH 13/20] feat(web): Add campaign monitor email signup service (#16240) * Add campaign monitor email signup service * chore: charts update dirty files * Change one translation string * Add enum for signup types to improve type safety * Add test for campaign monitor * Fix typo * Add tests for error handling * Fix tests --------- Co-authored-by: andes-it Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- apps/api/infra/api.ts | 2 + apps/api/src/app/app.module.ts | 2 + .../Slice/EmailSignup/EmailSignup.tsx | 46 +++++++--- charts/islandis/values.dev.yaml | 1 + charts/islandis/values.prod.yaml | 1 + charts/islandis/values.staging.yaml | 1 + libs/api/domains/email-signup/src/index.ts | 1 + .../src/lib/emailSignup.config.ts | 4 + .../src/lib/emailSignup.module.ts | 2 + .../src/lib/emailSignup.resolver.spec.ts | 86 ++++++++++++++++++- .../src/lib/emailSignup.service.ts | 19 +++- .../email-signup/src/lib/serviceProvider.ts | 13 --- .../campaignMonitor/campaignMonitor.config.ts | 18 ++++ .../campaignMonitor.service.ts | 48 +++++++++++ .../src/lib/services/zenter/zenter.service.ts | 2 +- .../src/lib/generated/contentfulTypes.d.ts | 2 +- libs/cms/src/lib/models/emailSignup.model.ts | 2 +- 17 files changed, 220 insertions(+), 30 deletions(-) delete mode 100644 libs/api/domains/email-signup/src/lib/serviceProvider.ts create mode 100644 libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.config.ts create mode 100644 libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.service.ts diff --git a/apps/api/infra/api.ts b/apps/api/infra/api.ts index 5e14a7d5aed7..cc8308e42a37 100644 --- a/apps/api/infra/api.ts +++ b/apps/api/infra/api.ts @@ -386,6 +386,8 @@ export const serviceSetup = (services: { ULTRAVIOLET_RADIATION_API_KEY: '/k8s/api/ULTRAVIOLET_RADIATION_API_KEY', UMBODSMADUR_SKULDARA_COST_OF_LIVING_CALCULATOR_API_URL: '/k8s/api/UMBODSMADUR_SKULDARA_COST_OF_LIVING_CALCULATOR_API_URL', + VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: + '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY', }) .xroad( AdrAndMachine, diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 97ed2726f24f..71017ebdd1a2 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -29,6 +29,7 @@ import { ElectronicRegistrationsModule } from '@island.is/api/domains/electronic import { EmailSignupModule, ZenterSignupConfig, + CampaignMonitorSignupConfig, } from '@island.is/api/domains/email-signup' import { EndorsementSystemModule } from '@island.is/api/domains/endorsement-system' import { EnergyFundsServiceModule } from '@island.is/api/domains/energy-funds' @@ -390,6 +391,7 @@ const environment = getConfig DocumentClientConfig, DocumentsClientV2Config, ZenterSignupConfig, + CampaignMonitorSignupConfig, PaymentScheduleClientConfig, JudicialAdministrationClientConfig, CommunicationsConfig, diff --git a/apps/web/components/Organization/Slice/EmailSignup/EmailSignup.tsx b/apps/web/components/Organization/Slice/EmailSignup/EmailSignup.tsx index 71557dd59d70..7acc2461f1ee 100644 --- a/apps/web/components/Organization/Slice/EmailSignup/EmailSignup.tsx +++ b/apps/web/components/Organization/Slice/EmailSignup/EmailSignup.tsx @@ -12,18 +12,19 @@ import { Text, } from '@island.is/island-ui/core' import { FormField } from '@island.is/web/components' -import { FormFieldType } from '../../../Form/Form' import { EmailSignup as EmailSignupSchema, EmailSignupInputField, EmailSignupSubscriptionMutation, EmailSignupSubscriptionMutationVariables, } from '@island.is/web/graphql/schema' -import { EMAIL_SIGNUP_MUTATION } from '@island.is/web/screens/queries' import { useNamespace } from '@island.is/web/hooks' +import { useI18n } from '@island.is/web/i18n' +import { EMAIL_SIGNUP_MUTATION } from '@island.is/web/screens/queries' import { isValidEmail } from '@island.is/web/utils/isValidEmail' import { isValidNationalId } from '@island.is/web/utils/isValidNationalId' +import { FormFieldType } from '../../../Form/Form' import * as styles from './EmailSignup.css' type SubmitResponse = { @@ -50,6 +51,7 @@ interface EmailSignupProps { const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { const n = useNamespace(slice.translations ?? {}) + const { activeLocale } = useI18n() const formFields = useMemo( () => slice.formFields?.filter( @@ -79,7 +81,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { if (field?.required && !value) { newErrors[fieldName] = n( 'fieldIsRequired', - 'Þennan reit þarf að fylla út', + activeLocale === 'is' + ? 'Þennan reit þarf að fylla út' + : 'This field is required', ) } else if ( field?.type === FormFieldType.EMAIL && @@ -87,7 +91,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { ) { newErrors[fieldName] = n( 'invalidEmail', - 'Vinsamlegast sláðu inn gilt netfang', + activeLocale === 'is' + ? 'Vinsamlegast sláðu inn gilt netfang' + : 'Please enter a valid email address', ) } else if ( field?.type === FormFieldType.CHECKBOXES && @@ -97,7 +103,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { ) { newErrors[fieldName] = n( 'fieldIsRequired', - 'Þennan reit þarf að fylla út', + activeLocale === 'is' + ? 'Þennan reit þarf að fylla út' + : 'This field is required', ) } else if ( field?.type === FormFieldType.NATIONAL_ID && @@ -106,7 +114,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { ) { newErrors[fieldName] = n( 'formInvalidNationalId', - 'Þetta er ekki gild kennitala.', + activeLocale === 'is' + ? 'Þetta er ekki gild kennitala.' + : 'This is not valid national id.', ) } } @@ -143,10 +153,17 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { if (result?.data?.emailSignupSubscription?.subscribed) { setSubmitResponse({ type: 'success', - title: n('submitSuccessTitle', 'Skráning tókst') as string, + title: n( + 'submitSuccessTitle', + activeLocale === 'is' + ? 'Skráning tókst' + : 'Registration was successful', + ) as string, message: n( 'submitSuccessMessage', - 'Þú þarft að fara í pósthólfið þitt og samþykkja umsóknina. Takk fyrir', + activeLocale === 'is' + ? 'Þú þarft að fara í tölvupóstinn þinn og samþykkja umsóknina. Takk fyrir' + : 'You need to go to your email and confirm the subscription. Thank you', ) as string, }) } else { @@ -155,7 +172,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { title: '', message: n( 'submitFailureMessage', - 'Ekki tókst að skrá þig á póstlistann, reynið aftur síðar', + activeLocale === 'is' + ? 'Ekki tókst að skrá þig á póstlistann, reynið aftur síðar' + : 'Unable to subscribe to the mailing list, please try again later', ) as string, }) } @@ -166,7 +185,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { title: '', message: n( 'submitError', - 'Villa kom upp við skráningu á póstlista', + activeLocale === 'is' + ? 'Villa kom upp við skráningu á póstlista' + : 'An error occurred while registering to the mailing list', ) as string, }) }) @@ -279,7 +300,10 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => { diff --git a/charts/islandis/values.dev.yaml b/charts/islandis/values.dev.yaml index bf816cdfa428..6c0ec7c7b434 100644 --- a/charts/islandis/values.dev.yaml +++ b/charts/islandis/values.dev.yaml @@ -547,6 +547,7 @@ api: UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY' VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS' VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY' + VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL' XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET' diff --git a/charts/islandis/values.prod.yaml b/charts/islandis/values.prod.yaml index 1c7e76c77b9c..e482a0ddb879 100644 --- a/charts/islandis/values.prod.yaml +++ b/charts/islandis/values.prod.yaml @@ -537,6 +537,7 @@ api: UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY' VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS' VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY' + VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL' XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET' diff --git a/charts/islandis/values.staging.yaml b/charts/islandis/values.staging.yaml index 60eca44050fa..9b15bed53c7d 100644 --- a/charts/islandis/values.staging.yaml +++ b/charts/islandis/values.staging.yaml @@ -545,6 +545,7 @@ api: UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY' VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS' VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY' + VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY' WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL' XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET' diff --git a/libs/api/domains/email-signup/src/index.ts b/libs/api/domains/email-signup/src/index.ts index 320137f96397..10f04aceda49 100644 --- a/libs/api/domains/email-signup/src/index.ts +++ b/libs/api/domains/email-signup/src/index.ts @@ -1,3 +1,4 @@ export * from './lib/emailSignup.module' export * from './lib/emailSignup.resolver' export * from './lib/services/zenter/zenter.config' +export * from './lib/services/campaignMonitor/campaignMonitor.config' diff --git a/libs/api/domains/email-signup/src/lib/emailSignup.config.ts b/libs/api/domains/email-signup/src/lib/emailSignup.config.ts index 9b2a85537eea..45a8f5fcd12e 100644 --- a/libs/api/domains/email-signup/src/lib/emailSignup.config.ts +++ b/libs/api/domains/email-signup/src/lib/emailSignup.config.ts @@ -6,6 +6,7 @@ const schema = z.object({ fiskistofaZenterPassword: z.string(), fiskistofaZenterClientId: z.string(), fiskistofaZenterClientPassword: z.string(), + vinnueftirlitidCampaignMonitorApiKey: z.string(), }) export const EmailSignupConfig = defineConfig({ @@ -19,6 +20,9 @@ export const EmailSignupConfig = defineConfig({ fiskistofaZenterClientPassword: env.required( 'FISKISTOFA_ZENTER_CLIENT_PASSWORD', ), + vinnueftirlitidCampaignMonitorApiKey: env.required( + 'VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY', + ), } }, }) diff --git a/libs/api/domains/email-signup/src/lib/emailSignup.module.ts b/libs/api/domains/email-signup/src/lib/emailSignup.module.ts index 6cd52190f069..e732c3dddd89 100644 --- a/libs/api/domains/email-signup/src/lib/emailSignup.module.ts +++ b/libs/api/domains/email-signup/src/lib/emailSignup.module.ts @@ -6,12 +6,14 @@ import { EmailSignupResolver } from './emailSignup.resolver' import { EmailSignupService } from './emailSignup.service' import { ZenterSignupService } from './services/zenter/zenter.service' import { MailchimpSignupService } from './services/mailchimp/mailchimp.service' +import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service' @Module({ imports: [CmsModule], providers: [ ZenterSignupService, MailchimpSignupService, + CampaignMonitorSignupService, EmailSignupService, EmailSignupResolver, ], diff --git a/libs/api/domains/email-signup/src/lib/emailSignup.resolver.spec.ts b/libs/api/domains/email-signup/src/lib/emailSignup.resolver.spec.ts index e5729660cfaa..5a9647975fbf 100644 --- a/libs/api/domains/email-signup/src/lib/emailSignup.resolver.spec.ts +++ b/libs/api/domains/email-signup/src/lib/emailSignup.resolver.spec.ts @@ -6,6 +6,7 @@ import { emailSignup } from './fixtures/emailSignup' import { EmailSignupInput } from './dto/emailSignup.input' import { EmailSignupService } from './emailSignup.service' import { ZenterSignupService } from './services/zenter/zenter.service' +import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service' import { MailchimpSignupService } from './services/mailchimp/mailchimp.service' import { ZENTER_IMPORT_ENDPOINT_URL } from './constants' @@ -29,6 +30,15 @@ describe('emailSignupResolver', () => { }) }, }, + { + provide: CampaignMonitorSignupService, + useFactory() { + return new CampaignMonitorSignupService({ + vinnueftirlitidCampaignMonitorApiKey: '', + isConfigured: true, + }) + }, + }, MailchimpSignupService, EmailSignupService, EmailSignupResolver, @@ -154,7 +164,6 @@ describe('emailSignupResolver', () => { ) jest.spyOn(axios, 'post').mockImplementation((url) => { - console.log('yee', url, url === ZENTER_IMPORT_ENDPOINT_URL) return Promise.resolve({ data: url === ZENTER_IMPORT_ENDPOINT_URL ? 1 : 0, }) @@ -170,4 +179,79 @@ describe('emailSignupResolver', () => { expect(result?.subscribed).toBe(true) }) }) + + describe('subscribeToCampaignMonitor', () => { + const testEmailSlice: EmailSignup = { + id: '345', + title: '', + description: '', + configuration: { + signupUrl: 'test.is', + }, + formFields: [ + { + id: '1', + options: [], + placeholder: '', + required: true, + title: '', + type: 'email', + name: 'EmailAddress', + emailConfig: {}, + }, + ], + signupType: 'campaign monitor', + translations: {}, + } + const testInput: EmailSignupInput = { + signupID: '345', + inputFields: [ + { + name: 'EmailAddress', + type: 'email', + value: 'test@example.com', + id: '1', + }, + ], + } + + it('should handle errors from the subscription API', async () => { + jest + .spyOn(cmsContentfulService, 'getEmailSignup') + .mockImplementation(({ id }) => + Promise.resolve(id === '345' ? testEmailSlice : null), + ) + jest.spyOn(axios, 'post').mockImplementation(() => { + return Promise.reject(new Error('Network error')) + }) + + const result = await emailSignupResolver.emailSignupSubscription( + testInput, + ) + + expect(result?.subscribed).toBe(false) + }) + + it('should get a successful response if input is valid', async () => { + jest + .spyOn(cmsContentfulService, 'getEmailSignup') + .mockImplementation(({ id }) => + Promise.resolve(id === '345' ? testEmailSlice : null), + ) + + jest.spyOn(axios, 'post').mockImplementation((_url, data) => { + const EmailAddress = (data as { EmailAddress: string }).EmailAddress + + return Promise.resolve({ + data: EmailAddress === testInput.inputFields[0].value ? 1 : 0, + }) + }) + + const result = await emailSignupResolver.emailSignupSubscription( + testInput, + ) + + expect(result?.subscribed).toBe(true) + }) + }) }) diff --git a/libs/api/domains/email-signup/src/lib/emailSignup.service.ts b/libs/api/domains/email-signup/src/lib/emailSignup.service.ts index cbe8346b02a3..0a35b342d683 100644 --- a/libs/api/domains/email-signup/src/lib/emailSignup.service.ts +++ b/libs/api/domains/email-signup/src/lib/emailSignup.service.ts @@ -4,13 +4,21 @@ import { CmsContentfulService } from '@island.is/cms' import { MailchimpSignupService } from './services/mailchimp/mailchimp.service' import { ZenterSignupService } from './services/zenter/zenter.service' +import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service' import { EmailSignupInput } from './dto/emailSignup.input' +enum SignupType { + Mailchimp = 'mailchimp', + Zenter = 'zenter', + CampaignMonitor = 'campaign monitor', +} + @Injectable() export class EmailSignupService { constructor( private readonly zenterSignupService: ZenterSignupService, private readonly mailchimpSignupService: MailchimpSignupService, + private readonly campaignMonitorSignupService: CampaignMonitorSignupService, private readonly cmsContentfulService: CmsContentfulService, ) {} @@ -28,20 +36,27 @@ export class EmailSignupService { formFieldNames.includes(field.name), ) - if (emailSignupModel.signupType === 'mailchimp') { + if (emailSignupModel.signupType === SignupType.Mailchimp) { return this.mailchimpSignupService.subscribeToMailingList( emailSignupModel, inputFields, ) } - if (emailSignupModel.signupType === 'zenter') { + if (emailSignupModel.signupType === SignupType.Zenter) { return this.zenterSignupService.subscribeToMailingList( emailSignupModel, inputFields, ) } + if (emailSignupModel.signupType === SignupType.CampaignMonitor) { + return this.campaignMonitorSignupService.subscribeToMailingList( + emailSignupModel, + inputFields, + ) + } + return { subscribed: false } } } diff --git a/libs/api/domains/email-signup/src/lib/serviceProvider.ts b/libs/api/domains/email-signup/src/lib/serviceProvider.ts deleted file mode 100644 index faa7acc1c467..000000000000 --- a/libs/api/domains/email-signup/src/lib/serviceProvider.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Provider } from '@nestjs/common' -import { ConfigType, LazyDuringDevScope } from '@island.is/nest/config' -import { EmailSignupConfig } from './emailSignup.config' -import { EmailSignupService } from './emailSignup.service' - -export const EmailSignupServiceProvider: Provider = { - provide: EmailSignupService, - scope: LazyDuringDevScope, - useFactory(config: ConfigType) { - return new EmailSignupService(config) - }, - inject: [EmailSignupConfig.KEY], -} diff --git a/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.config.ts b/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.config.ts new file mode 100644 index 000000000000..b798dcf52b77 --- /dev/null +++ b/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from '@island.is/nest/config' +import { z } from 'zod' + +const schema = z.object({ + vinnueftirlitidCampaignMonitorApiKey: z.string(), +}) + +export const CampaignMonitorSignupConfig = defineConfig({ + name: 'CampaignMonitorSignup', + schema, + load(env) { + return { + vinnueftirlitidCampaignMonitorApiKey: env.required( + 'VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY', + ), + } + }, +}) diff --git a/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.service.ts b/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.service.ts new file mode 100644 index 000000000000..2a7ef5e87f42 --- /dev/null +++ b/libs/api/domains/email-signup/src/lib/services/campaignMonitor/campaignMonitor.service.ts @@ -0,0 +1,48 @@ +import { EmailSignup } from '@island.is/cms' +import { EmailSignupInput } from '../../dto/emailSignup.input' +import axios from 'axios' +import { ConfigType } from '@nestjs/config' +import { Inject, Injectable } from '@nestjs/common' +import { CampaignMonitorSignupConfig } from './campaignMonitor.config' +import { LazyDuringDevScope } from '@island.is/nest/config' + +@Injectable({ scope: LazyDuringDevScope }) +export class CampaignMonitorSignupService { + constructor( + @Inject(CampaignMonitorSignupConfig.KEY) + private readonly config: ConfigType, + ) {} + + async subscribeToMailingList( + emailSignupModel: EmailSignup, + inputFields: EmailSignupInput['inputFields'], + ) { + const url = (emailSignupModel.configuration?.signupUrl as string) ?? '' + + const API_KEY = this.config.vinnueftirlitidCampaignMonitorApiKey + + const authHeader = `Basic ${Buffer.from(API_KEY + ':').toString('base64')}` + + const map = new Map() + + map.set('ConsentToTrack', 'Yes') + map.set('Resubscribe', true) + + for (const field of inputFields) { + map.set(field.name, field.value) + } + + const obj = Object.fromEntries(map) + + return axios + .post(url, obj, { headers: { Authorization: authHeader } }) + .then((response) => { + return { + subscribed: response?.data?.result === 'error' ? false : true, + } + }) + .catch(() => { + return { subscribed: false } + }) + } +} diff --git a/libs/api/domains/email-signup/src/lib/services/zenter/zenter.service.ts b/libs/api/domains/email-signup/src/lib/services/zenter/zenter.service.ts index b63043c3cfd0..a0a1ba23fc11 100644 --- a/libs/api/domains/email-signup/src/lib/services/zenter/zenter.service.ts +++ b/libs/api/domains/email-signup/src/lib/services/zenter/zenter.service.ts @@ -84,7 +84,7 @@ export class ZenterSignupService { Accept: 'text/plain', }, }) - console.log('response', response.data) + return { subscribed: response.data === 1 } } } diff --git a/libs/cms/src/lib/generated/contentfulTypes.d.ts b/libs/cms/src/lib/generated/contentfulTypes.d.ts index 59fbfe0e6d21..62503dab4ec1 100644 --- a/libs/cms/src/lib/generated/contentfulTypes.d.ts +++ b/libs/cms/src/lib/generated/contentfulTypes.d.ts @@ -854,7 +854,7 @@ export interface IEmailSignupFields { formFields?: IFormField[] | undefined /** Signup Type */ - signupType?: 'mailchimp' | 'zenter' | undefined + signupType?: 'mailchimp' | 'zenter' | 'campaign monitor' | undefined /** Configuration */ configuration?: Record | undefined diff --git a/libs/cms/src/lib/models/emailSignup.model.ts b/libs/cms/src/lib/models/emailSignup.model.ts index 9150df23220b..13c429c0a66a 100644 --- a/libs/cms/src/lib/models/emailSignup.model.ts +++ b/libs/cms/src/lib/models/emailSignup.model.ts @@ -20,7 +20,7 @@ export class EmailSignup { formFields?: FormField[] @Field({ nullable: true }) - signupType?: 'mailchimp' | 'zenter' + signupType?: 'mailchimp' | 'zenter' | 'campaign monitor' @Field(() => GraphQLJSON, { nullable: true }) configuration?: Record From fa8f276f5a795b3df1b43d45f400d3d6677b4159 Mon Sep 17 00:00:00 2001 From: unakb Date: Fri, 4 Oct 2024 17:35:05 +0000 Subject: [PATCH 14/20] fix(j-s): Civil claimant view for courts (#16171) * fix(j-s): Civil claimant view for courts * feat(j-s): Judge can add and remove advocates * Update civilClaimant.controller.ts * Fixed key on Box --- .../defendant/civilClaimant.controller.ts | 24 ++- .../pages/domur/akaera/malflytjendur/[id].ts | 4 +- .../Advocates/Advocates.strings.ts | 77 +++++++++ .../Defender.tsx => Advocates/Advocates.tsx} | 26 ++- .../Advocates/SelectCivilClaimantAdvocate.tsx | 162 ++++++++++++++++++ .../SelectDefender.tsx | 4 +- .../Indictments/Defender/Defender.strings.ts | 28 --- 7 files changed, 283 insertions(+), 42 deletions(-) create mode 100644 apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.strings.ts rename apps/judicial-system/web/src/routes/Court/Indictments/{Defender/Defender.tsx => Advocates/Advocates.tsx} (74%) create mode 100644 apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectCivilClaimantAdvocate.tsx rename apps/judicial-system/web/src/routes/Court/Indictments/{Defender => Advocates}/SelectDefender.tsx (96%) delete mode 100644 apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.strings.ts diff --git a/apps/judicial-system/backend/src/app/modules/defendant/civilClaimant.controller.ts b/apps/judicial-system/backend/src/app/modules/defendant/civilClaimant.controller.ts index 58cff3c4941b..439904735d4e 100644 --- a/apps/judicial-system/backend/src/app/modules/defendant/civilClaimant.controller.ts +++ b/apps/judicial-system/backend/src/app/modules/defendant/civilClaimant.controller.ts @@ -19,7 +19,13 @@ import { RolesRules, } from '@island.is/judicial-system/auth' -import { prosecutorRepresentativeRule, prosecutorRule } from '../../guards' +import { + districtCourtAssistantRule, + districtCourtJudgeRule, + districtCourtRegistrarRule, + prosecutorRepresentativeRule, + prosecutorRule, +} from '../../guards' import { Case, CaseExistsGuard, CaseWriteGuard, CurrentCase } from '../case' import { UpdateCivilClaimantDto } from './dto/updateCivilClaimant.dto' import { CivilClaimant } from './models/civilClaimant.model' @@ -36,7 +42,13 @@ export class CivilClaimantController { ) {} @UseGuards(CaseExistsGuard, CaseWriteGuard) - @RolesRules(prosecutorRule, prosecutorRepresentativeRule) + @RolesRules( + prosecutorRule, + prosecutorRepresentativeRule, + districtCourtJudgeRule, + districtCourtRegistrarRule, + districtCourtAssistantRule, + ) @Post() @ApiCreatedResponse({ type: CivilClaimant, @@ -52,7 +64,13 @@ export class CivilClaimantController { } @UseGuards(CaseExistsGuard, CaseWriteGuard) - @RolesRules(prosecutorRule, prosecutorRepresentativeRule) + @RolesRules( + prosecutorRule, + prosecutorRepresentativeRule, + districtCourtJudgeRule, + districtCourtRegistrarRule, + districtCourtAssistantRule, + ) @Patch(':civilClaimantId') @ApiOkResponse({ type: CivilClaimant, diff --git a/apps/judicial-system/web/pages/domur/akaera/malflytjendur/[id].ts b/apps/judicial-system/web/pages/domur/akaera/malflytjendur/[id].ts index 4bf36a18f264..e686009b01a2 100644 --- a/apps/judicial-system/web/pages/domur/akaera/malflytjendur/[id].ts +++ b/apps/judicial-system/web/pages/domur/akaera/malflytjendur/[id].ts @@ -1,3 +1,3 @@ -import HearingArrangements from '@island.is/judicial-system-web/src/routes/Court/Indictments/Defender/Defender' +import Advocates from '@island.is/judicial-system-web/src/routes/Court/Indictments/Advocates/Advocates' -export default HearingArrangements +export default Advocates diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.strings.ts b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.strings.ts new file mode 100644 index 000000000000..1250e9fa97b9 --- /dev/null +++ b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.strings.ts @@ -0,0 +1,77 @@ +import { defineMessages } from 'react-intl' + +export const strings = defineMessages({ + title: { + id: 'judicial.system.core:court_indictments.advocates.title', + defaultMessage: 'Verjandi', + description: + 'Notaður sem titill á síðu á verjenda skrefi í dómaraflæði í ákærum.', + }, + alertBannerText: { + id: 'judicial.system.core:court_indictments.advocates.alert_banner_text', + defaultMessage: + 'Verjendur í sakamálum fá tilkynningu um skráningu í tölvupósti, aðgang að gögnum málsins og boð í þingfestingu.', + description: + 'Notaður sem texti í alert banner á málflytjendurskjá í ákærum.', + }, + selectDefenderHeading: { + id: 'judicial.system.core:court_indictments.advocates.select_defender_heading', + defaultMessage: 'Verjandi', + description: 'Notaður sem texti fyrir val á skipaðan verjanda í ákærum.', + }, + defendantWaivesRightToCounsel: { + id: 'judicial.system.core:court_indictments.advocates.defendant_waives_right_to_counsel', + defaultMessage: '{accused} óskar ekki eftir að sér sé skipaður verjandi', + description: + 'Notaður sem texti fyrir takka þegar ákærðu óska ekki eftir verjanda í dómaraflæði í ákærum. ', + }, + civilClaimants: { + id: 'judicial.system.core:court_indictments.advocates.civil_claimants', + defaultMessage: 'Kröfuhafar', + description: + 'Notaður sem titill á texta um kröfuhafa í dómaraflæði í ákærum.', + }, + shareFilesWithCivilClaimantAdvocate: { + id: 'judicial.system.core:court_indictments.advocates.civil_claimant_share_files_with_advocate', + defaultMessage: + 'Deila gögnum með {defenderIsLawyer, select, true {lögmanni} other {réttargæslumanni}} kröfuhafa', + description: 'Notaður sem texti á deila kröfum með kröfuhafa takka.', + }, + shareFilesWithCivilClaimantAdvocateTooltip: { + id: 'judicial.system.core:court_indictments.advocates.civil_claimant_share_files_with_advocate_tooltip', + defaultMessage: + 'Ef hakað er í þennan reit fær {defenderIsLawyer, select, true {lögmaður} other {réttargæslumaður}} kröfuhafa aðgang að gögnum málsins', + description: + 'Notaður sem texti í tooltip á deila kröfum með kröfuhafa takka.', + }, + lawyer: { + id: 'judicial.system.core:court_indictments.advocates.lawyer', + defaultMessage: 'Lögmaður', + description: 'Notaður sem texti fyrir lögmann í dómaraflæði í ákærum.', + }, + legalRightsProtector: { + id: 'judicial.system.core:court_indictments.advocates.legal_rights_protector', + defaultMessage: 'Réttargæslumaður', + description: + 'Notaður sem texti fyrir réttargæslumann í dómaraflæði í ákærum.', + }, + removeCivilClaimantAdvocate: { + id: 'judicial.system.core:court_indictments.advocates.remove_civil_claimant_advocate', + defaultMessage: + 'Fjarlægja {defenderIsLawyer, select, true {lögmann} other {réttargæslumann}}', + description: + 'Notaður sem texti fyrir eyða kröfuhafa í dómaraflæði í ákærum.', + }, + addCivilClaimantAdvocate: { + id: 'judicial.system.core:court_indictments.advocates.add_civil_claimant', + defaultMessage: 'Bæta við lögmanni kröfuhafa', + description: + 'Notaður sem texti fyrir bæta við kröfuhafa takka í dómaraflæði í ákærum.', + }, + noCivilClaimantAdvocate: { + id: 'judicial.system.core:court_indictments.advocates.no_civil_claimant_advocate', + defaultMessage: 'Enginn lögmaður skráður', + description: + 'Notaður sem texti þegar enginn lögmaður er skráður í dómaraflæði í ákærum.', + }, +}) diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.tsx b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.tsx similarity index 74% rename from apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.tsx rename to apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.tsx index a629abf8760a..ffdba0747338 100644 --- a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.tsx +++ b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/Advocates.tsx @@ -20,10 +20,11 @@ import { NotificationType } from '@island.is/judicial-system-web/src/graphql/sch import { useCase } from '@island.is/judicial-system-web/src/utils/hooks' import { isDefenderStepValid } from '@island.is/judicial-system-web/src/utils/validate' +import SelectCivilClaimantAdvocate from './SelectCivilClaimantAdvocate' import SelectDefender from './SelectDefender' -import { defender as m } from './Defender.strings' +import { strings } from './Advocates.strings' -const HearingArrangements = () => { +const Advocates = () => { const { workingCase, isLoadingWorkingCase, caseNotFound } = useContext(FormContext) const router = useRouter() @@ -39,6 +40,7 @@ const HearingArrangements = () => { ) const stepIsValid = !isSendingNotification && isDefenderStepValid(workingCase) + const hasCivilClaimants = (workingCase.civilClaimants?.length ?? 0) > 0 return ( { > - {formatMessage(m.title)} + {formatMessage(strings.title)} - + {workingCase.defendants?.map((defendant, index) => ( ))} + {hasCivilClaimants && ( + + + {workingCase.civilClaimants?.map((civilClaimant) => ( + + + + ))} + + )} { ) } -export default HearingArrangements +export default Advocates diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectCivilClaimantAdvocate.tsx b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectCivilClaimantAdvocate.tsx new file mode 100644 index 000000000000..c79fb2078f01 --- /dev/null +++ b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectCivilClaimantAdvocate.tsx @@ -0,0 +1,162 @@ +import { FC, useContext } from 'react' +import { useIntl } from 'react-intl' + +import { + AlertMessage, + Box, + Button, + Checkbox, + RadioButton, + Text, +} from '@island.is/island-ui/core' +import { + BlueBox, + FormContext, + InputAdvocate, +} from '@island.is/judicial-system-web/src/components' +import { + CivilClaimant, + UpdateCivilClaimantInput, +} from '@island.is/judicial-system-web/src/graphql/schema' +import { useCivilClaimants } from '@island.is/judicial-system-web/src/utils/hooks' + +import { strings } from './Advocates.strings' + +interface Props { + civilClaimant: CivilClaimant +} + +const SelectCivilClaimantAdvocate: FC = ({ civilClaimant }) => { + const { setAndSendCivilClaimantToServer } = useCivilClaimants() + const { workingCase, setWorkingCase } = useContext(FormContext) + + const { formatMessage } = useIntl() + + const updateCivilClaimant = (update: UpdateCivilClaimantInput) => { + setAndSendCivilClaimantToServer( + { + ...update, + caseId: workingCase.id, + civilClaimantId: civilClaimant.id, + }, + setWorkingCase, + ) + } + + return ( + + + {civilClaimant.name} + + {civilClaimant.hasSpokesperson ? ( + <> + + + + updateCivilClaimant({ + spokespersonIsLawyer: true, + } as UpdateCivilClaimantInput) + } + /> + + + + updateCivilClaimant({ + spokespersonIsLawyer: false, + } as UpdateCivilClaimantInput) + } + /> + + + + + + { + updateCivilClaimant({ + caseFilesSharedWithSpokesperson: + !civilClaimant.caseFilesSharedWithSpokesperson, + } as UpdateCivilClaimantInput) + }} + tooltip={formatMessage( + strings.shareFilesWithCivilClaimantAdvocateTooltip, + { + defenderIsLawyer: civilClaimant.spokespersonIsLawyer, + }, + )} + backgroundColor="white" + large + filled + /> + + ) : ( + + )} + + + + + ) +} + +export default SelectCivilClaimantAdvocate diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/SelectDefender.tsx b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectDefender.tsx similarity index 96% rename from apps/judicial-system/web/src/routes/Court/Indictments/Defender/SelectDefender.tsx rename to apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectDefender.tsx index 824cca080df2..15b455791e48 100644 --- a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/SelectDefender.tsx +++ b/apps/judicial-system/web/src/routes/Court/Indictments/Advocates/SelectDefender.tsx @@ -16,7 +16,7 @@ import { } from '@island.is/judicial-system-web/src/graphql/schema' import { useDefendants } from '@island.is/judicial-system-web/src/utils/hooks' -import { defender as m } from './Defender.strings' +import { strings } from './Advocates.strings' interface Props { defendant: Defendant @@ -80,7 +80,7 @@ const SelectDefender: FC = ({ defendant }) => { dataTestId={`defendantWaivesRightToCounsel-${defendant.id}`} name={`defendantWaivesRightToCounsel-${defendant.id}`} label={capitalize( - formatMessage(m.defendantWaivesRightToCounsel, { + formatMessage(strings.defendantWaivesRightToCounsel, { accused: formatMessage(core.indictmentDefendant, { gender }), }), )} diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.strings.ts b/apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.strings.ts deleted file mode 100644 index 2c6984795367..000000000000 --- a/apps/judicial-system/web/src/routes/Court/Indictments/Defender/Defender.strings.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineMessages } from 'react-intl' - -export const defender = defineMessages({ - title: { - id: 'judicial.system.core:court_indictments.defender.title_v1', - defaultMessage: 'Verjandi', - description: - 'Notaður sem titill á síðu á verjenda skrefi í dómaraflæði í ákærum.', - }, - alertBannerText: { - id: 'judicial.system.core:court_indictments.defender.alert_banner_text_v1', - defaultMessage: - 'Verjendur í sakamálum fá tilkynningu um skráningu í tölvupósti, aðgang að gögnum málsins og boð í þingfestingu.', - description: - 'Notaður sem texti í alert banner á málflytjendurskjá í ákærum.', - }, - selectDefenderHeading: { - id: 'judicial.system.core:court_indictments.defender.select_defender_heading_v1', - defaultMessage: 'Verjandi', - description: 'Notaður sem texti fyrir val á skipaðan verjanda í ákærum.', - }, - defendantWaivesRightToCounsel: { - id: 'judicial.system.core:court_indictments.defender.defendant_waives_right_to_counsel', - defaultMessage: '{accused} óskar ekki eftir að sér sé skipaður verjandi', - description: - 'Notaður sem texti fyrir takka þegar ákærðu óska ekki eftir verjanda í dómaraflæði í ákærum. ', - }, -}) From f1b145fd95923ac68d35fcd0f14e7517467c0c86 Mon Sep 17 00:00:00 2001 From: birkirkristmunds <142495885+birkirkristmunds@users.noreply.github.com> Date: Fri, 4 Oct 2024 18:09:49 +0000 Subject: [PATCH 15/20] feat(new-primary-school): Data implementation and remove not used pages (#16096) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added latest version of clientConfig and latest endpoints from Juni * testing * Rollback test * feat(new-primary-school): Allergies and intolerances - Data implementation (#15319) * [TS-806] Implement Allergies and intolerances page - Data implementation * Updated function name * Refactor/new primary school data implementation (#15381) * refactor: updated apitags * fix? clean * chore: nx format:write update dirty files --------- Co-authored-by: Alex Diljar Co-authored-by: andes-it * Comment out UserApi * feat(new-primary-school): Move child page to prerequisites (#15394) * Move child page to prerequisites * Update clientConfig * Updated Api module action name * feat(new-primary-school): Relatives - Data implementation (#15403) * Relatives - Data implementation * Fixed after review * feat(new-primary-school): pronoun (#15408) * feat(new-primary-school): Pronoun Select Field Added a select field for selecting pronoun https://dit-iceland.atlassian.net/browse/TS-811 * Make pronoun full width and change place with preferred name * Use gender data from Júní * Review comment fixes * use defaultValue for pronouns --------- Co-authored-by: hfhelgason * Update Frigg service path * Update clientConfig * feat(new-primary-school): Implement no children found page (#15909) * [TS-816] Implement no children found page * Remove comments * feat(new-primary): Update new primary school application (#15849) * [TS-883] Remove 'Má sækja barn' - Relatives page * [TS-884] Remove gender - Child info page * [TS-885] Remove use of footage page * Update Child in Review * [TS-904] Remove Allergies and intolerances page (#15923) Co-authored-by: bkristmundsson * Remove duplicated translations * feat(new-primary-school): New school - Data implementation (#15437) * New school - Data implementation * testing build problems * testing build problems * build problem testing * build problem testing * Rollback build test --------- Co-authored-by: bkristmundsson * Fixed codegen error? * Updated loadOptions in FriggOptionsAsyncSelectField * Updated clientConfig * Updated other parent address * Allow children to pass through for testing * chore: nx format:write update dirty files * feat(new-primary-school): Current school (#16125) * Implement current school * Fixed message namespace error * Updated messages * Remove unnecessary data providers and their associated functions * Removed unused stateMachine action * feat(new-primary-school): Send application (#15489) * Send application - Not ready * Update sendApplication - Not ready * Update sendApplication - Not ready * chore: nx format:write update dirty files * Removed logo * Updated languages in transformApplicationToNewPrimarySchoolDTO * Updated text in Review * [TS-814] Implement send application --------- Co-authored-by: andes-it * Simplified nested ternary operator used to calculate noIcelandic * Removed otherParentName - unused * Fix after coderabbit * Fixed formatGrade() after review from coderabbitai * Update nationalRegistry text in externalData * Fix after coderabbit * Fix after coderabbit * Fix after coderabbit, added default values * Fix after coderabbit, added default values * Fix after coderabbit, added null checks --------- Co-authored-by: veronikasif <54938148+veronikasif@users.noreply.github.com> Co-authored-by: Alex Diljar Birkisbur Hellsing <42963845+alexdiljar@users.noreply.github.com> Co-authored-by: Alex Diljar Co-authored-by: andes-it Co-authored-by: Veronika Sif Co-authored-by: helgifr Co-authored-by: hfhelgason Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- charts/islandis/values.dev.yaml | 4 +- charts/islandis/values.prod.yaml | 4 +- charts/islandis/values.staging.yaml | 4 +- infra/src/dsl/xroad.ts | 6 +- .../src/lib/graphql/frigg.resolver.ts | 23 +- .../lib/graphql/frigg/organization.model.ts | 32 ++ .../new-primary-school.service.ts | 89 +++- .../new-primary-school.utils.ts | 156 ++++++ .../new-primary-school/src/assets/Logo.tsx | 41 -- .../src/dataProviders/index.ts | 12 +- .../FriggOptionsAsyncSelectField/index.tsx | 84 ++++ .../fields/RelativesTableRepeater/index.tsx | 104 ++++ .../src/fields/Review/index.tsx | 4 - .../AllergiesAndIntolerances.tsx | 86 ---- .../src/fields/Review/review-groups/Child.tsx | 30 +- .../Review/review-groups/Photography.tsx | 64 --- .../review-groups/ReasonForApplication.tsx | 2 +- .../fields/Review/review-groups/Relatives.tsx | 15 +- .../fields/Review/review-groups/School.tsx | 109 +++-- .../fields/Review/review-groups/Support.tsx | 1 + .../new-primary-school/src/fields/index.ts | 2 + .../childInfoSubSection.ts | 93 ++-- .../childrenSubSection.ts | 46 -- .../childrenNParentsSection/index.ts | 8 +- .../parentsSubSection.ts | 2 +- .../relativesSubSection.ts | 98 +--- .../allergiesAndIntolerancesSubSection.ts | 142 ------ .../differentNeedsSection/index.ts | 9 +- .../useOfFootageSubSection.ts | 91 ---- .../NewPrimarySchoolForm/overviewSection.ts | 2 +- .../newSchoolSubSection.ts | 94 ++-- .../src/forms/Prerequisites.ts | 71 --- .../forms/Prerequisites/childrenSubSection.ts | 55 +++ .../Prerequisites/externalDataSubSection.ts | 42 ++ .../src/forms/Prerequisites/index.ts | 20 + .../new-primary-school/src/graphql/queries.ts | 18 + .../src/hooks/useFriggOptions.ts | 28 ++ .../templates/new-primary-school/src/index.ts | 1 + .../src/lib/NewPrimarySchoolTemplate.ts | 65 +-- .../new-primary-school/src/lib/constants.ts | 59 +-- .../new-primary-school/src/lib/dataSchema.ts | 60 +-- .../new-primary-school/src/lib/messages.ts | 321 ++----------- .../src/lib/newPrimarySchoolUtils.spec.ts | 53 +-- .../src/lib/newPrimarySchoolUtils.ts | 294 +++--------- .../templates/new-primary-school/src/types.ts | 65 ++- libs/application/types/src/lib/Fields.ts | 5 +- .../ActionCardListFormField.tsx | 4 +- libs/clients/mms/frigg/README.md | 18 + libs/clients/mms/frigg/project.json | 2 +- libs/clients/mms/frigg/src/clientConfig.json | 446 +++++++++++++++++- libs/clients/mms/frigg/src/lib/apiProvider.ts | 36 +- .../mms/frigg/src/lib/friggClient.config.ts | 2 +- .../mms/frigg/src/lib/friggClient.service.ts | 46 +- 53 files changed, 1620 insertions(+), 1548 deletions(-) create mode 100644 libs/api/domains/education/src/lib/graphql/frigg/organization.model.ts create mode 100644 libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.utils.ts delete mode 100644 libs/application/templates/new-primary-school/src/assets/Logo.tsx create mode 100644 libs/application/templates/new-primary-school/src/fields/FriggOptionsAsyncSelectField/index.tsx create mode 100644 libs/application/templates/new-primary-school/src/fields/RelativesTableRepeater/index.tsx delete mode 100644 libs/application/templates/new-primary-school/src/fields/Review/review-groups/AllergiesAndIntolerances.tsx delete mode 100644 libs/application/templates/new-primary-school/src/fields/Review/review-groups/Photography.tsx delete mode 100644 libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childrenSubSection.ts delete mode 100644 libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/allergiesAndIntolerancesSubSection.ts delete mode 100644 libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/useOfFootageSubSection.ts delete mode 100644 libs/application/templates/new-primary-school/src/forms/Prerequisites.ts create mode 100644 libs/application/templates/new-primary-school/src/forms/Prerequisites/childrenSubSection.ts create mode 100644 libs/application/templates/new-primary-school/src/forms/Prerequisites/externalDataSubSection.ts create mode 100644 libs/application/templates/new-primary-school/src/forms/Prerequisites/index.ts create mode 100644 libs/application/templates/new-primary-school/src/hooks/useFriggOptions.ts diff --git a/charts/islandis/values.dev.yaml b/charts/islandis/values.dev.yaml index 6c0ec7c7b434..e24731216f8f 100644 --- a/charts/islandis/values.dev.yaml +++ b/charts/islandis/values.dev.yaml @@ -369,7 +369,7 @@ api: XROAD_INNA_PATH: 'IS-DEV/GOV/10066/MMS-Protected/inna-v1' XROAD_INTELLECTUAL_PROPERTIES_PATH: 'IS-DEV/GOV/10030/WebAPI-Public/HUG-webAPI/' XROAD_JUDICIAL_SYSTEM_SP_PATH: 'IS-DEV/GOV/10014/Rettarvorslugatt-Private/judicial-system-mailbox-api' - XROAD_MMS_FRIGG_PATH: 'IS-DEV/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS-DEV/GOV/10066/MMS-Protected/frigg-form-service' XROAD_MMS_GRADE_SERVICE_ID: 'IS-DEV/GOV/10066/MMS-Protected/grade-api-v1' XROAD_MMS_LICENSE_SERVICE_ID: 'IS-DEV/GOV/10066/MMS-Protected/license-api-v1' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.5fzau3.euw1.cache.amazonaws.com:6379"]' @@ -649,7 +649,7 @@ application-system-api: XROAD_HOLAR_UNIVERSITY_PATH: 'IS-DEV/EDU/10055/Holar-Protected/brautskraning-v1' XROAD_ICELAND_UNIVERSITY_OF_THE_ARTS_PATH: 'IS-DEV/EDU/10049/LHI-Protected/brautskraning-v1' XROAD_INNA_PATH: 'IS-DEV/GOV/10066/MMS-Protected/inna-v1' - XROAD_MMS_FRIGG_PATH: 'IS-DEV/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS-DEV/GOV/10066/MMS-Protected/frigg-form-service' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.5fzau3.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS-DEV/GOV/10001/SKRA-Protected/Einstaklingar-v1' XROAD_OFFICIAL_JOURNAL_APPLICATION_PATH: 'IS-DEV/GOV/10014/DMR-Protected/official-journal-application' diff --git a/charts/islandis/values.prod.yaml b/charts/islandis/values.prod.yaml index e482a0ddb879..2f2eac443ece 100644 --- a/charts/islandis/values.prod.yaml +++ b/charts/islandis/values.prod.yaml @@ -359,7 +359,7 @@ api: XROAD_INNA_PATH: 'IS/GOV/6601241280/MMS-Protected/inna-v1' XROAD_INTELLECTUAL_PROPERTIES_PATH: 'IS/GOV/6501912189/WebAPI-Public/HUG-webAPI/' XROAD_JUDICIAL_SYSTEM_SP_PATH: 'IS-GOV/GOV/5804170510/Rettarvorslugatt-Private/judicial-system-mailbox-api' - XROAD_MMS_FRIGG_PATH: 'IS/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS/GOV/10066/MMS-Protected/frigg-form-service' XROAD_MMS_GRADE_SERVICE_ID: 'IS/GOV/6601241280/MMS-Protected/grade-api-v1' XROAD_MMS_LICENSE_SERVICE_ID: 'IS/GOV/6601241280/MMS-Protected/license-api-v1' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.whakos.euw1.cache.amazonaws.com:6379"]' @@ -639,7 +639,7 @@ application-system-api: XROAD_HOLAR_UNIVERSITY_PATH: 'IS/EDU/5001694359/Holar-Protected/brautskraning-v1' XROAD_ICELAND_UNIVERSITY_OF_THE_ARTS_PATH: 'IS/EDU/4210984099/LHI-Protected/brautskraning-v1' XROAD_INNA_PATH: 'IS/GOV/6601241280/MMS-Protected/inna-v1' - XROAD_MMS_FRIGG_PATH: 'IS/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS/GOV/10066/MMS-Protected/frigg-form-service' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.whakos.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS/GOV/6503760649/SKRA-Protected/Einstaklingar-v1' XROAD_OFFICIAL_JOURNAL_APPLICATION_PATH: 'IS/GOV/10014/DMR-Protected/official-journal-application' diff --git a/charts/islandis/values.staging.yaml b/charts/islandis/values.staging.yaml index 9b15bed53c7d..8b10bf9ad613 100644 --- a/charts/islandis/values.staging.yaml +++ b/charts/islandis/values.staging.yaml @@ -369,7 +369,7 @@ api: XROAD_INNA_PATH: 'IS-TEST/GOV/6601241280/MMS-Protected/inna-v1' XROAD_INTELLECTUAL_PROPERTIES_PATH: 'IS-TEST/GOV/6501912189/WebAPI-Public/HUG-webAPI/' XROAD_JUDICIAL_SYSTEM_SP_PATH: 'IS-TEST/GOV/10014/Rettarvorslugatt-Private/judicial-system-mailbox-api' - XROAD_MMS_FRIGG_PATH: 'IS-TEST/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS-TEST/GOV/10066/MMS-Protected/frigg-form-service' XROAD_MMS_GRADE_SERVICE_ID: 'IS-TEST/GOV/6601241280/MMS-Protected/grade-api-v1' XROAD_MMS_LICENSE_SERVICE_ID: 'IS-TEST/GOV/6601241280/MMS-Protected/license-api-v1' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.ab9ckb.euw1.cache.amazonaws.com:6379"]' @@ -647,7 +647,7 @@ application-system-api: XROAD_HOLAR_UNIVERSITY_PATH: 'IS-TEST/EDU/10055/Holar-Protected/brautskraning-v1' XROAD_ICELAND_UNIVERSITY_OF_THE_ARTS_PATH: 'IS-TEST/EDU/10049/LHI-Protected/brautskraning-v1' XROAD_INNA_PATH: 'IS-TEST/GOV/6601241280/MMS-Protected/inna-v1' - XROAD_MMS_FRIGG_PATH: 'IS-TEST/GOV/10066/MMS-Protected/frigg-api' + XROAD_MMS_FRIGG_PATH: 'IS-TEST/GOV/10066/MMS-Protected/frigg-form-service' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.ab9ckb.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS-TEST/GOV/6503760649/SKRA-Protected/Einstaklingar-v1' XROAD_OFFICIAL_JOURNAL_APPLICATION_PATH: 'IS-TEST/GOV/10014/DMR-Protected/official-journal-application' diff --git a/infra/src/dsl/xroad.ts b/infra/src/dsl/xroad.ts index 1f9a79557692..0025244cff7a 100644 --- a/infra/src/dsl/xroad.ts +++ b/infra/src/dsl/xroad.ts @@ -895,9 +895,9 @@ export const OfficialJournalOfIcelandApplication = new XroadConf({ export const Frigg = new XroadConf({ env: { XROAD_MMS_FRIGG_PATH: { - dev: 'IS-DEV/GOV/10066/MMS-Protected/frigg-api', - staging: 'IS-TEST/GOV/10066/MMS-Protected/frigg-api', - prod: 'IS/GOV/10066/MMS-Protected/frigg-api', + dev: 'IS-DEV/GOV/10066/MMS-Protected/frigg-form-service', + staging: 'IS-TEST/GOV/10066/MMS-Protected/frigg-form-service', + prod: 'IS/GOV/10066/MMS-Protected/frigg-form-service', }, }, }) diff --git a/libs/api/domains/education/src/lib/graphql/frigg.resolver.ts b/libs/api/domains/education/src/lib/graphql/frigg.resolver.ts index 5a009eac74d1..6a9fb851d3b8 100644 --- a/libs/api/domains/education/src/lib/graphql/frigg.resolver.ts +++ b/libs/api/domains/education/src/lib/graphql/frigg.resolver.ts @@ -1,20 +1,22 @@ -import { Args, Query, Resolver } from '@nestjs/graphql' - -import { UseGuards } from '@nestjs/common' - +import type { User } from '@island.is/auth-nest-tools' import { CurrentUser, IdsUserGuard, Scopes, ScopesGuard, } from '@island.is/auth-nest-tools' - -import type { User } from '@island.is/auth-nest-tools' import { ApiScope } from '@island.is/auth/scopes' -import { FriggClientService, KeyOption } from '@island.is/clients/mms/frigg' +import { + FriggClientService, + KeyOption, + OrganizationModel, +} from '@island.is/clients/mms/frigg' +import { UseGuards } from '@nestjs/common' +import { Args, Query, Resolver } from '@nestjs/graphql' import { KeyOptionModel } from './frigg/keyOption.model' import { FriggOptionListInput } from './frigg/optionList.input' +import { FriggOrganizationModel } from './frigg/organization.model' @UseGuards(IdsUserGuard, ScopesGuard) @Scopes(ApiScope.internal) @@ -30,4 +32,11 @@ export class FriggResolver { ): Promise { return this.friggClientService.getAllKeyOptions(user, input.type) } + + @Query(() => [FriggOrganizationModel], { nullable: true }) + friggSchoolsByMunicipality( + @CurrentUser() user: User, + ): Promise { + return this.friggClientService.getAllSchoolsByMunicipality(user) + } } diff --git a/libs/api/domains/education/src/lib/graphql/frigg/organization.model.ts b/libs/api/domains/education/src/lib/graphql/frigg/organization.model.ts new file mode 100644 index 000000000000..649737b3fa6e --- /dev/null +++ b/libs/api/domains/education/src/lib/graphql/frigg/organization.model.ts @@ -0,0 +1,32 @@ +import { Field, ObjectType, registerEnumType } from '@nestjs/graphql' + +export enum OrganizationModelTypeEnum { + Municipality = 'municipality', + National = 'national', + School = 'school', +} + +registerEnumType(OrganizationModelTypeEnum, { + name: 'OrganizationModelTypeEnum', +}) + +@ObjectType('EducationFriggOrganizationModel') +export class FriggOrganizationModel { + @Field() + id!: string + + @Field() + nationalId!: string + + @Field() + name!: string + + @Field(() => OrganizationModelTypeEnum) + type!: OrganizationModelTypeEnum + + @Field(() => [String], { nullable: true }) + gradeLevels?: string[] + + @Field(() => [FriggOrganizationModel], { nullable: true }) + children?: FriggOrganizationModel[] +} diff --git a/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.service.ts b/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.service.ts index efec706e766d..80ce338d5cd2 100644 --- a/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.service.ts +++ b/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.service.ts @@ -1,28 +1,101 @@ -import { Inject, Injectable } from '@nestjs/common' +import { NationalRegistryXRoadService } from '@island.is/api/domains/national-registry-x-road' +import { + errorMessages, + getApplicationAnswers, +} from '@island.is/application/templates/new-primary-school' import { ApplicationTypes } from '@island.is/application/types' -import { BaseTemplateApiService } from '../../base-template-api.service' import { FriggClientService } from '@island.is/clients/mms/frigg' import { LOGGER_PROVIDER } from '@island.is/logging' +import { TemplateApiError } from '@island.is/nest/problem' +import { Inject, Injectable } from '@nestjs/common' +import * as kennitala from 'kennitala' import { TemplateApiModuleActionProps } from '../../../types' +import { BaseTemplateApiService } from '../../base-template-api.service' +import { transformApplicationToNewPrimarySchoolDTO } from './new-primary-school.utils' +import { isRunningOnEnvironment } from '@island.is/shared/utils' @Injectable() export class NewPrimarySchoolService extends BaseTemplateApiService { constructor( @Inject(LOGGER_PROVIDER) private logger: Logger, private readonly friggClientService: FriggClientService, + private readonly nationalRegistryService: NationalRegistryXRoadService, ) { super(ApplicationTypes.NEW_PRIMARY_SCHOOL) } - async getTypes({ auth }: TemplateApiModuleActionProps) { - return await this.friggClientService.getTypes(auth) + async getChildInformation({ + auth, + application, + }: TemplateApiModuleActionProps) { + const { childNationalId } = getApplicationAnswers(application.answers) + + if (!childNationalId) { + return undefined + } + + return await this.friggClientService.getUserById(auth, childNationalId) } - async getAllKeyOptions({ auth }: TemplateApiModuleActionProps) { - return await this.friggClientService.getAllKeyOptions(auth, '') + async getChildren({ auth }: TemplateApiModuleActionProps) { + const children = + await this.nationalRegistryService.getChildrenCustodyInformation(auth) + + const currentYear = new Date().getFullYear() + const maxYear = currentYear - 7 // 2nd grade + const minYear = currentYear - 16 // 10th grade + + // Check if the child is at primary school age and lives with the applicant + const filteredChildren = children.filter((child) => { + // Allow children to pass through + const validChildren = [ + '1111111119', + '2222222229', + '5555555559', + '6666666669', + ] + if ( + isRunningOnEnvironment('local') && + validChildren.includes(child.nationalId) + ) { + return true + } + + if (!child.nationalId) { + return false + } + + const yearOfBirth = kennitala + .info(child.nationalId) + .birthday.getFullYear() + + return ( + child.livesWithApplicant && + yearOfBirth >= minYear && + yearOfBirth <= maxYear + ) + }) + + if (filteredChildren.length === 0) { + throw new TemplateApiError( + { + title: errorMessages.noChildrenFoundTitle, + summary: errorMessages.noChildrenFoundMessage, + }, + 400, + ) + } + + return filteredChildren } - async getHealth({ auth }: TemplateApiModuleActionProps) { - return await this.friggClientService.getHealth(auth) + async sendApplication({ auth, application }: TemplateApiModuleActionProps) { + const newPrimarySchoolDTO = + transformApplicationToNewPrimarySchoolDTO(application) + + return await this.friggClientService.sendApplication( + auth, + newPrimarySchoolDTO, + ) } } diff --git a/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.utils.ts b/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.utils.ts new file mode 100644 index 000000000000..f816098a2283 --- /dev/null +++ b/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/new-primary-school.utils.ts @@ -0,0 +1,156 @@ +import { + getApplicationAnswers, + getApplicationExternalData, + ReasonForApplicationOptions, +} from '@island.is/application/templates/new-primary-school' +import { Application, YES } from '@island.is/application/types' +import { + AgentDto, + FormDto, + FormDtoTypeEnum, +} from '@island.is/clients/mms/frigg' + +export const transformApplicationToNewPrimarySchoolDTO = ( + application: Application, +): FormDto => { + const { + differentPlaceOfResidence, + childInfo, + parents, + siblings, + relatives, + reasonForApplication, + reasonForApplicationCountry, + reasonForApplicationStreetAddress, + reasonForApplicationPostalCode, + selectedSchool, + nativeLanguage, + otherLanguagesSpokenDaily, + otherLanguages, + icelandicNotSpokenAroundChild, + developmentalAssessment, + specialSupport, + startDate, + requestMeeting, + } = getApplicationAnswers(application.answers) + + const { primaryOrgId } = getApplicationExternalData(application.externalData) + + const agents: AgentDto[] = [ + { + name: parents.parent1.fullName, + nationalId: parents.parent1.nationalId, + domicile: { + address: parents.parent1.address.streetAddress, + postCode: parents.parent1.address.postalCode, + }, + email: parents.parent1.email, + phone: parents.parent1.phoneNumber, + role: 'parent', + }, + ...(parents.parent2 + ? [ + { + name: parents.parent2.fullName, + nationalId: parents.parent2.nationalId, + domicile: { + address: parents.parent2.address.streetAddress, + postCode: parents.parent2.address.postalCode, + }, + email: parents.parent2.email, + phone: parents.parent2.phoneNumber, + role: 'parent', + }, + ] + : []), + ...relatives.map((relative) => ({ + name: relative.fullName, + nationalId: relative.nationalId, + phone: relative.phoneNumber, + role: relative.relation, + })), + // TODO: Skoða hvernig ég veit hvaða ástæða var valin (ég er ekki með lista yfir ástæður) + ...(reasonForApplication === + ReasonForApplicationOptions.SIBLINGS_IN_THE_SAME_PRIMARY_SCHOOL + ? siblings.map((sibling) => ({ + name: sibling.fullName, + nationalId: sibling.nationalId, + // TODO: Siblings relation valmöguleikar eru ekki í key-options endapunktinum => Júní ætlar að bæta því við (Þurfum að passa að þeir valmöguleikar komi ekki upp í dropdown á aðstandenda síðunni) + role: sibling.relation, + })) + : []), + ] + + let noIcelandic: boolean + if (otherLanguagesSpokenDaily === YES) { + if (nativeLanguage === 'is' || otherLanguages?.includes('is')) { + noIcelandic = false + } else { + noIcelandic = icelandicNotSpokenAroundChild?.includes(YES) + } + } else { + noIcelandic = nativeLanguage !== 'is' + } + + const newPrimarySchoolDTO: FormDto = { + type: FormDtoTypeEnum.Registration, + user: { + name: childInfo.name, + nationalId: childInfo.nationalId, + preferredName: childInfo.preferredName, + pronouns: childInfo.pronouns, + domicile: { + address: childInfo.address.streetAddress, + postCode: childInfo.address.postalCode, + }, + ...(differentPlaceOfResidence === YES && childInfo.placeOfResidence + ? { + residence: { + address: childInfo.placeOfResidence.streetAddress, + postCode: childInfo.placeOfResidence.postalCode, + }, + } + : {}), + }, + agents, + registration: { + // TODO: Skoða hvernig ég veit hvaða ástæða var valin (ég er ekki með lista yfir ástæður) + defaultOrg: primaryOrgId, + ...(reasonForApplication !== ReasonForApplicationOptions.MOVING_ABROAD + ? { + selectedOrg: selectedSchool, + requestingMeeting: requestMeeting === YES, + expectedStartDate: new Date(startDate), + } + : { + movingAbroadCountry: reasonForApplicationCountry, + }), + reason: reasonForApplication, + ...(reasonForApplication === + ReasonForApplicationOptions.TRANSFER_OF_LEGAL_DOMICILE + ? { + newDomicile: { + address: reasonForApplicationStreetAddress, + postCode: reasonForApplicationPostalCode, + }, + } + : {}), + }, + ...(reasonForApplication !== ReasonForApplicationOptions.MOVING_ABROAD + ? { + social: { + hasHadSupport: specialSupport === YES, + hasDiagnoses: developmentalAssessment === YES, + }, + language: { + nativeLanguage: nativeLanguage, + noIcelandic, + otherLanguages: + otherLanguagesSpokenDaily === YES ? otherLanguages : undefined, + }, + } + : {}), + } + + return newPrimarySchoolDTO +} diff --git a/libs/application/templates/new-primary-school/src/assets/Logo.tsx b/libs/application/templates/new-primary-school/src/assets/Logo.tsx deleted file mode 100644 index d5564886e184..000000000000 --- a/libs/application/templates/new-primary-school/src/assets/Logo.tsx +++ /dev/null @@ -1,41 +0,0 @@ -function Logo() { - return ( - - - - - - - - - - - - - - - ) -} - -export default Logo diff --git a/libs/application/templates/new-primary-school/src/dataProviders/index.ts b/libs/application/templates/new-primary-school/src/dataProviders/index.ts index 634d71350a1b..38a0baef849c 100644 --- a/libs/application/templates/new-primary-school/src/dataProviders/index.ts +++ b/libs/application/templates/new-primary-school/src/dataProviders/index.ts @@ -3,14 +3,8 @@ import { defineTemplateApi, } from '@island.is/application/types' -export const GetTypesApi = defineTemplateApi({ - action: 'getTypes', - externalDataId: 'types', - namespace: ApplicationTypes.NEW_PRIMARY_SCHOOL, -}) - -export const GetHealthApi = defineTemplateApi({ - action: 'getHealth', - externalDataId: 'health', +export const ChildrenApi = defineTemplateApi({ + action: 'getChildren', + externalDataId: 'children', namespace: ApplicationTypes.NEW_PRIMARY_SCHOOL, }) diff --git a/libs/application/templates/new-primary-school/src/fields/FriggOptionsAsyncSelectField/index.tsx b/libs/application/templates/new-primary-school/src/fields/FriggOptionsAsyncSelectField/index.tsx new file mode 100644 index 000000000000..eae477a04fa9 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/fields/FriggOptionsAsyncSelectField/index.tsx @@ -0,0 +1,84 @@ +import { coreErrorMessages } from '@island.is/application/core' +import { + FieldBaseProps, + FieldComponents, + FieldTypes, + FormText, +} from '@island.is/application/types' +import { AsyncSelectFormField } from '@island.is/application/ui-fields' +import { useLocale } from '@island.is/localization' +import React, { FC } from 'react' +import { OptionsType } from '../../lib/constants' +import { friggOptionsQuery } from '../../graphql/queries' +import { + FriggOptionsQuery, + FriggOptionsQueryVariables, +} from '../../types/schema' + +type FriggOptionsAsyncSelectFieldProps = { + field: { + props: { + optionsType: OptionsType + placeholder: FormText + isMulti?: boolean + } + } +} + +const FriggOptionsAsyncSelectField: FC< + React.PropsWithChildren +> = ({ error, field, application }) => { + const { lang } = useLocale() + const { title, props, defaultValue, id } = field + const { isMulti = true, optionsType, placeholder } = props + + return ( + { + const { data } = await apolloClient.query< + FriggOptionsQuery, + FriggOptionsQueryVariables + >({ + query: friggOptionsQuery, + variables: { + type: { + type: optionsType, + }, + }, + }) + + return ( + data?.friggOptions?.flatMap(({ options }) => + options.flatMap(({ value, key }) => { + let content = value.find( + ({ language }) => language === lang, + )?.content + if (!content) { + content = value.find( + ({ language }) => language === 'is', + )?.content + } + return { value: key ?? '', label: content ?? '' } + }), + ) ?? [] + ) + }, + isMulti, + backgroundColor: 'blue', + }} + /> + ) +} + +export default FriggOptionsAsyncSelectField diff --git a/libs/application/templates/new-primary-school/src/fields/RelativesTableRepeater/index.tsx b/libs/application/templates/new-primary-school/src/fields/RelativesTableRepeater/index.tsx new file mode 100644 index 000000000000..875ebe4ae322 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/fields/RelativesTableRepeater/index.tsx @@ -0,0 +1,104 @@ +import { + FieldBaseProps, + FieldComponents, + FieldTypes, +} from '@island.is/application/types' +import { + formatPhoneNumber, + removeCountryCode, +} from '@island.is/application/ui-components' +import { TableRepeaterFormField } from '@island.is/application/ui-fields' +import { format as formatKennitala } from 'kennitala' +import React, { FC } from 'react' +import { useFriggOptions } from '../../hooks/useFriggOptions' +import { OptionsType } from '../../lib/constants' +import { newPrimarySchoolMessages } from '../../lib/messages' +import { getSelectedOptionLabel } from '../../lib/newPrimarySchoolUtils' + +const RelativesTableRepeater: FC> = ({ + error, + field, + application, +}) => { + const { id, title } = field + + const relationFriggOptions = useFriggOptions(OptionsType.RELATION) + + return ( + + value ? formatPhoneNumber(removeCountryCode(value)) : '', + nationalId: (value) => (value ? formatKennitala(value) : ''), + relation: (value) => + value + ? getSelectedOptionLabel(relationFriggOptions, value) ?? '' + : '', + }, + header: [ + newPrimarySchoolMessages.shared.fullName, + newPrimarySchoolMessages.shared.phoneNumber, + newPrimarySchoolMessages.shared.nationalId, + newPrimarySchoolMessages.shared.relation, + ], + }, + }} + /> + ) +} + +export default RelativesTableRepeater diff --git a/libs/application/templates/new-primary-school/src/fields/Review/index.tsx b/libs/application/templates/new-primary-school/src/fields/Review/index.tsx index 4599570d8d9e..babded3a9ea1 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/index.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/index.tsx @@ -16,11 +16,9 @@ import { ReasonForApplicationOptions, States } from '../../lib/constants' import { newPrimarySchoolMessages } from '../../lib/messages' import { getApplicationAnswers } from '../../lib/newPrimarySchoolUtils' -import { AllergiesAndIntolerances } from './review-groups/AllergiesAndIntolerances' import { Child } from './review-groups/Child' import { Languages } from './review-groups/Languages' import { Parents } from './review-groups/Parents' -import { Photography } from './review-groups/Photography' import { ReasonForApplication } from './review-groups/ReasonForApplication' import { Relatives } from './review-groups/Relatives' import { Siblings } from './review-groups/Siblings' @@ -167,9 +165,7 @@ export const Review: FC = ({ )} - - )} diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/AllergiesAndIntolerances.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/AllergiesAndIntolerances.tsx deleted file mode 100644 index 1b034ee09e9e..000000000000 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/AllergiesAndIntolerances.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { YES } from '@island.is/application/core' -import { DataValue, ReviewGroup } from '@island.is/application/ui-components' -import { GridColumn, GridRow, Stack } from '@island.is/island-ui/core' -import { useLocale } from '@island.is/localization' -import { newPrimarySchoolMessages } from '../../../lib/messages' -import { - getApplicationAnswers, - getFoodAllergiesOptionsLabel, - getFoodIntolerancesOptionsLabel, -} from '../../../lib/newPrimarySchoolUtils' -import { ReviewGroupProps } from './props' - -export const AllergiesAndIntolerances = ({ - application, - editable, - goToScreen, -}: ReviewGroupProps) => { - const { formatMessage } = useLocale() - const { - hasFoodAllergies, - hasFoodIntolerances, - isUsingEpiPen, - foodAllergies, - foodIntolerances, - } = getApplicationAnswers(application.answers) - - return ( - goToScreen?.('allergiesAndIntolerances')} - > - - {hasFoodAllergies.includes(YES) && ( - - - { - return formatMessage( - getFoodAllergiesOptionsLabel(allergies), - ) - }) - .join(', ')} - /> - - - )} - {hasFoodIntolerances.includes(YES) && ( - - - { - return formatMessage( - getFoodIntolerancesOptionsLabel(intolerances), - ) - }) - .join(', ')} - /> - - - )} - - - - - - - - ) -} diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Child.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Child.tsx index 3ff01b20e68d..df7ed000027e 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Child.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Child.tsx @@ -6,9 +6,11 @@ import { format as formatKennitala } from 'kennitala' import { newPrimarySchoolMessages } from '../../../lib/messages' import { getApplicationAnswers, - getGenderOptionLabel, + getSelectedOptionLabel, } from '../../../lib/newPrimarySchoolUtils' import { ReviewGroupProps } from './props' +import { useFriggOptions } from '../../../hooks/useFriggOptions' +import { OptionsType } from '../../../lib/constants' export const Child = ({ application, @@ -20,10 +22,12 @@ export const Child = ({ application.answers, ) + const pronounOptions = useFriggOptions(OptionsType.PRONOUN) + return ( goToScreen?.('childrenMultiField')} + editAction={() => goToScreen?.('childInfo')} > @@ -63,28 +67,32 @@ export const Child = ({ /> - {(childInfo.gender || - childInfo.chosenName || + {(childInfo.preferredName || + childInfo.pronouns?.length > 0 || differentPlaceOfResidence === YES) && ( - {childInfo.chosenName && ( + {childInfo.preferredName && ( )} - {childInfo.gender && ( - + {childInfo.pronouns?.length > 0 && ( + + getSelectedOptionLabel(pronounOptions, pronoun), + ) + .join(', ')} /> )} diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Photography.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Photography.tsx deleted file mode 100644 index 1fc4c6ad8e1d..000000000000 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Photography.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { YES } from '@island.is/application/core' -import { RadioValue, ReviewGroup } from '@island.is/application/ui-components' -import { GridColumn, GridRow, Stack } from '@island.is/island-ui/core' -import { useLocale } from '@island.is/localization' -import { newPrimarySchoolMessages } from '../../../lib/messages' -import { getApplicationAnswers } from '../../../lib/newPrimarySchoolUtils' -import { ReviewGroupProps } from './props' - -export const Photography = ({ - application, - editable, - goToScreen, -}: ReviewGroupProps) => { - const { formatMessage } = useLocale() - const { photographyConsent, photoSchoolPublication, photoMediaPublication } = - getApplicationAnswers(application.answers) - - return ( - goToScreen?.('photography')} - isLast={true} - > - - - - - - - {photographyConsent === YES && ( - <> - - - - - - - - - - - - )} - - - ) -} diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/ReasonForApplication.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/ReasonForApplication.tsx index c5b19a1e3ffe..97434e05efd5 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/ReasonForApplication.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/ReasonForApplication.tsx @@ -71,7 +71,7 @@ export const ReasonForApplication = ({ diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Relatives.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Relatives.tsx index 7e2073e7967e..9377bdd34b49 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Relatives.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Relatives.tsx @@ -1,4 +1,4 @@ -import { FieldComponents, FieldTypes, YES } from '@island.is/application/types' +import { FieldComponents, FieldTypes } from '@island.is/application/types' import { Label, ReviewGroup, @@ -9,10 +9,12 @@ import { StaticTableFormField } from '@island.is/application/ui-fields' import { Box, GridColumn, GridRow } from '@island.is/island-ui/core' import { useLocale } from '@island.is/localization' import { format as formatKennitala } from 'kennitala' +import { useFriggOptions } from '../../../hooks/useFriggOptions' +import { OptionsType } from '../../../lib/constants' import { newPrimarySchoolMessages } from '../../../lib/messages' import { getApplicationAnswers, - getRelationOptionLabel, + getSelectedOptionLabel, } from '../../../lib/newPrimarySchoolUtils' import { ReviewGroupProps } from './props' @@ -24,15 +26,14 @@ export const Relatives = ({ const { formatMessage } = useLocale() const { relatives } = getApplicationAnswers(application.answers) + const relationFriggOptions = useFriggOptions(OptionsType.RELATION) + const rows = relatives.map((r) => { return [ r.fullName, formatPhoneNumber(removeCountryCode(r.phoneNumber ?? '')), formatKennitala(r.nationalId), - getRelationOptionLabel(r.relation), - r.canPickUpChild?.includes(YES) - ? newPrimarySchoolMessages.shared.yes - : newPrimarySchoolMessages.shared.no, + getSelectedOptionLabel(relationFriggOptions, r.relation) ?? '', ] }) @@ -64,8 +65,6 @@ export const Relatives = ({ newPrimarySchoolMessages.shared.phoneNumber, newPrimarySchoolMessages.shared.nationalId, newPrimarySchoolMessages.shared.relation, - newPrimarySchoolMessages.childrenNParents - .relativesCanPickUpChildTableHeader, ], rows, }} diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/School.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/School.tsx index d42cbdc63c5f..5367e841215b 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/School.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/School.tsx @@ -1,19 +1,46 @@ +import { useQuery } from '@apollo/client' import { DataValue, ReviewGroup } from '@island.is/application/ui-components' -import { GridColumn, GridRow, Stack, Text } from '@island.is/island-ui/core' +import { + GridColumn, + GridRow, + SkeletonLoader, + Stack, + Text, +} from '@island.is/island-ui/core' import { useLocale } from '@island.is/localization' +import { friggSchoolsByMunicipalityQuery } from '../../../graphql/queries' import { newPrimarySchoolMessages } from '../../../lib/messages' -import { getApplicationAnswers } from '../../../lib/newPrimarySchoolUtils' +import { + formatGrade, + getApplicationAnswers, + getApplicationExternalData, + getCurrentSchoolName, +} from '../../../lib/newPrimarySchoolUtils' +import { FriggSchoolsByMunicipalityQuery } from '../../../types/schema' import { ReviewGroupProps } from './props' +import { useMemo } from 'react' export const School = ({ application, editable, goToScreen, }: ReviewGroupProps) => { - const { formatMessage, formatDate } = useLocale() + const { formatMessage, formatDate, lang } = useLocale() const { startDate, selectedSchool } = getApplicationAnswers( application.answers, ) + const { childGradeLevel } = getApplicationExternalData( + application.externalData, + ) + + const { data, loading } = useQuery( + friggSchoolsByMunicipalityQuery, + ) + const selectedSchoolName = useMemo(() => { + return data?.friggSchoolsByMunicipality + ?.flatMap((municipality) => municipality.children) + .find((school) => school?.id === selectedSchool)?.name + }, [data, selectedSchool]) return ( - - - - - - - - - - - - - - - - + + {loading ? ( + + ) : ( + <> + + + + + + + + + + + + + + + + + + )} ) diff --git a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Support.tsx b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Support.tsx index ec27b12a2c5a..32d079f5a28a 100644 --- a/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Support.tsx +++ b/libs/application/templates/new-primary-school/src/fields/Review/review-groups/Support.tsx @@ -18,6 +18,7 @@ export const Support = ({ goToScreen?.('support')} + isLast={true} > diff --git a/libs/application/templates/new-primary-school/src/fields/index.ts b/libs/application/templates/new-primary-school/src/fields/index.ts index 0e2d8dbbffd1..671bdef85414 100644 --- a/libs/application/templates/new-primary-school/src/fields/index.ts +++ b/libs/application/templates/new-primary-school/src/fields/index.ts @@ -1 +1,3 @@ +export { default as FriggOptionsAsyncSelectField } from './FriggOptionsAsyncSelectField' +export { default as RelativesTableRepeater } from './RelativesTableRepeater' export { Review } from './Review' diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childInfoSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childInfoSubSection.ts index 8cfefc41ef9c..b0d90f5a600c 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childInfoSubSection.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childInfoSubSection.ts @@ -1,18 +1,20 @@ import { + buildActionCardListField, + buildCustomField, + buildDescriptionField, buildMultiField, buildRadioField, - buildSelectField, buildSubSection, buildTextField, } from '@island.is/application/core' import { Application, NO, YES } from '@island.is/application/types' +import { OptionsType } from '../../../lib/constants' import { newPrimarySchoolMessages } from '../../../lib/messages' import { - formatGender, getApplicationAnswers, getApplicationExternalData, - getGenderOptions, - getSelectedChild, + formatGrade, + getCurrentSchoolName, } from '../../../lib/newPrimarySchoolUtils' export const childInfoSubSection = buildSubSection({ @@ -21,7 +23,7 @@ export const childInfoSubSection = buildSubSection({ children: [ buildMultiField({ id: 'childInfo', - title: newPrimarySchoolMessages.childrenNParents.childInfoTitle, + title: newPrimarySchoolMessages.childrenNParents.childInfoSubSectionTitle, description: newPrimarySchoolMessages.childrenNParents.childInfoDescription, children: [ @@ -30,7 +32,8 @@ export const childInfoSubSection = buildSubSection({ title: newPrimarySchoolMessages.shared.fullName, disabled: true, defaultValue: (application: Application) => - getSelectedChild(application)?.fullName, + getApplicationExternalData(application.externalData) + .childInformation.name, }), buildTextField({ id: 'childInfo.nationalId', @@ -39,15 +42,14 @@ export const childInfoSubSection = buildSubSection({ format: '######-####', disabled: true, defaultValue: (application: Application) => - getSelectedChild(application)?.nationalId, + getApplicationExternalData(application.externalData) + .childInformation.nationalId, }), buildTextField({ id: 'childInfo.address.streetAddress', title: newPrimarySchoolMessages.shared.address, width: 'half', disabled: true, - // TODO: Nota gögn frá Júní - // TODO: Hægt að nota heimilisfang innskráðs foreldris? (foreldri getur ekki sótt um nema barn sé með sama lögheimili) defaultValue: (application: Application) => getApplicationExternalData(application.externalData) .applicantAddress, @@ -57,8 +59,6 @@ export const childInfoSubSection = buildSubSection({ title: newPrimarySchoolMessages.shared.postalCode, width: 'half', disabled: true, - // TODO: Nota gögn frá Júní - // TODO: Hægt að nota heimilisfang innskráðs foreldris? (foreldri getur ekki sótt um nema barn sé með sama lögheimili) defaultValue: (application: Application) => getApplicationExternalData(application.externalData) .applicantPostalCode, @@ -68,28 +68,33 @@ export const childInfoSubSection = buildSubSection({ title: newPrimarySchoolMessages.shared.municipality, width: 'half', disabled: true, - // TODO: Nota gögn frá Júní - // TODO: Hægt að nota heimilisfang innskráðs foreldris? (foreldri getur ekki sótt um nema barn sé með sama lögheimili) defaultValue: (application: Application) => getApplicationExternalData(application.externalData).applicantCity, }), buildTextField({ - id: 'childInfo.chosenName', - title: newPrimarySchoolMessages.childrenNParents.childInfoChosenName, - width: 'half', - }), - buildSelectField({ - id: 'childInfo.gender', - title: newPrimarySchoolMessages.childrenNParents.childInfoGender, - placeholder: - newPrimarySchoolMessages.childrenNParents - .childInfoGenderPlaceholder, - width: 'half', - // TODO: Nota gögn fá Júní - options: getGenderOptions(), + id: 'childInfo.preferredName', + title: + newPrimarySchoolMessages.childrenNParents.childInfoPreferredName, defaultValue: (application: Application) => - formatGender(getSelectedChild(application)?.genderCode), + getApplicationExternalData(application.externalData) + .childInformation.preferredName ?? undefined, }), + buildCustomField( + { + id: 'childInfo.pronouns', + title: newPrimarySchoolMessages.childrenNParents.childInfoPronouns, + component: 'FriggOptionsAsyncSelectField', + defaultValue: (application: Application) => + getApplicationExternalData(application.externalData) + .childInformation.pronouns, + }, + { + optionsType: OptionsType.PRONOUN, + placeholder: + newPrimarySchoolMessages.childrenNParents + .childInfoPronounsPlaceholder, + }, + ), buildRadioField({ id: 'childInfo.differentPlaceOfResidence', title: @@ -132,6 +137,40 @@ export const childInfoSubSection = buildSubSection({ return differentPlaceOfResidence === YES }, }), + buildDescriptionField({ + id: 'childInfo.currentSchool.title', + title: newPrimarySchoolMessages.overview.currentSchool, + titleVariant: 'h4', + space: 2, + }), + buildActionCardListField({ + id: 'childInfo.currentSchool', + title: '', + doesNotRequireAnswer: true, + marginTop: 2, + items: (application, lang) => { + const { childGradeLevel } = getApplicationExternalData( + application.externalData, + ) + + const currentSchool = getCurrentSchoolName(application) + + return [ + { + heading: currentSchool, + headingVariant: 'h4', + tag: { + label: { + ...newPrimarySchoolMessages.overview.currentGrade, + values: { grade: formatGrade(childGradeLevel, lang) }, + }, + outlined: true, + variant: 'blue', + }, + }, + ] + }, + }), ], }), ], diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childrenSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childrenSubSection.ts deleted file mode 100644 index 3a4ddf4ae7f0..000000000000 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/childrenSubSection.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - buildMultiField, - buildRadioField, - buildSubSection, -} from '@island.is/application/core' -import { format as formatKennitala } from 'kennitala' -import { newPrimarySchoolMessages } from '../../../lib/messages' -import { - canApply, - getApplicationExternalData, -} from '../../../lib/newPrimarySchoolUtils' - -export const childrenSubSection = buildSubSection({ - id: 'childrenSubSection', - title: newPrimarySchoolMessages.childrenNParents.childrenSubSectionTitle, - children: [ - buildMultiField({ - id: 'childrenMultiField', - title: newPrimarySchoolMessages.childrenNParents.childrenSubSectionTitle, - description: - newPrimarySchoolMessages.childrenNParents.childrenDescription, - children: [ - buildRadioField({ - id: 'childNationalId', - title: newPrimarySchoolMessages.childrenNParents.childrenRadioTitle, - options: (application) => { - const { children } = getApplicationExternalData( - application.externalData, - ) - - return children - .filter((child) => canApply(child)) - .map((child) => { - return { - value: child.nationalId, - label: child.fullName, - subLabel: formatKennitala(child.nationalId), - } - }) - }, - required: true, - }), - ], - }), - ], -}) diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/index.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/index.ts index 9779b607c08c..023e05a1e723 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/index.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/index.ts @@ -1,17 +1,11 @@ import { buildSection } from '@island.is/application/core' import { newPrimarySchoolMessages } from '../../../lib/messages' import { childInfoSubSection } from './childInfoSubSection' -import { childrenSubSection } from './childrenSubSection' import { parentsSubSection } from './parentsSubSection' import { relativesSubSection } from './relativesSubSection' export const childrenNParentsSection = buildSection({ id: 'childrenNParentsSection', title: newPrimarySchoolMessages.childrenNParents.sectionTitle, - children: [ - childrenSubSection, - childInfoSubSection, - parentsSubSection, - relativesSubSection, - ], + children: [childInfoSubSection, parentsSubSection, relativesSubSection], }) diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/parentsSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/parentsSubSection.ts index 3a54030ac709..ec2812b7db09 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/parentsSubSection.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/parentsSubSection.ts @@ -161,7 +161,7 @@ export const parentsSubSection = buildSubSection({ condition: (answers, externalData) => hasOtherParent(answers, externalData), defaultValue: (application: Application) => - getOtherParent(application)?.address.streetAddress, + getOtherParent(application)?.address.streetName, }), buildTextField({ id: 'parents.parent2.address.postalCode', diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/relativesSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/relativesSubSection.ts index 5fe016271a70..f3a96abeeae9 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/relativesSubSection.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/childrenNParentsSection/relativesSubSection.ts @@ -1,20 +1,9 @@ import { + buildCustomField, buildMultiField, buildSubSection, - buildTableRepeaterField, } from '@island.is/application/core' -import { YES } from '@island.is/application/types' -import { - formatPhoneNumber, - removeCountryCode, -} from '@island.is/application/ui-components' -import { format as formatKennitala } from 'kennitala' -import { RelationOptions } from '../../../lib/constants' import { newPrimarySchoolMessages } from '../../../lib/messages' -import { - getRelationOptionLabel, - getRelationOptions, -} from '../../../lib/newPrimarySchoolUtils' export const relativesSubSection = buildSubSection({ id: 'relativesSubSection', @@ -26,91 +15,10 @@ export const relativesSubSection = buildSubSection({ description: newPrimarySchoolMessages.childrenNParents.relativesDescription, children: [ - buildTableRepeaterField({ + buildCustomField({ id: 'relatives', title: '', - formTitle: - newPrimarySchoolMessages.childrenNParents - .relativesRegistrationTitle, - addItemButtonText: - newPrimarySchoolMessages.childrenNParents.relativesAddRelative, - saveItemButtonText: - newPrimarySchoolMessages.childrenNParents.relativesRegisterRelative, - removeButtonTooltipText: - newPrimarySchoolMessages.childrenNParents.relativesDeleteRelative, - marginTop: 0, - maxRows: 6, - fields: { - fullName: { - component: 'input', - label: newPrimarySchoolMessages.shared.fullName, - width: 'half', - type: 'text', - dataTestId: 'relative-full-name', - }, - phoneNumber: { - component: 'input', - label: newPrimarySchoolMessages.shared.phoneNumber, - width: 'half', - type: 'tel', - format: '###-####', - placeholder: '000-0000', - dataTestId: 'relative-phone-number', - }, - nationalId: { - component: 'input', - label: newPrimarySchoolMessages.shared.nationalId, - width: 'half', - type: 'text', - format: '######-####', - placeholder: '000000-0000', - dataTestId: 'relative-national-id', - }, - relation: { - component: 'select', - label: newPrimarySchoolMessages.shared.relation, - width: 'half', - placeholder: newPrimarySchoolMessages.shared.relationPlaceholder, - // TODO: Nota gögn fá Júní - options: getRelationOptions(), - dataTestId: 'relative-relation', - }, - canPickUpChild: { - component: 'checkbox', - width: 'full', - large: true, - options: [ - { - label: - newPrimarySchoolMessages.childrenNParents - .relativesCanPickUpChild, - value: YES, - }, - ], - dataTestId: 'relative-can-pick-up-child', - }, - }, - table: { - format: { - phoneNumber: (value) => - formatPhoneNumber(removeCountryCode(value ?? '')), - nationalId: (value) => formatKennitala(value), - relation: (value) => - getRelationOptionLabel(value as RelationOptions), - canPickUpChild: (value) => - value?.includes(YES) - ? newPrimarySchoolMessages.shared.yes - : newPrimarySchoolMessages.shared.no, - }, - header: [ - newPrimarySchoolMessages.shared.fullName, - newPrimarySchoolMessages.shared.phoneNumber, - newPrimarySchoolMessages.shared.nationalId, - newPrimarySchoolMessages.shared.relation, - newPrimarySchoolMessages.childrenNParents - .relativesCanPickUpChildTableHeader, - ], - }, + component: 'RelativesTableRepeater', }), ], }), diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/allergiesAndIntolerancesSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/allergiesAndIntolerancesSubSection.ts deleted file mode 100644 index 050db767ee53..000000000000 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/allergiesAndIntolerancesSubSection.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { - buildAlertMessageField, - buildAsyncSelectField, - buildCheckboxField, - buildDescriptionField, - buildMultiField, - buildSubSection, -} from '@island.is/application/core' -import { YES } from '@island.is/application/types' -import { newPrimarySchoolMessages } from '../../../lib/messages' -import { - getApplicationAnswers, - getFoodAllergiesOptions, - getFoodIntolerancesOptions, -} from '../../../lib/newPrimarySchoolUtils' - -export const allergiesAndIntolerancesSubSection = buildSubSection({ - id: 'allergiesAndIntolerancesSubSection', - title: - newPrimarySchoolMessages.differentNeeds - .allergiesAndIntolerancesSubSectionTitle, - children: [ - buildMultiField({ - id: 'allergiesAndIntolerances', - title: - newPrimarySchoolMessages.differentNeeds - .foodAllergiesAndIntolerancesTitle, - description: - newPrimarySchoolMessages.differentNeeds - .foodAllergiesAndIntolerancesDescription, - children: [ - buildCheckboxField({ - id: 'allergiesAndIntolerances.hasFoodAllergies', - title: '', - spacing: 0, - options: [ - { - value: YES, - label: - newPrimarySchoolMessages.differentNeeds.childHasFoodAllergies, - }, - ], - }), - buildAsyncSelectField({ - id: 'allergiesAndIntolerances.foodAllergies', - title: newPrimarySchoolMessages.differentNeeds.typeOfAllergies, - dataTestId: 'food-allergies', - placeholder: - newPrimarySchoolMessages.differentNeeds.typeOfAllergiesPlaceholder, - // TODO: Nota gögn fá Júní - loadOptions: async ({ apolloClient }) => { - /* return await getOptionsListByType( - apolloClient, - OptionsType.ALLERGRY, - )*/ - - return getFoodAllergiesOptions() - }, - isMulti: true, - condition: (answers) => { - const { hasFoodAllergies } = getApplicationAnswers(answers) - - return hasFoodAllergies?.includes(YES) - }, - }), - buildAlertMessageField({ - id: 'allergiesAndIntolerances.info', - title: newPrimarySchoolMessages.shared.alertTitle, - message: - newPrimarySchoolMessages.differentNeeds - .confirmFoodAllergiesAlertMessage, - doesNotRequireAnswer: true, - alertType: 'info', - marginBottom: 4, - condition: (answers) => { - const { hasFoodAllergies } = getApplicationAnswers(answers) - - return hasFoodAllergies?.includes(YES) - }, - }), - buildCheckboxField({ - id: 'allergiesAndIntolerances.hasFoodIntolerances', - title: '', - spacing: 0, - options: [ - { - value: YES, - label: - newPrimarySchoolMessages.differentNeeds - .childHasFoodIntolerances, - }, - ], - }), - buildAsyncSelectField({ - id: 'allergiesAndIntolerances.foodIntolerances', - title: newPrimarySchoolMessages.differentNeeds.typeOfIntolerances, - dataTestId: 'food-intolerances', - placeholder: - newPrimarySchoolMessages.differentNeeds - .typeOfIntolerancesPlaceholder, - // TODO: Nota gögn fá Júní - loadOptions: async ({ apolloClient }) => { - /*return await getOptionsListByType( - apolloClient, - OptionsType.INTELERENCE, - )*/ - - return getFoodIntolerancesOptions() - }, - isMulti: true, - condition: (answers) => { - const { hasFoodIntolerances } = getApplicationAnswers(answers) - - return hasFoodIntolerances?.includes(YES) - }, - }), - buildDescriptionField({ - // Needed to add space - id: 'allergiesAndIntolerances.divider', - title: '', - marginBottom: 4, - condition: (answers) => { - const { hasFoodIntolerances } = getApplicationAnswers(answers) - - return hasFoodIntolerances?.includes(YES) - }, - }), - buildCheckboxField({ - id: 'allergiesAndIntolerances.isUsingEpiPen', - title: '', - spacing: 0, - options: [ - { - value: YES, - label: newPrimarySchoolMessages.differentNeeds.usesEpinephrinePen, - }, - ], - }), - ], - }), - ], -}) diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/index.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/index.ts index 4df41b1c2790..1c26f46f6c96 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/index.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/index.ts @@ -2,10 +2,8 @@ import { buildSection } from '@island.is/application/core' import { ReasonForApplicationOptions } from '../../../lib/constants' import { newPrimarySchoolMessages } from '../../../lib/messages' import { getApplicationAnswers } from '../../../lib/newPrimarySchoolUtils' -import { allergiesAndIntolerancesSubSection } from './allergiesAndIntolerancesSubSection' import { languageSubSection } from './languageSubSection' import { supportSubSection } from './supportSubSection' -import { useOfFootageSubSection } from './useOfFootageSubSection' export const differentNeedsSection = buildSection({ id: 'differentNeedsSection', @@ -15,10 +13,5 @@ export const differentNeedsSection = buildSection({ const { reasonForApplication } = getApplicationAnswers(answers) return reasonForApplication !== ReasonForApplicationOptions.MOVING_ABROAD }, - children: [ - languageSubSection, - allergiesAndIntolerancesSubSection, - supportSubSection, - useOfFootageSubSection, - ], + children: [languageSubSection, supportSubSection], }) diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/useOfFootageSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/useOfFootageSubSection.ts deleted file mode 100644 index 995dfbcf5552..000000000000 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/differentNeedsSection/useOfFootageSubSection.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - buildAlertMessageField, - buildMultiField, - buildRadioField, - buildSubSection, -} from '@island.is/application/core' -import { NO, YES } from '@island.is/application/types' -import { newPrimarySchoolMessages } from '../../../lib/messages' -import { getApplicationAnswers } from '../../../lib/newPrimarySchoolUtils' - -export const useOfFootageSubSection = buildSubSection({ - id: 'useOfFootageSubSection', - title: newPrimarySchoolMessages.differentNeeds.useOfFootageSubSectionTitle, - children: [ - buildMultiField({ - id: 'photography', - title: newPrimarySchoolMessages.differentNeeds.photography, - description: - newPrimarySchoolMessages.differentNeeds.photographyDescription, - children: [ - buildRadioField({ - id: 'photography.photographyConsent', - title: newPrimarySchoolMessages.differentNeeds.photographyConsent, - width: 'half', - required: true, - options: [ - { - label: newPrimarySchoolMessages.shared.yes, - dataTestId: 'yes-option', - value: YES, - }, - { - label: newPrimarySchoolMessages.shared.no, - dataTestId: 'no-option', - value: NO, - }, - ], - }), - buildRadioField({ - id: 'photography.photoSchoolPublication', - condition: (answers) => { - const { photographyConsent } = getApplicationAnswers(answers) - return photographyConsent === YES - }, - title: newPrimarySchoolMessages.differentNeeds.photoSchoolPublication, - width: 'half', - options: [ - { - label: newPrimarySchoolMessages.shared.yes, - dataTestId: 'yes-option', - value: YES, - }, - { - label: newPrimarySchoolMessages.shared.no, - dataTestId: 'no-option', - value: NO, - }, - ], - }), - buildRadioField({ - id: 'photography.photoMediaPublication', - condition: (answers) => { - const { photographyConsent } = getApplicationAnswers(answers) - return photographyConsent === YES - }, - title: newPrimarySchoolMessages.differentNeeds.photoMediaPublication, - width: 'half', - options: [ - { - label: newPrimarySchoolMessages.shared.yes, - dataTestId: 'yes-option', - value: YES, - }, - { - label: newPrimarySchoolMessages.shared.no, - dataTestId: 'no-option', - value: NO, - }, - ], - }), - buildAlertMessageField({ - id: 'differentNeeds.photographyInfo', - title: newPrimarySchoolMessages.shared.alertTitle, - message: newPrimarySchoolMessages.differentNeeds.photographyInfo, - doesNotRequireAnswer: true, - alertType: 'info', - }), - ], - }), - ], -}) diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/overviewSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/overviewSection.ts index e6f435874c52..bd2e8c474912 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/overviewSection.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/overviewSection.ts @@ -19,7 +19,7 @@ export const overviewSection = buildSection({ buildCustomField( { id: 'overviewScreen', - title: newPrimarySchoolMessages.overview.overviewTitle, + title: '', component: 'Review', }, { diff --git a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/primarySchoolSection/newSchoolSubSection.ts b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/primarySchoolSection/newSchoolSubSection.ts index 4abd6c056210..fc5449e50716 100644 --- a/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/primarySchoolSection/newSchoolSubSection.ts +++ b/libs/application/templates/new-primary-school/src/forms/NewPrimarySchoolForm/primarySchoolSection/newSchoolSubSection.ts @@ -1,11 +1,18 @@ import { buildAsyncSelectField, + buildHiddenInputWithWatchedValue, buildMultiField, buildSubSection, + coreErrorMessages, } from '@island.is/application/core' +import { friggSchoolsByMunicipalityQuery } from '../../../graphql/queries' import { ReasonForApplicationOptions } from '../../../lib/constants' import { newPrimarySchoolMessages } from '../../../lib/messages' -import { getApplicationAnswers } from '../../../lib/newPrimarySchoolUtils' +import { + getApplicationAnswers, + getApplicationExternalData, +} from '../../../lib/newPrimarySchoolUtils' +import { FriggSchoolsByMunicipalityQuery } from '../../../types/schema' export const newSchoolSubSection = buildSubSection({ id: 'newSchoolSubSection', @@ -23,47 +30,68 @@ export const newSchoolSubSection = buildSubSection({ buildAsyncSelectField({ id: 'schools.newSchool.municipality', title: newPrimarySchoolMessages.shared.municipality, - // TODO: get data from Juni + placeholder: newPrimarySchoolMessages.shared.municipalityPlaceholder, + loadingError: coreErrorMessages.failedDataProvider, + dataTestId: 'new-school-municipality', loadOptions: async ({ apolloClient }) => { - return [{ value: 'Reykjavík', label: 'Reykjavík' }] - /*const { municipalities } = getApplicationExternalData( - application.externalData, - ) + const { data } = + await apolloClient.query({ + query: friggSchoolsByMunicipalityQuery, + }) - return municipalities.map( - (municipality: NationalRegistryMunicipality) => ({ - value: municipality?.code || '', - label: municipality.name || '', - }), - )*/ + return ( + data?.friggSchoolsByMunicipality?.map((municipality) => ({ + value: municipality.name, + label: municipality.name, + })) ?? [] + ) }, - - placeholder: newPrimarySchoolMessages.shared.municipalityPlaceholder, - dataTestId: 'new-school-municipality', }), - buildAsyncSelectField({ id: 'schools.newSchool.school', title: newPrimarySchoolMessages.shared.school, - condition: (answers) => { - const { schoolMunicipality } = getApplicationAnswers(answers) - return !!schoolMunicipality - }, - // TODO: get data from Juni - loadOptions: async ({ apolloClient }) => { - return [ - { - value: 'Ártúnsskóli', - label: 'Ártúnsskóli', - }, - { - value: 'Árbæjarskóli', - label: 'Árbæjarskóli', - }, - ] - }, placeholder: newPrimarySchoolMessages.shared.schoolPlaceholder, + loadingError: coreErrorMessages.failedDataProvider, dataTestId: 'new-school-school', + loadOptions: async ({ application, apolloClient }) => { + const { schoolMunicipality } = getApplicationAnswers( + application.answers, + ) + const { childGradeLevel } = getApplicationExternalData( + application.externalData, + ) + + const { data } = + await apolloClient.query({ + query: friggSchoolsByMunicipalityQuery, + }) + + return ( + data?.friggSchoolsByMunicipality + ?.find(({ name }) => name === schoolMunicipality) + ?.children?.filter((school) => + school.gradeLevels?.includes(childGradeLevel), + ) + ?.map((school) => ({ + value: school.id, + label: school.name, + })) ?? [] + ) + }, + condition: (answers) => { + const { schoolMunicipality, newSchoolHiddenInput } = + getApplicationAnswers(answers) + + return ( + !!schoolMunicipality && + schoolMunicipality === newSchoolHiddenInput + ) + }, + }), + buildHiddenInputWithWatchedValue({ + // Needed to trigger an update on loadOptions in the async select above + id: 'schools.newSchool.hiddenInput', + watchValue: 'schools.newSchool.municipality', }), ], }), diff --git a/libs/application/templates/new-primary-school/src/forms/Prerequisites.ts b/libs/application/templates/new-primary-school/src/forms/Prerequisites.ts deleted file mode 100644 index ede49c5d1d6f..000000000000 --- a/libs/application/templates/new-primary-school/src/forms/Prerequisites.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - buildDataProviderItem, - buildExternalDataProvider, - buildForm, - buildSection, - buildSubmitField, -} from '@island.is/application/core' -import { - ChildrenCustodyInformationApi, - DefaultEvents, - Form, - FormModes, - NationalRegistryUserApi, - UserProfileApi, -} from '@island.is/application/types' -import { newPrimarySchoolMessages } from '../lib/messages' - -export const Prerequisites: Form = buildForm({ - id: 'newPrimarySchoolPrerequisites', - title: newPrimarySchoolMessages.shared.formTitle, - mode: FormModes.NOT_STARTED, - renderLastScreenButton: true, - children: [ - buildSection({ - id: 'prerequisites', - title: newPrimarySchoolMessages.pre.externalDataSection, - children: [ - buildExternalDataProvider({ - id: 'approveExternalData', - title: newPrimarySchoolMessages.pre.externalDataSection, - subTitle: newPrimarySchoolMessages.pre.externalDataDescription, - checkboxLabel: newPrimarySchoolMessages.pre.checkboxProvider, - submitField: buildSubmitField({ - id: 'submit', - placement: 'footer', - title: '', - refetchApplicationAfterSubmit: true, - actions: [ - { - event: DefaultEvents.SUBMIT, - name: newPrimarySchoolMessages.pre.startApplication, - type: 'primary', - }, - ], - }), - dataProviders: [ - buildDataProviderItem({ - provider: NationalRegistryUserApi, - title: - newPrimarySchoolMessages.pre.nationalRegistryInformationTitle, - subTitle: - newPrimarySchoolMessages.pre - .nationalRegistryInformationSubTitle, - }), - buildDataProviderItem({ - provider: ChildrenCustodyInformationApi, - title: '', - subTitle: '', - }), - buildDataProviderItem({ - provider: UserProfileApi, - title: newPrimarySchoolMessages.pre.userProfileInformationTitle, - subTitle: - newPrimarySchoolMessages.pre.userProfileInformationSubTitle, - }), - ], - }), - ], - }), - ], -}) diff --git a/libs/application/templates/new-primary-school/src/forms/Prerequisites/childrenSubSection.ts b/libs/application/templates/new-primary-school/src/forms/Prerequisites/childrenSubSection.ts new file mode 100644 index 000000000000..25989a1c2999 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/forms/Prerequisites/childrenSubSection.ts @@ -0,0 +1,55 @@ +import { + buildMultiField, + buildRadioField, + buildSubSection, + buildSubmitField, +} from '@island.is/application/core' +import { DefaultEvents } from '@island.is/application/types' +import { format as formatKennitala } from 'kennitala' +import { newPrimarySchoolMessages } from '../../lib/messages' +import { getApplicationExternalData } from '../../lib/newPrimarySchoolUtils' + +export const childrenSubSection = buildSubSection({ + id: 'childrenSubSection', + title: newPrimarySchoolMessages.pre.childrenSubSectionTitle, + children: [ + buildMultiField({ + id: 'childrenMultiField', + title: newPrimarySchoolMessages.pre.childrenSubSectionTitle, + description: newPrimarySchoolMessages.pre.childrenDescription, + children: [ + buildRadioField({ + id: 'childNationalId', + title: newPrimarySchoolMessages.pre.childrenRadioTitle, + options: (application) => { + const { children } = getApplicationExternalData( + application.externalData, + ) + + return children.map((child) => { + return { + value: child.nationalId, + label: child.fullName, + subLabel: formatKennitala(child.nationalId), + } + }) + }, + required: true, + }), + buildSubmitField({ + id: 'submit', + placement: 'footer', + title: '', + refetchApplicationAfterSubmit: true, + actions: [ + { + event: DefaultEvents.SUBMIT, + name: newPrimarySchoolMessages.pre.startApplication, + type: 'primary', + }, + ], + }), + ], + }), + ], +}) diff --git a/libs/application/templates/new-primary-school/src/forms/Prerequisites/externalDataSubSection.ts b/libs/application/templates/new-primary-school/src/forms/Prerequisites/externalDataSubSection.ts new file mode 100644 index 000000000000..ff0152236a11 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/forms/Prerequisites/externalDataSubSection.ts @@ -0,0 +1,42 @@ +import { + buildDataProviderItem, + buildExternalDataProvider, + buildSubSection, +} from '@island.is/application/core' +import { + NationalRegistryUserApi, + UserProfileApi, +} from '@island.is/application/types' +import { ChildrenApi } from '../../dataProviders' +import { newPrimarySchoolMessages } from '../../lib/messages' + +export const externalDataSubSection = buildSubSection({ + id: 'externalDataSubSection', + title: newPrimarySchoolMessages.pre.externalDataSubSection, + children: [ + buildExternalDataProvider({ + id: 'approveExternalData', + title: newPrimarySchoolMessages.pre.externalDataSubSection, + subTitle: newPrimarySchoolMessages.pre.externalDataDescription, + checkboxLabel: newPrimarySchoolMessages.pre.checkboxProvider, + dataProviders: [ + buildDataProviderItem({ + provider: NationalRegistryUserApi, + title: newPrimarySchoolMessages.pre.nationalRegistryInformationTitle, + subTitle: + newPrimarySchoolMessages.pre.nationalRegistryInformationSubTitle, + }), + buildDataProviderItem({ + provider: ChildrenApi, + title: '', + subTitle: '', + }), + buildDataProviderItem({ + provider: UserProfileApi, + title: newPrimarySchoolMessages.pre.userProfileInformationTitle, + subTitle: newPrimarySchoolMessages.pre.userProfileInformationSubTitle, + }), + ], + }), + ], +}) diff --git a/libs/application/templates/new-primary-school/src/forms/Prerequisites/index.ts b/libs/application/templates/new-primary-school/src/forms/Prerequisites/index.ts new file mode 100644 index 000000000000..2ea1457ce5f4 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/forms/Prerequisites/index.ts @@ -0,0 +1,20 @@ +import { buildForm, buildSection } from '@island.is/application/core' +import { Form, FormModes } from '@island.is/application/types' +import { newPrimarySchoolMessages } from '../../lib/messages' +import { childrenSubSection } from './childrenSubSection' +import { externalDataSubSection } from './externalDataSubSection' + +export const Prerequisites: Form = buildForm({ + id: 'newPrimarySchoolPrerequisites', + title: newPrimarySchoolMessages.shared.formTitle, + mode: FormModes.NOT_STARTED, + renderLastScreenButton: true, + renderLastScreenBackButton: true, + children: [ + buildSection({ + id: 'prerequisites', + title: newPrimarySchoolMessages.pre.externalDataSection, + children: [externalDataSubSection, childrenSubSection], + }), + ], +}) diff --git a/libs/application/templates/new-primary-school/src/graphql/queries.ts b/libs/application/templates/new-primary-school/src/graphql/queries.ts index 0cbfc1ac8157..f27c705e30a7 100644 --- a/libs/application/templates/new-primary-school/src/graphql/queries.ts +++ b/libs/application/templates/new-primary-school/src/graphql/queries.ts @@ -15,3 +15,21 @@ export const friggOptionsQuery = gql` } } ` + +export const friggSchoolsByMunicipalityQuery = gql` + query FriggSchoolsByMunicipality { + friggSchoolsByMunicipality { + id + nationalId + name + type + children { + id + nationalId + name + type + gradeLevels + } + } + } +` diff --git a/libs/application/templates/new-primary-school/src/hooks/useFriggOptions.ts b/libs/application/templates/new-primary-school/src/hooks/useFriggOptions.ts new file mode 100644 index 000000000000..0b277a9054f2 --- /dev/null +++ b/libs/application/templates/new-primary-school/src/hooks/useFriggOptions.ts @@ -0,0 +1,28 @@ +import { useQuery } from '@apollo/client' +import { useLocale } from '@island.is/localization' +import { friggOptionsQuery } from '../graphql/queries' +import { OptionsType } from '../lib/constants' +import { FriggOptionsQuery } from '../types/schema' + +export const useFriggOptions = (type?: OptionsType) => { + const { lang } = useLocale() + const { data } = useQuery(friggOptionsQuery, { + variables: { + type: { + type, + }, + }, + }) + + return ( + data?.friggOptions?.flatMap(({ options }) => + options.flatMap(({ value, key }) => { + let content = value.find(({ language }) => language === lang)?.content + if (!content) { + content = value.find(({ language }) => language === 'is')?.content + } + return { value: key ?? '', label: content ?? '' } + }), + ) ?? [] + ) +} diff --git a/libs/application/templates/new-primary-school/src/index.ts b/libs/application/templates/new-primary-school/src/index.ts index 677e626b5135..bd945288a909 100644 --- a/libs/application/templates/new-primary-school/src/index.ts +++ b/libs/application/templates/new-primary-school/src/index.ts @@ -5,4 +5,5 @@ export const getFields = () => import('./fields') export default NewPrimarySchoolTemplate export * from './lib/newPrimarySchoolUtils' +export * from './lib/constants' export * from './lib/messages' diff --git a/libs/application/templates/new-primary-school/src/lib/NewPrimarySchoolTemplate.ts b/libs/application/templates/new-primary-school/src/lib/NewPrimarySchoolTemplate.ts index ead983048ca9..8dbf12e5d375 100644 --- a/libs/application/templates/new-primary-school/src/lib/NewPrimarySchoolTemplate.ts +++ b/libs/application/templates/new-primary-school/src/lib/NewPrimarySchoolTemplate.ts @@ -12,15 +12,22 @@ import { ApplicationStateSchema, ApplicationTemplate, ApplicationTypes, - ChildrenCustodyInformationApi, DefaultEvents, NationalRegistryUserApi, UserProfileApi, + defineTemplateApi, } from '@island.is/application/types' import { Features } from '@island.is/feature-flags' import unset from 'lodash/unset' import { assign } from 'xstate' -import { Events, ReasonForApplicationOptions, Roles, States } from './constants' +import { ChildrenApi } from '../dataProviders' +import { + ApiModuleActions, + Events, + ReasonForApplicationOptions, + Roles, + States, +} from './constants' import { dataSchema } from './dataSchema' import { newPrimarySchoolMessages, statesMessages } from './messages' import { getApplicationAnswers } from './newPrimarySchoolUtils' @@ -51,11 +58,16 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< displayStatus: 'success', }, }, + onExit: defineTemplateApi({ + action: ApiModuleActions.getChildInformation, + externalDataId: 'childInformation', + throwOnError: true, + }), roles: [ { id: Roles.APPLICANT, formLoader: () => - import('../forms/Prerequisites').then((val) => + import('../forms/Prerequisites/index').then((val) => Promise.resolve(val.Prerequisites), ), actions: [ @@ -67,11 +79,7 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< ], write: 'all', delete: true, - api: [ - ChildrenCustodyInformationApi, - NationalRegistryUserApi, - UserProfileApi, - ], + api: [NationalRegistryUserApi, UserProfileApi, ChildrenApi], }, ], }, @@ -84,8 +92,6 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< 'clearApplicationIfReasonForApplication', 'clearPlaceOfResidence', 'clearLanguages', - 'clearAllergiesAndIntolerances', - 'clearPublication', ], meta: { name: States.DRAFT, @@ -97,6 +103,11 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< displayStatus: 'success', }, }, + onExit: defineTemplateApi({ + action: ApiModuleActions.sendApplication, + triggerEvent: DefaultEvents.SUBMIT, + throwOnError: true, + }), roles: [ { id: Roles.APPLICANT, @@ -166,8 +177,6 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< unset(application.answers, 'siblings') unset(application.answers, 'languages') unset(application.answers, 'startDate') - unset(application.answers, 'photography') - unset(application.answers, 'allergiesAndIntolerances') } else { // Clear movingAbroad if "Moving abroad" is not selected as reason for application unset(application.answers, 'reasonForApplication.movingAbroad') @@ -214,38 +223,6 @@ const NewPrimarySchoolTemplate: ApplicationTemplate< } return context }), - /** - * If the user changes his answers, - * clear selected food allergies and intolerances. - */ - clearAllergiesAndIntolerances: assign((context) => { - const { application } = context - const { hasFoodAllergies, hasFoodIntolerances } = getApplicationAnswers( - application.answers, - ) - - if (hasFoodAllergies?.length === 0) { - unset(application.answers, 'allergiesAndIntolerances.foodAllergies') - } - if (hasFoodIntolerances?.length === 0) { - unset( - application.answers, - 'allergiesAndIntolerances.foodIntolerances', - ) - } - return context - }), - clearPublication: assign((context) => { - const { application } = context - const { photographyConsent } = getApplicationAnswers( - application.answers, - ) - if (photographyConsent === NO) { - unset(application.answers, 'photography.photoSchoolPublication') - unset(application.answers, 'photography.photoMediaPublication') - } - return context - }), }, }, diff --git a/libs/application/templates/new-primary-school/src/lib/constants.ts b/libs/application/templates/new-primary-school/src/lib/constants.ts index ab0132cfb1c4..c4c150539b88 100644 --- a/libs/application/templates/new-primary-school/src/lib/constants.ts +++ b/libs/application/templates/new-primary-school/src/lib/constants.ts @@ -16,21 +16,13 @@ export type Events = | { type: DefaultEvents.ASSIGN } | { type: DefaultEvents.EDIT } -export enum Roles { - APPLICANT = 'applicant', -} - -export type Option = { - value: string - label: string +export enum ApiModuleActions { + getChildInformation = 'getChildInformation', + sendApplication = 'sendApplication', } -export enum RelationOptions { - GRANDPARENT = 'grandparent', - SIBLING = 'sibling', - STEPPARENT = 'stepparent', - RELATIVE = 'relative', - FRIEND_OR_OTHER = 'friendOrOther', +export enum Roles { + APPLICANT = 'applicant', } export enum ReasonForApplicationOptions { @@ -52,30 +44,27 @@ export enum SiblingRelationOptions { STEP_SIBLING = 'stepSibling', } -export enum FoodAllergiesOptions { - EGG_ALLERGY = 'eggAllergy', - FISH_ALLERGY = 'fishAllergy', - PENUT_ALLERGY = 'peanutAllergy', - WHEAT_ALLERGY = 'wheatAllergy', - MILK_ALLERGY = 'milkAllergy', - OTHER = 'other', -} - -export enum FoodIntolerancesOptions { - LACTOSE_INTOLERANCE = 'lactoseIntolerance', - GLUTEN_INTOLERANCE = 'glutenIntolerance', - MSG_INTOLERANCE = 'msgIntolerance', - OTHER = 'other', +export enum OptionsType { + PRONOUN = 'pronoun', + GENDER = 'gender', + INTOLERANCE = 'intolerence', + REASON = 'rejectionReason', + RELATION = 'relation', + ALLERGY = 'allergy', } -export enum Gender { - FEMALE = 'FEMALE', - MALE = 'MALE', - OTHER = 'OTHER', +export enum MembershipRole { + Admin = 'admin', + Guardian = 'guardian', + Parent = 'parent', + Principal = 'principal', + Relative = 'relative', + Student = 'student', + Teacher = 'teacher', } -export enum OptionsType { - ALLERGRY = 'allergy', - INTOLERANCE = 'intolerence', - REASON = 'rejectionReason', +export enum MembershipOrganizationType { + Municipality = 'municipality', + National = 'national', + School = 'school', } diff --git a/libs/application/templates/new-primary-school/src/lib/dataSchema.ts b/libs/application/templates/new-primary-school/src/lib/dataSchema.ts index 7c38dc235935..54f61828ba0e 100644 --- a/libs/application/templates/new-primary-school/src/lib/dataSchema.ts +++ b/libs/application/templates/new-primary-school/src/lib/dataSchema.ts @@ -3,12 +3,8 @@ import * as kennitala from 'kennitala' import { parsePhoneNumberFromString } from 'libphonenumber-js' import { z } from 'zod' import { - FoodAllergiesOptions, - FoodIntolerancesOptions, ReasonForApplicationOptions, - RelationOptions, SiblingRelationOptions, - Gender, } from './constants' import { errorMessages } from './messages' @@ -28,7 +24,8 @@ export const dataSchema = z.object({ childNationalId: z.string().min(1), childInfo: z .object({ - gender: z.nativeEnum(Gender).optional(), + preferredName: z.string().optional(), + pronouns: z.array(z.string()).optional(), differentPlaceOfResidence: z.enum([YES, NO]), placeOfResidence: z .object({ @@ -71,7 +68,7 @@ export const dataSchema = z.object({ nationalId: z.string().refine((n) => kennitala.isValid(n), { params: errorMessages.nationalId, }), - relation: z.nativeEnum(RelationOptions), + relation: z.string(), }), ) .refine((r) => r === undefined || r.length > 0, { @@ -123,6 +120,7 @@ export const dataSchema = z.object({ ), schools: z.object({ newSchool: z.object({ + municipality: z.string(), school: z.string(), }), }), @@ -156,61 +154,11 @@ export const dataSchema = z.object({ params: errorMessages.languagesRequired, }, ), - allergiesAndIntolerances: z - .object({ - hasFoodAllergies: z.array(z.string()), - hasFoodIntolerances: z.array(z.string()), - foodAllergies: z.array(z.nativeEnum(FoodAllergiesOptions)).optional(), - foodIntolerances: z - .array(z.nativeEnum(FoodIntolerancesOptions)) - .optional(), - isUsingEpiPen: z.array(z.string()), - }) - .refine( - ({ hasFoodAllergies, foodAllergies }) => - hasFoodAllergies.includes(YES) - ? !!foodAllergies && foodAllergies.length > 0 - : true, - { - path: ['foodAllergies'], - params: errorMessages.foodAllergyRequired, - }, - ) - .refine( - ({ hasFoodIntolerances, foodIntolerances }) => - hasFoodIntolerances.includes(YES) - ? !!foodIntolerances && foodIntolerances.length > 0 - : true, - { - path: ['foodIntolerances'], - params: errorMessages.foodIntoleranceRequired, - }, - ), support: z.object({ developmentalAssessment: z.enum([YES, NO]), specialSupport: z.enum([YES, NO]), requestMeeting: z.array(z.enum([YES, NO])).optional(), }), - photography: z - .object({ - photographyConsent: z.enum([YES, NO]), - photoSchoolPublication: z.enum([YES, NO]).optional(), - photoMediaPublication: z.enum([YES, NO]).optional(), - }) - .refine( - ({ photographyConsent, photoSchoolPublication }) => - photographyConsent === YES ? !!photoSchoolPublication : true, - { - path: ['photoSchoolPublication'], - }, - ) - .refine( - ({ photographyConsent, photoMediaPublication }) => - photographyConsent === YES ? !!photoMediaPublication : true, - { - path: ['photoMediaPublication'], - }, - ), }) export type SchemaFormValues = z.infer diff --git a/libs/application/templates/new-primary-school/src/lib/messages.ts b/libs/application/templates/new-primary-school/src/lib/messages.ts index 904236f680a5..510ec6473fec 100644 --- a/libs/application/templates/new-primary-school/src/lib/messages.ts +++ b/libs/application/templates/new-primary-school/src/lib/messages.ts @@ -56,7 +56,7 @@ export const newPrimarySchoolMessages: MessageDir = { description: 'National id', }, email: { - id: 'dess.nps.application.email', + id: 'dess.nps.application:email', defaultMessage: 'Netfang', description: 'Email address', }, @@ -83,7 +83,7 @@ export const newPrimarySchoolMessages: MessageDir = { phoneNumber: { id: 'dess.nps.application:phoneNumber', defaultMessage: 'Símanúmer', - description: 'Phonenumber', + description: 'Phone number', }, relation: { id: 'dess.nps.application:relation', @@ -105,26 +105,16 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Veldu skóla', description: 'Select school', }, - male: { - id: 'dess.nps.application:gender.male', - defaultMessage: 'Karlkyns', - description: 'Male', - }, - female: { - id: 'dess.nps.application:gender.female', - defaultMessage: 'Kvenkyns', - description: 'Female', - }, - otherGender: { - id: 'dess.nps.application:gender.other', - defaultMessage: 'Kynsegin/Annað', - description: 'non-binary/Other', - }, }), pre: defineMessages({ externalDataSection: { id: 'dess.nps.application:external.data.section', + defaultMessage: 'Forsendur', + description: 'Prerequisites', + }, + externalDataSubSection: { + id: 'dess.nps.application:external.data.sub.section', defaultMessage: 'Gagnaöflun', description: 'Data collection', }, @@ -140,8 +130,8 @@ export const newPrimarySchoolMessages: MessageDir = { }, nationalRegistryInformationSubTitle: { id: 'dess.nps.application:prerequisites.national.registry.subtitle', - defaultMessage: 'Upplýsingar um þig.', - description: 'Information about you.', + defaultMessage: 'Upplýsingar um þig, maka og börn.', + description: 'Information about you, spouse and children.', }, userProfileInformationTitle: { id: 'dess.nps.application:prerequisites.userprofile.title', @@ -167,31 +157,31 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Hefja umsókn', description: 'Start application', }, - }), - - childrenNParents: defineMessages({ - sectionTitle: { - id: 'dess.nps.application:childrenNParents.section.title', - defaultMessage: 'Börn og foreldrar', - description: 'Children and parents', - }, // Children childrenSubSectionTitle: { - id: 'dess.nps.application:childrenNParents.children.sub.section.title', + id: 'dess.nps.application:prerequisites.children.sub.section.title', defaultMessage: 'Börn', description: 'Children', }, childrenDescription: { - id: 'dess.nps.application:childrenNParents.childrenDescription#markdown', + id: 'dess.nps.application:prerequisites.childrenDescription#markdown', defaultMessage: `Samkvæmt uppflettingu í Þjóðskrá hefur þú forsjá með eftirfarandi barni/börnum. Ef þú sérð ekki barnið þitt hér, þá bendum við þér að hafa samband við Þjóðskrá. \n\nAthugaðu að einungis er hægt að sækja um fyrir eitt barn í einu. Ef skrá á tvö börn svo sem tvíbura er hægt að fara beint í að skrá annað barn þegar búið er að skrá það fyrra.`, description: `According to the Registers Iceland database you have the following children. If you do not see your child in this process, please contact the Registers Iceland. \n\nPlease note that you can only apply for one child at a time. If you have two children, such as twins, you can proceed to register the second child directly after completing the registration for the first one.`, }, childrenRadioTitle: { - id: 'dess.nps.application:childrenNParents.childrenRadioTitle', + id: 'dess.nps.application:prerequisites.childrenRadioTitle', defaultMessage: 'Veldu barn fyrir umsóknina', description: 'Select child for the application', }, + }), + + childrenNParents: defineMessages({ + sectionTitle: { + id: 'dess.nps.application:childrenNParents.section.title', + defaultMessage: 'Börn og foreldrar', + description: 'Children and parents', + }, // Child information childInfoSubSectionTitle: { @@ -199,31 +189,26 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Upplýsingar um barn', description: 'Information about child', }, - childInfoTitle: { - id: 'dess.nps.application:childrenNParents.child.info.title', - defaultMessage: 'Upplýsingar um barn', - description: 'Information about child', - }, childInfoDescription: { id: 'dess.nps.application:childrenNParents.child.info.description', defaultMessage: 'Athugaðu hvort upplýsingarnar séu réttar áður en þú heldur áfram.', description: 'Check that the information is correct before proceeding.', }, - childInfoChosenName: { - id: 'dess.nps.application:childrenNParents.child.info.chosen.name', + childInfoPreferredName: { + id: 'dess.nps.application:childrenNParents.child.info.preferred.name', defaultMessage: 'Valið nafn', description: 'Preferred name', }, - childInfoGender: { - id: 'dess.nps.application:childrenNParents.child.info.gender', - defaultMessage: 'Kyn', - description: 'Gender', + childInfoPronouns: { + id: 'dess.nps.application:childrenNParents.child.info.pronouns', + defaultMessage: 'Fornafn', + description: 'Pronoun', }, - childInfoGenderPlaceholder: { - id: 'dess.nps.application:childrenNParents.child.info.gender.placeholder', - defaultMessage: 'Veldu kyn', - description: 'Select gender', + childInfoPronounsPlaceholder: { + id: 'dess.nps.application:childrenNParents.child.info.pronouns.placeholder', + defaultMessage: 'Veldu fornafn', + description: 'Select pronoun', }, differentPlaceOfResidence: { id: 'dess.nps.application:childrenNParents.child.info.different.place.of.residence', @@ -299,41 +284,6 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Eyða aðstandanda', description: 'Remove relative', }, - relativesRelationGrandparent: { - id: 'dess.nps.application:childrenNParents.relatives.relation.grandparent', - defaultMessage: 'Afi/amma', - description: 'Grandparent', - }, - relativesRelationSibling: { - id: 'dess.nps.application:childrenNParents.relatives.relation.sibling', - defaultMessage: 'Systkini', - description: 'Sibling', - }, - relativesRelationStepparent: { - id: 'dess.nps.application:childrenNParents.relatives.relation.stepparent', - defaultMessage: 'Stjúpforeldri', - description: 'Stepparent', - }, - relativesRelationRelative: { - id: 'dess.nps.application:childrenNParents.relatives.relation.relative', - defaultMessage: 'Frændfólk', - description: 'Relative', - }, - relativesRelationFriendOrOther: { - id: 'dess.nps.application:childrenNParents.relatives.relation.friend.or.other', - defaultMessage: 'Vinafólk/annað', - description: 'Friend/other', - }, - relativesCanPickUpChild: { - id: 'dess.nps.application:childrenNParents.relatives.can.pick.up.child', - defaultMessage: 'Má sækja barn í skólann', - description: 'Can pick up the child from school', - }, - relativesCanPickUpChildTableHeader: { - id: 'dess.nps.application:childrenNParents.relatives.can.pick.up.child.table.header', - defaultMessage: 'Má sækja barn', - description: 'Can pick up the child', - }, }), primarySchool: defineMessages({ @@ -546,112 +496,6 @@ export const newPrimarySchoolMessages: MessageDir = { "Icelandic is not spoken in the child's immediate environment", }, - // Allergies and intolerances - allergiesAndIntolerancesSubSectionTitle: { - id: 'dess.nps.application:different.needs.allergies.and.intolerances.sub.section.title', - defaultMessage: 'Ofnæmi og óþol', - description: 'Allergies and intolerances', - }, - foodAllergiesAndIntolerancesTitle: { - id: 'dess.nps.application:different.needs.food.allergies.and.intolerances.title', - defaultMessage: 'Fæðuofnæmi og -óþol', - description: 'Food allergies and intolerances', - }, - foodAllergiesAndIntolerancesDescription: { - id: 'dess.nps.application:different.needs.food.allergies.and.intolerances.description', - defaultMessage: - 'Er barnið með fæðuofnæmi eða -óþol sem starfsfólk skóla þarf að vera meðvitað um?', - description: - 'Does the child have food allergies or intolerances that the school staff need to be aware of?', - }, - childHasFoodAllergies: { - id: 'dess.nps.application:different.needs.child.has.food.allergies', - defaultMessage: 'Barnið er með fæðuofnæmi', - description: 'Child has food allergies', - }, - typeOfAllergies: { - id: 'dess.nps.application:different.needs.type.of.allergies', - defaultMessage: 'Tegund ofnæmis', - description: 'Type of allergies', - }, - typeOfAllergiesPlaceholder: { - id: 'dess.nps.application:different.needs.type.of.allergies.placeholder', - defaultMessage: 'Veldu tegund ofnæmis', - description: 'Select type of allergies', - }, - confirmFoodAllergiesAlertMessage: { - id: 'dess.nps.application:different.needs.confirm.food.allergies.alert.message', - defaultMessage: - 'Athugið að skóli mun krefjast vottorðs frá lækni til staðfestingar á fæðuofnæmi.', - description: - "Please note that the school will require a doctor's certificate to confirm food allergies.", - }, - childHasFoodIntolerances: { - id: 'dess.nps.application:different.needs.child.has.food.intolerances', - defaultMessage: 'Barnið er með fæðuóþol', - description: 'Child has food intolerances', - }, - typeOfIntolerances: { - id: 'dess.nps.application:different.needs.type.of.intolerances', - defaultMessage: 'Tegund óþols', - description: 'Type of intolerances', - }, - typeOfIntolerancesPlaceholder: { - id: 'dess.nps.application:different.needs.type.of.intolerances.placeholder', - defaultMessage: 'Veldu tegund óþols', - description: 'Select type of intolerances', - }, - usesEpinephrinePen: { - id: 'dess.nps.application:different.needs.uses.epinephrine.pen', - defaultMessage: 'Notar adrenalínpenna', - description: 'Uses epinephrine pen', - }, - eggAllergy: { - id: 'dess.nps.application:different.needs.egg.allergy', - defaultMessage: 'Eggjaofnæmi', - description: 'Egg allergy', - }, - fishAllergy: { - id: 'dess.nps.application:different.needs.fish.allergy', - defaultMessage: 'Fiskiofnæmi', - description: 'Fish allergy', - }, - nutAllergy: { - id: 'dess.nps.application:different.needs.nut.allergy', - defaultMessage: 'Hnetuofnæmi', - description: 'Nut allergy', - }, - wheatAllergy: { - id: 'dess.nps.application:different.needs.wheat.allergy', - defaultMessage: 'Hveitiofnæmi', - description: 'Wheat allergy', - }, - milkAllergy: { - id: 'dess.nps.application:different.needs.milk.allergy', - defaultMessage: 'Mjólkurofnæmi', - description: 'Milk allergy', - }, - other: { - id: 'dess.nps.application:different.needs.other', - defaultMessage: 'Annað', - description: 'Other', - }, - lactoseIntolerance: { - id: 'dess.nps.application:different.needs.lactose.intolerance', - defaultMessage: 'Mjólkursykuróþol', - description: 'Lactose intolerance', - }, - glutenIntolerance: { - id: 'dess.nps.application:different.needs.gluten.intolerance', - defaultMessage: 'Glútenóþol', - description: 'Gluten intolerance', - }, - msgIntolerance: { - id: 'dess.nps.application:different.needs.msg.intolerance', - defaultMessage: 'MSG-óþol', - description: 'MSG intolerance', - }, - // Support supportSubSectionTitle: { id: 'dess.nps.application:different.needs.support.sub.section.title', @@ -696,55 +540,6 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Óska eftir samtali við skóla', description: 'Request meeting with the school', }, - - // Use of footage - useOfFootageSubSectionTitle: { - id: 'dess.nps.application:different.needs.use.of.footage.sub.section.title', - defaultMessage: 'Notkun myndefnis', - description: 'Use of footage', - }, - photography: { - id: 'dess.nps.application:different.needs.photography', - defaultMessage: - 'Samþykki vegna myndatöku, myndbandsupptöku og birtingu myndefnis grunnskóla', - description: - 'Consent for photography, video recording and publication of elementary school footage', - }, - photographyDescription: { - id: 'dess.nps.application:different.needs.photography.description', - defaultMessage: - 'Þegar kemur að myndatöku og myndbirtingu skal virða sjálfsákvörðunarrétt barna og ungmenna og taka tillit til skoðana og viðhorfa þeirra í samræmi við aldur og þroska.', - description: - 'When it comes to taking pictures and publishing pictures, the right of self-determination of children and young people must be respected and their views and attitudes taken into account in accordance with their age and maturity.', - }, - photographyConsent: { - id: 'dess.nps.application:different.needs.photography.consent', - defaultMessage: - 'Er heimilt að taka ljósmyndir/myndbönd af barni þínu í daglegu skólastarfi?', - description: - 'Is it allowed to take photos/videos of your child during daily school activities?', - }, - photoSchoolPublication: { - id: 'dess.nps.application:different.needs.photo.school.publication', - defaultMessage: - 'Má birta myndefni á vettvangi skólans svo sem á vefsíðu hans, í fréttabréfi, samfélagsmiðlum og kynningarefni?', - description: - "Can footage be published on the school's website, in the newsletter, social media and promotional materials?", - }, - photoMediaPublication: { - id: 'dess.nps.application:different.needs.photo.media.publication', - defaultMessage: - 'Má birta myndefni hjá þriðja aðila svo sem í fjölmiðlum?', - description: - 'Can footage be published by third parties such as in the media?', - }, - photographyInfo: { - id: 'dess.nps.application:different.needs.photography.info', - defaultMessage: - 'Ekki er heimilt að nota myndefni í öðrum tilgangi en samþykki nær til.\n\nEf myndefni er notað í öðrum tilgangi, eða myndataka er fyrirhuguð í öðrum tilgangi en samþykki nær til, verða foreldrar upplýstir sérstaklega og sérstaks samþykkis aflað, af viðkomandi skóla.\n\nForeldri getur afturkallað samþykki sitt með því að hafa samband við skóla. Afturköllun hefur þó ekki áhrif á lögmæti þeirrar myndatöku og myndbirtingar sem fram hefur farið fram að þeim tíma.\n\nHver og einn skóli er ábyrgðaraðili vegna persónuupplýsinga sem þar eru unnar. Frekari leiðbeiningar og fræðsla um mynda- og myndbandstökur sem og myndbirtingar má finna á vef viðkomandi sveitarfélags.', - description: - 'It is not allowed to use visual material for any purpose other than what has been approved.\n\nIf visual material is used for a purpose other than what has been approved, or if photography is intended for a purpose other than what has been approved, parents will be informed specifically and a separate consent will be obtained from the relevant school.\n\nA parent can revoke their consent by contacting the school. However, revocation does not affect the legality of any photography or publication that has already taken place up to that time.\n\nEach school is responsible for the personal information processed there. Further guidance and education on photography and publication, as well as image processing, can be found on the website of the relevant municipality.', - }, }), overview: defineMessages({ @@ -753,11 +548,6 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Yfirlit', description: 'Overview', }, - overviewTitle: { - id: 'dess.nps.application:confirmation.overview.title', - defaultMessage: 'Yfirlit', - description: 'Overview', - }, overviewDescription: { id: 'dess.nps.application:overview.description', defaultMessage: @@ -794,40 +584,30 @@ export const newPrimarySchoolMessages: MessageDir = { defaultMessage: 'Íslenska er töluð í nærumhverfi barnsins', description: "Icelandic is spoken in the child's immediate environment", }, - foodAllergies: { - id: 'dess.nps.application:overview.food.allergies', - defaultMessage: 'Fæðuofnæmi', - description: 'Food allergies', - }, - foodIntolerances: { - id: 'dess.nps.application:overview.food.intolerances', - defaultMessage: 'Fæðuóþol', - description: 'Food intolerances', - }, - usesEpinephrinePen: { - id: 'dess.nps.application:overview.uses.epinephrine.pen', - defaultMessage: 'Notar adrenalínpenna', - description: 'Uses an epinephrine pen', - }, schoolTitle: { - id: 'dess.nps.application:review.school.title', + id: 'dess.nps.application:overview.school.title', defaultMessage: 'Upplýsingar um skóla', description: 'Information about school', }, currentSchool: { - id: 'dess.nps.application:confirm.current.school', + id: 'dess.nps.application:overview.current.school', defaultMessage: 'Núverandi skóli', description: 'Current school', }, selectedSchool: { - id: 'dess.nps.application:confirm.selected.school', + id: 'dess.nps.application:overview.selected.school', defaultMessage: 'Valinn skóli', description: 'Selected school', }, - class: { - id: 'dess.nps.application:confirm.class', + grade: { + id: 'dess.nps.application:overview.grade', defaultMessage: 'Bekkur', - description: 'Class', + description: 'Grade', + }, + currentGrade: { + id: 'dess.nps.application:overview.current.grade', + defaultMessage: '{grade}. bekkur', + description: '{grade} grade', }, }), @@ -899,14 +679,17 @@ export const errorMessages = defineMessages({ defaultMessage: 'Það þarf að velja a.m.k eitt tungumál', description: 'At least one language must be selected', }, - foodAllergyRequired: { - id: 'dess.nps.application:error.food.allergy.required', - defaultMessage: 'Það þarf að velja a.m.k eitt fæðuofnæmi', - description: 'At least one food allergy must be selected', + noChildrenFoundTitle: { + id: 'dess.nps.application:error.no.children.found.title', + defaultMessage: 'Því miður ert þú ekki með skráð barn á grunnskólaaldri', + description: + 'Unfortunately, you do not have a child registered at primary school age', }, - foodIntoleranceRequired: { - id: 'dess.nps.application:error.food.intolerance.required', - defaultMessage: 'Það þarf að velja a.m.k eitt fæðuóþol', - description: 'At least one food intolerance must be selected', + noChildrenFoundMessage: { + id: 'dess.nps.application:error.no.children.found.message#markdown', + defaultMessage: + 'Eingöngu sá sem er með lögheimilisforsjá hefur heimild til að sækja um fyrir barn. \n\nÞjóðskrá skráir hver eða hverjir teljast foreldrar barns og hver fari með forsjárskyldur þess. Upplýsingar um skráningu forsjár og lögheimilisforeldris má nálgast hér: [Foreldrar og forsjá | Þjóðskrá (skra.is)](https://www.skra.is/folk/skraning-barns/foreldrar-og-forsja/)\n\nUpplýsingum um tengsl á milli barna og foreldra auk forsjáraðila eru einnig aðgengilegar á [Mínum síðum á Ísland.is](https://island.is/minarsidur)', + description: + 'Only the person who has legal custody has the authority to apply for a child.\n\nThe National Registry records who or which individuals are considered to be the parents of a child and who has custody responsibilities. Information on registering custody and legal guardianship can be found here: [Parents and Custody | National Registry (skra.is)](https://www.skra.is/folk/skraning-barns/foreldrar-og-forsja/)\n\nInformation about the relationship between children and parents, as well as custody authorities, is also available on [My Pages on Ísland.is](https://island.is/minarsidur)', }, }) diff --git a/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.spec.ts b/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.spec.ts index 123ba82b26c6..a6ba6347e256 100644 --- a/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.spec.ts +++ b/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.spec.ts @@ -1,58 +1,11 @@ import { ExternalData } from '@island.is/application/types' -import { Child } from '../types' -import { canApply, hasOtherParent } from './newPrimarySchoolUtils' -import * as kennitala from 'kennitala' - -describe('canApply', () => { - const getNationalId = (years: number) => { - const currentDate = new Date() - const fithteenYearsAgo = new Date( - currentDate.getFullYear() - years, - currentDate.getMonth(), - currentDate.getDate(), - ) - - return kennitala.generatePerson(fithteenYearsAgo) - } - - it('should return true if child is between 5 and 15 years old and lives with applicant', () => { - const child = { - nationalId: getNationalId(15), - livesWithApplicant: true, - } as Child - expect(canApply(child)).toBe(true) - }) - - it('should return false if child is younger than 5 years old', () => { - const child = { - nationalId: getNationalId(4), - livesWithApplicant: true, - } as Child - expect(canApply(child)).toBe(false) - }) - - it('should return false if child is older than 15 years old', () => { - const child = { - nationalId: getNationalId(16), - livesWithApplicant: true, - } as Child - expect(canApply(child)).toBe(false) - }) - - it('should return false if child does not live with applicant', () => { - const child = { - nationalId: getNationalId(8), - livesWithApplicant: false, - } as Child - expect(canApply(child)).toBe(false) - }) -}) +import { hasOtherParent } from './newPrimarySchoolUtils' describe('hasOtherParent', () => { it('should return true if otherParent exists in externalData', () => { const answers = {} const externalData = { - childrenCustodyInformation: { + children: { data: [ { fullName: 'Stúfur Maack ', @@ -71,7 +24,7 @@ describe('hasOtherParent', () => { it('should return false if otherParent does not exist in externalData', () => { const answers = {} const externalData = { - childrenCustodyInformation: { + children: { data: [ { fullName: 'Stúfur Maack ', diff --git a/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.ts b/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.ts index c627c828c780..540c61cf8198 100644 --- a/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.ts +++ b/libs/application/templates/new-primary-school/src/lib/newPrimarySchoolUtils.ts @@ -5,29 +5,24 @@ import { FormValue, YesOrNo, } from '@island.is/application/types' -import * as kennitala from 'kennitala' +import { Locale } from '@island.is/shared/types' import { Child, ChildInformation, + FriggChildInformation, + Membership, Parents, Person, RelativesRow, + SelectOption, SiblingsRow, } from '../types' import { - FoodAllergiesOptions, - FoodIntolerancesOptions, - Gender, ReasonForApplicationOptions, - RelationOptions, SiblingRelationOptions, } from './constants' import { newPrimarySchoolMessages } from './messages' -import { ApolloClient } from '@apollo/client' -import { friggOptionsQuery } from '../graphql/queries' -import { FriggOptionsQuery, FriggOptionsQueryVariables } from '../types/schema' - export const getApplicationAnswers = (answers: Application['answers']) => { const childNationalId = getValueViaPath(answers, 'childNationalId') as string @@ -84,31 +79,6 @@ export const getApplicationAnswers = (answers: Application['answers']) => { 'languages.icelandicNotSpokenAroundChild', ) as string[] - const hasFoodAllergies = getValueViaPath( - answers, - 'allergiesAndIntolerances.hasFoodAllergies', - ) as string[] - - const foodAllergies = getValueViaPath( - answers, - 'allergiesAndIntolerances.foodAllergies', - ) as FoodAllergiesOptions[] - - const hasFoodIntolerances = getValueViaPath( - answers, - 'allergiesAndIntolerances.hasFoodIntolerances', - ) as string[] - - const foodIntolerances = getValueViaPath( - answers, - 'allergiesAndIntolerances.foodIntolerances', - ) as FoodIntolerancesOptions[] - - const isUsingEpiPen = getValueViaPath( - answers, - 'allergiesAndIntolerances.isUsingEpiPen', - ) as YesOrNo - const developmentalAssessment = getValueViaPath( answers, 'support.developmentalAssessment', @@ -137,20 +107,10 @@ export const getApplicationAnswers = (answers: Application['answers']) => { 'schools.newSchool.school', ) as string - const photographyConsent = getValueViaPath( - answers, - 'photography.photographyConsent', - ) as YesOrNo - - const photoSchoolPublication = getValueViaPath( - answers, - 'photography.photoSchoolPublication', - ) as YesOrNo - - const photoMediaPublication = getValueViaPath( + const newSchoolHiddenInput = getValueViaPath( answers, - 'photography.photoMediaPublication', - ) as YesOrNo + 'schools.newSchool.hiddenInput', + ) as string return { childNationalId, @@ -167,63 +127,74 @@ export const getApplicationAnswers = (answers: Application['answers']) => { otherLanguagesSpokenDaily, otherLanguages, icelandicNotSpokenAroundChild, - hasFoodAllergies, - foodAllergies, - hasFoodIntolerances, - foodIntolerances, - isUsingEpiPen, developmentalAssessment, specialSupport, requestMeeting, - photographyConsent, - photoSchoolPublication, - photoMediaPublication, - startDate, schoolMunicipality, selectedSchool, + newSchoolHiddenInput, } } export const getApplicationExternalData = ( externalData: Application['externalData'], ) => { - const children = getValueViaPath( - externalData, - 'childrenCustodyInformation.data', - [], - ) as Child[] + const children = getValueViaPath(externalData, 'children.data', []) as Child[] const applicantName = getValueViaPath( externalData, 'nationalRegistry.data.name', + '', ) as string const applicantNationalId = getValueViaPath( externalData, 'nationalRegistry.data.nationalId', + '', ) as string const applicantAddress = getValueViaPath( externalData, 'nationalRegistry.data.address.streetAddress', + '', ) as string const applicantPostalCode = getValueViaPath( externalData, 'nationalRegistry.data.address.postalCode', + '', ) as string const applicantCity = getValueViaPath( externalData, 'nationalRegistry.data.address.city', + '', ) as string - const otherParentName = getValueViaPath( + const childInformation = getValueViaPath( externalData, - 'childrenCustodyInformation.data.otherParent.fullName', + 'childInformation.data', + ) as FriggChildInformation + + const childGradeLevel = getValueViaPath( + externalData, + 'childInformation.data.gradeLevel', + '', ) as string + const primaryOrgId = getValueViaPath( + externalData, + 'childInformation.data.primaryOrgId', + '', + ) as string + + const childMemberships = getValueViaPath( + externalData, + 'childInformation.data.memberships', + [], + ) as Membership[] + return { children, applicantName, @@ -231,21 +202,11 @@ export const getApplicationExternalData = ( applicantAddress, applicantPostalCode, applicantCity, - otherParentName, - } -} - -export const canApply = (child: Child): boolean => { - // Check if the child is at primary school age and lives with the applicant - if ( - kennitala.info(child.nationalId).age >= 5 && - kennitala.info(child.nationalId).age <= 15 && - child.livesWithApplicant - ) { - return true + childInformation, + childGradeLevel, + primaryOrgId, + childMemberships, } - - return false } export const getSelectedChild = (application: Application) => { @@ -275,37 +236,6 @@ export const hasOtherParent = ( return !!otherParent } -export const getRelationOptions = () => [ - { - value: RelationOptions.GRANDPARENT, - label: - newPrimarySchoolMessages.childrenNParents.relativesRelationGrandparent, - }, - { - value: RelationOptions.SIBLING, - label: newPrimarySchoolMessages.childrenNParents.relativesRelationSibling, - }, - { - value: RelationOptions.STEPPARENT, - label: - newPrimarySchoolMessages.childrenNParents.relativesRelationStepparent, - }, - { - value: RelationOptions.RELATIVE, - label: newPrimarySchoolMessages.childrenNParents.relativesRelationRelative, - }, - { - value: RelationOptions.FRIEND_OR_OTHER, - label: - newPrimarySchoolMessages.childrenNParents.relativesRelationFriendOrOther, - }, -] - -export const getRelationOptionLabel = (value: RelationOptions) => { - const relationOptions = getRelationOptions() - return relationOptions.find((option) => option.value === value)?.label ?? '' -} - export const getReasonForApplicationOptions = () => [ { value: ReasonForApplicationOptions.TRANSFER_OF_LEGAL_DOMICILE, @@ -382,127 +312,49 @@ export const getSiblingRelationOptionLabel = ( return relationOptions.find((option) => option.value === value)?.label ?? '' } -export const getGenderOptions = () => [ - { - value: Gender.MALE, - label: newPrimarySchoolMessages.shared.male, - }, - { - value: Gender.FEMALE, - label: newPrimarySchoolMessages.shared.female, - }, - { - value: Gender.OTHER, - label: newPrimarySchoolMessages.shared.otherGender, - }, -] - -export const formatGender = (genderCode?: string): Gender | undefined => { - switch (genderCode) { - case '1': - case '3': - return Gender.MALE - case '2': - case '4': - return Gender.FEMALE - case '7': - case '8': - return Gender.OTHER - default: - return undefined +export const getSelectedOptionLabel = ( + options: SelectOption[], + key?: string, +) => { + if (key === undefined) { + return undefined } -} -export const getGenderOptionLabel = (value: Gender) => { - const genderOptions = getGenderOptions() - return genderOptions.find((option) => option.value === value)?.label ?? '' + return options.find((option) => option.value === key)?.label } -export const getFoodAllergiesOptions = () => [ - { - value: FoodAllergiesOptions.EGG_ALLERGY, - label: newPrimarySchoolMessages.differentNeeds.eggAllergy, - }, - { - value: FoodAllergiesOptions.FISH_ALLERGY, - label: newPrimarySchoolMessages.differentNeeds.fishAllergy, - }, - { - value: FoodAllergiesOptions.PENUT_ALLERGY, - label: newPrimarySchoolMessages.differentNeeds.nutAllergy, - }, - { - value: FoodAllergiesOptions.WHEAT_ALLERGY, - label: newPrimarySchoolMessages.differentNeeds.wheatAllergy, - }, - { - value: FoodAllergiesOptions.MILK_ALLERGY, - label: newPrimarySchoolMessages.differentNeeds.milkAllergy, - }, - { - value: FoodAllergiesOptions.OTHER, - label: newPrimarySchoolMessages.differentNeeds.other, - }, -] +export const formatGrade = (gradeLevel: string, lang: Locale) => { + let grade = gradeLevel + if (gradeLevel.startsWith('0')) { + grade = gradeLevel.substring(1) + } -export const getFoodAllergiesOptionsLabel = (value: FoodAllergiesOptions) => { - const foodAllergiesOptions = getFoodAllergiesOptions() - return ( - foodAllergiesOptions.find((option) => option.value === value)?.label ?? '' - ) + if (lang === 'en') { + switch (grade) { + case '1': + return `${grade}st` + case '2': + return `${grade}nd` + case '3': + return `${grade}rd` + default: + return `${grade}th` + } + } + return grade } -export const getFoodIntolerancesOptions = () => [ - { - value: FoodIntolerancesOptions.LACTOSE_INTOLERANCE, - label: newPrimarySchoolMessages.differentNeeds.lactoseIntolerance, - }, - { - value: FoodIntolerancesOptions.GLUTEN_INTOLERANCE, - label: newPrimarySchoolMessages.differentNeeds.glutenIntolerance, - }, - { - value: FoodIntolerancesOptions.MSG_INTOLERANCE, - label: newPrimarySchoolMessages.differentNeeds.msgIntolerance, - }, - { - value: FoodIntolerancesOptions.OTHER, - label: newPrimarySchoolMessages.differentNeeds.other, - }, -] - -export const getFoodIntolerancesOptionsLabel = ( - value: FoodIntolerancesOptions, -) => { - const foodIntolerancesOptions = getFoodIntolerancesOptions() - return ( - foodIntolerancesOptions.find((option) => option.value === value)?.label ?? - '' +export const getCurrentSchoolName = (application: Application) => { + const { primaryOrgId, childMemberships } = getApplicationExternalData( + application.externalData, ) -} -export const getOptionsListByType = async ( - apolloClient: ApolloClient, - type: string, -) => { - const { data } = await apolloClient.query< - FriggOptionsQuery, - FriggOptionsQueryVariables - >({ - query: friggOptionsQuery, - variables: { - type: { - type, - }, - }, - }) + if (!primaryOrgId || !childMemberships) { + return undefined + } - return ( - data?.friggOptions?.flatMap(({ options }) => - options.flatMap(({ value, id }) => { - const content = value.find(({ language }) => language === 'is')?.content - return { value: id ?? '', label: content ?? '' } - }), - ) ?? [] - ) + // Find the school name since we only have primary org id + return childMemberships + .map((membership) => membership.organization) + .find((organization) => organization?.id === primaryOrgId)?.name } diff --git a/libs/application/templates/new-primary-school/src/types.ts b/libs/application/templates/new-primary-school/src/types.ts index a81c26db3575..7473cd7b7e64 100644 --- a/libs/application/templates/new-primary-school/src/types.ts +++ b/libs/application/templates/new-primary-school/src/types.ts @@ -1,6 +1,6 @@ import { - Gender, - RelationOptions, + MembershipOrganizationType, + MembershipRole, SiblingRelationOptions, } from './lib/constants' @@ -8,8 +8,7 @@ export interface RelativesRow { fullName: string phoneNumber: string nationalId: string - relation: RelationOptions - canPickUpChild: string[] + relation: string } export interface SiblingsRow { @@ -23,7 +22,6 @@ export type Child = { nationalId: string otherParent: object livesWithApplicant: boolean - domicileInIceland: boolean livesWithBothParents: boolean genderCode: string } @@ -36,8 +34,8 @@ export type ChildInformation = { postalCode: string city: string } - gender: Gender - chosenName: string + preferredName: string + pronouns: string[] differentPlaceOfResidence: string placeOfResidence?: { streetAddress: string @@ -52,6 +50,7 @@ export type Person = { phoneNumber: string address: { streetAddress: string + streetName?: string postalCode: string city: string } @@ -61,3 +60,55 @@ export type Parents = { parent1: Person parent2: Person } + +export type SelectOption = { + label: string + value: string +} + +export type Agent = { + id: string + name: string + role: string + email: string + phone: string + nationalId: string +} + +export type Membership = { + id: string + role: MembershipRole + beginDate: Date + endDate: Date | null + organization?: MembershipOrganization +} + +export type MembershipOrganization = { + id: string + nationalId: string + name: string + type: MembershipOrganizationType +} + +export type AddressModel = { + id: string + street: string + municipality?: string // Is set as object in MMS data + zip: string + country?: string // Is set as object in MMS data +} + +export type FriggChildInformation = { + id: string + name: string + email: string + agents: Agent[] + pronouns: string[] + nationalId: string + gradeLevel: string + memberships: Membership[] + primaryOrgId: string + preferredName: string | null + domicile: AddressModel + residence: AddressModel +} diff --git a/libs/application/types/src/lib/Fields.ts b/libs/application/types/src/lib/Fields.ts index 2f8ad12660af..8f3c5828097d 100644 --- a/libs/application/types/src/lib/Fields.ts +++ b/libs/application/types/src/lib/Fields.ts @@ -551,7 +551,10 @@ type Modify = Omit & R export type ActionCardListField = BaseField & { readonly type: FieldTypes.ACTION_CARD_LIST component: FieldComponents.ACTION_CARD_LIST - items: (application: Application) => ApplicationActionCardProps[] + items: ( + application: Application, + lang: Locale, + ) => ApplicationActionCardProps[] space?: BoxProps['paddingTop'] marginBottom?: BoxProps['marginBottom'] marginTop?: BoxProps['marginTop'] diff --git a/libs/application/ui-fields/src/lib/ActionCardListFormField/ActionCardListFormField.tsx b/libs/application/ui-fields/src/lib/ActionCardListFormField/ActionCardListFormField.tsx index b2f63f1f93c1..d34197221ab9 100644 --- a/libs/application/ui-fields/src/lib/ActionCardListFormField/ActionCardListFormField.tsx +++ b/libs/application/ui-fields/src/lib/ActionCardListFormField/ActionCardListFormField.tsx @@ -14,11 +14,11 @@ interface Props extends FieldBaseProps { export const ActionCardListFormField: FC = ({ application, field }) => { const { items, marginBottom = 4, marginTop = 4, space = 2 } = field - const { formatMessage } = useLocale() + const { formatMessage, lang } = useLocale() return ( - {items(application).map((item, index) => { + {items(application, lang).map((item, index) => { const itemWithTranslatedTexts: ActionCardProps = { ...item, heading: diff --git a/libs/clients/mms/frigg/README.md b/libs/clients/mms/frigg/README.md index 1c7749537b34..f9d25bd6f3e6 100644 --- a/libs/clients/mms/frigg/README.md +++ b/libs/clients/mms/frigg/README.md @@ -5,3 +5,21 @@ This library was generated with [Nx](https://nx.dev). ## Running unit tests Run `nx test clients-mms-frigg` to execute the unit tests via [Jest](https://jestjs.io). + +## Running lint + +Run `nx lint clients-mms-frigg` to execute the lint via [ESLint](https://eslint.org/). + +## Usage + +### Updating the open api definition (clientConfig.json) + +```sh +yarn nx run clients-mms-frigg:update-openapi-document +``` + +### Regenerating the client: + +```sh +yarn nx run clients-mms-frigg:codegen/backend-client +``` diff --git a/libs/clients/mms/frigg/project.json b/libs/clients/mms/frigg/project.json index 333343cfaecd..d67cd8a8c925 100644 --- a/libs/clients/mms/frigg/project.json +++ b/libs/clients/mms/frigg/project.json @@ -22,7 +22,7 @@ "executor": "nx:run-commands", "options": { "commands": [ - "curl -H \"X-Road-Client: IS-DEV/GOV/10000/island-is-client\" http://localhost:8081/r1/IS-DEV/GOV/10066/MMS-Protected/getOpenAPI?serviceCode=frigg-api > src/clientConfig.json", + "curl -H \"X-Road-Client: IS-DEV/GOV/10000/island-is-client\" http://localhost:8081/r1/IS-DEV/GOV/10066/MMS-Protected/getOpenAPI?serviceCode=frigg-form-service > src/clientConfig.json", "prettier --write src/clientConfig.json" ], "parallel": false, diff --git a/libs/clients/mms/frigg/src/clientConfig.json b/libs/clients/mms/frigg/src/clientConfig.json index f671fc3c7bf7..8bbfcae254ef 100644 --- a/libs/clients/mms/frigg/src/clientConfig.json +++ b/libs/clients/mms/frigg/src/clientConfig.json @@ -1,7 +1,88 @@ { "openapi": "3.0.0", "paths": { - "/keyOptions": { + "/forms": { + "post": { + "operationId": "submitForm", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/FormDto" } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FormSubmitSuccessModel" + } + } + } + } + }, + "tags": ["Frigg"], + "security": [{ "bearer": [] }] + } + }, + "/forms/types": { + "get": { + "operationId": "getFormTypes", + "summary": "Get list of types of forms", + "description": "Get types.", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "type": "array", "items": { "type": "string" } } + } + } + } + }, + "tags": ["Frigg"], + "security": [{ "bearer": [] }] + } + }, + "/forms/reviews/{reviewId}/{action}": { + "post": { + "operationId": "updateReview", + "summary": "Review form", + "description": "Review form.", + "parameters": [ + { + "name": "reviewId", + "required": true, + "in": "path", + "schema": { "type": "string" } + }, + { + "name": "action", + "required": true, + "in": "path", + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/SuccessModel" } + } + } + } + }, + "tags": ["Frigg"], + "security": [{ "bearer": [] }] + } + }, + "/key-options": { "get": { "operationId": "getAllKeyOptions", "summary": "Get all key options.", @@ -28,31 +109,88 @@ } } }, - "tags": ["KeyOptionsManagement"], - "security": [{ "Authorization": [] }] + "tags": ["Frigg"] } }, - "/keyOptions/types": { + "/key-options/types": { "get": { - "operationId": "getTypes", + "operationId": "getKeyOptionsTypes", "summary": "Get list of types of key options", "description": "Get types.", "parameters": [], - "responses": { "200": { "description": "" } }, - "tags": ["KeyOptionsManagement"], - "security": [{ "Authorization": [] }] + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "type": "array", "items": { "type": "string" } } + } + } + } + }, + "tags": ["Frigg"] } }, "/health": { "get": { "operationId": "health", "parameters": [], - "responses": { "200": { "description": "" } } + "responses": { "200": { "description": "" } }, + "tags": ["Utils"] + } + }, + "/schools": { + "get": { + "operationId": "getAllSchoolsByMunicipality", + "summary": "Get all schools.", + "description": "Returns a paginated collection of schools.", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { "$ref": "#/components/schemas/OrganizationModel" } + } + } + } + } + }, + "tags": ["Frigg"] + } + }, + "/students/{nationalId}": { + "get": { + "operationId": "getUserBySourcedId", + "summary": "Get user by nationalId", + "description": "Get user by Id.", + "parameters": [ + { + "name": "nationalId", + "required": true, + "in": "path", + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/UserModel" } + } + } + } + }, + "tags": ["Frigg"], + "security": [{ "bearer": [] }] } } }, "info": { - "title": "MMS Internal API", + "title": "MMS FORM SERVICE API", "description": "Frigg - student information system", "version": "1", "contact": {} @@ -61,16 +199,130 @@ "servers": [], "components": { "securitySchemes": { - "Authorization": { - "scheme": "Bearer", - "bearerFormat": "Bearer", + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", "description": "Please enter token in from IAS", - "name": "Authorization", - "type": "http", - "in": "Header" + "type": "http" } }, "schemas": { + "AddressDto": { + "type": "object", + "properties": { + "address": { "type": "string" }, + "postCode": { "type": "string" } + }, + "required": ["address", "postCode"] + }, + "UserDto": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "nationalId": { "type": "string" }, + "preferredName": { "type": "string" }, + "pronouns": { "type": "array", "items": { "type": "string" } }, + "domicile": { "$ref": "#/components/schemas/AddressDto" }, + "residence": { "$ref": "#/components/schemas/AddressDto" } + }, + "required": ["name", "nationalId"] + }, + "AgentDto": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "nationalId": { "type": "string" }, + "preferredName": { "type": "string" }, + "pronouns": { "type": "array", "items": { "type": "string" } }, + "domicile": { "$ref": "#/components/schemas/AddressDto" }, + "email": { "type": "string", "example": "name@frigg.is" }, + "phone": { "type": "string" }, + "role": { + "type": "string", + "description": "Agents connection to the student, strings can be found under key option type \"relation\"" + } + }, + "required": ["name", "nationalId", "role"] + }, + "RegistrationDto": { + "type": "object", + "properties": { + "preRegisteredId": { + "type": "string", + "description": "If a user has an open ongoing registration, for exaple first year students submit the id here" + }, + "defaultOrg": { + "type": "string", + "description": "The school a student should or does belong to, pre registered school or current school" + }, + "selectedOrg": { + "type": "string", + "description": "The school selected for a student in the application process" + }, + "requestingMeeting": { "type": "boolean", "default": false }, + "expectedStartDate": { "format": "date-time", "type": "string" }, + "reason": { "type": "string" }, + "movingAbroadCountry": { "type": "string" }, + "newDomicile": { "$ref": "#/components/schemas/AddressDto" } + }, + "required": ["defaultOrg", "reason"] + }, + "HealthDto": { + "type": "object", + "properties": { + "usesEpipen": { "type": "boolean", "default": false }, + "allergies": { "type": "array", "items": { "type": "string" } }, + "intolerances": { "type": "array", "items": { "type": "string" } } + } + }, + "SocialDto": { + "type": "object", + "properties": { + "hasHadSupport": { "type": "boolean", "default": false }, + "hasDiagnoses": { "type": "boolean", "default": false } + } + }, + "LanguageDto": { + "type": "object", + "properties": { + "nativeLanguage": { "type": "string" }, + "noIcelandic": { "type": "boolean" }, + "otherLanguages": { "type": "array", "items": { "type": "string" } } + }, + "required": ["nativeLanguage", "noIcelandic"] + }, + "FormDto": { + "type": "object", + "properties": { + "type": { "type": "string", "enum": ["registration"] }, + "user": { "$ref": "#/components/schemas/UserDto" }, + "agents": { + "type": "array", + "items": { "$ref": "#/components/schemas/AgentDto" } + }, + "registration": { "$ref": "#/components/schemas/RegistrationDto" }, + "health": { "$ref": "#/components/schemas/HealthDto" }, + "social": { "$ref": "#/components/schemas/SocialDto" }, + "language": { "$ref": "#/components/schemas/LanguageDto" } + }, + "required": ["type", "user"] + }, + "FormSubmitSuccessModel": { + "type": "object", + "properties": { + "formId": { "type": "string", "description": "Id of form created" }, + "reviewId": { "type": "string", "description": "Id of review" }, + "status": { "type": "string", "description": "Status of form" } + }, + "required": ["formId", "reviewId", "status"] + }, + "SuccessModel": { + "type": "object", + "properties": { + "success": { "type": "boolean", "description": "Submission response" } + }, + "required": ["success"] + }, "Value": { "type": "object", "properties": { @@ -119,6 +371,168 @@ } }, "required": ["type", "options"] + }, + "AddressModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "street": { "type": "string" }, + "municipality": { "type": "object", "nullable": true }, + "zip": { "type": "string" }, + "country": { "type": "object", "nullable": true } + }, + "required": ["id", "street", "municipality", "zip", "country"] + }, + "OrganizationModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "nationalId": { "type": "string" }, + "name": { "type": "string" }, + "type": { + "type": "string", + "enum": ["municipality", "national", "school"] + }, + "gradeLevels": { "type": "array", "items": { "type": "string" } }, + "address": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/AddressModel" }] + }, + "parent": { + "nullable": true, + "default": null, + "allOf": [{ "$ref": "#/components/schemas/OrganizationModel" }] + }, + "children": { + "nullable": true, + "default": [], + "type": "array", + "items": { "$ref": "#/components/schemas/OrganizationModel" } + } + }, + "required": [ + "id", + "nationalId", + "name", + "type", + "gradeLevels", + "address", + "parent", + "children" + ] + }, + "MembershipOrganizationModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "nationalId": { "type": "string" }, + "name": { "type": "string" }, + "type": { + "type": "string", + "enum": ["municipality", "national", "school"] + } + }, + "required": ["id", "nationalId", "name", "type"] + }, + "MembershipModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "role": { + "type": "string", + "enum": [ + "admin", + "guardian", + "parent", + "principal", + "relative", + "student", + "teacher" + ] + }, + "beginDate": { "format": "date-time", "type": "string" }, + "endDate": { + "format": "date-time", + "type": "string", + "nullable": true + }, + "organization": { + "nullable": true, + "allOf": [ + { "$ref": "#/components/schemas/MembershipOrganizationModel" } + ] + } + }, + "required": ["id", "role", "beginDate", "endDate", "organization"] + }, + "AgentModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "nationalId": { "type": "string" }, + "name": { "type": "string" }, + "phone": { "type": "string" }, + "email": { "type": "string" }, + "role": { "type": "string" }, + "domicile": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/AddressModel" }] + } + }, + "required": [ + "id", + "nationalId", + "name", + "phone", + "email", + "role", + "domicile" + ] + }, + "UserModel": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "nationalId": { "type": "string" }, + "name": { "type": "string" }, + "preferredName": { "type": "object", "nullable": true }, + "pronouns": { "type": "array", "items": { "type": "string" } }, + "gradeLevel": { "type": "string" }, + "email": { "type": "object", "nullable": true }, + "domicile": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/AddressModel" }] + }, + "residence": { + "nullable": true, + "allOf": [{ "$ref": "#/components/schemas/AddressModel" }] + }, + "primaryOrgId": { "type": "object" }, + "memberships": { + "nullable": true, + "type": "array", + "items": { "$ref": "#/components/schemas/MembershipModel" } + }, + "agents": { + "nullable": true, + "type": "array", + "items": { "$ref": "#/components/schemas/AgentModel" } + } + }, + "required": [ + "id", + "nationalId", + "name", + "preferredName", + "pronouns", + "gradeLevel", + "email", + "domicile", + "residence", + "primaryOrgId", + "memberships", + "agents" + ] } } } diff --git a/libs/clients/mms/frigg/src/lib/apiProvider.ts b/libs/clients/mms/frigg/src/lib/apiProvider.ts index d1f77fd70d0b..e56219d24758 100644 --- a/libs/clients/mms/frigg/src/lib/apiProvider.ts +++ b/libs/clients/mms/frigg/src/lib/apiProvider.ts @@ -4,27 +4,21 @@ import { LazyDuringDevScope, XRoadConfig, } from '@island.is/nest/config' -import { - Configuration, - DefaultApi, - KeyOptionsManagementApi, -} from '../../gen/fetch' +import { Configuration, FriggApi } from '../../gen/fetch' import { ConfigFactory } from './configFactory' import { FriggClientConfig } from './friggClient.config' -export const apiProvider = [KeyOptionsManagementApi, DefaultApi].map( - (apiRecord) => ({ - provide: apiRecord, - scope: LazyDuringDevScope, - useFactory: ( - xRoadConfig: ConfigType, - config: ConfigType, - idsClientConfig: ConfigType, - ) => { - return new apiRecord( - new Configuration(ConfigFactory(xRoadConfig, config, idsClientConfig)), - ) - }, - inject: [XRoadConfig.KEY, FriggClientConfig.KEY, IdsClientConfig.KEY], - }), -) +export const apiProvider = [FriggApi].map((apiRecord) => ({ + provide: apiRecord, + scope: LazyDuringDevScope, + useFactory: ( + xRoadConfig: ConfigType, + config: ConfigType, + idsClientConfig: ConfigType, + ) => { + return new apiRecord( + new Configuration(ConfigFactory(xRoadConfig, config, idsClientConfig)), + ) + }, + inject: [XRoadConfig.KEY, FriggClientConfig.KEY, IdsClientConfig.KEY], +})) diff --git a/libs/clients/mms/frigg/src/lib/friggClient.config.ts b/libs/clients/mms/frigg/src/lib/friggClient.config.ts index 300f2cd6d438..8889c509c261 100644 --- a/libs/clients/mms/frigg/src/lib/friggClient.config.ts +++ b/libs/clients/mms/frigg/src/lib/friggClient.config.ts @@ -13,7 +13,7 @@ export const FriggClientConfig = defineConfig>({ load: (env) => ({ xRoadServicePath: env.required( 'XROAD_MMS_FRIGG_PATH', - 'IS-DEV/GOV/10066/MMS-Protected/frigg-api', + 'IS-DEV/GOV/10066/MMS-Protected/frigg-form-service', ), scope: [MMSScope.frigg], }), diff --git a/libs/clients/mms/frigg/src/lib/friggClient.service.ts b/libs/clients/mms/frigg/src/lib/friggClient.service.ts index 95d7b47117cf..345650cb36d5 100644 --- a/libs/clients/mms/frigg/src/lib/friggClient.service.ts +++ b/libs/clients/mms/frigg/src/lib/friggClient.service.ts @@ -1,33 +1,41 @@ -import { Injectable } from '@nestjs/common' import { Auth, AuthMiddleware, type User } from '@island.is/auth-nest-tools' -import { KeyOption, KeyOptionsManagementApi, DefaultApi } from '../../gen/fetch' +import { Injectable } from '@nestjs/common' +import { + FormDto, + FriggApi, + KeyOption, + OrganizationModel, + FormSubmitSuccessModel, + UserModel, +} from '../../gen/fetch' @Injectable() export class FriggClientService { - constructor( - private readonly keyOptionsManagementApi: KeyOptionsManagementApi, - private readonly defaultApi: DefaultApi, - ) {} + constructor(private readonly friggApi: FriggApi) {} - private keyOptionsManagementApiWithAuth = (user: User) => - this.keyOptionsManagementApi.withMiddleware( - new AuthMiddleware(user as Auth), - ) + private friggApiWithAuth = (user: User) => + this.friggApi.withMiddleware(new AuthMiddleware(user as Auth)) - private defaultApiWithAuth = (user: User) => - this.defaultApi.withMiddleware(new AuthMiddleware(user as Auth)) + async getAllKeyOptions( + user: User, + type: string | undefined, + ): Promise { + return await this.friggApiWithAuth(user).getAllKeyOptions({ + type: type, + }) + } - async getHealth(user: User): Promise { - return this.defaultApiWithAuth(user).health() + async getAllSchoolsByMunicipality(user: User): Promise { + return await this.friggApiWithAuth(user).getAllSchoolsByMunicipality() } - async getAllKeyOptions(user: User, type: string): Promise { - return this.keyOptionsManagementApiWithAuth(user).getAllKeyOptions({ - type, + async getUserById(user: User, childNationalId: string): Promise { + return await this.friggApiWithAuth(user).getUserBySourcedId({ + nationalId: childNationalId, }) } - async getTypes(user: User): Promise { - return this.keyOptionsManagementApiWithAuth(user).getTypes() + sendApplication(user: User, form: FormDto): Promise { + return this.friggApiWithAuth(user).submitForm({ formDto: form }) } } From 8594e5631759eed742f606ad8288cbb74df291d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dvar=20Oddsson?= Date: Mon, 7 Oct 2024 08:21:44 +0000 Subject: [PATCH 16/20] feat(j-s): Display service status (#16177) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Locks subpoena fields when arraignment date has been set * Show subpoena status * Move arraignment date message handling to the server side * Updates tests and fixes date comparison * Change subpoena data structure * Checkpoint * Map ServiceStatus to human readable text * Defender and electronically service * Schedules new subpoenas * Enforces operation ordering * Only sends query parameters with new subpoena requests * Service to defender * Sort in asc order * Cleanup * Checkpoint * Supports multiple subpoenas per defendant * Updates unit tests * Updates unit test * Fixes some typs and null reference guards * Improved type declaration * Improved date formatting * Improves indexing * Fixes spelling * Fixes indexing * Fixes optional arguments * Removes redundant constructor * Fix key error * Remove unused import * Remove unused import * Fix tests * Checkpoint * Checkpoint * Checkpoint * Save subpoena status in DB * Error handling * Move error handling * Update police.service.ts * Merge * Update police.service.ts * Update police.service.ts * Update police.service.ts * Error handling in frontend * Cleanup * Cleanup * Cleanup * Revert processing * Cleanup * Error handling * Add to prosecutor screen * Remove double encoding code * Hide ServiceAnnouncement if no subpoena id * Use correct data * Add defender national id * Fix Slack log * Rename interface * fix(j-s): xrd fixes * Update app.service.ts * Update updateSubpoena.dto.ts * fix(j-s): module import * Revert "fix(j-s): module import" This reverts commit a11885ca0a325cc18468e97766d29d5e2a6b9346. * Update createTestingPoliceModule.ts --------- Co-authored-by: Guðjón Guðjónsson Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: unakb --- .../app/modules/backend/backend.service.ts | 8 + .../api/src/app/modules/defendant/index.ts | 1 + .../defendant/models/subpoena.model.ts | 24 ++- .../police/dto/subpoenaStatus.input.ts | 14 ++ .../api/src/app/modules/police/index.ts | 1 + .../police/models/subpoenaStatus.model.ts | 21 +++ .../src/app/modules/police/police.resolver.ts | 22 +++ .../20240925130059-update-subpoena.js | 87 +++++++++++ .../app/modules/case/internalCase.service.ts | 1 - .../getIndictmentPdfGuards.spec.ts | 2 - .../src/app/modules/event/event.service.ts | 1 - .../getCaseFileSignedUrlGuards.spec.ts | 2 - .../app/modules/police/police.controller.ts | 27 +++- .../src/app/modules/police/police.module.ts | 3 +- .../src/app/modules/police/police.service.ts | 101 +++++++++++- .../police/test/createTestingPoliceModule.ts | 3 + .../subpoena/dto/updateSubpoena.dto.ts | 17 +- .../modules/subpoena/models/subpoena.model.ts | 22 ++- .../web/messages/Core/errors.ts | 12 ++ .../src/components/FormProvider/case.graphql | 7 + .../ServiceAnnouncement.strings.ts | 39 +++++ .../ServiceAnnouncement.tsx | 147 ++++++++++++++++++ .../web/src/components/index.ts | 1 + .../Court/Indictments/Overview/Overview.tsx | 14 ++ .../Indictments/Overview/Overview.tsx | 10 ++ .../web/src/utils/hooks/index.ts | 1 + .../useSubpoena/getSubpoenaStatus.graphql | 9 ++ .../web/src/utils/hooks/useSubpoena/index.ts | 20 +++ .../xrd-api/src/app/app.service.ts | 73 ++++++--- .../xrd-api/src/app/dto/subpoena.dto.ts | 10 +- .../audit-trail/src/lib/auditTrail.service.ts | 1 + libs/judicial-system/types/src/index.ts | 1 + .../types/src/lib/defendant.ts | 8 + 33 files changed, 657 insertions(+), 53 deletions(-) create mode 100644 apps/judicial-system/api/src/app/modules/police/dto/subpoenaStatus.input.ts create mode 100644 apps/judicial-system/api/src/app/modules/police/models/subpoenaStatus.model.ts create mode 100644 apps/judicial-system/backend/migrations/20240925130059-update-subpoena.js create mode 100644 apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.strings.ts create mode 100644 apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.tsx create mode 100644 apps/judicial-system/web/src/utils/hooks/useSubpoena/getSubpoenaStatus.graphql create mode 100644 apps/judicial-system/web/src/utils/hooks/useSubpoena/index.ts diff --git a/apps/judicial-system/api/src/app/modules/backend/backend.service.ts b/apps/judicial-system/api/src/app/modules/backend/backend.service.ts index 5a42b29ab8a7..099c3bf98b10 100644 --- a/apps/judicial-system/api/src/app/modules/backend/backend.service.ts +++ b/apps/judicial-system/api/src/app/modules/backend/backend.service.ts @@ -41,6 +41,7 @@ import { Institution } from '../institution' import { PoliceCaseFile, PoliceCaseInfo, + SubpoenaStatus, UploadPoliceCaseFileResponse, } from '../police' import { backendModuleConfig } from './backend.config' @@ -306,6 +307,13 @@ export class BackendService extends DataSource<{ req: Request }> { return this.get(`case/${caseId}/policeFiles`) } + getSubpoenaStatus( + caseId: string, + subpoenaId: string, + ): Promise { + return this.get(`case/${caseId}/subpoenaStatus/${subpoenaId}`) + } + getPoliceCaseInfo(caseId: string): Promise { return this.get(`case/${caseId}/policeCaseInfo`) } diff --git a/apps/judicial-system/api/src/app/modules/defendant/index.ts b/apps/judicial-system/api/src/app/modules/defendant/index.ts index 0811956a0ca8..040ddad841e3 100644 --- a/apps/judicial-system/api/src/app/modules/defendant/index.ts +++ b/apps/judicial-system/api/src/app/modules/defendant/index.ts @@ -2,3 +2,4 @@ export { Defendant } from './models/defendant.model' export { DeleteDefendantResponse } from './models/delete.response' export { CivilClaimant } from './models/civilClaimant.model' export { DeleteCivilClaimantResponse } from './models/deleteCivilClaimant.response' +export { Subpoena } from './models/subpoena.model' diff --git a/apps/judicial-system/api/src/app/modules/defendant/models/subpoena.model.ts b/apps/judicial-system/api/src/app/modules/defendant/models/subpoena.model.ts index 9a810b1edc10..2bd991c2d4d8 100644 --- a/apps/judicial-system/api/src/app/modules/defendant/models/subpoena.model.ts +++ b/apps/judicial-system/api/src/app/modules/defendant/models/subpoena.model.ts @@ -1,4 +1,8 @@ -import { Field, ID, ObjectType } from '@nestjs/graphql' +import { Field, ID, ObjectType, registerEnumType } from '@nestjs/graphql' + +import { ServiceStatus } from '@island.is/judicial-system/types' + +registerEnumType(ServiceStatus, { name: 'ServiceStatus' }) @ObjectType() export class Subpoena { @@ -14,15 +18,27 @@ export class Subpoena { @Field(() => String, { nullable: true }) subpoenaId?: string - @Field(() => Boolean, { nullable: true }) - acknowledged?: boolean + @Field(() => String, { nullable: true }) + defendantId?: string + + @Field(() => String, { nullable: true }) + caseId?: string + + @Field(() => ServiceStatus, { nullable: true }) + serviceStatus?: ServiceStatus + + @Field(() => String, { nullable: true }) + serviceDate?: string @Field(() => String, { nullable: true }) - registeredBy?: string + servedBy?: string @Field(() => String, { nullable: true }) comment?: string + @Field(() => String, { nullable: true }) + defenderNationalId?: string + @Field(() => String, { nullable: true }) arraignmentDate?: string diff --git a/apps/judicial-system/api/src/app/modules/police/dto/subpoenaStatus.input.ts b/apps/judicial-system/api/src/app/modules/police/dto/subpoenaStatus.input.ts new file mode 100644 index 000000000000..dcc11761c0be --- /dev/null +++ b/apps/judicial-system/api/src/app/modules/police/dto/subpoenaStatus.input.ts @@ -0,0 +1,14 @@ +import { Allow } from 'class-validator' + +import { Field, ID, InputType } from '@nestjs/graphql' + +@InputType() +export class SubpoenaStatusQueryInput { + @Allow() + @Field(() => ID) + readonly caseId!: string + + @Allow() + @Field(() => ID) + readonly subpoenaId!: string +} diff --git a/apps/judicial-system/api/src/app/modules/police/index.ts b/apps/judicial-system/api/src/app/modules/police/index.ts index c2c2457a57b5..a1fe72f38c8e 100644 --- a/apps/judicial-system/api/src/app/modules/police/index.ts +++ b/apps/judicial-system/api/src/app/modules/police/index.ts @@ -1,3 +1,4 @@ export { PoliceCaseInfo } from './models/policeCaseInfo.model' +export { SubpoenaStatus } from './models/subpoenaStatus.model' export { PoliceCaseFile } from './models/policeCaseFile.model' export { UploadPoliceCaseFileResponse } from './models/uploadPoliceCaseFile.response' diff --git a/apps/judicial-system/api/src/app/modules/police/models/subpoenaStatus.model.ts b/apps/judicial-system/api/src/app/modules/police/models/subpoenaStatus.model.ts new file mode 100644 index 000000000000..b4617bfe58a4 --- /dev/null +++ b/apps/judicial-system/api/src/app/modules/police/models/subpoenaStatus.model.ts @@ -0,0 +1,21 @@ +import { Field, ObjectType } from '@nestjs/graphql' + +import { ServiceStatus } from '@island.is/judicial-system/types' + +@ObjectType() +export class SubpoenaStatus { + @Field(() => ServiceStatus) + readonly serviceStatus!: ServiceStatus + + @Field(() => String, { nullable: true }) + readonly servedBy?: string + + @Field(() => String, { nullable: true }) + readonly comment?: string + + @Field(() => String, { nullable: true }) + readonly serviceDate?: string + + @Field(() => String, { nullable: true }) + readonly defenderNationalId?: string +} diff --git a/apps/judicial-system/api/src/app/modules/police/police.resolver.ts b/apps/judicial-system/api/src/app/modules/police/police.resolver.ts index 8d4fbf9cd90a..1eef19336e76 100644 --- a/apps/judicial-system/api/src/app/modules/police/police.resolver.ts +++ b/apps/judicial-system/api/src/app/modules/police/police.resolver.ts @@ -17,9 +17,11 @@ import type { User } from '@island.is/judicial-system/types' import { BackendService } from '../backend' import { PoliceCaseFilesQueryInput } from './dto/policeCaseFiles.input' import { PoliceCaseInfoQueryInput } from './dto/policeCaseInfo.input' +import { SubpoenaStatusQueryInput } from './dto/subpoenaStatus.input' import { UploadPoliceCaseFileInput } from './dto/uploadPoliceCaseFile.input' import { PoliceCaseFile } from './models/policeCaseFile.model' import { PoliceCaseInfo } from './models/policeCaseInfo.model' +import { SubpoenaStatus } from './models/subpoenaStatus.model' import { UploadPoliceCaseFileResponse } from './models/uploadPoliceCaseFile.response' @UseGuards(JwtGraphQlAuthGuard) @@ -49,6 +51,26 @@ export class PoliceResolver { ) } + @Query(() => SubpoenaStatus, { nullable: true }) + subpoenaStatus( + @Args('input', { type: () => SubpoenaStatusQueryInput }) + input: SubpoenaStatusQueryInput, + @CurrentGraphQlUser() user: User, + @Context('dataSources') + { backendService }: { backendService: BackendService }, + ): Promise { + this.logger.debug( + `Getting subpoena status for subpoena ${input.subpoenaId} of case ${input.caseId}`, + ) + + return this.auditTrailService.audit( + user.id, + AuditedAction.GET_SUBPOENA_STATUS, + backendService.getSubpoenaStatus(input.caseId, input.subpoenaId), + input.caseId, + ) + } + @Query(() => [PoliceCaseInfo], { nullable: true }) policeCaseInfo( @Args('input', { type: () => PoliceCaseInfoQueryInput }) diff --git a/apps/judicial-system/backend/migrations/20240925130059-update-subpoena.js b/apps/judicial-system/backend/migrations/20240925130059-update-subpoena.js new file mode 100644 index 000000000000..43ae74f21010 --- /dev/null +++ b/apps/judicial-system/backend/migrations/20240925130059-update-subpoena.js @@ -0,0 +1,87 @@ +'use strict' + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.sequelize.transaction((transaction) => + queryInterface + .changeColumn( + 'subpoena', + 'acknowledged', + { type: Sequelize.STRING, allowNull: true }, + { transaction }, + ) + .then( + () => + queryInterface.renameColumn( + 'subpoena', + 'acknowledged', + 'service_status', + { transaction }, + ), + + queryInterface.renameColumn( + 'subpoena', + 'acknowledged_date', + 'service_date', + { transaction }, + ), + + queryInterface.renameColumn( + 'subpoena', + 'registered_by', + 'served_by', + { transaction }, + ), + + queryInterface.addColumn( + 'subpoena', + 'defender_national_id', + { + type: Sequelize.STRING, + allowNull: true, + }, + { transaction }, + ), + ), + ) + }, + + down: (queryInterface) => { + return queryInterface.sequelize.transaction((transaction) => + queryInterface + .renameColumn('subpoena', 'service_status', 'acknowledged', { + transaction, + }) + .then( + () => + queryInterface.changeColumn( + 'subpoena', + 'acknowledged', + { + type: 'BOOLEAN USING CAST("acknowledged" as BOOLEAN)', + allowNull: true, + }, + { transaction }, + ), + + queryInterface.renameColumn( + 'subpoena', + 'service_date', + 'acknowledged_date', + { transaction }, + ), + + queryInterface.renameColumn( + 'subpoena', + 'served_by', + 'registered_by', + { transaction }, + ), + + queryInterface.removeColumn('subpoena', 'defender_national_id', { + transaction, + }), + ), + ) + }, +} diff --git a/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts b/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts index 26377502db54..dd1271f2ba0b 100644 --- a/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts +++ b/apps/judicial-system/backend/src/app/modules/case/internalCase.service.ts @@ -1,7 +1,6 @@ import CryptoJS from 'crypto-js' import format from 'date-fns/format' import { Base64 } from 'js-base64' -import { Op } from 'sequelize' import { Sequelize } from 'sequelize-typescript' import { diff --git a/apps/judicial-system/backend/src/app/modules/case/test/caseController/getIndictmentPdfGuards.spec.ts b/apps/judicial-system/backend/src/app/modules/case/test/caseController/getIndictmentPdfGuards.spec.ts index d86a9827ce80..b84a86bd3d9d 100644 --- a/apps/judicial-system/backend/src/app/modules/case/test/caseController/getIndictmentPdfGuards.spec.ts +++ b/apps/judicial-system/backend/src/app/modules/case/test/caseController/getIndictmentPdfGuards.spec.ts @@ -1,5 +1,3 @@ -import { CanActivate } from '@nestjs/common' - import { JwtAuthGuard, RolesGuard } from '@island.is/judicial-system/auth' import { indictmentCases } from '@island.is/judicial-system/types' diff --git a/apps/judicial-system/backend/src/app/modules/event/event.service.ts b/apps/judicial-system/backend/src/app/modules/event/event.service.ts index aeac0ff7f26d..56c762f6299a 100644 --- a/apps/judicial-system/backend/src/app/modules/event/event.service.ts +++ b/apps/judicial-system/backend/src/app/modules/event/event.service.ts @@ -18,7 +18,6 @@ import { } from '@island.is/judicial-system/types' import { type Case } from '../case' -import { CaseString } from '../case/models/caseString.model' import { DateLog } from '../case/models/dateLog.model' import { eventModuleConfig } from './event.config' diff --git a/apps/judicial-system/backend/src/app/modules/file/test/fileController/getCaseFileSignedUrlGuards.spec.ts b/apps/judicial-system/backend/src/app/modules/file/test/fileController/getCaseFileSignedUrlGuards.spec.ts index 88c3d0946486..e23a72d4273b 100644 --- a/apps/judicial-system/backend/src/app/modules/file/test/fileController/getCaseFileSignedUrlGuards.spec.ts +++ b/apps/judicial-system/backend/src/app/modules/file/test/fileController/getCaseFileSignedUrlGuards.spec.ts @@ -1,5 +1,3 @@ -import { CanActivate } from '@nestjs/common' - import { RolesGuard } from '@island.is/judicial-system/auth' import { CaseExistsGuard, CaseReadGuard } from '../../../case' diff --git a/apps/judicial-system/backend/src/app/modules/police/police.controller.ts b/apps/judicial-system/backend/src/app/modules/police/police.controller.ts index 2d6321e6bc14..7eaa7773c91b 100644 --- a/apps/judicial-system/backend/src/app/modules/police/police.controller.ts +++ b/apps/judicial-system/backend/src/app/modules/police/police.controller.ts @@ -21,7 +21,11 @@ import { } from '@island.is/judicial-system/auth' import type { User } from '@island.is/judicial-system/types' -import { prosecutorRepresentativeRule, prosecutorRule } from '../../guards' +import { + districtCourtJudgeRule, + prosecutorRepresentativeRule, + prosecutorRule, +} from '../../guards' import { Case, CaseExistsGuard, @@ -30,6 +34,7 @@ import { CaseReadGuard, CurrentCase, } from '../case' +import { Subpoena } from '../subpoena' import { UploadPoliceCaseFileDto } from './dto/uploadPoliceCaseFile.dto' import { PoliceCaseFile } from './models/policeCaseFile.model' import { PoliceCaseInfo } from './models/policeCaseInfo.model' @@ -69,6 +74,26 @@ export class PoliceController { return this.policeService.getAllPoliceCaseFiles(theCase.id, user) } + @RolesRules( + prosecutorRule, + prosecutorRepresentativeRule, + districtCourtJudgeRule, + ) + @Get('subpoenaStatus/:subpoenaId') + @ApiOkResponse({ + type: Subpoena, + description: 'Gets subpoena status', + }) + getSubpoenaStatus( + @Param('subpoenaId') subpoenaId: string, + @CurrentCase() theCase: Case, + @CurrentHttpUser() user: User, + ): Promise { + this.logger.debug(`Gets subpoena status in case ${theCase.id}`) + + return this.policeService.getSubpoenaStatus(subpoenaId, user) + } + @RolesRules(prosecutorRule, prosecutorRepresentativeRule) @UseInterceptors(CaseOriginalAncestorInterceptor) @Get('policeCaseInfo') diff --git a/apps/judicial-system/backend/src/app/modules/police/police.module.ts b/apps/judicial-system/backend/src/app/modules/police/police.module.ts index 37f05ff5e4dc..1df72c2b8794 100644 --- a/apps/judicial-system/backend/src/app/modules/police/police.module.ts +++ b/apps/judicial-system/backend/src/app/modules/police/police.module.ts @@ -1,6 +1,6 @@ import { forwardRef, Module } from '@nestjs/common' -import { AwsS3Module, CaseModule, EventModule } from '../index' +import { AwsS3Module, CaseModule, EventModule, SubpoenaModule } from '../index' import { PoliceController } from './police.controller' import { PoliceService } from './police.service' @@ -9,6 +9,7 @@ import { PoliceService } from './police.service' forwardRef(() => CaseModule), forwardRef(() => EventModule), forwardRef(() => AwsS3Module), + forwardRef(() => SubpoenaModule), ], providers: [PoliceService], exports: [PoliceService], diff --git a/apps/judicial-system/backend/src/app/modules/police/police.service.ts b/apps/judicial-system/backend/src/app/modules/police/police.service.ts index 39cd3ed543d4..b4a9d5e2848a 100644 --- a/apps/judicial-system/backend/src/app/modules/police/police.service.ts +++ b/apps/judicial-system/backend/src/app/modules/police/police.service.ts @@ -23,13 +23,19 @@ import { import { normalizeAndFormatNationalId } from '@island.is/judicial-system/formatters' import type { User } from '@island.is/judicial-system/types' -import { CaseState, CaseType } from '@island.is/judicial-system/types' +import { + CaseState, + CaseType, + ServiceStatus, +} from '@island.is/judicial-system/types' import { nowFactory } from '../../factories' import { AwsS3Service } from '../aws-s3' import { Case } from '../case' import { Defendant } from '../defendant/models/defendant.model' import { EventService } from '../event' +import { Subpoena, SubpoenaService } from '../subpoena' +import { UpdateSubpoenaDto } from '../subpoena/dto/updateSubpoena.dto' import { UploadPoliceCaseFileDto } from './dto/uploadPoliceCaseFile.dto' import { CreateSubpoenaResponse } from './models/createSubpoena.response' import { PoliceCaseFile } from './models/policeCaseFile.model' @@ -122,6 +128,18 @@ export class PoliceService { skjol: z.optional(z.array(this.policeCaseFileStructure)), malseinings: z.optional(z.array(this.crimeSceneStructure)), }) + private subpoenaStructure = z.object({ + acknowledged: z.boolean().nullish(), + comment: z.string().nullish(), + defenderChoice: z.string().nullish(), + defenderNationalId: z.string().nullish(), + prosecutedConfirmedSubpoenaThroughIslandis: z.boolean().nullish(), + servedBy: z.string().nullish(), + servedAt: z.string().nullish(), + delivered: z.boolean().nullish(), + deliveredOnPaper: z.boolean().nullish(), + deliveredToLawyer: z.boolean().nullish(), + }) constructor( @Inject(policeModuleConfig.KEY) @@ -130,6 +148,8 @@ export class PoliceService { private readonly eventService: EventService, @Inject(forwardRef(() => AwsS3Service)) private readonly awsS3Service: AwsS3Service, + @Inject(forwardRef(() => SubpoenaService)) + private readonly subpoenaService: SubpoenaService, @Inject(LOGGER_PROVIDER) private readonly logger: Logger, ) { this.xRoadPath = createXRoadAPIPath( @@ -316,6 +336,85 @@ export class PoliceService { }) } + async getSubpoenaStatus(subpoenaId: string, user: User): Promise { + return this.fetchPoliceDocumentApi( + `${this.xRoadPath}/GetSubpoenaStatus?id=${subpoenaId}`, + ) + .then(async (res: Response) => { + if (res.ok) { + const response: z.infer = + await res.json() + + this.subpoenaStructure.parse(response) + + const subpoenaToUpdate = await this.subpoenaService.findBySubpoenaId( + subpoenaId, + ) + + const updatedSubpoena = await this.subpoenaService.update( + subpoenaToUpdate, + { + comment: response.comment ?? undefined, + servedBy: response.servedBy ?? undefined, + defenderNationalId: response.defenderNationalId ?? undefined, + serviceDate: response.servedAt ?? undefined, + serviceStatus: response.deliveredToLawyer + ? ServiceStatus.DEFENDER + : response.prosecutedConfirmedSubpoenaThroughIslandis + ? ServiceStatus.ELECTRONICALLY + : response.deliveredOnPaper || response.delivered === true + ? ServiceStatus.IN_PERSON + : response.acknowledged === false + ? ServiceStatus.FAILED + : // TODO: handle expired + undefined, + } as UpdateSubpoenaDto, + ) + + return updatedSubpoena + } + + const reason = await res.text() + + // The police system does not provide a structured error response. + // When a subpoena does not exist, a stack trace is returned. + throw new NotFoundException({ + message: `Subpoena with id ${subpoenaId} does not exist`, + detail: reason, + }) + }) + .catch((reason) => { + if (reason instanceof NotFoundException) { + throw reason + } + + if (reason instanceof ServiceUnavailableException) { + // Act as if the case does not exist + throw new NotFoundException({ + ...reason, + message: `Subpoena ${subpoenaId} does not exist`, + detail: reason.message, + }) + } + + this.eventService.postErrorEvent( + 'Failed to get subpoena', + { + subpoenaId, + actor: user.name, + institution: user.institution?.name, + }, + reason, + ) + + throw new BadGatewayException({ + ...reason, + message: `Failed to get subpoena ${subpoenaId}`, + detail: reason.message, + }) + }) + } + async getPoliceCaseInfo( caseId: string, user: User, diff --git a/apps/judicial-system/backend/src/app/modules/police/test/createTestingPoliceModule.ts b/apps/judicial-system/backend/src/app/modules/police/test/createTestingPoliceModule.ts index fb00a32daf9b..c97b49711f23 100644 --- a/apps/judicial-system/backend/src/app/modules/police/test/createTestingPoliceModule.ts +++ b/apps/judicial-system/backend/src/app/modules/police/test/createTestingPoliceModule.ts @@ -12,6 +12,7 @@ import { AwsS3Service } from '../../aws-s3' import { CaseService } from '../../case' import { InternalCaseService } from '../../case/internalCase.service' import { EventService } from '../../event' +import { SubpoenaService } from '../../subpoena' import { policeModuleConfig } from '../police.config' import { PoliceController } from '../police.controller' import { PoliceService } from '../police.service' @@ -20,6 +21,7 @@ jest.mock('../../event/event.service') jest.mock('../../aws-s3/awsS3.service.ts') jest.mock('../../case/case.service.ts') jest.mock('../../case/internalCase.service.ts') +jest.mock('../../subpoena/subpoena.service.ts') export const createTestingPoliceModule = async () => { const policeModule = await Test.createTestingModule({ @@ -36,6 +38,7 @@ export const createTestingPoliceModule = async () => { CaseService, InternalCaseService, PoliceService, + SubpoenaService, { provide: LOGGER_PROVIDER, useValue: { diff --git a/apps/judicial-system/backend/src/app/modules/subpoena/dto/updateSubpoena.dto.ts b/apps/judicial-system/backend/src/app/modules/subpoena/dto/updateSubpoena.dto.ts index b482b972be30..1b93bdd29b27 100644 --- a/apps/judicial-system/backend/src/app/modules/subpoena/dto/updateSubpoena.dto.ts +++ b/apps/judicial-system/backend/src/app/modules/subpoena/dto/updateSubpoena.dto.ts @@ -1,19 +1,24 @@ -import { IsBoolean, IsEnum, IsOptional, IsString } from 'class-validator' +import { IsDate, IsEnum, IsOptional, IsString } from 'class-validator' import { ApiPropertyOptional } from '@nestjs/swagger' -import { DefenderChoice } from '@island.is/judicial-system/types' +import { DefenderChoice, ServiceStatus } from '@island.is/judicial-system/types' export class UpdateSubpoenaDto { @IsOptional() - @IsBoolean() - @ApiPropertyOptional({ type: Boolean }) - readonly acknowledged?: boolean + @IsEnum(ServiceStatus) + @ApiPropertyOptional({ enum: ServiceStatus }) + readonly serviceStatus?: ServiceStatus @IsOptional() @IsString() @ApiPropertyOptional({ type: String }) - readonly registeredBy?: string + readonly servedBy?: string + + @IsOptional() + @IsString() + @ApiPropertyOptional({ type: String }) + readonly serviceDate?: string @IsOptional() @IsString() diff --git a/apps/judicial-system/backend/src/app/modules/subpoena/models/subpoena.model.ts b/apps/judicial-system/backend/src/app/modules/subpoena/models/subpoena.model.ts index 1de50a941e03..513d5daa5a2d 100644 --- a/apps/judicial-system/backend/src/app/modules/subpoena/models/subpoena.model.ts +++ b/apps/judicial-system/backend/src/app/modules/subpoena/models/subpoena.model.ts @@ -11,6 +11,8 @@ import { import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger' +import { ServiceStatus } from '@island.is/judicial-system/types' + import { Case } from '../../case/models/case.model' import { Defendant } from '../../defendant/models/defendant.model' @@ -57,18 +59,30 @@ export class Subpoena extends Model { @ApiPropertyOptional({ type: Case }) case?: Case - @Column({ type: DataType.BOOLEAN, allowNull: true }) - @ApiPropertyOptional({ type: Boolean }) - acknowledged?: boolean + @Column({ + type: DataType.ENUM, + allowNull: true, + values: Object.values(ServiceStatus), + }) + @ApiPropertyOptional({ enum: ServiceStatus }) + serviceStatus?: ServiceStatus + + @Column({ type: DataType.DATE, allowNull: true }) + @ApiPropertyOptional({ type: Date }) + serviceDate?: Date @Column({ type: DataType.STRING, allowNull: true }) @ApiPropertyOptional({ type: String }) - registeredBy?: string + servedBy?: string @Column({ type: DataType.TEXT, allowNull: true }) @ApiPropertyOptional({ type: String }) comment?: string + @Column({ type: DataType.STRING, allowNull: true }) + @ApiPropertyOptional({ type: String }) + defenderNationalId?: string + @Column({ type: DataType.DATE, allowNull: false }) @ApiProperty({ type: Date }) arraignmentDate!: Date diff --git a/apps/judicial-system/web/messages/Core/errors.ts b/apps/judicial-system/web/messages/Core/errors.ts index 3123d4e8745c..2f3a6f63c441 100644 --- a/apps/judicial-system/web/messages/Core/errors.ts +++ b/apps/judicial-system/web/messages/Core/errors.ts @@ -145,4 +145,16 @@ export const errors = defineMessages({ defaultMessage: 'Upp kom villa við að opna skjal', description: 'Notaður sem villuskilaboð þegar ekki gengur að opna skjal', }, + getSubpoenaStatusTitle: { + id: 'judicial.system.core:errors.get_subpoena_status_title', + defaultMessage: 'Ekki tókst að sækja stöðu birtingar', + description: + 'Notaður sem villuskilaboð þegar tekst að sækja stöðu birtingar', + }, + getSubpoenaStatus: { + id: 'judicial.system.core:errors.get_subpoena_status', + defaultMessage: 'Vinsamlegast reyndu aftur síðar', + description: + 'Notaður sem villuskilaboð þegar tekst að sækja stöðu birtingar', + }, }) diff --git a/apps/judicial-system/web/src/components/FormProvider/case.graphql b/apps/judicial-system/web/src/components/FormProvider/case.graphql index 64acb88c88c8..d45521ec30d9 100644 --- a/apps/judicial-system/web/src/components/FormProvider/case.graphql +++ b/apps/judicial-system/web/src/components/FormProvider/case.graphql @@ -29,6 +29,13 @@ query Case($input: CaseQueryInput!) { subpoenas { id created + serviceStatus + serviceDate + servedBy + comment + defenderNationalId + caseId + subpoenaId } } defenderName diff --git a/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.strings.ts b/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.strings.ts new file mode 100644 index 000000000000..a145bc5b8307 --- /dev/null +++ b/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.strings.ts @@ -0,0 +1,39 @@ +import { defineMessages } from 'react-intl' + +export const strings = defineMessages({ + serviceStatusSuccess: { + id: 'judicial.system.core:service_announcement.service_status_success', + defaultMessage: 'Birting tókst', + description: 'Notaður sem texti þegar birting tókst.', + }, + serviceStatusExpired: { + id: 'judicial.system.core:service_announcement.service_status_expired', + defaultMessage: 'Birting tókst ekki', + description: 'Notaður sem texti þegar birting rann út á tíma.', + }, + serviceStatusExpiredMessage: { + id: 'judicial.system.core:service_announcement.service_status_expired_message', + defaultMessage: 'Ekki tókst að birta fyrir þingfestingu.', + description: 'Notaður sem texti þegar birting rann út á tíma.', + }, + serviceStatusFailed: { + id: 'judicial.system.core:service_announcement.service_status_failed', + defaultMessage: 'Árangurslaus birting', + description: 'Notaður sem texti þegar birting tókst ekki.', + }, + serviceStatusUnknown: { + id: 'judicial.system.core:service_announcement.service_status_unknown', + defaultMessage: 'Birtingastaða óþekkt', + description: 'Notaður sem texti þegar ekki er vitað um stöðu birtingar.', + }, + servedToDefender: { + id: 'judicial.system.core:service_announcement.served_to_defender', + defaultMessage: 'Birt fyrir verjanda - {lawyerName} {practice}', + description: 'Notaður sem texti þegar birti var verjanda.', + }, + servedToElectronically: { + id: 'judicial.system.core:service_announcement.served_electronically', + defaultMessage: 'Rafrænt pósthólf island.is - {date}', + description: 'Notaður sem texti þegar birti var í pósthólfi.', + }, +}) diff --git a/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.tsx b/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.tsx new file mode 100644 index 000000000000..3da5a6a2af5a --- /dev/null +++ b/apps/judicial-system/web/src/components/ServiceAnnouncement/ServiceAnnouncement.tsx @@ -0,0 +1,147 @@ +import { FC, useEffect, useState } from 'react' +import { IntlShape, MessageDescriptor, useIntl } from 'react-intl' + +import { AlertMessage, Box, LoadingDots, Text } from '@island.is/island-ui/core' +import { formatDate } from '@island.is/judicial-system/formatters' +import { type Lawyer } from '@island.is/judicial-system/types' +import { errors } from '@island.is/judicial-system-web/messages' +import { + ServiceStatus, + Subpoena, +} from '@island.is/judicial-system-web/src/graphql/schema' + +import { useGetLawyer, useSubpoena } from '../../utils/hooks' +import { SubpoenaStatusQuery } from '../../utils/hooks/useSubpoena/getSubpoenaStatus.generated' +import { strings } from './ServiceAnnouncement.strings' + +const mapServiceStatusTitle = ( + serviceStatus?: ServiceStatus | null, +): MessageDescriptor => { + switch (serviceStatus) { + case ServiceStatus.DEFENDER: + case ServiceStatus.ELECTRONICALLY: + case ServiceStatus.IN_PERSON: + return strings.serviceStatusSuccess + case ServiceStatus.EXPIRED: + return strings.serviceStatusExpired + case ServiceStatus.FAILED: + return strings.serviceStatusFailed + // Should not happen + default: + return strings.serviceStatusUnknown + } +} + +const mapServiceStatusMessages = ( + subpoena: Subpoena, + formatMessage: IntlShape['formatMessage'], + lawyer?: Lawyer, +) => { + switch (subpoena.serviceStatus) { + case ServiceStatus.DEFENDER: + return [ + `${subpoena.servedBy} - ${formatDate(subpoena.serviceDate, 'Pp')}`, + formatMessage(strings.servedToDefender, { + lawyerName: lawyer?.name, + practice: lawyer?.practice, + }), + ] + case ServiceStatus.ELECTRONICALLY: + return [ + formatMessage(strings.servedToElectronically, { + date: formatDate(subpoena.serviceDate, 'Pp'), + }), + ] + case ServiceStatus.IN_PERSON: + case ServiceStatus.FAILED: + return [ + `${subpoena.servedBy} - ${formatDate(subpoena.serviceDate, 'Pp')}`, + subpoena.comment, + ] + case ServiceStatus.EXPIRED: + return [formatMessage(strings.serviceStatusExpiredMessage)] + default: + return [] + } +} + +const renderError = (formatMessage: IntlShape['formatMessage']) => ( + +) + +interface ServiceAnnouncementProps { + subpoena: Subpoena + defendantName?: string | null +} + +const ServiceAnnouncement: FC = (props) => { + const { subpoena: localSubpoena, defendantName } = props + + const [subpoena, setSubpoena] = useState() + + const { subpoenaStatus, subpoenaStatusLoading, subpoenaStatusError } = + useSubpoena(localSubpoena.caseId, localSubpoena.subpoenaId) + + const { formatMessage } = useIntl() + + const lawyer = useGetLawyer( + subpoena?.defenderNationalId, + subpoena?.serviceStatus === ServiceStatus.DEFENDER, + ) + + const title = mapServiceStatusTitle(subpoena?.serviceStatus) + const messages = subpoena + ? mapServiceStatusMessages(subpoena, formatMessage, lawyer) + : [] + + // Use data from RLS but fallback to local data + useEffect(() => { + if (subpoenaStatusError) { + setSubpoena(localSubpoena) + } else { + setSubpoena({ + ...localSubpoena, + servedBy: subpoenaStatus?.subpoenaStatus?.servedBy, + serviceStatus: subpoenaStatus?.subpoenaStatus?.serviceStatus, + serviceDate: subpoenaStatus?.subpoenaStatus?.serviceDate, + comment: subpoenaStatus?.subpoenaStatus?.comment, + defenderNationalId: subpoenaStatus?.subpoenaStatus?.defenderNationalId, + }) + } + }, [localSubpoena, subpoenaStatus, subpoenaStatusError]) + + return !defendantName ? null : !subpoena && !subpoenaStatusLoading ? ( + {renderError(formatMessage)} + ) : subpoenaStatusLoading ? ( + + + + ) : ( + + + {messages.map((msg) => ( + + {msg} + + ))} + + } + type={ + subpoena?.serviceStatus === ServiceStatus.FAILED || + subpoena?.serviceStatus === ServiceStatus.EXPIRED + ? 'warning' + : 'success' + } + /> + + ) +} + +export default ServiceAnnouncement diff --git a/apps/judicial-system/web/src/components/index.ts b/apps/judicial-system/web/src/components/index.ts index fa0cfce3c06f..85c50b4f5967 100644 --- a/apps/judicial-system/web/src/components/index.ts +++ b/apps/judicial-system/web/src/components/index.ts @@ -62,6 +62,7 @@ export { default as RestrictionTags } from './RestrictionTags/RestrictionTags' export { default as RulingAccordionItem } from './AccordionItems/RulingAccordionItem/RulingAccordionItem' export { default as RulingInput } from './RulingInput/RulingInput' export { default as SectionHeading } from './SectionHeading/SectionHeading' +export { default as ServiceAnnouncement } from './ServiceAnnouncement/ServiceAnnouncement' export { default as ServiceInterruptionBanner } from './ServiceInterruptionBanner/ServiceInterruptionBanner' export { default as SignedDocument } from './SignedDocument/SignedDocument' export { default as OverviewHeader } from './OverviewHeader/OverviewHeader' diff --git a/apps/judicial-system/web/src/routes/Court/Indictments/Overview/Overview.tsx b/apps/judicial-system/web/src/routes/Court/Indictments/Overview/Overview.tsx index 176c08156d9e..bf1f5cfedb8a 100644 --- a/apps/judicial-system/web/src/routes/Court/Indictments/Overview/Overview.tsx +++ b/apps/judicial-system/web/src/routes/Court/Indictments/Overview/Overview.tsx @@ -18,6 +18,7 @@ import { PageHeader, PageLayout, PageTitle, + ServiceAnnouncement, useIndictmentsLawsBroken, } from '@island.is/judicial-system-web/src/components' import { IndictmentDecision } from '@island.is/judicial-system-web/src/graphql/schema' @@ -39,6 +40,7 @@ const IndictmentOverview = () => { const latestDate = workingCase.courtDate ?? workingCase.arraignmentDate const isArraignmentScheduled = Boolean(workingCase.arraignmentDate) + // const caseHasBeenReceivedByCourt = workingCase.state === CaseState.RECEIVED const handleNavigationTo = useCallback( @@ -76,6 +78,18 @@ const IndictmentOverview = () => { {formatMessage(strings.inProgressTitle)} + {workingCase.defendants?.map((defendant) => + defendant.subpoenas?.map( + (subpoena) => + subpoena.subpoenaId && ( + + ), + ), + )} {workingCase.court && latestDate?.date && workingCase.indictmentDecision !== IndictmentDecision.COMPLETING && diff --git a/apps/judicial-system/web/src/routes/Prosecutor/Indictments/Overview/Overview.tsx b/apps/judicial-system/web/src/routes/Prosecutor/Indictments/Overview/Overview.tsx index 3c13b47bef12..fc8d3994709c 100644 --- a/apps/judicial-system/web/src/routes/Prosecutor/Indictments/Overview/Overview.tsx +++ b/apps/judicial-system/web/src/routes/Prosecutor/Indictments/Overview/Overview.tsx @@ -29,6 +29,7 @@ import { PageLayout, ProsecutorCaseInfo, SectionHeading, + ServiceAnnouncement, useIndictmentsLawsBroken, UserContext, } from '@island.is/judicial-system-web/src/components' @@ -193,6 +194,15 @@ const Overview: FC = () => { + {workingCase.defendants?.map((defendant) => + defendant.subpoenas?.map((subpoena) => ( + + )), + )} {workingCase.court && latestDate?.date && workingCase.indictmentDecision !== IndictmentDecision.COMPLETING && diff --git a/apps/judicial-system/web/src/utils/hooks/index.ts b/apps/judicial-system/web/src/utils/hooks/index.ts index 3c9d8a29cec0..cc4edd7be94a 100644 --- a/apps/judicial-system/web/src/utils/hooks/index.ts +++ b/apps/judicial-system/web/src/utils/hooks/index.ts @@ -29,3 +29,4 @@ export { default as useSections } from './useSections' export { default as useCaseList } from './useCaseList' export { default as useNationalRegistry } from './useNationalRegistry' export { default as useCivilClaimants } from './useCivilClaimants' +export { default as useSubpoena } from './useSubpoena' diff --git a/apps/judicial-system/web/src/utils/hooks/useSubpoena/getSubpoenaStatus.graphql b/apps/judicial-system/web/src/utils/hooks/useSubpoena/getSubpoenaStatus.graphql new file mode 100644 index 000000000000..a87df3e15366 --- /dev/null +++ b/apps/judicial-system/web/src/utils/hooks/useSubpoena/getSubpoenaStatus.graphql @@ -0,0 +1,9 @@ +query SubpoenaStatus($input: SubpoenaStatusQueryInput!) { + subpoenaStatus(input: $input) { + serviceStatus + servedBy + comment + serviceDate + defenderNationalId + } +} diff --git a/apps/judicial-system/web/src/utils/hooks/useSubpoena/index.ts b/apps/judicial-system/web/src/utils/hooks/useSubpoena/index.ts new file mode 100644 index 000000000000..3d2ab133f847 --- /dev/null +++ b/apps/judicial-system/web/src/utils/hooks/useSubpoena/index.ts @@ -0,0 +1,20 @@ +import { useSubpoenaStatusQuery } from './getSubpoenaStatus.generated' + +const useSubpoena = (caseId?: string | null, subpoenaId?: string | null) => { + const { + data: subpoenaStatus, + loading: subpoenaStatusLoading, + error: subpoenaStatusError, + } = useSubpoenaStatusQuery({ + variables: { + input: { + caseId: caseId ?? '', + subpoenaId: subpoenaId ?? '', + }, + }, + }) + + return { subpoenaStatus, subpoenaStatusLoading, subpoenaStatusError } +} + +export default useSubpoena diff --git a/apps/judicial-system/xrd-api/src/app/app.service.ts b/apps/judicial-system/xrd-api/src/app/app.service.ts index c2e33651586e..202e2dbaf644 100644 --- a/apps/judicial-system/xrd-api/src/app/app.service.ts +++ b/apps/judicial-system/xrd-api/src/app/app.service.ts @@ -16,7 +16,7 @@ import { AuditTrailService, } from '@island.is/judicial-system/audit-trail' import { LawyersService } from '@island.is/judicial-system/lawyers' -import { DefenderChoice } from '@island.is/judicial-system/types' +import { DefenderChoice, ServiceStatus } from '@island.is/judicial-system/types' import { UpdateSubpoenaDto } from './dto/subpoena.dto' import { SubpoenaResponse } from './models/subpoena.response' @@ -96,46 +96,69 @@ export class AppService { subpoenaId: string, updateSubpoena: UpdateSubpoenaDto, ): Promise { - //TODO: Remove this mix - const { - deliveredOnPaper, - prosecutedConfirmedSubpoenaThroughIslandis, - delivered, - deliveredToLawyer, - deliveryInvalidated, - servedBy, - ...update - } = updateSubpoena - - let updatesToSend = { registeredBy: servedBy, ...update } + let defenderInfo: { + defenderName: string | undefined + defenderEmail: string | undefined + defenderPhoneNumber: string | undefined + } = { + defenderName: undefined, + defenderEmail: undefined, + defenderPhoneNumber: undefined, + } if ( - update.defenderChoice === DefenderChoice.CHOOSE && - !update.defenderNationalId + updateSubpoena.defenderChoice === DefenderChoice.CHOOSE && + !updateSubpoena.defenderNationalId ) { throw new BadRequestException( 'Defender national id is required for choice', ) } - if (update.defenderNationalId) { + if (updateSubpoena.defenderNationalId) { try { const chosenLawyer = await this.lawyersService.getLawyer( - update.defenderNationalId, + updateSubpoena.defenderNationalId, ) - updatesToSend = { - ...updatesToSend, - ...{ - defenderName: chosenLawyer.Name, - defenderEmail: chosenLawyer.Email, - defenderPhoneNumber: chosenLawyer.Phone, - }, + defenderInfo = { + defenderName: chosenLawyer.Name, + defenderEmail: chosenLawyer.Email, + defenderPhoneNumber: chosenLawyer.Phone, } } catch (reason) { + // TODO: Reconsider throwing - what happens if registry is down? + this.logger.error( + `Failed to retrieve lawyer with national id ${updateSubpoena.defenderNationalId}`, + reason, + ) throw new BadRequestException('Lawyer not found') } } + //TODO: move logic to reusable place if this is the data structure we keep + const serviceStatus = updateSubpoena.deliveredToLawyer + ? ServiceStatus.DEFENDER + : updateSubpoena.prosecutedConfirmedSubpoenaThroughIslandis + ? ServiceStatus.ELECTRONICALLY + : updateSubpoena.deliveredOnPaper || updateSubpoena.delivered === true + ? ServiceStatus.IN_PERSON + : updateSubpoena.acknowledged === false + ? ServiceStatus.FAILED + : // TODO: handle expired + undefined + + const updateToSend = { + serviceStatus, + comment: updateSubpoena.comment, + servedBy: updateSubpoena.servedBy, + serviceDate: updateSubpoena.servedAt, + defenderChoice: updateSubpoena.defenderChoice, + defenderNationalId: updateSubpoena.defenderNationalId, + defenderName: defenderInfo.defenderName, + defenderEmail: defenderInfo.defenderEmail, + defenderPhoneNumber: defenderInfo.defenderPhoneNumber, + } + try { const res = await fetch( `${this.config.backend.url}/api/internal/subpoena/${subpoenaId}`, @@ -145,7 +168,7 @@ export class AppService { 'Content-Type': 'application/json', authorization: `Bearer ${this.config.backend.accessToken}`, }, - body: JSON.stringify(updatesToSend), + body: JSON.stringify(updateToSend), }, ) diff --git a/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts b/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts index c1a7a319c1a9..edb6ff7db4d6 100644 --- a/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts +++ b/apps/judicial-system/xrd-api/src/app/dto/subpoena.dto.ts @@ -20,6 +20,11 @@ export class UpdateSubpoenaDto { @ApiProperty({ type: String, required: false }) servedBy?: string + @IsOptional() + @IsString() + @ApiProperty({ type: String, required: false }) + servedAt?: string + @IsOptional() @IsEnum(DefenderChoice) @ApiProperty({ enum: DefenderChoice, required: false }) @@ -49,9 +54,4 @@ export class UpdateSubpoenaDto { @IsBoolean() @ApiProperty({ type: Boolean, required: false }) deliveredToLawyer?: boolean - - @IsOptional() - @IsBoolean() - @ApiProperty({ type: Boolean, required: false }) - deliveryInvalidated?: boolean } diff --git a/libs/judicial-system/audit-trail/src/lib/auditTrail.service.ts b/libs/judicial-system/audit-trail/src/lib/auditTrail.service.ts index 91f4de74ca3d..2dba14790572 100644 --- a/libs/judicial-system/audit-trail/src/lib/auditTrail.service.ts +++ b/libs/judicial-system/audit-trail/src/lib/auditTrail.service.ts @@ -40,6 +40,7 @@ export enum AuditedAction { GET_SUBPOENA_PDF = 'GET_SUBPOENA_PDF', GET_ALL_FILES_ZIP = 'GET_ALL_FILES_ZIP', GET_INSTITUTIONS = 'GET_INSTITUTIONS', + GET_SUBPOENA_STATUS = 'GET_SUBPOENA_STATUS', CREATE_PRESIGNED_POST = 'CREATE_PRESIGNED_POST', CREATE_FILE = 'CREATE_FILE', UPDATE_FILES = 'UPDATE_FILES', diff --git a/libs/judicial-system/types/src/index.ts b/libs/judicial-system/types/src/index.ts index 9694c67c1755..899aa61fe4b4 100644 --- a/libs/judicial-system/types/src/index.ts +++ b/libs/judicial-system/types/src/index.ts @@ -6,6 +6,7 @@ export { SubpoenaType, DefendantPlea, ServiceRequirement, + ServiceStatus, } from './lib/defendant' export { InstitutionType } from './lib/institution' export { NotificationType } from './lib/notification' diff --git a/libs/judicial-system/types/src/lib/defendant.ts b/libs/judicial-system/types/src/lib/defendant.ts index 4be363ff2622..5994ab09f293 100644 --- a/libs/judicial-system/types/src/lib/defendant.ts +++ b/libs/judicial-system/types/src/lib/defendant.ts @@ -27,3 +27,11 @@ export enum ServiceRequirement { NOT_REQUIRED = 'NOT_REQUIRED', NOT_APPLICABLE = 'NOT_APPLICABLE', } + +export enum ServiceStatus { + ELECTRONICALLY = 'ELECTRONICALLY', // Via digital mailbox on island.is + DEFENDER = 'DEFENDER', // Via a person's defender + IN_PERSON = 'IN_PERSON', + FAILED = 'FAILED', + EXPIRED = 'EXPIRED', // If a subpoena expires +} From 42d7d9aba0babe38191821c27e2384cb57299e16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAnar=20Vestmann?= <43557895+RunarVestmann@users.noreply.github.com> Date: Mon, 7 Oct 2024 08:59:50 +0000 Subject: [PATCH 17/20] fix(search-indexer): Reduce "missing parameter: index" error logs (#16282) * Only append token if postSync will run * Fetch first page in case we skip --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../src/lib/indexing.service.ts | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/libs/content-search-indexer/src/lib/indexing.service.ts b/libs/content-search-indexer/src/lib/indexing.service.ts index 16be829458a5..697b36537891 100644 --- a/libs/content-search-indexer/src/lib/indexing.service.ts +++ b/libs/content-search-indexer/src/lib/indexing.service.ts @@ -61,15 +61,52 @@ export class IndexingService { }) let nextPageToken: string | undefined = undefined - let initialFetch = true let postSyncOptions: SyncResponse['postSyncOptions'] const isIncrementalUpdate = syncType === 'fromLast' + // Fetch initial page specifically in case importing is skipped (no need to wait for a new sync token if we don't need it) + { + const importerResponse = await importer.doSync({ + ...options, + elasticIndex, + nextPageToken, + folderHash: postSyncOptions?.folderHash, + }) + + // importers can skip import by returning null + if (!importerResponse) { + didImportAll = false + return true + } + + const { + nextPageToken: importerResponseNextPageToken, + postSyncOptions: importerResponsePostSyncOptions, + ...elasticData + } = importerResponse + await this.elasticService.bulk( + elasticIndex, + elasticData, + isIncrementalUpdate, + ) + + // Invalidate cached pages in the background if we are performing an incremental update + if (isIncrementalUpdate) { + this.cacheInvalidationService.invalidateCache( + elasticData.add, + options.locale, + ) + } + + nextPageToken = importerResponseNextPageToken + postSyncOptions = importerResponsePostSyncOptions + } + const [nextSyncToken] = await Promise.all([ importer.getNextSyncToken?.(syncType), (async () => { - while (initialFetch || nextPageToken) { + while (nextPageToken) { const importerResponse = await importer.doSync({ ...options, elasticIndex, @@ -104,16 +141,17 @@ export class IndexingService { nextPageToken = importerResponseNextPageToken postSyncOptions = importerResponsePostSyncOptions - initialFetch = false } })(), ]) - if (nextSyncToken) { - postSyncOptions = { ...postSyncOptions, token: nextSyncToken } - } - if (postSyncOptions && importer.postSync) { + if (nextSyncToken) { + postSyncOptions = { + ...postSyncOptions, + token: nextSyncToken, + } + } logger.info('Importer started post sync', { importer: importer.constructor.name, index: elasticIndex, From 600ae64d7721ce0ef773a0665deff0829e06b633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3rey=20J=C3=B3na?= Date: Mon, 7 Oct 2024 09:20:15 +0000 Subject: [PATCH 18/20] fix(native-app): applications pages locale (#16269) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../app/src/screens/applications/applications-completed.tsx | 2 +- .../app/src/screens/applications/applications-in-progress.tsx | 2 +- .../app/src/screens/applications/applications-incomplete.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/native/app/src/screens/applications/applications-completed.tsx b/apps/native/app/src/screens/applications/applications-completed.tsx index 1038c67b87f3..32ffb4bd29d8 100644 --- a/apps/native/app/src/screens/applications/applications-completed.tsx +++ b/apps/native/app/src/screens/applications/applications-completed.tsx @@ -44,7 +44,7 @@ export const ApplicationsCompletedScreen: NavigationFunctionComponent = ({ ApplicationResponseDtoStatusEnum.Approved, ], }, - locale: locale === 'is-US' ? 'is' : 'en', + locale: locale === 'is-IS' ? 'is' : 'en', }, }) diff --git a/apps/native/app/src/screens/applications/applications-in-progress.tsx b/apps/native/app/src/screens/applications/applications-in-progress.tsx index 08c1c7f3d47e..28305f7fb516 100644 --- a/apps/native/app/src/screens/applications/applications-in-progress.tsx +++ b/apps/native/app/src/screens/applications/applications-in-progress.tsx @@ -40,7 +40,7 @@ export const ApplicationsInProgressScreen: NavigationFunctionComponent = ({ input: { status: [ApplicationResponseDtoStatusEnum.Inprogress], }, - locale: locale === 'is-US' ? 'is' : 'en', + locale: locale === 'is-IS' ? 'is' : 'en', }, }) diff --git a/apps/native/app/src/screens/applications/applications-incomplete.tsx b/apps/native/app/src/screens/applications/applications-incomplete.tsx index 70874676aed1..d9a224e4e667 100644 --- a/apps/native/app/src/screens/applications/applications-incomplete.tsx +++ b/apps/native/app/src/screens/applications/applications-incomplete.tsx @@ -40,7 +40,7 @@ export const ApplicationsIncompleteScreen: NavigationFunctionComponent = ({ input: { status: [ApplicationResponseDtoStatusEnum.Draft], }, - locale: locale === 'is-US' ? 'is' : 'en', + locale: locale === 'is-IS' ? 'is' : 'en', }, }) From ea6cc03c3093b030d316a6d749183b6223cf12b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3r=C3=B0ur=20H?= Date: Mon, 7 Oct 2024 11:09:29 +0000 Subject: [PATCH 19/20] feat(service-portal-health): Add extra doctor info to med cert (#16224) * Add extra doctor info to med cert * Fix * Update messages.ts * chore: nx format:write update dirty files --------- Co-authored-by: andes-it --- .../src/components/ExtraDoctors/index.tsx | 27 +++++++++++++++++++ .../service-portal/health/src/lib/messages.ts | 4 +++ .../MedicineCertificate.tsx | 10 +++++++ 3 files changed, 41 insertions(+) create mode 100644 libs/service-portal/health/src/components/ExtraDoctors/index.tsx diff --git a/libs/service-portal/health/src/components/ExtraDoctors/index.tsx b/libs/service-portal/health/src/components/ExtraDoctors/index.tsx new file mode 100644 index 000000000000..46006c7b4f70 --- /dev/null +++ b/libs/service-portal/health/src/components/ExtraDoctors/index.tsx @@ -0,0 +1,27 @@ +import { RightsPortalMethylDoctor } from '@island.is/api/schema' +import { Box, Text } from '@island.is/island-ui/core' +import { isDefined } from '@island.is/shared/utils' + +interface Props { + doctors?: RightsPortalMethylDoctor[] +} + +export const ExtraDoctors = ({ doctors }: Props) => { + const docs = doctors?.map((doctor) => doctor.name).filter(isDefined) + + if (!docs || docs.length === 0) { + return null + } + + return ( + + {docs.map((doc, i) => ( + + + {doc} + + + ))} + + ) +} diff --git a/libs/service-portal/health/src/lib/messages.ts b/libs/service-portal/health/src/lib/messages.ts index 6ea14565057b..5414196153db 100644 --- a/libs/service-portal/health/src/lib/messages.ts +++ b/libs/service-portal/health/src/lib/messages.ts @@ -940,6 +940,10 @@ export const messages = defineMessages({ id: 'sp.health:medicine-name-of-doctor', defaultMessage: 'Heiti læknis', }, + medicineNameOfDocExtra: { + id: 'sp.health:medicine-name-of-doc-extra', + defaultMessage: 'Aukalæknar skráðir á skírteini', + }, medicineCalculatorAddToPurchaseLabel: { id: 'sp.health:medicine-calculator-add-to-purchase-label', defaultMessage: 'Bæta {arg} við lyfjakaupalista', diff --git a/libs/service-portal/health/src/screens/MedicineCertificate/MedicineCertificate.tsx b/libs/service-portal/health/src/screens/MedicineCertificate/MedicineCertificate.tsx index 82d760c68404..2df649e26c8e 100644 --- a/libs/service-portal/health/src/screens/MedicineCertificate/MedicineCertificate.tsx +++ b/libs/service-portal/health/src/screens/MedicineCertificate/MedicineCertificate.tsx @@ -12,6 +12,7 @@ import { messages } from '../../lib/messages' import { useLocale } from '@island.is/localization' import { HealthPaths } from '../../lib/paths' import { Problem } from '@island.is/react-spa/shared' +import { ExtraDoctors } from '../../components/ExtraDoctors' type UseParams = { type: string @@ -101,6 +102,15 @@ export const MedicineCertificate = () => { valueColumnSpan={['6/12']} /> )} + {certificate.methylDoctors && certificate.methylDoctors.length && ( + } + labelColumnSpan={['6/12']} + valueColumnSpan={['6/12']} + /> + )} {certificate.approved !== null && ( Date: Mon, 7 Oct 2024 13:21:38 +0000 Subject: [PATCH 20/20] fix(portals-admin): locklist (#16279) * fix(portals-admin): locklist * tweak * msg id fix * tweak --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../signature-collection/src/lib/messages.ts | 19 ++++- .../List/paperSignees/index.tsx | 1 + .../src/screens-parliamentary/index.tsx | 2 +- .../completeReview/index.tsx | 51 ++++++------ .../completeReview/lockList/index.tsx | 78 +++++++++++++++++++ .../completeReview/lockList/lockList.graphql | 6 ++ 6 files changed, 126 insertions(+), 31 deletions(-) create mode 100644 libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/index.tsx create mode 100644 libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/lockList.graphql diff --git a/libs/portals/admin/signature-collection/src/lib/messages.ts b/libs/portals/admin/signature-collection/src/lib/messages.ts index 80f2890f11c3..da266b710980 100644 --- a/libs/portals/admin/signature-collection/src/lib/messages.ts +++ b/libs/portals/admin/signature-collection/src/lib/messages.ts @@ -422,7 +422,7 @@ export const m = defineMessages({ }, confirmListReviewedToggleBack: { id: 'admin-portal.signature-collection:confirmListReviewedToggleBack', - defaultMessage: 'Aflæsa úrvinnslu', + defaultMessage: 'Opna fyrir úrvinnslu', description: '', }, listReviewedModalDescription: { @@ -463,9 +463,24 @@ export const m = defineMessages({ defaultMessage: 'Úrvinnslu lokið', description: '', }, + lockList: { + id: 'admin-portal.signature-collection:lockList', + defaultMessage: 'Læsa söfnun', + description: '', + }, + lockListSuccess: { + id: 'admin-portal.signature-collection:lockListSuccess', + defaultMessage: 'Tókst að læsa söfnun', + description: '', + }, + lockListError: { + id: 'admin-portal.signature-collection:lockListError', + defaultMessage: 'Ekki tókst að læsa söfnun', + description: '', + }, toggleReviewError: { id: 'admin-portal.signature-collection:toggleReviewError', - defaultMessage: 'Ekki tókst loka úrvinnslu', + defaultMessage: 'Ekki tókst að loka úrvinnslu', description: '', }, toggleCollectionProcessSuccess: { diff --git a/libs/portals/admin/signature-collection/src/screens-parliamentary/List/paperSignees/index.tsx b/libs/portals/admin/signature-collection/src/screens-parliamentary/List/paperSignees/index.tsx index 083cb10e2b7b..60556c7d06de 100644 --- a/libs/portals/admin/signature-collection/src/screens-parliamentary/List/paperSignees/index.tsx +++ b/libs/portals/admin/signature-collection/src/screens-parliamentary/List/paperSignees/index.tsx @@ -44,6 +44,7 @@ export const PaperSignees = ({ listId }: { listId: string }) => { listId, }, }, + skip: !nationalId.isValid(nationalIdInput) || !name, }) useEffect(() => { diff --git a/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx b/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx index 9ae00b303039..3a0b0b940abf 100644 --- a/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx +++ b/libs/portals/admin/signature-collection/src/screens-parliamentary/index.tsx @@ -41,7 +41,7 @@ const ParliamentaryRoot = ({ variables: { input: { collectionId: collection?.id, - nationalId: searchTerm, + nationalId: searchTerm.replace(/[^0-9]/g, ''), }, }, skip: searchTerm.replace(/[^0-9]/g, '').length !== 10, diff --git a/libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx b/libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx index a7ad2862538a..96b5b1488381 100644 --- a/libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx +++ b/libs/portals/admin/signature-collection/src/shared-components/completeReview/index.tsx @@ -6,6 +6,7 @@ import { useToggleListReviewMutation } from './toggleListReview.generated' import { useRevalidator } from 'react-router-dom' import { m } from '../../lib/messages' import { ListStatus } from '../../lib/utils' +import LockList from './lockList' const ActionReviewComplete = ({ listId, @@ -15,43 +16,38 @@ const ActionReviewComplete = ({ listStatus: string }) => { const { formatMessage } = useLocale() - const [modalSubmitReviewIsOpen, setModalSubmitReviewIsOpen] = useState(false) - const [toggleListReviewMutation, { loading }] = useToggleListReviewMutation() const { revalidate } = useRevalidator() + + const [modalSubmitReviewIsOpen, setModalSubmitReviewIsOpen] = useState(false) const listReviewed = listStatus && listStatus === ListStatus.Reviewed const modalText = listReviewed ? formatMessage(m.confirmListReviewedToggleBack) : formatMessage(m.confirmListReviewed) - const toggleReview = async () => { - try { - const res = await toggleListReviewMutation({ - variables: { - input: { - listId, - }, - }, - }) - if (res.data?.signatureCollectionAdminToggleListReview.success) { - toast.success(formatMessage(m.toggleReviewSuccess)) - setModalSubmitReviewIsOpen(false) - revalidate() - } else { - toast.error(formatMessage(m.toggleReviewError)) - } - } catch (e) { - toast.error(e.message) - } - } + const [toggleListReview, { loading }] = useToggleListReviewMutation({ + variables: { + input: { + listId, + }, + }, + onCompleted: () => { + setModalSubmitReviewIsOpen(false) + revalidate() + toast.success(formatMessage(m.toggleReviewSuccess)) + }, + onError: () => { + toast.error(formatMessage(m.toggleReviewError)) + }, + }) return ( - + + diff --git a/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/index.tsx b/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/index.tsx new file mode 100644 index 000000000000..8cf2e5903495 --- /dev/null +++ b/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/index.tsx @@ -0,0 +1,78 @@ +import { useLocale } from '@island.is/localization' +import { Box, Button, Text, toast } from '@island.is/island-ui/core' +import { useState } from 'react' +import { Modal } from '@island.is/react/components' +import { useRevalidator } from 'react-router-dom' +import { m } from '../../../lib/messages' +import { ListStatus } from '../../../lib/utils' +import { useSignatureCollectionLockListMutation } from './lockList.generated' + +const ActionLockList = ({ + listId, + listStatus, +}: { + listId: string + listStatus: string +}) => { + const { formatMessage } = useLocale() + const { revalidate } = useRevalidator() + + const [modalLockListIsOpen, setModalLockListIsOpen] = useState(false) + + const [lockList, { loading: loadingLockList }] = + useSignatureCollectionLockListMutation({ + variables: { + input: { + listId, + }, + }, + onCompleted: () => { + setModalLockListIsOpen(false) + revalidate() + toast.success(formatMessage(m.lockListSuccess)) + }, + onError: () => { + toast.error(formatMessage(m.lockListError)) + }, + }) + + return ( + + + setModalLockListIsOpen(false)} + label={''} + closeButtonLabel={''} + > + + {formatMessage(m.lockList)} + + + + + + + ) +} + +export default ActionLockList diff --git a/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/lockList.graphql b/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/lockList.graphql new file mode 100644 index 000000000000..f67084926da8 --- /dev/null +++ b/libs/portals/admin/signature-collection/src/shared-components/completeReview/lockList/lockList.graphql @@ -0,0 +1,6 @@ +mutation SignatureCollectionLockList($input: SignatureCollectionListIdInput!) { + signatureCollectionLockList(input: $input) { + reasons + success + } +}