diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index a51c0517..00000000 --- a/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -# Ignore all JavaScript files in a directory -src/main/resources/static/pdfjs/* linguist-vendored -src/main/resources/static/css/bootstrap-icons.css linguist-vendored -src/main/resources/static/css/bootstrap.min.css linguist-vendored -src/main/resources/static/css/fonts/* linguist-vendored diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 30a5ce23..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,13 +0,0 @@ -# These are supported funding model platforms - -github: Frooodle # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: ['https://paypal.me/froodleplex?country.x=GB&locale.x=en_GB'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index a35c2aa1..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,11 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates - -version: 2 -updates: - - package-ecosystem: "gradle" # See documentation for possible values - directory: "/" # Location of package manifests - schedule: - interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index e73caa3f..00000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,4 +0,0 @@ -# License Agreement for Contributions -By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. - -(This does not change the general open-source nature of Stirling-PDF, simply moving from one license to another license) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml deleted file mode 100644 index 55500892..00000000 --- a/.github/workflows/codeql.yml +++ /dev/null @@ -1,55 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of - -name: "Build repo" - -on: - push: - branches: [ "main" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "main" ] - schedule: - - cron: '15 12 * * 1' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - - # - name: Initialize CodeQL - # uses: github/codeql-action/init@v2 - # with: - # languages: java - - - uses: gradle/gradle-build-action@v2.4.2 - with: - gradle-version: 7.6 - arguments: assemble --no-build-cache - - #- name: Perform CodeQL analysis - # uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/pull_request_template.md b/.github/workflows/pull_request_template.md deleted file mode 100644 index bc8f5d04..00000000 --- a/.github/workflows/pull_request_template.md +++ /dev/null @@ -1,3 +0,0 @@ -# License Agreement for Contributions -By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. -(This does not change the open-source nature of Stirling-PDF, simply moving from one license to another license) diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml deleted file mode 100644 index 50d03bcc..00000000 --- a/.github/workflows/push-docker.yml +++ /dev/null @@ -1,142 +0,0 @@ -name: Push Docker Image with VersionNumber - -on: - workflow_dispatch: - push: - branches: - - master - - main -jobs: - push: - runs-on: ubuntu-latest - steps: - - - uses: actions/checkout@v3.5.2 - - - name: Set up JDK 17 - uses: actions/setup-java@v3.11.0 - with: - java-version: '17' - distribution: 'temurin' - - - - uses: gradle/gradle-build-action@v2.4.2 - env: - DOCKER_ENABLE_SECURITY: false - with: - gradle-version: 7.6 - arguments: clean build - - - name: Make Gradle wrapper executable - run: chmod +x gradlew - - - name: Get version number - id: versionNumber - run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)" - - - name: Login to Docker Hub - uses: docker/login-action@v2.1.0 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_API }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2.1.0 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ github.token }} - - - name: Convert repository owner to lowercase - id: repoowner - run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')" - - - name: Generate tags - id: meta - uses: docker/metadata-action@v4.4.0 - with: - images: | - ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf - ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf - tags: | - type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2.1.0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2.5.0 - - - name: Build and push main Dockerfile - uses: docker/build-push-action@v4.0.0 - with: - context: . - dockerfile: ./Dockerfile - push: true - cache-from: type=gha - cache-to: type=gha,mode=max - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: - VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} - platforms: linux/amd64,linux/arm64/v8 - - - - - name: Generate tags ultra-lite - id: meta2 - uses: docker/metadata-action@v4.4.0 - if: github.ref != 'refs/heads/main' - with: - images: | - ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf - ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf - tags: | - type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }} - - - - name: Build and push Dockerfile-ultra-lite - uses: docker/build-push-action@v4.0.0 - if: github.ref != 'refs/heads/main' - with: - context: . - file: ./Dockerfile-ultra-lite - push: true - cache-from: type=gha - cache-to: type=gha,mode=max - tags: ${{ steps.meta2.outputs.tags }} - labels: ${{ steps.meta2.outputs.labels }} - build-args: - VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} - platforms: linux/amd64,linux/arm64/v8 - - - - - name: Generate tags lite - id: meta3 - uses: docker/metadata-action@v4.4.0 - if: github.ref != 'refs/heads/main' - with: - images: | - ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf - ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf - tags: | - type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-lite,enable=${{ github.ref == 'refs/heads/master' }} - type=raw,value=latest-lite,enable=${{ github.ref == 'refs/heads/master' }} - - - - name: Build and push Dockerfile-lite - uses: docker/build-push-action@v4.0.0 - if: github.ref != 'refs/heads/main' - with: - context: . - file: ./Dockerfile-lite - push: true - cache-from: type=gha - cache-to: type=gha,mode=max - tags: ${{ steps.meta3.outputs.tags }} - labels: ${{ steps.meta3.outputs.labels }} - platforms: linux/amd64,linux/arm64/v8 diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml deleted file mode 100644 index f57aacd4..00000000 --- a/.github/workflows/releaseArtifacts.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Release Artifacts - -on: - release: - types: [created] - -jobs: - push: - runs-on: ubuntu-latest - strategy: - matrix: - enable_security: [true, false] - include: - - enable_security: true - file_suffix: '-with-login' - - enable_security: false - file_suffix: '' - steps: - - uses: actions/checkout@v3.5.2 - - - name: Set up JDK 17 - uses: actions/setup-java@v3.11.0 - with: - java-version: '17' - distribution: 'temurin' - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Generate jar (With Security=${{ matrix.enable_security }}) - run: ./gradlew clean createExe - env: - DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }} - - - name: Upload binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./build/launch4j/Stirling-PDF.exe - asset_name: Stirling-PDF${{ matrix.file_suffix }}.exe - tag: ${{ github.ref }} - overwrite: true - - - name: Get version number - id: versionNumber - run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)" - - - name: Upload jar binaries to release - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar - asset_name: Stirling-PDF${{ matrix.file_suffix }}.jar - tag: ${{ github.ref }} - overwrite: true diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml deleted file mode 100644 index c1e6774e..00000000 --- a/.github/workflows/swagger.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Update Swagger - -on: - workflow_dispatch: - push: - branches: - - master -jobs: - push: - - runs-on: ubuntu-latest - steps: - - - uses: actions/checkout@v3.5.2 - - - name: Set up JDK 17 - uses: actions/setup-java@v3.11.0 - with: - java-version: '17' - distribution: 'temurin' - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - - name: Generate Swagger documentation - run: ./gradlew generateOpenApiDocs - - - name: Upload Swagger Documentation to SwaggerHub - run: ./gradlew swaggerhubUpload - env: - SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }} - - - name: Set API version as published and default on SwaggerHub - run: | - curl -X PUT -H "Authorization: ${SWAGGERHUB_API_KEY}" "https://api.swaggerhub.com/apis/Frooodle/Stirling-PDF/${{ steps.versionNumber.outputs.versionNumber }}/settings/lifecycle" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"published\":true,\"default\":true}" - env: - SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }} \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ff9a3bc5..00000000 --- a/.gitignore +++ /dev/null @@ -1,122 +0,0 @@ - - -### Eclipse ### -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders -.classpath -.project -version.properties -pipeline/ - -#### Stirling-PDF Files ### -customFiles/ -configs/ -watchedFolders/ - - -# Gradle -.gradle -.lock - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# CDT- autotools -.autotools - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -# Annotation Processing -.apt_generated/ -.apt_generated_test/ - -# Scala IDE specific (Scala & Java development for Eclipse) -.cache-main -.scala_dependencies -.worksheet - -# Uncomment this line if you wish to ignore the project description file. -# Typically, this file would be tracked if it contains build/dependency configurations: -#.project - -### Eclipse Patch ### -# Spring Boot Tooling -.sts4-cache/ - -### Git ### -# Created by git for backups. To disable backups in Git: -# $ git config --global mergetool.keepBackup false -*.orig - -# Created by git when using merge tools for conflicts -*.BACKUP.* -*.BASE.* -*.LOCAL.* -*.REMOTE.* -*_BACKUP_*.txt -*_BASE_*.txt -*_LOCAL_*.txt -*_REMOTE_*.txt - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar -*.db -/build - -/.vscode \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/CNAME b/CNAME deleted file mode 100644 index 736e5893..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -stirlingtools.com \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index e4bd868c..00000000 --- a/Dockerfile +++ /dev/null @@ -1,45 +0,0 @@ -# Use the base image -FROM frooodle/stirling-pdf-base:beta4 - -ARG VERSION_TAG - -# Set Environment Variables -ENV DOCKER_ENABLE_SECURITY=false \ - HOME=/home/stirlingpdfuser \ - VERSION_TAG=$VERSION_TAG -# PUID=1000 \ -# PGID=1000 \ -# UMASK=022 \ - - -# Create user and group -##RUN groupadd -g $PGID stirlingpdfgroup && \ -## useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \ -## mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME - -# Set up necessary directories and permissions -RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /usr/share/tesseract-ocr /configs /customFiles -##&& \ -## chown -R stirlingpdfuser:stirlingpdfgroup /scripts /usr/share/fonts/opentype/noto /usr/share/tesseract-ocr /configs /customFiles && \ -## chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/tesseract-ocr-original - -# Copy necessary files -COPY ./scripts/* /scripts/ -COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ -COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/ -COPY build/libs/*.jar app.jar - -# Set font cache and permissions -RUN fc-cache -f -v && chmod +x /scripts/init.sh - -##&& \ -## chown stirlingpdfuser:stirlingpdfgroup /app.jar && \ -## chmod +x /scripts/init.sh - -# Expose necessary ports -EXPOSE 8080 - -# Set user and run command -##USER stirlingpdfuser -ENTRYPOINT ["/scripts/init.sh"] -CMD ["java", "-jar", "/app.jar"] diff --git a/Dockerfile-lite b/Dockerfile-lite deleted file mode 100644 index f41a8a8f..00000000 --- a/Dockerfile-lite +++ /dev/null @@ -1,54 +0,0 @@ -# Build jbig2enc in a separate stage -FROM bellsoft/liberica-openjdk-debian:17 -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - libreoffice-core-nogui \ - libreoffice-common \ - libreoffice-writer-nogui \ - libreoffice-calc-nogui \ - libreoffice-impress-nogui \ - unoconv && \ - rm -rf /var/lib/apt/lists/* - - -# Set Environment Variables -ENV DOCKER_ENABLE_SECURITY=false \ - HOME=/home/stirlingpdfuser \ - VERSION_TAG=$VERSION_TAG -# PUID=1000 \ -# PGID=1000 \ -# UMASK=022 \ - -# Create user and group -#RUN groupadd -g $PGID stirlingpdfgroup && \ -# useradd -u $PUID -g stirlingpdfgroup -s /bin/sh stirlingpdfuser && \ -# mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME - -# Set up necessary directories and permissions -RUN mkdir -p /scripts /usr/share/fonts/opentype/noto /configs /customFiles - -# chown -R stirlingpdfuser:stirlingpdfgroup /usr/share/fonts/opentype/noto /configs /customFiles - -# Copy necessary files -COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto/ -COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto/ -COPY build/libs/*.jar app.jar - -# Set font cache and permissions -RUN fc-cache -f -v -# chown stirlingpdfuser:stirlingpdfgroup /app.jar - - - - -# Expose the application port -EXPOSE 8080 - -# Set environment variables -ENV ENDPOINTS_GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF -ENV DOCKER_ENABLE_SECURITY=false - -# Run the application -#USER stirlingpdfuser - -CMD ["java", "-jar", "/app.jar"] diff --git a/Dockerfile-ultra-lite b/Dockerfile-ultra-lite deleted file mode 100644 index 84798820..00000000 --- a/Dockerfile-ultra-lite +++ /dev/null @@ -1,34 +0,0 @@ -# Build jbig2enc in a separate stage -FROM bellsoft/liberica-openjdk-alpine:17 - -# Set Environment Variables -ENV PUID=1000 \ - PGID=1000 \ - UMASK=022 \ - DOCKER_ENABLE_SECURITY=false \ - HOME=/home/stirlingpdfuser \ - VERSION_TAG=$VERSION_TAG - -# Create user and group using Alpine's addgroup and adduser -RUN addgroup -g $PGID stirlingpdfgroup && \ - adduser -u $PUID -G stirlingpdfgroup -s /bin/sh -D stirlingpdfuser && \ - mkdir -p $HOME && chown stirlingpdfuser:stirlingpdfgroup $HOME - -# Set up necessary directories and permissions -RUN mkdir -p /scripts /configs /customFiles && \ - chown -R stirlingpdfuser:stirlingpdfgroup /scripts /configs /customFiles - -COPY build/libs/*.jar app.jar - -# Set font cache and permissions -RUN chown stirlingpdfuser:stirlingpdfgroup /app.jar - -# Expose the application port -EXPOSE 8080 - -# Set environment variables -ENV ENDPOINTS_GROUPS_TO_REMOVE=CLI -ENV DOCKER_ENABLE_SECURITY=false - -# Run the application -CMD ["java", "-jar", "/app.jar"] diff --git a/DockerfileBase b/DockerfileBase deleted file mode 100644 index d1c2df74..00000000 --- a/DockerfileBase +++ /dev/null @@ -1,37 +0,0 @@ -# Main stage -FROM bellsoft/liberica-openjdk-debian:17 AS base -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - libreoffice-core-nogui \ - libreoffice-common \ - libreoffice-writer-nogui \ - libreoffice-calc-nogui \ - libreoffice-impress-nogui \ - python3-uno \ - python3-pip \ - unoconv \ - pngquant \ - unpaper \ - ocrmypdf && \ - rm -rf /var/lib/apt/lists/* && \ - mkdir /usr/share/tesseract-ocr-original && \ - cp -r /usr/share/tesseract-ocr/* /usr/share/tesseract-ocr-original && \ - rm -rf /usr/share/tesseract-ocr - -# Python packages stage -FROM base AS python-packages -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - build-essential \ - libffi-dev \ - libssl-dev \ - zlib1g-dev \ - libjpeg-dev && \ - pip install --upgrade pip && \ - pip install --no-cache-dir \ - opencv-python-headless WeasyPrint && \ - rm -rf /var/lib/apt/lists/* - -# Final stage: Copy necessary files from the previous stage -FROM base -COPY --from=python-packages /usr/local /usr/local \ No newline at end of file diff --git a/Endpoint-groups.md b/Endpoint-groups.md deleted file mode 100644 index 9c7f3ae6..00000000 --- a/Endpoint-groups.md +++ /dev/null @@ -1,46 +0,0 @@ -| Operation | PageOps | Convert | Security | Other | CLI | Python | OpenCV | LibreOffice | OCRmyPDF | Java | Javascript | -|---------------------|---------|---------|----------|-------|------|--------|--------|-------------|----------|----------|------------| -| adjust-contrast | ✔️ | | | | | | | | | | ✔️ | -| auto-split-pdf | ✔️ | | | | | | | | | ✔️ | | -| crop | ✔️ | | | | | | | | | ✔️ | | -| extract-page | ✔️ | | | | | | | | | ✔️ | | -| merge-pdfs | ✔️ | | | | | | | | | ✔️ | | -| multi-page-layout | ✔️ | | | | | | | | | ✔️ | | -| pdf-organizer | ✔️ | | | | | | | | | ✔️ | ✔️ | -| pdf-to-single-page | ✔️ | | | | | | | | | ✔️ | | -| remove-pages | ✔️ | | | | | | | | | ✔️ | | -| rotate-pdf | ✔️ | | | | | | | | | ✔️ | | -| scale-pages | ✔️ | | | | | | | | | ✔️ | | -| split-pdfs | ✔️ | | | | | | | | | ✔️ | | -| file-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| img-to-pdf | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-html | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-img | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-pdfa | | ✔️ | | | ✔️ | | | | ✔️ | | | -| pdf-to-markdown | | ✔️ | | | | | | | | ✔️ | | -| pdf-to-presentation | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-text | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-word | | ✔️ | | | ✔️ | | | ✔️ | | | | -| pdf-to-xml | | ✔️ | | | ✔️ | | | ✔️ | | | | -| xlsx-to-pdf | | ✔️ | | | ✔️ | | | ✔️ | | | | -| add-password | | | ✔️ | | | | | | | ✔️ | | -| add-watermark | | | ✔️ | | | | | | | ✔️ | | -| cert-sign | | | ✔️ | | | | | | | ✔️ | | -| change-permissions | | | ✔️ | | | | | | | ✔️ | | -| remove-password | | | ✔️ | | | | | | | ✔️ | | -| sanitize-pdf | | | ✔️ | | | | | | | ✔️ | | -| add-image | | | | ✔️ | | | | | | ✔️ | | -| add-page-numbers | | | | ✔️ | | | | | | ✔️ | | -| auto-rename | | | | ✔️ | | | | | | ✔️ | | -| change-metadata | | | | ✔️ | | | | | | ✔️ | | -| compare | | | | ✔️ | | | | | | | ✔️ | -| compress-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| extract-image-scans | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| extract-images | | | | ✔️ | | | | | | ✔️ | | -| flatten | | | | ✔️ | | | | | | | ✔️ | -| get-info-on-pdf | | | | ✔️ | | | | | | ✔️ | | -| ocr-pdf | | | | ✔️ | ✔️ | | | | ✔️ | | | -| remove-blanks | | | | ✔️ | ✔️ | ✔️ | ✔️ | | | | | -| repair | | | | ✔️ | ✔️ | | | ✔️ | | | | -| show-javascript | | | | ✔️ | | | | | | | ✔️ | -| sign | | | | ✔️ | | | | | | | ✔️ | \ No newline at end of file diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md deleted file mode 100644 index b6a7fa4a..00000000 --- a/HowToAddNewLanguage.md +++ /dev/null @@ -1,38 +0,0 @@ -


Stirling-PDF

-

- - -# How to add new languages to Stirling-PDF - -Fork Stirling-PDF and make a new branch out of Main - -Then add reference to the language in the navbar by adding a new language entry to the dropdown - -https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html -and add a flag svg file to -https://github.com/Frooodle/Stirling-PDF/tree/main/src/main/resources/static/images/flags -Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/) -If your language isnt represented by a flag just find whichever closely matches it, such as for Arabic i chose Saudi Arabia - - -For example to add Polish you would add -``` - - icon Polski - -``` -The data-language-code is the code used to reference the file in the next step. - -Start by copying the existing english property file - -[https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties) - -Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties - - -Then simply translate all property entries within that file and make a PR into main for others to use! - -If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but wont be able to verify the translations themselves) - - - diff --git a/HowToUseOCR.md b/HowToUseOCR.md deleted file mode 100644 index 37e33b5c..00000000 --- a/HowToUseOCR.md +++ /dev/null @@ -1,76 +0,0 @@ -# OCR Language Packs and Setup - -This document provides instructions on how to add additional language packs for the OCR tab in Stirling-PDF, both inside and outside of Docker. - -## How does the OCR Work -Stirling-PDF uses [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) which in turn uses tesseract for its text recognition. -All credit goes to them for this awesome work! - -## Language Packs - -Tesseract OCR supports a variety of languages. You can find additional language packs in the Tesseract GitHub repositories: - -- [tessdata_fast](https://github.com/tesseract-ocr/tessdata_fast): These language packs are smaller and faster to load, but may provide lower recognition accuracy. -- [tessdata](https://github.com/tesseract-ocr/tessdata): These language packs are larger and provide better recognition accuracy, but may take longer to load. - -Depending on your requirements, you can choose the appropriate language pack for your use case. By default Stirling-PDF uses the tessdata_fast eng but this can be replaced. - -### Installing Language Packs - -1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. -2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/4.00/tessdata` (Debian) or `/usr/share/tesseract/tessdata` (Fedora) - -# DO NOT REMOVE EXISTING ENG.TRAINEDDATA, ITS REQUIRED. - -#### Docker - -If you are using Docker, you need to expose the Tesseract tessdata directory as a volume in order to use the additional language packs. -#### Docker Compose -Modify your `docker-compose.yml` file to include the following volume configuration: - - -```yaml -services: - your_service_name: - image: your_docker_image_name - volumes: - - /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata -``` - - -#### Docker run -Add the following to your existing docker run command -```bash --v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata -``` - -#### Non-Docker -If you are not using Docker, you need to install the OCR components, including the ocrmypdf app. -You can see [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) - -Debian based systems, install languages with this command: - -```bash -sudo apt update &&\ -# All languages -# sudo apt install -y 'tesseract-ocr-*' - -# Find languages: -apt search tesseract-ocr- - -# View installed languages: -dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g' -``` - -Fedora: - -```bash -# All languages -# sudo dnf install -y tesseract-langpack-* - -# Find languages: -dnf search -C tesseract-langpack- - -# View installed languages: -rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g' -``` diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index dce948a4..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,33 +0,0 @@ -pipeline { - agent any - stages { - stage('Build') { - steps { - sh 'chmod 755 gradlew' - sh './gradlew build' - } - } - stage('Docker Build') { - steps { - script { - def appVersion = sh(returnStdout: true, script: './gradlew printVersion -q').trim() - def image = "frooodle/s-pdf:$appVersion" - sh "docker build -t $image ." - } - } - } - stage('Docker Push') { - steps { - script { - def appVersion = sh(returnStdout: true, script: './gradlew printVersion -q').trim() - def image = "frooodle/s-pdf:$appVersion" - withCredentials([string(credentialsId: 'docker_hub_access_token', variable: 'DOCKER_HUB_ACCESS_TOKEN')]) { - sh "docker login --username frooodle --password $DOCKER_HUB_ACCESS_TOKEN" - sh "docker push $image" - } - } - } - - } - } -} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702d..00000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/LocalRunGuide.md b/LocalRunGuide.md deleted file mode 100644 index 8293aee1..00000000 --- a/LocalRunGuide.md +++ /dev/null @@ -1,213 +0,0 @@ - -To run the application without Docker, you will need to manually install all dependencies and build the necessary components. - -Note that some dependencies might not be available in the standard repositories of all Linux distributions, and may require additional steps to install. - -The following guide assumes you have a basic understanding of using a command line interface in your operating system. - -It should work on most Linux distributions and MacOS. For Windows, you might need to use Windows Subsystem for Linux (WSL) for certain steps. -The amount of dependencies is to actually reduce overall size, ie installing LibreOffice sub components rather than full LibreOffice package. - -### Step 1: Prerequisites - -Install the following software, if not already installed: - -- Java 17 or later - -- Gradle 7.0 or later (included within repo so not needed on server) - -- Git - -- Python 3 (with pip) - -- Make - -- GCC/G++ - -- Automake - -- Autoconf - -- libtool - -- pkg-config - -- zlib1g-dev - -- libleptonica-dev - -For Debian-based systems, you can use the following command: - -```bash -sudo apt-get update -sudo apt-get install -y git automake autoconf libtool libleptonica-dev pkg-config zlib1g-dev make g++ java-17-openjdk python3 python3-pip -``` - -For Fedora-based systems use this command: - -```bash -sudo dnf install -y git automake autoconf libtool leptonica-devel pkg-config zlib-devel make gcc-c++ java-17-openjdk python3 python3-pip -``` - -### Step 2: Clone and Build jbig2enc (Only required for certain OCR functionality) - -```bash -mkdir ~/.git -cd ~/.git &&\ -git clone https://github.com/agl/jbig2enc.git &&\ -cd jbig2enc &&\ -./autogen.sh &&\ -./configure &&\ -make &&\ -sudo make install -``` - -### Step 3: Install Additional Software -Next we need to install LibreOffice for conversions, ocrmypdf for OCR, and opencv for patern recognition functionality. - -Install the following software: - -- libreoffice-core - -- libreoffice-common - -- libreoffice-writer - -- libreoffice-calc - -- libreoffice-impress - -- python3-uno - -- unoconv - -- pngquant - -- unpaper - -- ocrmypdf - -- opencv-python-headless - -For Debian-based systems, you can use the following command: - -```bash -sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf -pip3 install uno opencv-python-headless unoconv pngquant -``` - -For Fedora: - -```bash -sudo dnf install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf -pip3 install uno opencv-python-headless unoconv pngquant -``` - -### Step 4: Clone and Build Stirling-PDF - -```bash -cd ~/.git &&\ -git clone https://github.com/Frooodle/Stirling-PDF.git &&\ -cd Stirling-PDF &&\ -chmod +x ./gradlew &&\ -./gradlew build -``` - - -### Step 5: Move jar to desired location - -After the build process, a `.jar` file will be generated in the `build/libs` directory. -You can move this file to a desired location, for example, `/opt/Stirling-PDF/`. -You must also move the Script folder within the Stirling-PDF repo that you have downloaded to this directory. -This folder is required for the python scripts using OpenCV - -```bash -sudo mkdir /opt/Stirling-PDF &&\ -sudo mv ./build/libs/Stirling-PDF-*.jar /opt/Stirling-PDF/ &&\ -sudo mv scripts /opt/Stirling-PDF/ &&\ -echo "Scripts installed." -``` -### Step 6: Other files -#### OCR -If you plan to use the OCR (Optical Character Recognition) functionality, you might need to install language packs for Tesseract if running non-english scanning. - -##### Installing Language Packs -Easiest is to use the langpacks provided by your repositories. Skip the other steps - -Manual: - -1. Download the desired language pack(s) by selecting the `.traineddata` file(s) for the language(s) you need. -2. Place the `.traineddata` files in the Tesseract tessdata directory: `/usr/share/tesseract-ocr/4.00/tessdata` -3. -Please view [OCRmyPDF install guide](https://ocrmypdf.readthedocs.io/en/latest/installation.html) for more info. -**IMPORTANT:** DO NOT REMOVE EXISTING `eng.traineddata`, IT'S REQUIRED. - -Debian based systems, install languages with this command: - -```bash -sudo apt update &&\ -# All languages -# sudo apt install -y 'tesseract-ocr-*' - -# Find languages: -apt search tesseract-ocr- - -# View installed languages: -dpkg-query -W tesseract-ocr- | sed 's/tesseract-ocr-//g' -``` - -Fedora: - -```bash -# All languages -# sudo dnf install -y tesseract-langpack-* - -# Find languages: -dnf search -C tesseract-langpack- - -# View installed languages: -rpm -qa | grep tesseract-langpack | sed 's/tesseract-langpack-//g' -``` - -### Step 7: Run Stirling-PDF - -```bash -./gradlew bootRun -or -java -jar build/libs/app.jar -``` - -### Step 8: Adding a Desktop icon - -This will add a modified Appstarter to your Appmenu. -```bash -location=$(pwd)/gradlew -image=$(pwd)/docs/stirling-transparent.svg - -cat > ~/.local/share/applications/Stirling-PDF.desktop <

Stirling-PDF

-

- -[![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) -[![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/Cn8pWhQRxZ) -[![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Frooodle/Stirling-PDF/) -[![GitHub Repo stars](https://img.shields.io/github/stars/frooodle/stirling-pdf?style=social)](https://github.com/Frooodle/stirling-pdf) -[![Paypal Donate](https://img.shields.io/badge/Paypal%20Donate-yellow?style=flat&logo=paypal)](https://www.paypal.com/paypalme/froodleplex) -[![Github Sponser](https://img.shields.io/badge/Github%20Sponsor-yellow?style=flat&logo=github)](https://github.com/sponsors/Frooodle) - -[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Frooodle/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) - -This is a powerful locally hosted web based PDF manipulation tool using docker that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application started as a 100% ChatGPT-made application and has evolved to include a wide range of features to handle all your PDF needs. - -Stirling PDF makes no outbound calls for any record keeping or tracking. - -All files and PDFs are either purely client side, in server memory only during the execution of the task or within a temporay file only for execution of the task. -Any file which has been downloaded by the user will have already been deleted from the server by that time. - -Feel free to request any features or bug fixes either in github issues or our [Discord](https://discord.gg/Cn8pWhQRxZ) - -![stirling-home](images/stirling-home.png) - -## Features -- Dark mode support. -- Custom download options (see [here](https://github.com/Frooodle/Stirling-PDF/blob/main/images/settings.png) for example) -- Parallel file processing and downloads -- API for integration with external scripts -- Optional Login and Authentication support (see [here](https://github.com/Frooodle/Stirling-PDF/tree/main#login-authentication) for documentation) - - -## **PDF Features** - -### **Page Operations** -- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. -- Merge multiple PDFs together into a single resultant file. -- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. -- Reorganize PDF pages into different orders. -- Rotate PDFs in 90-degree increments. -- Remove pages. -- Multi-page layout (Format PDFs into a multi-paged page). -- Scale page contents size by set %. -- Adjust Contrast. -- Crop PDF. -- Auto Split PDF (With physically scanned page dividers). -- Extract page(s). -- Convert PDF to a single page. - -### **Conversion Operations** -- Convert PDFs to and from images. -- Convert any common file to PDF (using LibreOffice). -- Convert PDF to Word/Powerpoint/Others (using LibreOffice). -- Convert HTML to PDF. -- URL to PDF. -- Markdown to PDF. - -### **Security & Permissions** -- Add and remove passwords. -- Change/set PDF Permissions. -- Add watermark(s). -- Certify/sign PDFs. -- Sanitize PDFs. -- Auto-redact text. - -### **Other Operations** -- Add/Generate/Write signatures. -- Repair PDFs. -- Detect and remove blank pages. -- Compare 2 PDFs and show differences in text. -- Add images to PDFs. -- Compress PDFs to decrease their filesize (Using OCRMyPDF). -- Extract images from PDF. -- Extract images from Scans. -- Add page numbers. -- Auto rename file by detecting PDF header text. -- OCR on PDF (Using OCRMyPDF). -- PDF/A conversion (Using OCRMyPDF). -- Edit metadata. -- Flatten PDFs. -- Get all information on a PDF to view or export as JSON. - - -For a overview of the tasks and the technology each uses please view [groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Groups.md) -Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de - -## Technologies used -- Spring Boot + Thymeleaf -- PDFBox -- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions -- [OcrMyPdf](https://github.com/ocrmypdf/OCRmyPDF) -- HTML, CSS, JavaScript -- Docker -- PDF.js -- PDF-LIB.js - -## How to use - -### Locally -Please view https://github.com/Frooodle/Stirling-PDF/blob/main/LocalRunGuide.md - -### Docker -https://hub.docker.com/r/frooodle/s-pdf - -Stirling PDF has 3 different versions, a Full version, Lite, and ultra-Lite. Depending on the types of features you use you may want a smaller image to save on space. -To see what the different versions offer please look at our [version mapping](https://github.com/Frooodle/Stirling-PDF/blob/main/Version-groups.md) -For people that don't mind about space optimization just use the latest tag. -![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest?label=Stirling-PDF%20Full) -![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-lite?label=Stirling-PDF%20Lite) -![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-ultra-lite?label=Stirling-PDF%20Ultra-Lite) - -Docker Run -``` -docker run -d \ - -p 8080:8080 \ - -v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \ - -v /location/of/extraConfigs:/configs \ - -e DOCKER_ENABLE_SECURITY=false \ - --name stirling-pdf \ - frooodle/s-pdf:latest - - - Can also add these for customisation but are not required - - -v /location/of/customFiles:/customFiles \ -``` -Docker Compose -``` -version: '3.3' -services: - stirling-pdf: - image: frooodle/s-pdf:latest - ports: - - '8080:8080' - volumes: - - /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages - - /location/of/extraConfigs:/configs -# - /location/of/customFiles:/customFiles/ - environment: - - DOCKER_ENABLE_SECURITY=false -``` - - -## Enable OCR/Compression feature -Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md - -## Want to add your own language? -Stirling PDF currently supports 18! -- English (English) (en_GB) -- English (US) (en_US) -- Arabic (العربية) (ar_AR) -- German (Deutsch) (de_DE) -- French (Français) (fr_FR) -- Spanish (Español) (es_ES) -- Chinese (简体中文) (zh_CN) -- Catalan (Català) (ca_CA) -- Italian (Italiano) (it_IT) -- Swedish (Svenska) (sv_SE) -- Polish (Polski) (pl_PL) -- Romanian (Română) (ro_RO) -- Korean (한국어) (ko_KR) -- Portuguese Brazilian (Português) (pt_BR) -- Russian (Русский) (ru_RU) -- Basque (Euskara) (eu_ES) -- Japanese (日本語) (ja_JP) -- Dutch (Nederlands) (nl_NL) - -If you want to add your own language to Stirling-PDF please refer -https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md - -And please create a PR to merge it back in so others can use it! - -## How to View -1. Open a web browser and navigate to `http://localhost:8080/` -2. Use the application by following the instructions on the website. - - -## Customisation -Stirling PDF allows easy customization of the app. -Includes things like -- Custom application name -- Custom slogans, icons, images, and even custom HTML (via file overrides) - - -There are two options for this, either using the generated settings file ``settings.yml`` -This file is located in the ``/configs`` directory and follows standard YAML formatting - -Environment variables are also supported and would override the settings file -For example in the settings.yml you have -``` -system: - defaultLocale: 'en-US' -``` - -To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE`` - -The Current list of settings is -``` -security: - enableLogin: false # set to 'true' to enable login - csrfDisabled: true - -system: - defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) - googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow - customStaticFilePath: '/customFiles/static/' # Directory path for custom static files - -#ui: -# appName: exampleAppName # Application's visible name -# homeDescription: I am a description # Short description or tagline shown on homepage. -# appNameNavbar: navbarName # Name displayed on the navigation bar - -endpoints: - toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) - groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) - -metrics: - enabled: true # 'true' to enable Info APIs endpoints (view http://localhost:8080/swagger-ui/index.html#/API to learn more), 'false' to disable -``` -### Extra notes -- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Frooodle/Stirling-PDF/blob/main/groups.md) -- customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF - -### Environment only parameters -- ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app`` -- ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values -- ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login) - -## API -For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation -[here](https://app.swaggerhub.com/apis-docs/Frooodle/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation (Or by following the API button in your settings of Stirling-PDF) - - -## Login authentication -![stirling-login](images/login-light.png) -### Prerequisites: -- User must have the folder ./configs volumed within docker so that it is retained during updates. -- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. -- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true`` -- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation). - -Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked. - -When you login to Stirling PDF you will be redirected to /login page to login with those default credentials. After login everything should function as normal - -To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key. - -To add new users go to the bottom of Account settings and hit 'Admin Settings', here you can add new users. The different roles mentioned within this are for rate limiting. This is a Work in progress which will be expanding on more in future - -For API usage you must provide a header with 'X-API-Key' and the associated API key for that user. - - -## FAQ - -### Q1: What are your planned features? -- Progress bar/Tracking -- Full custom logic pipelines to combine multiple operations together. -- Folder support with auto scanning to perform operations on -- Redact text (Via UI not just automated way) -- Add Forms -- Annotations -- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing -- Fill forms mannual and automatic - -### Q2: Why is my application downloading .htm files? -This is a issue caused commonly by your NGINX congifuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files. - -### Q3: Why is my download timing out -NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;`` diff --git a/Version-groups.md b/Version-groups.md deleted file mode 100644 index 90020579..00000000 --- a/Version-groups.md +++ /dev/null @@ -1,59 +0,0 @@ -|Technology | Ultra-Lite | Lite | Full | -|----------------|:----------:|:----:|:----:| -| Java | ✔️ | ✔️ | ✔️ | -| JavaScript | ✔️ | ✔️ | ✔️ | -| Libre | | ✔️ | ✔️ | -| Python | | | ✔️ | -| OpenCV | | | ✔️ | -| OCRmyPDF | | | ✔️ | - - - - - -Operation | Ultra-Lite | Lite | Full ---------------------|------------|------|----- -add-page-numbers | ✔️ | ✔️ | ✔️ -add-password | ✔️ | ✔️ | ✔️ -add-image | ✔️ | ✔️ | ✔️ -add-watermark | ✔️ | ✔️ | ✔️ -adjust-contrast | ✔️ | ✔️ | ✔️ -auto-split-pdf | ✔️ | ✔️ | ✔️ -auto-rename | ✔️ | ✔️ | ✔️ -cert-sign | ✔️ | ✔️ | ✔️ -crop | ✔️ | ✔️ | ✔️ -change-metadata | ✔️ | ✔️ | ✔️ -change-permissions | ✔️ | ✔️ | ✔️ -compare | ✔️ | ✔️ | ✔️ -extract-page | ✔️ | ✔️ | ✔️ -extract-images | ✔️ | ✔️ | ✔️ -flatten | ✔️ | ✔️ | ✔️ -get-info-on-pdf | ✔️ | ✔️ | ✔️ -img-to-pdf | ✔️ | ✔️ | ✔️ -markdown-to-pdf | ✔️ | ✔️ | ✔️ -merge-pdfs | ✔️ | ✔️ | ✔️ -multi-page-layout | ✔️ | ✔️ | ✔️ -pdf-organizer | ✔️ | ✔️ | ✔️ -pdf-to-img | ✔️ | ✔️ | ✔️ -pdf-to-single-page | ✔️ | ✔️ | ✔️ -remove-pages | ✔️ | ✔️ | ✔️ -remove-password | ✔️ | ✔️ | ✔️ -rotate-pdf | ✔️ | ✔️ | ✔️ -sanitize-pdf | ✔️ | ✔️ | ✔️ -scale-pages | ✔️ | ✔️ | ✔️ -sign | ✔️ | ✔️ | ✔️ -show-javascript | ✔️ | ✔️ | ✔️ -split-pdfs | ✔️ | ✔️ | ✔️ -file-to-pdf | | ✔️ | ✔️ -pdf-to-html | | ✔️ | ✔️ -pdf-to-presentation | | ✔️ | ✔️ -pdf-to-text | | ✔️ | ✔️ -pdf-to-word | | ✔️ | ✔️ -pdf-to-xml | | ✔️ | ✔️ -repair | | ✔️ | ✔️ -xlsx-to-pdf | | ✔️ | ✔️ -compress-pdf | | | ✔️ -extract-image-scans | | | ✔️ -ocr-pdf | | | ✔️ -pdf-to-pdfa | | | ✔️ -remove-blanks | | | ✔️ diff --git a/build.gradle b/build.gradle deleted file mode 100644 index d020f2a9..00000000 --- a/build.gradle +++ /dev/null @@ -1,140 +0,0 @@ -plugins { - id 'java' - id 'org.springframework.boot' version '3.1.2' - id 'io.spring.dependency-management' version '1.1.3' - id 'org.springdoc.openapi-gradle-plugin' version '1.6.0' - id "io.swagger.swaggerhub" version "1.2.0" - id 'edu.sc.seis.launch4j' version '3.0.5' -} - -group = 'stirling.software' -version = '0.14.5' -sourceCompatibility = '17' - -repositories { - mavenCentral() -} - -sourceSets { - main { - java { - if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false') { - exclude 'stirling/software/SPDF/config/security/**' - exclude 'stirling/software/SPDF/controller/api/UserController.java' - exclude 'stirling/software/SPDF/controller/web/AccountWebController.java' - exclude 'stirling/software/SPDF/model/ApiKeyAuthenticationToken.java' - exclude 'stirling/software/SPDF/model/Authority.java' - exclude 'stirling/software/SPDF/model/PersistentLogin.java' - exclude 'stirling/software/SPDF/model/User.java' - exclude 'stirling/software/SPDF/repository/**' - } - } - } -} - - -openApi { - apiDocsUrl = "http://localhost:8080/v1/api-docs" - outputDir = file("$projectDir") - outputFileName = "SwaggerDoc.json" -} - - -launch4j { - icon = "${projectDir}/src/main/resources/static/favicon.ico" - - outfile="Stirling-PDF.exe" - headerType="console" - jarTask = tasks.bootJar - - errTitle="Encountered error, Do you have Java 17?" - downloadUrl="https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe" - variables=["BROWSER_OPEN=true"] - jreMinVersion="17" - - mutexName="Stirling-PDF" - windowTitle="Stirling-PDF" - - messagesStartupError="An error occurred while starting Stirling-PDF" - //messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17." - messagesJreVersionError="You are running the wrong version of Java, Please download Java 17." - messagesLauncherError="Java is corrupted. Please uninstall and then install Java 17." - messagesInstanceAlreadyExists="Stirling-PDF is already running." -} - -dependencies { - implementation 'org.yaml:snakeyaml:2.1' - implementation 'org.springframework.boot:spring-boot-starter-web:3.1.2' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.1.2' - - if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { - implementation 'org.springframework.boot:spring-boot-starter-security:3.1.2' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' - implementation "org.springframework.boot:spring-boot-starter-data-jpa" - implementation "com.h2database:h2" - } - - testImplementation 'org.springframework.boot:spring-boot-starter-test:3.1.4' - - - - // https://mvnrepository.com/artifact/org.apache.pdfbox/jbig2-imageio - implementation group: 'org.apache.pdfbox', name: 'jbig2-imageio', version: '3.0.4' - implementation 'commons-io:commons-io:2.13.0' - - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' - - //general PDF - implementation 'org.apache.pdfbox:pdfbox:2.0.29' - implementation 'org.apache.pdfbox:xmpbox:2.0.29' - implementation 'org.bouncycastle:bcprov-jdk15on:1.70' - implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'io.micrometer:micrometer-core' - implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' - // https://mvnrepository.com/artifact/org.commonmark/commonmark - implementation 'org.commonmark:commonmark:0.21.0' - // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core - implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' - - developmentOnly("org.springframework.boot:spring-boot-devtools") - compileOnly 'org.projectlombok:lombok:1.18.28' - annotationProcessor 'org.projectlombok:lombok:1.18.28' - -} - -task writeVersion { - def propsFile = file('src/main/resources/version.properties') - def props = new Properties() - props.setProperty('version', version) - props.store(propsFile.newWriter(), null) -} - -swaggerhubUpload { - //dependsOn generateOpenApiDocs // Depends on your task generating Swagger docs - api 'Stirling-PDF' // The name of your API on SwaggerHub - owner 'Frooodle' // Your SwaggerHub username (or organization name) - version project.version // The version of your API - inputFile './SwaggerDoc.json' // The path to your Swagger docs - token "${System.getenv('SWAGGERHUB_API_KEY')}" // Your SwaggerHub API key, passed as an environment variable - oas '3.0.0' // The version of the OpenAPI Specification you're using -} - - - -jar { - enabled = false - manifest { - attributes 'Implementation-Title': 'Stirling-PDF', - 'Implementation-Version': project.version - } - -} - -tasks.named('test') { - useJUnitPlatform() -} - -task printVersion { - println project.version -} diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml deleted file mode 100644 index 3482b36d..00000000 --- a/chart/stirling-pdf/Chart.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v2 -appVersion: 0.14.2 -description: locally hosted web application that allows you to perform various operations on PDF files -home: https://github.com/Frooodle/Stirling-PDF -keywords: -- stirling-pdf -- helm -- charts repo -maintainers: -- name: Frooodle - url: https://github.com/Frooodle/Stirling-PDF -name: stirling-pdf -sources: -- https://github.com/Frooodle/Stirling-PDF -version: 1.0.0 diff --git a/chart/stirling-pdf/templates/NOTES.txt b/chart/stirling-pdf/templates/NOTES.txt deleted file mode 100644 index 3b432f00..00000000 --- a/chart/stirling-pdf/templates/NOTES.txt +++ /dev/null @@ -1,30 +0,0 @@ -** Please be patient while the chart is being deployed ** - -Get the stirlingpdf URL by running: - -{{- if contains "NodePort" .Values.service.type }} - - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "stirlingpdf.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT/ - -{{- else if contains "LoadBalancer" .Values.service.type }} - -** Please ensure an external IP is associated to the {{ template "stirlingpdf.fullname" . }} service before proceeding ** -** Watch the status using: kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "stirlingpdf.fullname" . }} ** - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.service.externalPort }}/ - -OR - - export SERVICE_HOST=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "stirlingpdf.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') - echo http://$SERVICE_HOST:{{ .Values.service.externalPort }}/ - -{{- else if contains "ClusterIP" .Values.service.type }} - - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "stirlingpdf.name" . }}" -l "release={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") - echo http://127.0.0.1:8080/ - kubectl port-forward $POD_NAME 8080:8080 --namespace {{ .Release.Namespace }} - -{{- end }} diff --git a/chart/stirling-pdf/templates/_helpers.tpl b/chart/stirling-pdf/templates/_helpers.tpl deleted file mode 100644 index 4c862604..00000000 --- a/chart/stirling-pdf/templates/_helpers.tpl +++ /dev/null @@ -1,129 +0,0 @@ -{{/* -Expand the name of the chart. -*/}} -{{- define "stirlingpdf.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} -{{- end }} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "stirlingpdf.fullname" -}} -{{- if .Values.fullnameOverride }} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- $name := default .Chart.Name .Values.nameOverride }} -{{- if contains $name .Release.Name }} -{{- .Release.Name | trunc 63 | trimSuffix "-" }} -{{- else }} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} -{{- end }} -{{- end }} -{{- end }} - -{{- /* -Create chart name and version as used by the chart label. - -It does minimal escaping for use in Kubernetes labels. - -Example output: - -stirlingpdf-0.4.5 -*/ -}} -{{- define "stirlingpdf.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} -{{- end -}} - -{{/* -Common labels -*/}} -{{- define "stirlingpdf.labels" -}} -helm.sh/chart: {{ include "stirlingpdf.chart" . }} -{{ include "stirlingpdf.selectorLabels" . }} -{{- if .Chart.AppVersion }} -app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} -{{- end }} -{{- if .Values.commonLabels}} -{{ toYaml .Values.commonLabels }} -{{- end }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -{{- end }} - -{{/* -Selector labels -*/}} -{{- define "stirlingpdf.selectorLabels" -}} -app.kubernetes.io/name: {{ include "stirlingpdf.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -{{- end }} - -{{/* -Create the name of the service account to use -*/}} -{{- define "stirlingpdf.serviceAccountName" -}} -{{- if .Values.serviceAccount.create }} -{{- default (include "stirlingpdf.fullname" .) .Values.serviceAccount.name }} -{{- else }} -{{- default "default" .Values.serviceAccount.name }} -{{- end }} -{{- end }} - -{{/* -Return the proper image name to change the volume permissions -*/}} -{{- define "stirlingpdf.volumePermissions.image" -}} -{{- $registryName := .Values.volumePermissions.image.registry -}} -{{- $repositoryName := .Values.volumePermissions.image.repository -}} -{{- $tag := .Values.volumePermissions.image.tag | toString -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 doesn't support it, so we need to implement this if-else logic. -Also, we can't use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} - {{- if .Values.global.imageRegistry }} - {{- printf "%s/%s:%s" .Values.global.imageRegistry $repositoryName $tag -}} - {{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} - {{- end -}} -{{- else -}} - {{- printf "%s/%s:%s" $registryName $repositoryName $tag -}} -{{- end -}} -{{- end -}} - -{{/* -Return the proper Docker Image Registry Secret Names -*/}} -{{- define "stirlingpdf.imagePullSecrets" -}} -{{/* -Helm 2.11 supports the assignment of a value to a variable defined in a different scope, -but Helm 2.9 and 2.10 does not support it, so we need to implement this if-else logic. -Also, we can not use a single if because lazy evaluation is not an option -*/}} -{{- if .Values.global }} -{{- if .Values.global.imagePullSecrets }} -imagePullSecrets: -{{- range .Values.global.imagePullSecrets }} - - name: {{ . }} -{{- end }} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- else if or .Values.image.pullSecrets .Values.volumePermissions.image.pullSecrets }} -imagePullSecrets: -{{- range .Values.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- range .Values.volumePermissions.image.pullSecrets }} - - name: {{ . }} -{{- end }} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/deployment.yaml b/chart/stirling-pdf/templates/deployment.yaml deleted file mode 100644 index 290a56c9..00000000 --- a/chart/stirling-pdf/templates/deployment.yaml +++ /dev/null @@ -1,129 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.deployment.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- if .Values.deployment.labels }} - {{- toYaml .Values.deployment.labels | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} - replicas: {{ .Values.replicaCount }} - strategy: -{{ toYaml .Values.strategy | indent 4 }} - revisionHistoryLimit: 10 - template: - metadata: - {{- with .Values.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - labels: - {{- include "stirlingpdf.selectorLabels" . | nindent 8 }} - {{- if .Values.podLabels }} - {{- toYaml .Values.podLabels | nindent 8 }} - {{- end }} - spec: - {{- if .Values.priorityClassName }} - priorityClassName: "{{ .Values.priorityClassName }}" - {{- end }} - {{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - {{- if .Values.securityContext.runAsNonRoot }} - runAsNonRoot: {{ .Values.securityContext.runAsNonRoot }} - {{- end }} - {{- if .Values.securityContext.supplementalGroups }} - supplementalGroups: {{ .Values.securityContext.supplementalGroups }} - {{- end }} - {{- else if .Values.persistence.enabled }} - initContainers: - - name: volume-permissions - image: {{ template "stirlingpdf.volumePermissions.image" . }} - imagePullPolicy: "{{ .Values.volumePermissions.image.pullPolicy }}" - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} - command: ['sh', '-c', 'chown -R {{ .Values.securityContext.fsGroup }}:{{ .Values.securityContext.fsGroup }} {{ .Values.persistence.path }}'] - volumeMounts: - - mountPath: {{ .Values.persistence.path }} - name: storage-volume - {{- end }} -{{- include "stirlingpdf.imagePullSecrets" . | indent 6 }} - containers: - - name: {{ .Chart.Name }} - image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - securityContext: - {{- toYaml .Values.containerSecurityContext | nindent 10 }} -{{- if .Values.envs }} - env: -{{ toYaml .Values.envs | indent 8 }} -{{- end }} -{{- if .Values.extraArgs }} - args: -{{ toYaml .Values.extraArgs | indent 8 }} -{{- end }} - ports: - - name: http - containerPort: 8080 - livenessProbe: - httpGet: - path: / - port: http -{{ toYaml .Values.probes.livenessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.liveness | indent 10 }} - readinessProbe: - httpGet: - path: / - port: http -{{ toYaml .Values.probes.readinessHttpGetConfig | indent 12 }} -{{ toYaml .Values.probes.readiness | indent 10 }} - volumeMounts: -{{- if .Values.deployment.extraVolumeMounts }} - {{- toYaml .Values.deployment.extraVolumeMounts | nindent 8 }} -{{- end }} -{{- if .Values.deployment.sidecarContainers }} -{{- range $name, $spec := .Values.deployment.sidecarContainers }} - - name: {{ $name }} -{{- toYaml $spec | nindent 8 }} -{{- end }} -{{- end }} - {{- with .Values.resources }} - resources: -{{ toYaml . | indent 10 }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - {{- if .Values.schedulerName }} - schedulerName: {{ .Values.schedulerName }} - {{- end }} - serviceAccountName: {{ include "stirlingpdf.serviceAccountName" . }} - automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} - volumes: - {{- if .Values.deployment.extraVolumes }} - {{- toYaml .Values.deployment.extraVolumes | nindent 6 }} - {{- end }} - - name: storage-volume - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "stirlingpdf.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end }} diff --git a/chart/stirling-pdf/templates/ingress.yaml b/chart/stirling-pdf/templates/ingress.yaml deleted file mode 100644 index c09fef68..00000000 --- a/chart/stirling-pdf/templates/ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{- if .Values.ingress.enabled }} -{{- $servicePort := .Values.service.externalPort -}} -{{- $serviceName := include "stirlingpdf.fullname" . -}} -{{- $ingressExtraPaths := .Values.ingress.extraPaths -}} ---- -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: extensions/v1beta1 -{{- else if semverCompare "<1.19-0" .Capabilities.KubeVersion.GitVersion }} -apiVersion: networking.k8s.io/v1beta1 -{{- else }} -apiVersion: networking.k8s.io/v1 -{{- end }} -kind: Ingress -metadata: - name: {{ include "stirlingpdf.fullname" . }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.ingress.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - {{- with .Values.ingress.ingressClassName }} - ingressClassName: {{ . }} - {{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ .name }} - http: - paths: - {{- range $ingressExtraPaths }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .port }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ default $.Values.ingress.pathType .pathType }} - {{- end }} - {{- end }} - - path: {{ default "/" .path | quote }} - backend: - {{- if semverCompare "<1.19-0" $.Capabilities.KubeVersion.GitVersion }} - {{- if $.Values.service.servicename }} - serviceName: {{ $.Values.service.servicename }} - {{- else }} - serviceName: {{ default $serviceName .service }} - {{- end }} - servicePort: {{ default $servicePort .servicePort }} - {{- else }} - service: - {{- if $.Values.service.servicename }} - name: {{ $.Values.service.servicename }} - {{- else }} - name: {{ default $serviceName .service }} - {{- end }} - port: - number: {{ default $servicePort .port }} - pathType: {{ $.Values.ingress.pathType }} - {{- end }} - {{- end }} - tls: - {{- range .Values.ingress.hosts }} - {{- if .tls }} - - hosts: - - {{ .name }} - secretName: {{ .tlsSecret }} - {{- end }} - {{- end }} -{{- end -}} diff --git a/chart/stirling-pdf/templates/pv.yaml b/chart/stirling-pdf/templates/pv.yaml deleted file mode 100644 index aa99c6a9..00000000 --- a/chart/stirling-pdf/templates/pv.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.persistence.pv.enabled -}} -apiVersion: v1 -kind: PersistentVolume -metadata: - name: {{ .Values.persistence.pv.pvname | default (include "stirlingpdf.fullname" .) }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -spec: - capacity: - storage: {{ .Values.persistence.pv.capacity.storage }} - accessModes: - - {{ .Values.persistence.pv.accessMode | quote }} - nfs: - server: {{ .Values.persistence.pv.nfs.server }} - path: {{ .Values.persistence.pv.nfs.path | quote }} -{{- end }} \ No newline at end of file diff --git a/chart/stirling-pdf/templates/pvc.yaml b/chart/stirling-pdf/templates/pvc.yaml deleted file mode 100644 index f7a21722..00000000 --- a/chart/stirling-pdf/templates/pvc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ include "stirlingpdf.fullname" . }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.persistence.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - accessModes: - - {{ .Values.persistence.accessMode | quote }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} -{{- if .Values.persistence.storageClass }} -{{- if (eq "-" .Values.persistence.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.persistence.storageClass }}" -{{- end }} -{{- if .Values.persistence.volumeName }} - volumeName: "{{ .Values.persistence.volumeName }}" -{{- end }} -{{- end }} -{{- end }} diff --git a/chart/stirling-pdf/templates/service.yaml b/chart/stirling-pdf/templates/service.yaml deleted file mode 100644 index a529c3f2..00000000 --- a/chart/stirling-pdf/templates/service.yaml +++ /dev/null @@ -1,48 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ .Values.service.servicename | default (include "stirlingpdf.fullname" .) }} - {{- with .Values.service.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.service.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - type: {{ .Values.service.type }} - {{- if (or (eq .Values.service.type "LoadBalancer") (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort)))) }} - externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerIP) }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if (and (eq .Values.service.type "LoadBalancer") .Values.service.loadBalancerSourceRanges) }} - loadBalancerSourceRanges: - {{- with .Values.service.loadBalancerSourceRanges }} -{{ toYaml . | indent 2 }} - {{- end }} - {{- end }} - {{- if eq .Values.service.type "ClusterIP" }} - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{- end }} - {{- end }} - ports: - - port: {{ .Values.service.externalPort }} -{{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{.Values.service.nodePort}} -{{- end }} -{{- if .Values.service.targetPort }} - targetPort: {{ .Values.service.targetPort }} - name: {{ .Values.service.targetPort }} -{{- else }} - targetPort: http - name: http -{{- end }} - protocol: TCP - - selector: - {{- include "stirlingpdf.selectorLabels" . | nindent 4 }} diff --git a/chart/stirling-pdf/templates/serviceaccount.yaml b/chart/stirling-pdf/templates/serviceaccount.yaml deleted file mode 100644 index 7156e4a4..00000000 --- a/chart/stirling-pdf/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.serviceAccount.create -}} ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "stirlingpdf.serviceAccountName" . }} - {{- with .Values.serviceAccount.annotations }} - annotations: - {{ toYaml . | nindent 4 }} - {{- end }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} -{{- end }} diff --git a/chart/stirling-pdf/templates/servicemonitor.yaml b/chart/stirling-pdf/templates/servicemonitor.yaml deleted file mode 100644 index ca0d31bb..00000000 --- a/chart/stirling-pdf/templates/servicemonitor.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if and ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) ( .Values.serviceMonitor.enabled ) }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "stirlingpdf.fullname" . }} - namespace: {{ .Values.serviceMonitor.namespace | default .Release.Namespace }} - labels: - {{- include "stirlingpdf.labels" . | nindent 4 }} - {{- with .Values.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - endpoints: - - targetPort: 8080 -{{- if .Values.serviceMonitor.interval }} - interval: {{ .Values.serviceMonitor.interval }} -{{- end }} -{{- if .Values.serviceMonitor.metricsPath }} - path: {{ .Values.serviceMonitor.metricsPath }} -{{- end }} -{{- if .Values.serviceMonitor.timeout }} - scrapeTimeout: {{ .Values.serviceMonitor.timeout }} -{{- end }} - jobLabel: {{ include "stirlingpdf.fullname" . }} - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{- include "stirlingpdf.selectorLabels" . | nindent 6 }} -{{- end }} diff --git a/chart/stirling-pdf/values.yaml b/chart/stirling-pdf/values.yaml deleted file mode 100644 index 3c4ca888..00000000 --- a/chart/stirling-pdf/values.yaml +++ /dev/null @@ -1,239 +0,0 @@ -extraArgs: [] - # - --storage-timestamp-tolerance 1s -replicaCount: 1 -strategy: - type: RollingUpdate -image: - repository: frooodle/s-pdf - # took Chart appVersion by default - tag: ~ - pullPolicy: IfNotPresent -secret: - labels: {} -## Labels to apply to all resources -## -commonLabels: {} -# team_name: dev - -envs: [] -# - name: PP_HOME_NAME -# value: "Stirling PDF" -# - name: APP_HOME_DESCRIPTION -# value: "Your locally hosted one-stop-shop for all your PDF needs." -# - name: APP_NAVBAR_NAME -# value: "Stirling PDF" -# - name: ALLOW_GOOGLE_VISIBILITY -# value: "true" -# - name: APP_ROOT_PATH -# value: "/" -# - name: APP_LOCALE -# value: "en_GB" - -deployment: - ## stirling-pdf Deployment annotations - annotations: {} - # name: value - labels: {} - # name: value - # additional volumes - extraVolumes: [] - # - name: nginx-config - # secret: - # secretName: nginx-config - # additional volumes to mount - extraVolumeMounts: [] - ## sidecarContainers for the stirling-pdf - # Can be used to add a proxy to the pod that does - # scanning for secrets, signing, authentication, validation - # of the chart's content, send notifications... - sidecarContainers: {} - ## Example sidecarContainer which uses an extraVolume from above and - ## a named port that can be referenced in the service as targetPort. - # proxy: - # image: nginx:latest - # ports: - # - name: proxy - # containerPort: 8081 - # volumeMounts: - # - name: nginx-config - # readOnly: true - # mountPath: /etc/nginx - -## Pod annotations -## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ -## Read more about kube2iam to provide access to s3 https://github.com/jtblin/kube2iam -## -podAnnotations: {} - # iam.amazonaws.com/role: role-arn - -## Pod labels -## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ -podLabels: {} - # name: value - -service: - servicename: - type: ClusterIP - externalTrafficPolicy: Local - ## Uses pre-assigned IP address from cloud provider - ## Only valid if service.type: LoadBalancer - loadBalancerIP: - ## Limits which cidr blocks can connect to service's load balancer - ## Only valid if service.type: LoadBalancer - loadBalancerSourceRanges: [] - # clusterIP: None - externalPort: 8080 - ## targetPort of the container to use. If a sidecar should handle the - ## requests first, use the named port from the sidecar. See sidecar example - ## from deployment above. Leave empty to use stirling-pdf directly. - targetPort: - nodePort: - annotations: {} - labels: {} - -serviceMonitor: - enabled: false - # namespace: prometheus - labels: {} - metricsPath: "/metrics" - # timeout: 60 - # interval: 60 - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 80m -# memory: 64Mi - -probes: - liveness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - livenessHttpGetConfig: - scheme: HTTP - readiness: - initialDelaySeconds: 5 - periodSeconds: 10 - timeoutSeconds: 1 - successThreshold: 1 - failureThreshold: 3 - readinessHttpGetConfig: - scheme: HTTP - -serviceAccount: - create: true - name: "" - automountServiceAccountToken: false - ## Annotations for the Service Account - annotations: {} - -# UID/GID 1000 is the default user "stirling-pdf" used in -# the container image starting in v0.8.0 and above. This -# is required for local persistent storage. If your cluster -# does not allow this, try setting securityContext: {} -securityContext: - enabled: true - fsGroup: 1000 - ## Optionally, specify supplementalGroups and/or - ## runAsNonRoot for security purposes - # runAsNonRoot: true - # supplementalGroups: [1000] - -containerSecurityContext: {} - -priorityClassName: "" - -nodeSelector: {} - -tolerations: [] - -affinity: {} - -persistence: - enabled: false - accessMode: ReadWriteOnce - size: 8Gi - labels: {} - # name: value - path: /tmp - ## A manually managed Persistent Volume and Claim - ## Requires persistence.enabled: true - ## If defined, PVC must be created manually before volume will be bound - # existingClaim: - - ## stirling-pdf data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - # volumeName: - pv: - enabled: false - pvname: - capacity: - storage: 8Gi - accessMode: ReadWriteOnce - nfs: - server: - path: - -## Init containers parameters: -## volumePermissions: Change the owner of the persistent volume mountpoint to RunAsUser:fsGroup -## -volumePermissions: - image: - registry: docker.io - repository: bitnami/minideb - tag: buster - pullPolicy: Always - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - # pullSecrets: - # - myRegistryKeySecretName - -## Ingress for load balancer -ingress: - enabled: false - pathType: "ImplementationSpecific" - ## stirling-pdf Ingress labels - ## - labels: {} - # dns: "route53" - - ## stirling-pdf Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - - ## stirling-pdf Ingress hostnames - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - name: stirling-pdf.domain1.com - # path: / - # tls: false - # - name: stirling-pdf.domain2.com - # path: / - # - # ## Set this to true in order to enable TLS on the ingress record - # tls: true - # - # ## If TLS is set to true, you must declare what secret will store the key/certificate for TLS - # ## Secrets must be added manually to the namespace - # tlsSecret: stirling-pdf.domain2-tls - - # For Kubernetes >= 1.18 you should specify the ingress-controller via the field ingressClassName - # See https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/#specifying-the-class-of-an-ingress - ingressClassName: - diff --git a/docs/stirling-pdf.png b/docs/stirling-pdf.png deleted file mode 100644 index 11695d86..00000000 Binary files a/docs/stirling-pdf.png and /dev/null differ diff --git a/docs/stirling-transparent.svg b/docs/stirling-transparent.svg deleted file mode 100644 index 700e6444..00000000 --- a/docs/stirling-transparent.svg +++ /dev/null @@ -1,298 +0,0 @@ - - - - diff --git a/docs/stirling.png b/docs/stirling.png deleted file mode 100644 index 11695d86..00000000 Binary files a/docs/stirling.png and /dev/null differ diff --git a/docs/stirling.svg b/docs/stirling.svg deleted file mode 100644 index 1a14a42f..00000000 --- a/docs/stirling.svg +++ /dev/null @@ -1,310 +0,0 @@ - - - - diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832..00000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 070cb702..00000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100644 index a69d9cb6..00000000 --- a/gradlew +++ /dev/null @@ -1,240 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# 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 -# -# https://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. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 53a6b238..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,91 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/images/DemoGif.gif b/images/DemoGif.gif deleted file mode 100644 index 5413bd36..00000000 Binary files a/images/DemoGif.gif and /dev/null differ diff --git a/images/login-dark.png b/images/login-dark.png deleted file mode 100644 index 672a6967..00000000 Binary files a/images/login-dark.png and /dev/null differ diff --git a/images/login-light.png b/images/login-light.png deleted file mode 100644 index 7b845c61..00000000 Binary files a/images/login-light.png and /dev/null differ diff --git a/images/settings.png b/images/settings.png deleted file mode 100644 index 49213054..00000000 Binary files a/images/settings.png and /dev/null differ diff --git a/images/stirling-home-light.png b/images/stirling-home-light.png deleted file mode 100644 index e6b09cad..00000000 Binary files a/images/stirling-home-light.png and /dev/null differ diff --git a/images/stirling-home.png b/images/stirling-home.png deleted file mode 100644 index c01af6f9..00000000 Binary files a/images/stirling-home.png and /dev/null differ diff --git a/lauch4jConfig.xml b/lauch4jConfig.xml deleted file mode 100644 index 918d6eaa..00000000 --- a/lauch4jConfig.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - false - console - .\build\libs\S-PDF-0.10.1.jar - .\Stirling-PDF.exe - Please download Java17 - - . - normal - https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe - - false - false - - ./src/main/resources/static/favicon.ico - BROWSER_OPEN=true - - Stirling-PDF - Stirling-PDF - - - %JAVA_HOME%;%PATH% - false - false - 17 - - - - An error occurred while starting Stirling-PDF - This application requires a Java Runtime Environment, Please download Java 17. - You are running the wrong version of Java, Please download Java 17. - Java is corrupted. Please uninstall and then install Java 17. - Stirling-PDF is already running. - - \ No newline at end of file diff --git a/scripts/PropSync.java b/scripts/PropSync.java deleted file mode 100644 index 741712b5..00000000 --- a/scripts/PropSync.java +++ /dev/null @@ -1,80 +0,0 @@ -package stirling.software.Stirling.Stats; - -import java.nio.file.*; -import java.nio.charset.MalformedInputException; -import java.nio.charset.StandardCharsets; -import java.io.*; -import java.util.*; - -public class PropSync { - - public static void main(String[] args) throws IOException { - File folder = new File("C:\\Users\\systo\\git\\Stirling-PDF\\src\\main\\resources"); - File[] files = folder.listFiles((dir, name) -> name.matches("messages_.*\\.properties")); - - List enLines = Files.readAllLines(Paths.get(folder + "\\messages_en_GB.properties"), StandardCharsets.UTF_8); - Map enProps = linesToProps(enLines); - - for (File file : files) { - if (!file.getName().equals("messages_en_GB.properties")) { - System.out.println("Processing file: " + file.getName()); - List lines; - try { - lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - } catch (MalformedInputException e) { - System.out.println("Skipping due to not UTF8 format for file: " + file.getName()); - continue; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - - Map currentProps = linesToProps(lines); - List newLines = syncPropsWithLines(enProps, currentProps, enLines); - - Files.write(file.toPath(), newLines, StandardCharsets.UTF_8); - System.out.println("Finished processing file: " + file.getName()); - } - } - } - - private static Map linesToProps(List lines) { - Map props = new LinkedHashMap<>(); - for (String line : lines) { - if (!line.trim().isEmpty() && line.contains("=")) { - String[] parts = line.split("=", 2); - props.put(parts[0].trim(), parts[1].trim()); - } - } - return props; - } - - private static List syncPropsWithLines(Map enProps, Map currentProps, List enLines) { - List newLines = new ArrayList<>(); - boolean needsTranslateComment = false; // flag to check if we need to add "TODO: Translate" - - for (String line : enLines) { - if (line.contains("=")) { - String key = line.split("=", 2)[0].trim(); - - if (currentProps.containsKey(key)) { - newLines.add(key + "=" + currentProps.get(key)); - needsTranslateComment = false; - } else { - if (!needsTranslateComment) { - newLines.add("##########################"); - newLines.add("### TODO: Translate ###"); - newLines.add("##########################"); - needsTranslateComment = true; - } - newLines.add(line); - } - } else { - // handle comments and other non-property lines - newLines.add(line); - needsTranslateComment = false; // reset the flag when we encounter comments or empty lines - } - } - - return newLines; - } -} diff --git a/scripts/detect-blank-pages.py b/scripts/detect-blank-pages.py deleted file mode 100644 index 474c2735..00000000 --- a/scripts/detect-blank-pages.py +++ /dev/null @@ -1,47 +0,0 @@ -import cv2 -import sys -import argparse - -def is_blank_image(image_path, threshold=10, white_percent=99, white_value=255, blur_size=5): - image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) - - if image is None: - print(f"Error: Unable to read the image file: {image_path}") - return False - - # Apply Gaussian blur to reduce noise - blurred_image = cv2.GaussianBlur(image, (blur_size, blur_size), 0) - - _, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY) - - # Calculate the percentage of white pixels in the thresholded image - white_pixels = 0 - total_pixels = thresholded_image.size - for i in range(0, thresholded_image.shape[0], 2): - for j in range(0, thresholded_image.shape[1], 2): - if thresholded_image[i, j] == white_value: - white_pixels += 1 - white_pixel_percentage = (white_pixels / (i * thresholded_image.shape[1] + j + 1)) * 100 - if white_pixel_percentage < white_percent: - return False - - print(f"Page has white pixel percent of {white_pixel_percentage}") - return True - - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Detect if an image is considered blank or not.') - parser.add_argument('image_path', help='The path to the image file.') - parser.add_argument('-t', '--threshold', type=int, default=10, help='Threshold for determining white pixels. The default value is 10.') - parser.add_argument('-w', '--white_percent', type=float, default=99, help='The percentage of white pixels for an image to be considered blank. The default value is 99.') - args = parser.parse_args() - - blank = is_blank_image(args.image_path, args.threshold, args.white_percent) - - if blank: - # Return code 1: The image is considered blank. - sys.exit(1) - else: - # Return code 0: The image is not considered blank. - sys.exit(0) diff --git a/scripts/init.sh b/scripts/init.sh deleted file mode 100644 index e65914c4..00000000 --- a/scripts/init.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copy the original tesseract-ocr files to the volume directory without overwriting existing files -echo "Copying original files without overwriting existing files" -mkdir -p /usr/share/tesseract-ocr -cp -rn /usr/share/tesseract-ocr-original/* /usr/share/tesseract-ocr - -# Check if TESSERACT_LANGS environment variable is set and is not empty -if [[ -n "$TESSERACT_LANGS" ]]; then - # Convert comma-separated values to a space-separated list - LANGS=$(echo $TESSERACT_LANGS | tr ',' ' ') - - # Install each language pack - for LANG in $LANGS; do - apt-get install -y "tesseract-ocr-$LANG" - done -fi - -# Check for DOCKER_ENABLE_SECURITY and download the appropriate JAR if required -if [ "$DOCKER_ENABLE_SECURITY" = "true" ] && [ "$VERSION_TAG" != "alpha" ]; then - if [ ! -f app-security.jar ]; then - echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar" - curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/v$VERSION_TAG/Stirling-PDF-with-login.jar - - # If the first download attempt failed, try with the 'v' prefix - if [ $? -ne 0 ]; then - echo "Trying to download from: https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar" - curl -L -o app-security.jar https://github.com/Frooodle/Stirling-PDF/releases/download/$VERSION_TAG/Stirling-PDF-with-login.jar - fi - - if [ $? -eq 0 ]; then # checks if curl was successful - rm -f app.jar - ln -s app-security.jar app.jar - fi - fi -fi - - -# Run the main command -exec "$@" \ No newline at end of file diff --git a/scripts/split_photos.py b/scripts/split_photos.py deleted file mode 100644 index 49ecc22c..00000000 --- a/scripts/split_photos.py +++ /dev/null @@ -1,116 +0,0 @@ -import argparse -import sys -import cv2 -import numpy as np -import os - -def find_photo_boundaries(image, background_color, tolerance=30, min_area=10000, min_contour_area=500): - mask = cv2.inRange(image, background_color - tolerance, background_color + tolerance) - mask = cv2.bitwise_not(mask) - kernel = np.ones((5,5),np.uint8) - mask = cv2.dilate(mask, kernel, iterations=2) - contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - - photo_boundaries = [] - for contour in contours: - x, y, w, h = cv2.boundingRect(contour) - area = w * h - contour_area = cv2.contourArea(contour) - if area >= min_area and contour_area >= min_contour_area: - photo_boundaries.append((x, y, w, h)) - - return photo_boundaries - -def estimate_background_color(image, sample_points=5): - h, w, _ = image.shape - points = [ - (0, 0), - (w - 1, 0), - (w - 1, h - 1), - (0, h - 1), - (w // 2, h // 2), - ] - - colors = [] - for x, y in points: - colors.append(image[y, x]) - - return np.median(colors, axis=0) - -def auto_rotate(image, angle_threshold=1): - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - edges = cv2.Canny(gray, 50, 150, apertureSize=3) - lines = cv2.HoughLines(edges, 1, np.pi / 180, 200) - - if lines is None: - return image - - # compute the median angle of the lines - angles = [] - for rho, theta in lines[:, 0]: - angles.append((theta * 180) / np.pi - 90) - - angle = np.median(angles) - - if abs(angle) < angle_threshold: - return image - - (h, w) = image.shape[:2] - center = (w // 2, h // 2) - M = cv2.getRotationMatrix2D(center, angle, 1.0) - return cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) - - - - -def crop_borders(image, border_color, tolerance=30): - mask = cv2.inRange(image, border_color - tolerance, border_color + tolerance) - - contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) - if len(contours) == 0: - return image - - largest_contour = max(contours, key=cv2.contourArea) - x, y, w, h = cv2.boundingRect(largest_contour) - - return image[y:y+h, x:x+w] - -def split_photos(input_file, output_directory, tolerance=30, min_area=10000, min_contour_area=500, angle_threshold=10, border_size=0): - image = cv2.imread(input_file) - background_color = estimate_background_color(image) - - # Add a constant border around the image - image = cv2.copyMakeBorder(image, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=background_color) - - photo_boundaries = find_photo_boundaries(image, background_color, tolerance) - - if not os.path.exists(output_directory): - os.makedirs(output_directory) - - # Get the input file's base name without the extension - input_file_basename = os.path.splitext(os.path.basename(input_file))[0] - - for idx, (x, y, w, h) in enumerate(photo_boundaries): - cropped_image = image[y:y+h, x:x+w] - cropped_image = auto_rotate(cropped_image, angle_threshold) - - # Remove the added border - cropped_image = cropped_image[border_size:-border_size, border_size:-border_size] - - output_path = os.path.join(output_directory, f"{input_file_basename}_{idx+1}.png") - cv2.imwrite(output_path, cropped_image) - print(f"Saved {output_path}") - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Split photos in an image") - parser.add_argument("input_file", help="The input scanned image containing multiple photos.") - parser.add_argument("output_directory", help="The directory where the result images should be placed.") - parser.add_argument("--tolerance", type=int, default=30, help="Determines the range of color variation around the estimated background color (default: 30).") - parser.add_argument("--min_area", type=int, default=10000, help="Sets the minimum area threshold for a photo (default: 10000).") - parser.add_argument("--min_contour_area", type=int, default=500, help="Sets the minimum contour area threshold for a photo (default: 500).") - parser.add_argument("--angle_threshold", type=int, default=10, help="Sets the minimum absolute angle required for the image to be rotated (default: 10).") - parser.add_argument("--border_size", type=int, default=0, help="Sets the size of the border added and removed to prevent white borders in the output (default: 0).") - - args = parser.parse_args() - - split_photos(args.input_file, args.output_directory, tolerance=args.tolerance, min_area=args.min_area, min_contour_area=args.min_contour_area, angle_threshold=args.angle_threshold, border_size=args.border_size) diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index f8139930..00000000 --- a/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'Stirling-PDF' diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java deleted file mode 100644 index 7f4fc160..00000000 --- a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java +++ /dev/null @@ -1,96 +0,0 @@ -package stirling.software.SPDF; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class LibreOfficeListener { - - private static final long ACTIVITY_TIMEOUT = 20 * 60 * 1000; // 20 minutes - - private static final LibreOfficeListener INSTANCE = new LibreOfficeListener(); - private static final int LISTENER_PORT = 2002; - - public static LibreOfficeListener getInstance() { - return INSTANCE; - } - - private ExecutorService executorService; - private long lastActivityTime; - - private Process process; - - private LibreOfficeListener() { - } - - private boolean isListenerRunning() { - try { - System.out.println("waiting for listener to start"); - Socket socket = new Socket(); - socket.connect(new InetSocketAddress("localhost", 2002), 1000); // Timeout after 1 second - socket.close(); - return true; - } catch (IOException e) { - return false; - } - } - - public void start() throws IOException { - // Check if the listener is already running - if (process != null && process.isAlive()) { - return; - } - - // Start the listener process - process = Runtime.getRuntime().exec("unoconv --listener"); - lastActivityTime = System.currentTimeMillis(); - - // Start a background thread to monitor the activity timeout - executorService = Executors.newSingleThreadExecutor(); - executorService.submit(() -> { - while (true) { - long idleTime = System.currentTimeMillis() - lastActivityTime; - if (idleTime >= ACTIVITY_TIMEOUT) { - // If there has been no activity for too long, tear down the listener - process.destroy(); - break; - } - try { - Thread.sleep(5000); // Check for inactivity every 5 seconds - } catch (InterruptedException e) { - break; - } - } - }); - - // Wait for the listener to start up - long startTime = System.currentTimeMillis(); - long timeout = 30000; // Timeout after 30 seconds - while (System.currentTimeMillis() - startTime < timeout) { - if (isListenerRunning()) { - - lastActivityTime = System.currentTimeMillis(); - return; - } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } // Check every 1 second - } - } - - public synchronized void stop() { - // Stop the activity timeout monitor thread - executorService.shutdownNow(); - - // Stop the listener process - if (process != null && process.isAlive()) { - process.destroy(); - } - } - -} diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java deleted file mode 100644 index 5dd7fed3..00000000 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ /dev/null @@ -1,82 +0,0 @@ -package stirling.software.SPDF; - -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.Collections; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.core.env.Environment; - -import jakarta.annotation.PostConstruct; -import stirling.software.SPDF.config.ConfigInitializer; -import stirling.software.SPDF.utils.GeneralUtils; -@SpringBootApplication - -//@EnableScheduling -public class SPdfApplication { - - @Autowired - private Environment env; - - @PostConstruct - public void init() { - // Check if the BROWSER_OPEN environment variable is set to true - String browserOpenEnv = env.getProperty("BROWSER_OPEN"); - boolean browserOpen = browserOpenEnv != null && browserOpenEnv.equalsIgnoreCase("true"); - - if (browserOpen) { - try { - String port = env.getProperty("local.server.port"); - if(port == null || port.length() == 0) { - port="8080"; - } - String url = "http://localhost:" + port; - - String os = System.getProperty("os.name").toLowerCase(); - Runtime rt = Runtime.getRuntime(); - if (os.contains("win")) { - // For Windows - rt.exec("rundll32 url.dll,FileProtocolHandler " + url); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - public static void main(String[] args) { - SpringApplication app = new SpringApplication(SPdfApplication.class); - app.addInitializers(new ConfigInitializer()); - if (Files.exists(Paths.get("configs/settings.yml"))) { - app.setDefaultProperties(Collections.singletonMap("spring.config.additional-location", "file:configs/settings.yml")); - } else { - System.out.println("External configuration file 'configs/settings.yml' does not exist. Using default configuration and environment configuration instead."); - } - app.run(args); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - GeneralUtils.createDir("customFiles/static/"); - GeneralUtils.createDir("customFiles/templates/"); - - - - System.out.println("Stirling-PDF Started."); - - String port = System.getProperty("local.server.port"); - if(port == null || port.length() == 0) { - port="8080"; - } - String url = "http://localhost:" + port; - System.out.println("Navigate to " + url); - } - - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java deleted file mode 100644 index 5d4bad43..00000000 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package stirling.software.SPDF.config; - -import org.springframework.beans.PropertyEditorRegistrar; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import stirling.software.SPDF.model.ApplicationProperties; -@Configuration -public class AppConfig { - - - @Autowired - ApplicationProperties applicationProperties; - - @Bean(name = "loginEnabled") - public boolean loginEnabled() { - return applicationProperties.getSecurity().getEnableLogin(); - } - - @Bean(name = "appName") - public String appName() { - String homeTitle = applicationProperties.getUi().getAppName(); - return (homeTitle != null) ? homeTitle : "Stirling PDF"; - } - - @Bean(name = "appVersion") - public String appVersion() { - String version = getClass().getPackage().getImplementationVersion(); - return (version != null) ? version : "0.0.0"; - } - - @Bean(name = "homeText") - public String homeText() { - return (applicationProperties.getUi().getHomeDescription() != null) ? applicationProperties.getUi().getHomeDescription() : "null"; - } - - - @Bean(name = "navBarText") - public String navBarText() { - String defaultNavBar = applicationProperties.getUi().getAppNameNavbar() != null ? applicationProperties.getUi().getAppNameNavbar() : applicationProperties.getUi().getAppName(); - return (defaultNavBar != null) ? defaultNavBar : "Stirling PDF"; - } - - @Bean(name = "rateLimit") - public boolean rateLimit() { - String appName = System.getProperty("rateLimit"); - if (appName == null) - appName = System.getenv("rateLimit"); - System.out.println("rateLimit=" + appName); - return (appName != null) ? Boolean.valueOf(appName) : false; - } - - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/Beans.java b/src/main/java/stirling/software/SPDF/config/Beans.java deleted file mode 100644 index d1c6a03b..00000000 --- a/src/main/java/stirling/software/SPDF/config/Beans.java +++ /dev/null @@ -1,65 +0,0 @@ -package stirling.software.SPDF.config; - -import java.util.Locale; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.LocaleResolver; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; -import org.springframework.web.servlet.i18n.SessionLocaleResolver; - -import stirling.software.SPDF.model.ApplicationProperties; - -@Configuration -public class Beans implements WebMvcConfigurer { - - @Autowired - ApplicationProperties applicationProperties; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(localeChangeInterceptor()); - registry.addInterceptor(new CleanUrlInterceptor()); - } - - @Bean - public LocaleChangeInterceptor localeChangeInterceptor() { - LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); - lci.setParamName("lang"); - return lci; - } - - @Bean - public LocaleResolver localeResolver() { - SessionLocaleResolver slr = new SessionLocaleResolver(); - - - String appLocaleEnv = applicationProperties.getSystem().getDefaultLocale(); - Locale defaultLocale = Locale.UK; // Fallback to UK locale if environment variable is not set - - if (appLocaleEnv != null && !appLocaleEnv.isEmpty()) { - Locale tempLocale = Locale.forLanguageTag(appLocaleEnv); - String tempLanguageTag = tempLocale.toLanguageTag(); - - if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) { - defaultLocale = tempLocale; - } else { - tempLocale = Locale.forLanguageTag(appLocaleEnv.replace("_","-")); - tempLanguageTag = tempLocale.toLanguageTag(); - - if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) { - defaultLocale = tempLocale; - } else { - System.err.println("Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK."); - } - } - } - - slr.setDefaultLocale(defaultLocale); - return slr; - } - -} diff --git a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java b/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java deleted file mode 100644 index 894d50d8..00000000 --- a/src/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java +++ /dev/null @@ -1,68 +0,0 @@ -package stirling.software.SPDF.config; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.ModelAndView; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -public class CleanUrlInterceptor implements HandlerInterceptor { - - private static final List ALLOWED_PARAMS = Arrays.asList("lang", "endpoint", "endpoints", "logout", "error", "file", "messageType"); - - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) - throws Exception { - String queryString = request.getQueryString(); - if (queryString != null && !queryString.isEmpty()) { - String requestURI = request.getRequestURI(); - Map parameters = new HashMap<>(); - - // Keep only the allowed parameters - String[] queryParameters = queryString.split("&"); - for (String param : queryParameters) { - String[] keyValue = param.split("="); - if (keyValue.length != 2) { - continue; - } - if (ALLOWED_PARAMS.contains(keyValue[0])) { - parameters.put(keyValue[0], keyValue[1]); - } - } - - // If there are any parameters that are not allowed - if (parameters.size() != queryParameters.length) { - // Construct new query string - StringBuilder newQueryString = new StringBuilder(); - for (Map.Entry entry : parameters.entrySet()) { - if (newQueryString.length() > 0) { - newQueryString.append("&"); - } - newQueryString.append(entry.getKey()).append("=").append(entry.getValue()); - } - - // Redirect to the URL with only allowed query parameters - String redirectUrl = requestURI + "?" + newQueryString; - response.sendRedirect(redirectUrl); - return false; - } - } - return true; - } - - @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, - ModelAndView modelAndView) { - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, - Exception ex) { - } -} diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java deleted file mode 100644 index 862f5718..00000000 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ /dev/null @@ -1,129 +0,0 @@ -package stirling.software.SPDF.config; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import org.springframework.context.ApplicationContextInitializer; -import org.springframework.context.ConfigurableApplicationContext; - -public class ConfigInitializer implements ApplicationContextInitializer { - - @Override - public void initialize(ConfigurableApplicationContext applicationContext) { - try { - ensureConfigExists(); - } catch (IOException e) { - throw new RuntimeException("Failed to initialize application configuration", e); - } - } - - public void ensureConfigExists() throws IOException { - // Define the path to the external config directory - Path destPath = Paths.get("configs", "settings.yml"); - - // Check if the file already exists - if (Files.notExists(destPath)) { - // Ensure the destination directory exists - Files.createDirectories(destPath.getParent()); - - // Copy the resource from classpath to the external directory - try (InputStream in = getClass().getClassLoader().getResourceAsStream("settings.yml.template")) { - if (in != null) { - Files.copy(in, destPath); - } else { - throw new FileNotFoundException("Resource file not found: settings.yml.template"); - } - } - } else { - // If user file exists, we need to merge it with the template from the classpath - List templateLines; - try (InputStream in = getClass().getClassLoader().getResourceAsStream("settings.yml.template")) { - templateLines = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)).lines() - .collect(Collectors.toList()); - } - - mergeYamlFiles(templateLines, destPath, destPath); - } - } - - public void mergeYamlFiles(List templateLines, Path userFilePath, Path outputPath) throws IOException { - List userLines = Files.readAllLines(userFilePath); - List mergedLines = new ArrayList<>(); - boolean insideAutoGenerated = false; - boolean beforeFirstKey = true; - - Function isCommented = line -> line.trim().startsWith("#"); - Function extractKey = line -> { - String[] parts = line.split(":"); - return parts.length > 0 ? parts[0].trim().replace("#", "").trim() : ""; - }; - - Set userKeys = userLines.stream().map(extractKey).collect(Collectors.toSet()); - - for (String line : templateLines) { - String key = extractKey.apply(line); - - if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) { - insideAutoGenerated = true; - mergedLines.add(line); - continue; - } else if (insideAutoGenerated && line.trim().isEmpty()) { - insideAutoGenerated = false; - mergedLines.add(line); - continue; - } - - if (beforeFirstKey && (isCommented.apply(line) || line.trim().isEmpty())) { - // Handle top comments and empty lines before the first key. - mergedLines.add(line); - continue; - } - - if (!key.isEmpty()) - beforeFirstKey = false; - - if (userKeys.contains(key)) { - // If user has any version (commented or uncommented) of this key, skip the - // template line - Optional userValue = userLines.stream() - .filter(l -> extractKey.apply(l).equalsIgnoreCase(key) && !isCommented.apply(l)).findFirst(); - if (userValue.isPresent()) - mergedLines.add(userValue.get()); - continue; - } - - if (isCommented.apply(line) || line.trim().isEmpty() || !userKeys.contains(key)) { - mergedLines.add(line); // If line is commented, empty or key not present in user's file, retain the - // template line - continue; - } - } - - // Add any additional uncommented user lines that are not present in the - // template - for (String userLine : userLines) { - String userKey = extractKey.apply(userLine); - boolean isPresentInTemplate = templateLines.stream().map(extractKey) - .anyMatch(templateKey -> templateKey.equalsIgnoreCase(userKey)); - if (!isPresentInTemplate && !isCommented.apply(userLine)) { - mergedLines.add(userLine); - } - } - - Files.write(outputPath, mergedLines, StandardCharsets.UTF_8); - } - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java deleted file mode 100644 index ee17e0b9..00000000 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ /dev/null @@ -1,228 +0,0 @@ -package stirling.software.SPDF.config; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import stirling.software.SPDF.model.ApplicationProperties; -@Service -public class EndpointConfiguration { - private static final Logger logger = LoggerFactory.getLogger(EndpointConfiguration.class); - private Map endpointStatuses = new ConcurrentHashMap<>(); - private Map> endpointGroups = new ConcurrentHashMap<>(); - - private final ApplicationProperties applicationProperties; - - @Autowired - public EndpointConfiguration(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - init(); - processEnvironmentConfigs(); - } - - public void enableEndpoint(String endpoint) { - endpointStatuses.put(endpoint, true); - } - - public void disableEndpoint(String endpoint) { - if(!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) { - logger.info("Disabling {}", endpoint); - endpointStatuses.put(endpoint, false); - } - } - - public boolean isEndpointEnabled(String endpoint) { - if (endpoint.startsWith("/")) { - endpoint = endpoint.substring(1); - } - return endpointStatuses.getOrDefault(endpoint, true); - } - - public void addEndpointToGroup(String group, String endpoint) { - endpointGroups.computeIfAbsent(group, k -> new HashSet<>()).add(endpoint); - } - - public void enableGroup(String group) { - Set endpoints = endpointGroups.get(group); - if (endpoints != null) { - for (String endpoint : endpoints) { - enableEndpoint(endpoint); - } - } - } - - public void disableGroup(String group) { - Set endpoints = endpointGroups.get(group); - if (endpoints != null) { - for (String endpoint : endpoints) { - disableEndpoint(endpoint); - } - } - } - - public void init() { - // Adding endpoints to "PageOps" group - addEndpointToGroup("PageOps", "remove-pages"); - addEndpointToGroup("PageOps", "merge-pdfs"); - addEndpointToGroup("PageOps", "split-pdfs"); - addEndpointToGroup("PageOps", "pdf-organizer"); - addEndpointToGroup("PageOps", "rotate-pdf"); - addEndpointToGroup("PageOps", "multi-page-layout"); - addEndpointToGroup("PageOps", "scale-pages"); - addEndpointToGroup("PageOps", "adjust-contrast"); - addEndpointToGroup("PageOps", "crop"); - addEndpointToGroup("PageOps", "auto-split-pdf"); - addEndpointToGroup("PageOps", "extract-page"); - addEndpointToGroup("PageOps", "pdf-to-single-page"); - - // Adding endpoints to "Convert" group - addEndpointToGroup("Convert", "pdf-to-img"); - addEndpointToGroup("Convert", "img-to-pdf"); - addEndpointToGroup("Convert", "pdf-to-pdfa"); - addEndpointToGroup("Convert", "file-to-pdf"); - addEndpointToGroup("Convert", "xlsx-to-pdf"); - addEndpointToGroup("Convert", "pdf-to-word"); - addEndpointToGroup("Convert", "pdf-to-presentation"); - addEndpointToGroup("Convert", "pdf-to-text"); - addEndpointToGroup("Convert", "pdf-to-html"); - addEndpointToGroup("Convert", "pdf-to-xml"); - addEndpointToGroup("Convert", "html-to-pdf"); - addEndpointToGroup("Convert", "url-to-pdf"); - addEndpointToGroup("Convert", "markdown-to-pdf"); - - // Adding endpoints to "Security" group - addEndpointToGroup("Security", "add-password"); - addEndpointToGroup("Security", "remove-password"); - addEndpointToGroup("Security", "change-permissions"); - addEndpointToGroup("Security", "add-watermark"); - addEndpointToGroup("Security", "cert-sign"); - addEndpointToGroup("Security", "sanitize-pdf"); - - - // Adding endpoints to "Other" group - addEndpointToGroup("Other", "ocr-pdf"); - addEndpointToGroup("Other", "add-image"); - addEndpointToGroup("Other", "compress-pdf"); - addEndpointToGroup("Other", "extract-images"); - addEndpointToGroup("Other", "change-metadata"); - addEndpointToGroup("Other", "extract-image-scans"); - addEndpointToGroup("Other", "sign"); - addEndpointToGroup("Other", "flatten"); - addEndpointToGroup("Other", "repair"); - addEndpointToGroup("Other", "remove-blanks"); - addEndpointToGroup("Other", "compare"); - addEndpointToGroup("Other", "add-page-numbers"); - addEndpointToGroup("Other", "auto-rename"); - addEndpointToGroup("Other", "get-info-on-pdf"); - addEndpointToGroup("Other", "show-javascript"); - - - - //CLI - addEndpointToGroup("CLI", "compress-pdf"); - addEndpointToGroup("CLI", "extract-image-scans"); - addEndpointToGroup("CLI", "remove-blanks"); - addEndpointToGroup("CLI", "repair"); - addEndpointToGroup("CLI", "pdf-to-pdfa"); - addEndpointToGroup("CLI", "file-to-pdf"); - addEndpointToGroup("CLI", "xlsx-to-pdf"); - addEndpointToGroup("CLI", "pdf-to-word"); - addEndpointToGroup("CLI", "pdf-to-presentation"); - addEndpointToGroup("CLI", "pdf-to-text"); - addEndpointToGroup("CLI", "pdf-to-html"); - addEndpointToGroup("CLI", "pdf-to-xml"); - addEndpointToGroup("CLI", "ocr-pdf"); - addEndpointToGroup("CLI", "html-to-pdf"); - addEndpointToGroup("CLI", "url-to-pdf"); - - - //python - addEndpointToGroup("Python", "extract-image-scans"); - addEndpointToGroup("Python", "remove-blanks"); - addEndpointToGroup("Python", "html-to-pdf"); - addEndpointToGroup("Python", "url-to-pdf"); - - //openCV - addEndpointToGroup("OpenCV", "extract-image-scans"); - addEndpointToGroup("OpenCV", "remove-blanks"); - - //LibreOffice - addEndpointToGroup("LibreOffice", "repair"); - addEndpointToGroup("LibreOffice", "file-to-pdf"); - addEndpointToGroup("LibreOffice", "xlsx-to-pdf"); - addEndpointToGroup("LibreOffice", "pdf-to-word"); - addEndpointToGroup("LibreOffice", "pdf-to-presentation"); - addEndpointToGroup("LibreOffice", "pdf-to-text"); - addEndpointToGroup("LibreOffice", "pdf-to-html"); - addEndpointToGroup("LibreOffice", "pdf-to-xml"); - - - //OCRmyPDF - addEndpointToGroup("OCRmyPDF", "compress-pdf"); - addEndpointToGroup("OCRmyPDF", "pdf-to-pdfa"); - addEndpointToGroup("OCRmyPDF", "ocr-pdf"); - - //Java - addEndpointToGroup("Java", "merge-pdfs"); - addEndpointToGroup("Java", "remove-pages"); - addEndpointToGroup("Java", "split-pdfs"); - addEndpointToGroup("Java", "pdf-organizer"); - addEndpointToGroup("Java", "rotate-pdf"); - addEndpointToGroup("Java", "pdf-to-img"); - addEndpointToGroup("Java", "img-to-pdf"); - addEndpointToGroup("Java", "add-password"); - addEndpointToGroup("Java", "remove-password"); - addEndpointToGroup("Java", "change-permissions"); - addEndpointToGroup("Java", "add-watermark"); - addEndpointToGroup("Java", "add-image"); - addEndpointToGroup("Java", "extract-images"); - addEndpointToGroup("Java", "change-metadata"); - addEndpointToGroup("Java", "cert-sign"); - addEndpointToGroup("Java", "multi-page-layout"); - addEndpointToGroup("Java", "scale-pages"); - addEndpointToGroup("Java", "add-page-numbers"); - addEndpointToGroup("Java", "auto-rename"); - addEndpointToGroup("Java", "auto-split-pdf"); - addEndpointToGroup("Java", "sanitize-pdf"); - addEndpointToGroup("Java", "crop"); - addEndpointToGroup("Java", "get-info-on-pdf"); - addEndpointToGroup("Java", "extract-page"); - addEndpointToGroup("Java", "pdf-to-single-page"); - addEndpointToGroup("Java", "markdown-to-pdf"); - addEndpointToGroup("Java", "show-javascript"); - - //Javascript - addEndpointToGroup("Javascript", "pdf-organizer"); - addEndpointToGroup("Javascript", "sign"); - addEndpointToGroup("Javascript", "compare"); - addEndpointToGroup("Javascript", "adjust-contrast"); - - - } - - private void processEnvironmentConfigs() { - List endpointsToRemove = applicationProperties.getEndpoints().getToRemove(); - List groupsToRemove = applicationProperties.getEndpoints().getGroupsToRemove(); - - if (endpointsToRemove != null) { - for (String endpoint : endpointsToRemove) { - disableEndpoint(endpoint.trim()); - } - } - - if (groupsToRemove != null) { - for (String group : groupsToRemove) { - disableGroup(group.trim()); - } - } - } - -} - diff --git a/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java b/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java deleted file mode 100644 index 77191a41..00000000 --- a/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java +++ /dev/null @@ -1,26 +0,0 @@ -package stirling.software.SPDF.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -@Component -public class EndpointInterceptor implements HandlerInterceptor { - - @Autowired - private EndpointConfiguration endpointConfiguration; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) - throws Exception { - String requestURI = request.getRequestURI(); - if (!endpointConfiguration.isEndpointEnabled(requestURI)) { - response.sendError(HttpServletResponse.SC_FORBIDDEN, "This endpoint is disabled"); - return false; - } - return true; - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/MetricsConfig.java b/src/main/java/stirling/software/SPDF/config/MetricsConfig.java deleted file mode 100644 index 1cdc99e3..00000000 --- a/src/main/java/stirling/software/SPDF/config/MetricsConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package stirling.software.SPDF.config; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import io.micrometer.core.instrument.Meter; -import io.micrometer.core.instrument.config.MeterFilter; -import io.micrometer.core.instrument.config.MeterFilterReply; - -@Configuration -public class MetricsConfig { - - @Bean - public MeterFilter meterFilter() { - return new MeterFilter() { - @Override - public MeterFilterReply accept(Meter.Id id) { - if (id.getName().equals("http.requests")) { - return MeterFilterReply.NEUTRAL; - } - return MeterFilterReply.DENY; - } - }; - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java deleted file mode 100644 index 6ee59db7..00000000 --- a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java +++ /dev/null @@ -1,48 +0,0 @@ -package stirling.software.SPDF.config; - -import java.io.IOException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import io.micrometer.core.instrument.Counter; -import io.micrometer.core.instrument.MeterRegistry; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -@Component -public class MetricsFilter extends OncePerRequestFilter { - - private final MeterRegistry meterRegistry; - - @Autowired - public MetricsFilter(MeterRegistry meterRegistry) { - this.meterRegistry = meterRegistry; - } - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - String uri = request.getRequestURI(); - - //System.out.println("uri="+uri + ", method=" + request.getMethod() ); - // Ignore static resources - if (!(uri.startsWith("/js") || uri.startsWith("api-docs") || uri.endsWith("robots.txt") || uri.startsWith("/images") || uri.endsWith(".png") || uri.endsWith(".ico") || uri.endsWith(".css") || uri.endsWith(".svg")|| uri.endsWith(".js") || uri.contains("swagger") || uri.startsWith("/api"))) { - Counter counter = Counter.builder("http.requests") - .tag("uri", uri) - .tag("method", request.getMethod()) - .register(meterRegistry); - - counter.increment(); - //System.out.println("Counted"); - } - - filterChain.doFilter(request, response); - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java deleted file mode 100644 index 2583277e..00000000 --- a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package stirling.software.SPDF.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; - -@Configuration -public class OpenApiConfig { - - @Bean - public OpenAPI customOpenAPI() { - String version = getClass().getPackage().getImplementationVersion(); - if (version == null) { - - version = "1.0.0"; // default version if all else fails - - } - - return new OpenAPI().components(new Components()).info( - new Info().title("Stirling PDF API").version(version).description("API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here.")); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java b/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java deleted file mode 100644 index 77b69c88..00000000 --- a/src/main/java/stirling/software/SPDF/config/StartupApplicationListener.java +++ /dev/null @@ -1,20 +0,0 @@ -package stirling.software.SPDF.config; - - -import java.time.LocalDateTime; - -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.stereotype.Component; - -@Component -public class StartupApplicationListener implements ApplicationListener { - - public static LocalDateTime startTime; - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - startTime = LocalDateTime.now(); - } -} - diff --git a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java b/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java deleted file mode 100644 index dca3f91c..00000000 --- a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package stirling.software.SPDF.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebMvcConfig implements WebMvcConfigurer { - - @Autowired - private EndpointInterceptor endpointInterceptor; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(endpointInterceptor); - } - - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - // Handler for external static resources - registry.addResourceHandler("/**") - .addResourceLocations("file:customFiles/static/", "classpath:/static/"); - //.setCachePeriod(0); // Optional: disable caching - } -} diff --git a/src/main/java/stirling/software/SPDF/config/YamlPropertySourceFactory.java b/src/main/java/stirling/software/SPDF/config/YamlPropertySourceFactory.java deleted file mode 100644 index 982cee94..00000000 --- a/src/main/java/stirling/software/SPDF/config/YamlPropertySourceFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package stirling.software.SPDF.config; - -import java.io.IOException; -import java.util.Properties; - -import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; -import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.core.env.PropertySource; -import org.springframework.core.io.support.EncodedResource; -import org.springframework.core.io.support.PropertySourceFactory; -public class YamlPropertySourceFactory implements PropertySourceFactory { - - @Override - public PropertySource createPropertySource(String name, EncodedResource encodedResource) - throws IOException { - YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); - factory.setResources(encodedResource.getResource()); - - Properties properties = factory.getObject(); - - return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java deleted file mode 100644 index 9f52a5e3..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.io.IOException; - -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.LockedException; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; - -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { - - @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) - throws IOException, ServletException { - if (exception.getClass().isAssignableFrom(BadCredentialsException.class)) { - setDefaultFailureUrl("/login?error=badcredentials"); - } else if (exception.getClass().isAssignableFrom(LockedException.class)) { - setDefaultFailureUrl("/login?error=locked"); - } - super.onAuthenticationFailure(request, response, exception); - } -} diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java b/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java deleted file mode 100644 index 7ae1680b..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java +++ /dev/null @@ -1,45 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -import stirling.software.SPDF.model.Authority; -import stirling.software.SPDF.model.User; -import stirling.software.SPDF.repository.UserRepository; - -@Service -public class CustomUserDetailsService implements UserDetailsService { - - @Autowired - private UserRepository userRepository; - - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new UsernameNotFoundException("No user found with username: " + username)); - - return new org.springframework.security.core.userdetails.User( - user.getUsername(), - user.getPassword(), - user.isEnabled(), - true, true, true, - getAuthorities(user.getAuthorities()) - ); - } - - private Collection getAuthorities(Set authorities) { - return authorities.stream() - .map(authority -> new SimpleGrantedAuthority(authority.getAuthority())) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java deleted file mode 100644 index 8e612464..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java +++ /dev/null @@ -1,53 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.io.IOException; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import stirling.software.SPDF.model.User; - -@Component -public class FirstLoginFilter extends OncePerRequestFilter { - - @Autowired - @Lazy - private UserService userService; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String method = request.getMethod(); - String requestURI = request.getRequestURI(); - // Check if the request is for static resources - boolean isStaticResource = requestURI.startsWith("/css/") - || requestURI.startsWith("/js/") - || requestURI.startsWith("/images/") - || requestURI.startsWith("/public/") - || requestURI.endsWith(".svg"); - - // If it's a static resource, just continue the filter chain and skip the logic below - if (isStaticResource) { - filterChain.doFilter(request, response); - return; - } - - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated()) { - Optional user = userService.findByUsername(authentication.getName()); - if ("GET".equalsIgnoreCase(method) && user.isPresent() && user.get().isFirstLogin() && !"/change-creds".equals(requestURI)) { - response.sendRedirect("/change-creds"); - return; - } - } - filterChain.doFilter(request, response); - } -} diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java deleted file mode 100644 index 842375d8..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ /dev/null @@ -1,85 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.UUID; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import jakarta.annotation.PostConstruct; -import stirling.software.SPDF.model.ApplicationProperties; -import stirling.software.SPDF.model.Role; -@Component -public class InitialSecuritySetup { - - @Autowired - private UserService userService; - - - @Autowired - ApplicationProperties applicationProperties; - - @PostConstruct - public void init() { - if (!userService.hasUsers()) { - - - String initialUsername = applicationProperties.getSecurity().getInitialLogin().getUsername(); - String initialPassword = applicationProperties.getSecurity().getInitialLogin().getPassword(); - if (initialUsername != null && initialPassword != null) { - userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId()); - } else { - initialUsername = "admin"; - initialPassword = "stirling"; - userService.saveUser(initialUsername, initialPassword, Role.ADMIN.getRoleId(), true); - } - - - } - } - - - - @PostConstruct - public void initSecretKey() throws IOException { - String secretKey = applicationProperties.getAutomaticallyGenerated().getKey(); - if (secretKey == null || secretKey.isEmpty()) { - secretKey = UUID.randomUUID().toString(); // Generating a random UUID as the secret key - saveKeyToConfig(secretKey); - } - } - - private void saveKeyToConfig(String key) throws IOException { - Path path = Paths.get("configs", "settings.yml"); // Target the configs/settings.yml - List lines = Files.readAllLines(path); - boolean keyFound = false; - - // Search for the existing key to replace it or place to add it - for (int i = 0; i < lines.size(); i++) { - if (lines.get(i).startsWith("AutomaticallyGenerated:")) { - keyFound = true; - if (i + 1 < lines.size() && lines.get(i + 1).trim().startsWith("key:")) { - lines.set(i + 1, " key: " + key); - break; - } else { - lines.add(i + 1, " key: " + key); - break; - } - } - } - - // If the section doesn't exist, append it - if (!keyFound) { - lines.add("# Automatically Generated Settings (Do Not Edit Directly)"); - lines.add("AutomaticallyGenerated:"); - lines.add(" key: " + key); - } - - // Write back to the file - Files.write(path, lines); - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java deleted file mode 100644 index dfe782ac..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ /dev/null @@ -1,106 +0,0 @@ -package stirling.software.SPDF.config.security; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; -import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; - -import stirling.software.SPDF.repository.JPATokenRepositoryImpl; -@Configuration -@EnableWebSecurity() -@EnableGlobalMethodSecurity(prePostEnabled = true) -public class SecurityConfiguration { - - @Autowired - private UserDetailsService userDetailsService; - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - @Autowired - @Lazy - private UserService userService; - - @Autowired - @Qualifier("loginEnabled") - public boolean loginEnabledValue; - - @Autowired - private UserAuthenticationFilter userAuthenticationFilter; - - @Autowired - private FirstLoginFilter firstLoginFilter; - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - - if(loginEnabledValue) { - - http.csrf(csrf -> csrf.disable()); - http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class); - http - .formLogin(formLogin -> formLogin - .loginPage("/login") - .defaultSuccessUrl("/") - .failureHandler(new CustomAuthenticationFailureHandler()) - .permitAll() - ) - .logout(logout -> logout - .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) - .logoutSuccessUrl("/login?logout=true") - .invalidateHttpSession(true) // Invalidate session - .deleteCookies("JSESSIONID", "remember-me") - ).rememberMe(rememberMeConfigurer -> rememberMeConfigurer // Use the configurator directly - .key("uniqueAndSecret") - .tokenRepository(persistentTokenRepository()) - .tokenValiditySeconds(1209600) // 2 weeks - ) - .authorizeHttpRequests(authz -> authz - .requestMatchers(req -> req.getRequestURI().startsWith("/login") || req.getRequestURI().endsWith(".svg") || req.getRequestURI().startsWith("/register") || req.getRequestURI().startsWith("/error") || req.getRequestURI().startsWith("/images/") || req.getRequestURI().startsWith("/public/") || req.getRequestURI().startsWith("/css/") || req.getRequestURI().startsWith("/js/")) - .permitAll() - .anyRequest().authenticated() - ) - .userDetailsService(userDetailsService) - .authenticationProvider(authenticationProvider()); - } else { - http.csrf(csrf -> csrf.disable()) - .authorizeHttpRequests(authz -> authz - .anyRequest().permitAll() - ); - } - return http.build(); - } - - - - @Bean - public DaoAuthenticationProvider authenticationProvider() { - DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); - authProvider.setUserDetailsService(userDetailsService); - authProvider.setPasswordEncoder(passwordEncoder()); - return authProvider; - } - - @Bean - public PersistentTokenRepository persistentTokenRepository() { - return new JPATokenRepositoryImpl(); - } - - - -} - diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java deleted file mode 100644 index eca7f70e..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ /dev/null @@ -1,113 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.io.IOException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Lazy; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import stirling.software.SPDF.model.ApiKeyAuthenticationToken; -@Component -public class UserAuthenticationFilter extends OncePerRequestFilter { - - @Autowired - private UserDetailsService userDetailsService; - - @Autowired - @Lazy - private UserService userService; - - - @Autowired - @Qualifier("loginEnabled") - public boolean loginEnabledValue; - - @Override - protected void doFilterInternal(HttpServletRequest request, - HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - - if (!loginEnabledValue) { - // If login is not enabled, just pass all requests without authentication - filterChain.doFilter(request, response); - return; - } - String requestURI = request.getRequestURI(); - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - // Check for API key in the request headers if no authentication exists - if (authentication == null || !authentication.isAuthenticated()) { - String apiKey = request.getHeader("X-API-Key"); - if (apiKey != null && !apiKey.trim().isEmpty()) { - try { - // Use API key to authenticate. This requires you to have an authentication provider for API keys. - UserDetails userDetails = userService.loadUserByApiKey(apiKey); - if(userDetails == null) - { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Invalid API Key."); - return; - } - authentication = new ApiKeyAuthenticationToken(userDetails, apiKey, userDetails.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - } catch (AuthenticationException e) { - // If API key authentication fails, deny the request - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Invalid API Key."); - return; - } - } - } - - // If we still don't have any authentication, deny the request - if (authentication == null || !authentication.isAuthenticated()) { - String method = request.getMethod(); - if ("GET".equalsIgnoreCase(method) && !"/login".equals(requestURI)) { - response.sendRedirect("/login"); // redirect to the login page - return; - } else { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); - return; - } - } - - filterChain.doFilter(request, response); - } - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { - String uri = request.getRequestURI(); - - String[] permitAllPatterns = { - "/login", - "/register", - "/error", - "/images/", - "/public/", - "/css/", - "/js/" - }; - - for (String pattern : permitAllPatterns) { - if (uri.startsWith(pattern) || uri.endsWith(".svg")) { - return true; - } - } - - return false; - } - -} diff --git a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java deleted file mode 100644 index f23e5ce3..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java +++ /dev/null @@ -1,125 +0,0 @@ -package stirling.software.SPDF.config.security; - -import java.io.IOException; -import java.time.Duration; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.HttpStatus; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import io.github.bucket4j.Bandwidth; -import io.github.bucket4j.Bucket; -import io.github.bucket4j.ConsumptionProbe; -import io.github.bucket4j.Refill; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import stirling.software.SPDF.model.Role; -@Component -public class UserBasedRateLimitingFilter extends OncePerRequestFilter { - - private final Map apiBuckets = new ConcurrentHashMap<>(); - private final Map webBuckets = new ConcurrentHashMap<>(); - - @Autowired - private UserDetailsService userDetailsService; - - @Autowired - @Qualifier("rateLimit") - public boolean rateLimit; - - @Override - protected void doFilterInternal(HttpServletRequest request, - HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - if (!rateLimit) { - // If rateLimit is not enabled, just pass all requests without rate limiting - filterChain.doFilter(request, response); - return; - } - - String method = request.getMethod(); - if (!"POST".equalsIgnoreCase(method)) { - // If the request is not a POST, just pass it through without rate limiting - filterChain.doFilter(request, response); - return; - } - - String identifier = null; - - // Check for API key in the request headers - String apiKey = request.getHeader("X-API-Key"); - if (apiKey != null && !apiKey.trim().isEmpty()) { - identifier = "API_KEY_" + apiKey; // Prefix to distinguish between API keys and usernames - } else { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated()) { - UserDetails userDetails = (UserDetails) authentication.getPrincipal(); - identifier = userDetails.getUsername(); - } - } - - // If neither API key nor an authenticated user is present, use IP address - if (identifier == null) { - identifier = request.getRemoteAddr(); - } - - Role userRole = getRoleFromAuthentication(SecurityContextHolder.getContext().getAuthentication()); - - if (request.getHeader("X-API-Key") != null) { - // It's an API call - processRequest(userRole.getApiCallsPerDay(), identifier, apiBuckets, request, response, filterChain); - } else { - // It's a Web UI call - processRequest(userRole.getWebCallsPerDay(), identifier, webBuckets, request, response, filterChain); - } - } - - private Role getRoleFromAuthentication(Authentication authentication) { - if (authentication != null && authentication.isAuthenticated()) { - for (GrantedAuthority authority : authentication.getAuthorities()) { - try { - return Role.fromString(authority.getAuthority()); - } catch (IllegalArgumentException ex) { - // Ignore and continue to next authority. - } - } - } - throw new IllegalStateException("User does not have a valid role."); - } - - private void processRequest(int limitPerDay, String identifier, Map buckets, - HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws IOException, ServletException { - Bucket userBucket = buckets.computeIfAbsent(identifier, k -> createUserBucket(limitPerDay)); - ConsumptionProbe probe = userBucket.tryConsumeAndReturnRemaining(1); - - if (probe.isConsumed()) { - response.setHeader("X-Rate-Limit-Remaining", Long.toString(probe.getRemainingTokens())); - filterChain.doFilter(request, response); - } else { - long waitForRefill = probe.getNanosToWaitForRefill() / 1_000_000_000; - response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); - response.setHeader("X-Rate-Limit-Retry-After-Seconds", String.valueOf(waitForRefill)); - response.getWriter().write("Rate limit exceeded for POST requests."); - } - } - - private Bucket createUserBucket(int limitPerDay) { - Bandwidth limit = Bandwidth.classic(limitPerDay, Refill.intervally(limitPerDay, Duration.ofDays(1))); - return Bucket.builder().addLimit(limit).build(); - } -} - - - diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java deleted file mode 100644 index 46c5aeff..00000000 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ /dev/null @@ -1,191 +0,0 @@ -package stirling.software.SPDF.config.security; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -import stirling.software.SPDF.model.Authority; -import stirling.software.SPDF.model.User; -import stirling.software.SPDF.repository.UserRepository; -@Service -public class UserService { - - @Autowired - private UserRepository userRepository; - - @Autowired - private PasswordEncoder passwordEncoder; - - public Authentication getAuthentication(String apiKey) { - User user = getUserByApiKey(apiKey); - if (user == null) { - throw new UsernameNotFoundException("API key is not valid"); - } - - // Convert the user into an Authentication object - return new UsernamePasswordAuthenticationToken( - user, // principal (typically the user) - null, // credentials (we don't expose the password or API key here) - getAuthorities(user) // user's authorities (roles/permissions) - ); - } - - private Collection getAuthorities(User user) { - // Convert each Authority object into a SimpleGrantedAuthority object. - return user.getAuthorities().stream() - .map((Authority authority) -> new SimpleGrantedAuthority(authority.getAuthority())) - .collect(Collectors.toList()); - - - } - - private String generateApiKey() { - String apiKey; - do { - apiKey = UUID.randomUUID().toString(); - } while (userRepository.findByApiKey(apiKey) != null); // Ensure uniqueness - return apiKey; - } - - public User addApiKeyToUser(String username) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new UsernameNotFoundException("User not found")); - - user.setApiKey(generateApiKey()); - return userRepository.save(user); - } - - public User refreshApiKeyForUser(String username) { - return addApiKeyToUser(username); // reuse the add API key method for refreshing - } - - public String getApiKeyForUser(String username) { - User user = userRepository.findByUsername(username) - .orElseThrow(() -> new UsernameNotFoundException("User not found")); - return user.getApiKey(); - } - - public boolean isValidApiKey(String apiKey) { - return userRepository.findByApiKey(apiKey) != null; - } - - public User getUserByApiKey(String apiKey) { - return userRepository.findByApiKey(apiKey); - } - - public UserDetails loadUserByApiKey(String apiKey) { - User userOptional = userRepository.findByApiKey(apiKey); - if (userOptional != null) { - User user = userOptional; - // Convert your User entity to a UserDetails object with authorities - return new org.springframework.security.core.userdetails.User( - user.getUsername(), - user.getPassword(), // you might not need this for API key auth - getAuthorities(user) - ); - } - return null; // or throw an exception - } - - - public boolean validateApiKeyForUser(String username, String apiKey) { - Optional userOpt = userRepository.findByUsername(username); - return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey); - } - - public void saveUser(String username, String password) { - User user = new User(); - user.setUsername(username); - user.setPassword(passwordEncoder.encode(password)); - user.setEnabled(true); - userRepository.save(user); - } - - public void saveUser(String username, String password, String role, boolean firstLogin) { - User user = new User(); - user.setUsername(username); - user.setPassword(passwordEncoder.encode(password)); - user.addAuthority(new Authority(role, user)); - user.setEnabled(true); - user.setFirstLogin(firstLogin); - userRepository.save(user); - } - - public void saveUser(String username, String password, String role) { - User user = new User(); - user.setUsername(username); - user.setPassword(passwordEncoder.encode(password)); - user.addAuthority(new Authority(role, user)); - user.setEnabled(true); - user.setFirstLogin(false); - userRepository.save(user); - } - - public void deleteUser(String username) { - Optional userOpt = userRepository.findByUsername(username); - if (userOpt.isPresent()) { - userRepository.delete(userOpt.get()); - } - } - - public boolean usernameExists(String username) { - return userRepository.findByUsername(username).isPresent(); - } - - public boolean hasUsers() { - return userRepository.count() > 0; - } - - public void updateUserSettings(String username, Map updates) { - Optional userOpt = userRepository.findByUsername(username); - if (userOpt.isPresent()) { - User user = userOpt.get(); - Map settingsMap = user.getSettings(); - - if(settingsMap == null) { - settingsMap = new HashMap(); - } - settingsMap.clear(); - settingsMap.putAll(updates); - user.setSettings(settingsMap); - - userRepository.save(user); - } - } - - public Optional findByUsername(String username) { - return userRepository.findByUsername(username); - } - - public void changeUsername(User user, String newUsername) { - user.setUsername(newUsername); - userRepository.save(user); - } - - public void changePassword(User user, String newPassword) { - user.setPassword(passwordEncoder.encode(newPassword)); - userRepository.save(user); - } - - public void changeFirstUse(User user, boolean firstUse) { - user.setFirstLogin(firstUse); - userRepository.save(user); - } - - - public boolean isPasswordCorrect(User user, String currentPassword) { - return passwordEncoder.matches(currentPassword, user.getPassword()); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java deleted file mode 100644 index d2723cce..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java +++ /dev/null @@ -1,86 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.apache.pdfbox.multipdf.LayerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.general.CropPdfForm; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class CropController { - - private static final Logger logger = LoggerFactory.getLogger(CropController.class); - - @PostMapping(value = "/crop", consumes = "multipart/form-data") - @Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO") - public ResponseEntity cropPdf(@ModelAttribute CropPdfForm form) - throws IOException { - - - - -PDDocument sourceDocument = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes())); - -PDDocument newDocument = new PDDocument(); - -int totalPages = sourceDocument.getNumberOfPages(); - -LayerUtility layerUtility = new LayerUtility(newDocument); - -for (int i = 0; i < totalPages; i++) { - PDPage sourcePage = sourceDocument.getPage(i); - - // Create a new page with the size of the source page - PDPage newPage = new PDPage(sourcePage.getMediaBox()); - newDocument.addPage(newPage); - PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage); - - // Import the source page as a form XObject - PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i); - - contentStream.saveGraphicsState(); - - // Define the crop area - contentStream.addRect(form.getX(), form.getY(), form.getWidth(), form.getHeight()); - contentStream.clip(); - - // Draw the entire formXObject - contentStream.drawForm(formXObject); - - contentStream.restoreGraphicsState(); - - contentStream.close(); - - // Now, set the new page's media box to the cropped size - newPage.setMediaBox(new PDRectangle(form.getX(), form.getY(), form.getWidth(), form.getHeight())); -} - -ByteArrayOutputStream baos = new ByteArrayOutputStream(); -newDocument.save(baos); -newDocument.close(); -sourceDocument.close(); - -byte[] pdfContent = baos.toByteArray(); -return WebResponseUtils.bytesToWebResponse(pdfContent, form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf"); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java deleted file mode 100644 index 4727e195..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ /dev/null @@ -1,115 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.general.MergePdfsRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class MergeController { - - private static final Logger logger = LoggerFactory.getLogger(MergeController.class); - - -private PDDocument mergeDocuments(List documents) throws IOException { - PDDocument mergedDoc = new PDDocument(); - for (PDDocument doc : documents) { - for (PDPage page : doc.getPages()) { - mergedDoc.addPage(page); - } - } - return mergedDoc; -} - -private Comparator getSortComparator(String sortType) { - switch (sortType) { - case "byFileName": - return Comparator.comparing(MultipartFile::getOriginalFilename); - case "byDateModified": - return (file1, file2) -> { - try { - BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); - BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); - return attr1.lastModifiedTime().compareTo(attr2.lastModifiedTime()); - } catch (IOException e) { - return 0; // If there's an error, treat them as equal - } - }; - case "byDateCreated": - return (file1, file2) -> { - try { - BasicFileAttributes attr1 = Files.readAttributes(Paths.get(file1.getOriginalFilename()), BasicFileAttributes.class); - BasicFileAttributes attr2 = Files.readAttributes(Paths.get(file2.getOriginalFilename()), BasicFileAttributes.class); - return attr1.creationTime().compareTo(attr2.creationTime()); - } catch (IOException e) { - return 0; // If there's an error, treat them as equal - } - }; - case "byPDFTitle": - return (file1, file2) -> { - try (PDDocument doc1 = PDDocument.load(file1.getInputStream()); - PDDocument doc2 = PDDocument.load(file2.getInputStream())) { - String title1 = doc1.getDocumentInformation().getTitle(); - String title2 = doc2.getDocumentInformation().getTitle(); - return title1.compareTo(title2); - } catch (IOException e) { - return 0; - } - }; - case "orderProvided": - default: - return (file1, file2) -> 0; // Default is the order provided - } -} - -@PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs") -@Operation(summary = "Merge multiple PDF files into one", - description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO") -public ResponseEntity mergePdfs(@ModelAttribute MergePdfsRequest form) throws IOException { - - MultipartFile[] files = form.getFileInput(); - Arrays.sort(files, getSortComparator(form.getSortType())); - - List documents = new ArrayList<>(); - for (MultipartFile file : files) { - try (InputStream is = file.getInputStream()) { - documents.add(PDDocument.load(is)); - } - } - - try (PDDocument mergedDoc = mergeDocuments(documents)) { - ResponseEntity response = WebResponseUtils.pdfDocToWebResponse(mergedDoc, files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf"); - return response; - } finally { - for (PDDocument doc : documents) { - if (doc != null) { - doc.close(); - } - } - } -} - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java deleted file mode 100644 index ebe81ffd..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ /dev/null @@ -1,124 +0,0 @@ -package stirling.software.SPDF.controller.api; - - -import java.awt.Color; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.apache.pdfbox.multipdf.LayerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.apache.pdfbox.util.Matrix; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class MultiPageLayoutController { - - private static final Logger logger = LoggerFactory.getLogger(MultiPageLayoutController.class); - - @PostMapping(value = "/multi-page-layout", consumes = "multipart/form-data") - @Operation( - summary = "Merge multiple pages of a PDF document into a single page", - description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity mergeMultiplePagesIntoOne(@ModelAttribute MergeMultiplePagesRequest request) - throws IOException { - - int pagesPerSheet = request.getPagesPerSheet(); - MultipartFile file = request.getFileInput(); - boolean addBorder = request.isAddBorder(); - - if (pagesPerSheet != 2 && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) { - throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square"); - } - - int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet); - int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet); - - PDDocument sourceDocument = PDDocument.load(file.getInputStream()); - PDDocument newDocument = new PDDocument(); - PDPage newPage = new PDPage(PDRectangle.A4); - newDocument.addPage(newPage); - - int totalPages = sourceDocument.getNumberOfPages(); - float cellWidth = newPage.getMediaBox().getWidth() / cols; - float cellHeight = newPage.getMediaBox().getHeight() / rows; - - PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true); - LayerUtility layerUtility = new LayerUtility(newDocument); - - float borderThickness = 1.5f; // Specify border thickness as required - contentStream.setLineWidth(borderThickness); - contentStream.setStrokingColor(Color.BLACK); - - for (int i = 0; i < totalPages; i++) { - if (i != 0 && i % pagesPerSheet == 0) { - // Close the current content stream and create a new page and content stream - contentStream.close(); - newPage = new PDPage(PDRectangle.A4); - newDocument.addPage(newPage); - contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true); - } - - PDPage sourcePage = sourceDocument.getPage(i); - PDRectangle rect = sourcePage.getMediaBox(); - float scaleWidth = cellWidth / rect.getWidth(); - float scaleHeight = cellHeight / rect.getHeight(); - float scale = Math.min(scaleWidth, scaleHeight); - - int adjustedPageIndex = i % pagesPerSheet; // This will reset the index for every new page - int rowIndex = adjustedPageIndex / cols; - int colIndex = adjustedPageIndex % cols; - - float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2; - float y = newPage.getMediaBox().getHeight() - ((rowIndex + 1) * cellHeight - (cellHeight - rect.getHeight() * scale) / 2); - - contentStream.saveGraphicsState(); - contentStream.transform(Matrix.getTranslateInstance(x, y)); - contentStream.transform(Matrix.getScaleInstance(scale, scale)); - - PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i); - contentStream.drawForm(formXObject); - - contentStream.restoreGraphicsState(); - - if(addBorder) { - // Draw border around each page - float borderX = colIndex * cellWidth; - float borderY = newPage.getMediaBox().getHeight() - (rowIndex + 1) * cellHeight; - contentStream.addRect(borderX, borderY, cellWidth, cellHeight); - contentStream.stroke(); - } - } - - - contentStream.close(); // Close the final content stream - sourceDocument.close(); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - newDocument.save(baos); - newDocument.close(); - - byte[] result = baos.toByteArray(); - return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java deleted file mode 100644 index b76b6cee..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ /dev/null @@ -1,219 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.SortTypes; -import stirling.software.SPDF.model.api.PDFWithPageNums; -import stirling.software.SPDF.model.api.general.RearrangePagesRequest; -import stirling.software.SPDF.utils.GeneralUtils; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class RearrangePagesPDFController { - - private static final Logger logger = LoggerFactory.getLogger(RearrangePagesPDFController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/remove-pages") - @Operation(summary = "Remove pages from a PDF file", description = "This endpoint removes specified pages from a given PDF file. Users can provide a comma-separated list of page numbers or ranges to delete. Input:PDF Output:PDF Type:SISO") - public ResponseEntity deletePages(@ModelAttribute PDFWithPageNums request ) - throws IOException { - - MultipartFile pdfFile = request.getFileInput(); - String pagesToDelete = request.getPageNumbers(); - - PDDocument document = PDDocument.load(pdfFile.getBytes()); - - // Split the page order string into an array of page numbers or range of numbers - String[] pageOrderArr = pagesToDelete.split(","); - - List pagesToRemove = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages()); - - for (int i = pagesToRemove.size() - 1; i >= 0; i--) { - int pageIndex = pagesToRemove.get(i); - document.removePage(pageIndex); - } - return WebResponseUtils.pdfDocToWebResponse(document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf"); - - } - - - - private List removeFirst(int totalPages) { - if (totalPages <= 1) - return new ArrayList<>(); - List newPageOrder = new ArrayList<>(); - for (int i = 2; i <= totalPages; i++) { - newPageOrder.add(i - 1); - } - return newPageOrder; - } - - private List removeLast(int totalPages) { - if (totalPages <= 1) - return new ArrayList<>(); - List newPageOrder = new ArrayList<>(); - for (int i = 1; i < totalPages; i++) { - newPageOrder.add(i - 1); - } - return newPageOrder; - } - - private List removeFirstAndLast(int totalPages) { - if (totalPages <= 2) - return new ArrayList<>(); - List newPageOrder = new ArrayList<>(); - for (int i = 2; i < totalPages; i++) { - newPageOrder.add(i - 1); - } - return newPageOrder; - } - - private List reverseOrder(int totalPages) { - List newPageOrder = new ArrayList<>(); - for (int i = totalPages; i >= 1; i--) { - newPageOrder.add(i - 1); - } - return newPageOrder; - } - - private List duplexSort(int totalPages) { - List newPageOrder = new ArrayList<>(); - int half = (totalPages + 1) / 2; // This ensures proper behavior with odd numbers of pages - for (int i = 1; i <= half; i++) { - newPageOrder.add(i - 1); - if (i <= totalPages - half) { // Avoid going out of bounds - newPageOrder.add(totalPages - i); - } - } - return newPageOrder; - } - - private List bookletSort(int totalPages) { - List newPageOrder = new ArrayList<>(); - for (int i = 0; i < totalPages / 2; i++) { - newPageOrder.add(i); - newPageOrder.add(totalPages - i - 1); - } - return newPageOrder; - } - - private List sideStitchBooklet(int totalPages) { - List newPageOrder = new ArrayList<>(); - for (int i = 0; i < (totalPages + 3) / 4; i++) { - int begin = i * 4; - newPageOrder.add(Math.min(begin + 3, totalPages - 1)); - newPageOrder.add(Math.min(begin, totalPages - 1)); - newPageOrder.add(Math.min(begin + 1, totalPages - 1)); - newPageOrder.add(Math.min(begin + 2, totalPages - 1)); - } - return newPageOrder; - } - - private List oddEvenSplit(int totalPages) { - List newPageOrder = new ArrayList<>(); - for (int i = 1; i <= totalPages; i += 2) { - newPageOrder.add(i - 1); - } - for (int i = 2; i <= totalPages; i += 2) { - newPageOrder.add(i - 1); - } - return newPageOrder; - } - - private List processSortTypes(String sortTypes, int totalPages) { - try { - SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase()); - switch (mode) { - case REVERSE_ORDER: - return reverseOrder(totalPages); - case DUPLEX_SORT: - return duplexSort(totalPages); - case BOOKLET_SORT: - return bookletSort(totalPages); - case SIDE_STITCH_BOOKLET_SORT: - return sideStitchBooklet(totalPages); - case ODD_EVEN_SPLIT: - return oddEvenSplit(totalPages); - case REMOVE_FIRST: - return removeFirst(totalPages); - case REMOVE_LAST: - return removeLast(totalPages); - case REMOVE_FIRST_AND_LAST: - return removeFirstAndLast(totalPages); - default: - throw new IllegalArgumentException("Unsupported custom mode"); - } - } catch (IllegalArgumentException e) { - logger.error("Unsupported custom mode", e); - return null; - } - } - - @PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages") - @Operation(summary = "Rearrange pages in a PDF file", description = "This endpoint rearranges pages in a given PDF file based on the specified page order or custom mode. Users can provide a page order as a comma-separated list of page numbers or page ranges, or a custom mode. Input:PDF Output:PDF") - public ResponseEntity rearrangePages(@ModelAttribute RearrangePagesRequest request) throws IOException { - MultipartFile pdfFile = request.getFileInput(); - String pageOrder = request.getPageNumbers(); - String sortType = request.getCustomMode(); - try { - // Load the input PDF - PDDocument document = PDDocument.load(pdfFile.getInputStream()); - - // Split the page order string into an array of page numbers or range of numbers - String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; - int totalPages = document.getNumberOfPages(); - List newPageOrder; - if (sortType != null && sortType.length() > 0) { - newPageOrder = processSortTypes(sortType, totalPages); - } else { - newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages); - } - logger.info("newPageOrder = " +newPageOrder); - logger.info("totalPages = " +totalPages); - // Create a new list to hold the pages in the new order - List newPages = new ArrayList<>(); - for (int i = 0; i < newPageOrder.size(); i++) { - newPages.add(document.getPage(newPageOrder.get(i))); - } - - // Remove all the pages from the original document - for (int i = document.getNumberOfPages() - 1; i >= 0; i--) { - document.removePage(i); - } - - // Add the pages in the new order - for (PDPage page : newPages) { - document.addPage(page); - } - - return WebResponseUtils.pdfDocToWebResponse(document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rearranged.pdf"); - } catch (IOException e) { - logger.error("Failed rearranging documents", e); - return null; - } - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java deleted file mode 100644 index ed527549..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ /dev/null @@ -1,52 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.IOException; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.general.RotatePDFRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class RotationController { - - private static final Logger logger = LoggerFactory.getLogger(RotationController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/rotate-pdf") - @Operation( - summary = "Rotate a PDF file", - description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity rotatePDF( - @ModelAttribute RotatePDFRequest request) throws IOException { - MultipartFile pdfFile = request.getFileInput(); - Integer angle = request.getAngle(); - // Load the PDF document - PDDocument document = PDDocument.load(pdfFile.getBytes()); - - // Get the list of pages in the document - PDPageTree pages = document.getPages(); - - for (PDPage page : pages) { - page.setRotation(page.getRotation() + angle); - } - - return WebResponseUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java deleted file mode 100644 index 743ea6b1..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ /dev/null @@ -1,110 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import org.apache.pdfbox.multipdf.LayerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.apache.pdfbox.util.Matrix; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.general.ScalePagesRequest; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class ScalePagesController { - - private static final Logger logger = LoggerFactory.getLogger(ScalePagesController.class); - - @PostMapping(value = "/scale-pages", consumes = "multipart/form-data") - @Operation(summary = "Change the size of a PDF page/document", description = "This operation takes an input PDF file and the size to scale the pages to in the output PDF file. Input:PDF Output:PDF Type:SISO") - public ResponseEntity scalePages(@ModelAttribute ScalePagesRequest request) throws IOException { - MultipartFile file = request.getFileInput(); - String targetPDRectangle = request.getPageSize(); - float scaleFactor = request.getScaleFactor(); - - Map sizeMap = new HashMap<>(); - // Add A0 - A10 - sizeMap.put("A0", PDRectangle.A0); - sizeMap.put("A1", PDRectangle.A1); - sizeMap.put("A2", PDRectangle.A2); - sizeMap.put("A3", PDRectangle.A3); - sizeMap.put("A4", PDRectangle.A4); - sizeMap.put("A5", PDRectangle.A5); - sizeMap.put("A6", PDRectangle.A6); - - // Add other sizes - sizeMap.put("LETTER", PDRectangle.LETTER); - sizeMap.put("LEGAL", PDRectangle.LEGAL); - - if (!sizeMap.containsKey(targetPDRectangle)) { - throw new IllegalArgumentException( - "Invalid PDRectangle. It must be one of the following: A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10"); - } - - PDRectangle targetSize = sizeMap.get(targetPDRectangle); - - PDDocument sourceDocument = PDDocument.load(file.getBytes()); - PDDocument outputDocument = new PDDocument(); - - int totalPages = sourceDocument.getNumberOfPages(); - for (int i = 0; i < totalPages; i++) { - PDPage sourcePage = sourceDocument.getPage(i); - PDRectangle sourceSize = sourcePage.getMediaBox(); - - float scaleWidth = targetSize.getWidth() / sourceSize.getWidth(); - float scaleHeight = targetSize.getHeight() / sourceSize.getHeight(); - float scale = Math.min(scaleWidth, scaleHeight) * scaleFactor; - - PDPage newPage = new PDPage(targetSize); - outputDocument.addPage(newPage); - - PDPageContentStream contentStream = new PDPageContentStream(outputDocument, newPage, PDPageContentStream.AppendMode.APPEND, true); - - float x = (targetSize.getWidth() - sourceSize.getWidth() * scale) / 2; - float y = (targetSize.getHeight() - sourceSize.getHeight() * scale) / 2; - - contentStream.saveGraphicsState(); - contentStream.transform(Matrix.getTranslateInstance(x, y)); - contentStream.transform(Matrix.getScaleInstance(scale, scale)); - - LayerUtility layerUtility = new LayerUtility(outputDocument); - PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, i); - contentStream.drawForm(form); - - contentStream.restoreGraphicsState(); - contentStream.close(); - } - - - - - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - outputDocument.save(baos); - outputDocument.close(); - sourceDocument.close(); - - - return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java deleted file mode 100644 index 649dc8ec..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ /dev/null @@ -1,109 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFWithPageNums; -import stirling.software.SPDF.utils.WebResponseUtils; -import org.apache.pdfbox.multipdf.Splitter; -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class SplitPDFController { - - private static final Logger logger = LoggerFactory.getLogger(SplitPDFController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/split-pages") - @Operation(summary = "Split a PDF file into separate documents", - description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page. Input:PDF Output:PDF Type:SIMO") - public ResponseEntity splitPdf(@ModelAttribute PDFWithPageNums request) throws IOException { - MultipartFile file = request.getFileInput(); - String pages = request.getPageNumbers(); - // open the pdf document - InputStream inputStream = file.getInputStream(); - PDDocument document = PDDocument.load(inputStream); - - List pageNumbers = request.getPageNumbersList(document); - if(!pageNumbers.contains(document.getNumberOfPages() - 1)) - pageNumbers.add(document.getNumberOfPages()- 1); - logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(","))); - - Splitter splitter = new Splitter(); - List splitDocumentsBoas = new ArrayList<>(); - - int previousPageNumber = 1; // PDFBox uses 1-based indexing for pages. - for (int splitPoint : pageNumbers) { - splitPoint = splitPoint + 1; - splitter.setStartPage(previousPageNumber); - splitter.setEndPage(splitPoint); - List splitDocuments = splitter.split(document); - - for (PDDocument splitDoc : splitDocuments) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - splitDoc.save(baos); - splitDocumentsBoas.add(baos); - splitDoc.close(); - } - - previousPageNumber = splitPoint + 1; - } - - - // closing the original document - document.close(); - - Path zipFile = Files.createTempFile("split_documents", ".zip"); - - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); - try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { - // loop through the split documents and write them to the zip file - for (int i = 0; i < splitDocumentsBoas.size(); i++) { - String fileName = filename + "_" + (i + 1) + ".pdf"; - ByteArrayOutputStream baos = splitDocumentsBoas.get(i); - byte[] pdf = baos.toByteArray(); - - // Add PDF file to the zip - ZipEntry pdfEntry = new ZipEntry(fileName); - zipOut.putNextEntry(pdfEntry); - zipOut.write(pdf); - zipOut.closeEntry(); - - logger.info("Wrote split document {} to zip file", fileName); - } - } catch (Exception e) { - logger.error("Failed writing to zip", e); - throw e; - } - - logger.info("Successfully created zip file with split documents: {}", zipFile.toString()); - byte[] data = Files.readAllBytes(zipFile); - Files.delete(zipFile); - - // return the Resource in the response - return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java deleted file mode 100644 index 22bf1d70..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java +++ /dev/null @@ -1,86 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.awt.geom.AffineTransform; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -import org.apache.pdfbox.multipdf.LayerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/general") -@Tag(name = "General", description = "General APIs") -public class ToSinglePageController { - - private static final Logger logger = LoggerFactory.getLogger(ToSinglePageController.class); - - - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-single-page") - @Operation( - summary = "Convert a multi-page PDF into a single long page PDF", - description = "This endpoint converts a multi-page PDF document into a single paged PDF document. The width of the single page will be same as the input's width, but the height will be the sum of all the pages' heights. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity pdfToSinglePage(@ModelAttribute PDFFile request) throws IOException { - - // Load the source document - PDDocument sourceDocument = PDDocument.load(request.getFileInput().getInputStream()); - - // Calculate total height and max width - float totalHeight = 0; - float maxWidth = 0; - for (PDPage page : sourceDocument.getPages()) { - PDRectangle pageSize = page.getMediaBox(); - totalHeight += pageSize.getHeight(); - maxWidth = Math.max(maxWidth, pageSize.getWidth()); - } - - // Create new document and page with calculated dimensions - PDDocument newDocument = new PDDocument(); - PDPage newPage = new PDPage(new PDRectangle(maxWidth, totalHeight)); - newDocument.addPage(newPage); - - // Initialize the content stream of the new page - PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage); - contentStream.close(); - - LayerUtility layerUtility = new LayerUtility(newDocument); - float yOffset = totalHeight; - - // For each page, copy its content to the new page at the correct offset - for (PDPage page : sourceDocument.getPages()) { - PDFormXObject form = layerUtility.importPageAsForm(sourceDocument, sourceDocument.getPages().indexOf(page)); - AffineTransform af = AffineTransform.getTranslateInstance(0, yOffset - page.getMediaBox().getHeight()); - layerUtility.wrapInSaveRestore(newPage); - String defaultLayerName = "Layer" + sourceDocument.getPages().indexOf(page); - layerUtility.appendFormAsLayer(newPage, form, af, defaultLayerName); - yOffset -= page.getMediaBox().getHeight(); - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - newDocument.save(baos); - newDocument.close(); - sourceDocument.close(); - - byte[] result = baos.toByteArray(); - return WebResponseUtils.bytesToWebResponse(result, request.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_singlePage.pdf"); - - - - - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java deleted file mode 100644 index bf451567..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ /dev/null @@ -1,234 +0,0 @@ -package stirling.software.SPDF.controller.api; - -import java.security.Principal; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import org.springframework.web.servlet.view.RedirectView; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import stirling.software.SPDF.config.security.UserService; -import stirling.software.SPDF.model.User; - -@Controller -@RequestMapping("/api/v1/user") -public class UserController { - - @Autowired - private UserService userService; - - @PostMapping("/register") - public String register(@RequestParam String username, @RequestParam String password, Model model) { - if(userService.usernameExists(username)) { - model.addAttribute("error", "Username already exists"); - return "register"; - } - - userService.saveUser(username, password); - return "redirect:/login?registered=true"; - } - - @PostMapping("/change-username-and-password") - public RedirectView changeUsernameAndPassword(Principal principal, - @RequestParam String currentPassword, - @RequestParam String newUsername, - @RequestParam String newPassword, - HttpServletRequest request, - HttpServletResponse response, - RedirectAttributes redirectAttributes) { - if (principal == null) { - return new RedirectView("/change-creds?messageType=notAuthenticated"); - } - - Optional userOpt = userService.findByUsername(principal.getName()); - - if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/change-creds?messageType=userNotFound"); - } - - User user = userOpt.get(); - - if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/change-creds?messageType=incorrectPassword"); - } - - if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { - return new RedirectView("/change-creds?messageType=usernameExists"); - } - - - userService.changePassword(user, newPassword); - if(newUsername != null && newUsername.length() > 0 && !user.getUsername().equals(newUsername)) { - userService.changeUsername(user, newUsername); - } - userService.changeFirstUse(user, false); - - // Logout using Spring's utility - new SecurityContextLogoutHandler().logout(request, response, null); - - return new RedirectView("/login?messageType=credsUpdated"); - } - - - - @PostMapping("/change-username") - public RedirectView changeUsername(Principal principal, - @RequestParam String currentPassword, - @RequestParam String newUsername, - HttpServletRequest request, - HttpServletResponse response, - RedirectAttributes redirectAttributes) { - if (principal == null) { - return new RedirectView("/account?messageType=notAuthenticated"); - } - - Optional userOpt = userService.findByUsername(principal.getName()); - - if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound"); - } - - User user = userOpt.get(); - - if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword"); - } - - if (!user.getUsername().equals(newUsername) && userService.usernameExists(newUsername)) { - return new RedirectView("/account?messageType=usernameExists"); - } - - if(newUsername != null && newUsername.length() > 0) { - userService.changeUsername(user, newUsername); - } - - // Logout using Spring's utility - new SecurityContextLogoutHandler().logout(request, response, null); - - return new RedirectView("/login?messageType=credsUpdated"); - } - - @PostMapping("/change-password") - public RedirectView changePassword(Principal principal, - @RequestParam String currentPassword, - @RequestParam String newPassword, - HttpServletRequest request, - HttpServletResponse response, - RedirectAttributes redirectAttributes) { - if (principal == null) { - return new RedirectView("/account?messageType=notAuthenticated"); - } - - Optional userOpt = userService.findByUsername(principal.getName()); - - if (userOpt == null || userOpt.isEmpty()) { - return new RedirectView("/account?messageType=userNotFound"); - } - - User user = userOpt.get(); - - if (!userService.isPasswordCorrect(user, currentPassword)) { - return new RedirectView("/account?messageType=incorrectPassword"); - } - - userService.changePassword(user, newPassword); - - // Logout using Spring's utility - new SecurityContextLogoutHandler().logout(request, response, null); - - return new RedirectView("/login?messageType=credsUpdated"); - } - - - @PostMapping("/updateUserSettings") - public String updateUserSettings(HttpServletRequest request, Principal principal) { - Map paramMap = request.getParameterMap(); - Map updates = new HashMap<>(); - - System.out.println("Received parameter map: " + paramMap); - - for (Map.Entry entry : paramMap.entrySet()) { - updates.put(entry.getKey(), entry.getValue()[0]); - } - - System.out.println("Processed updates: " + updates); - - // Assuming you have a method in userService to update the settings for a user - userService.updateUserSettings(principal.getName(), updates); - - return "redirect:/account"; // Redirect to a page of your choice after updating - } - - @PreAuthorize("hasRole('ROLE_ADMIN')") - @PostMapping("/admin/saveUser") - public RedirectView saveUser(@RequestParam String username, @RequestParam String password, @RequestParam String role, - @RequestParam(name = "forceChange", required = false, defaultValue = "false") boolean forceChange) { - - if(userService.usernameExists(username)) { - return new RedirectView("/addUsers?messageType=usernameExists"); - } - userService.saveUser(username, password, role, forceChange); - return new RedirectView("/addUsers"); // Redirect to account page after adding the user - } - - - @PreAuthorize("hasRole('ROLE_ADMIN')") - @PostMapping("/admin/deleteUser/{username}") - public String deleteUser(@PathVariable String username, Authentication authentication) { - - // Get the currently authenticated username - String currentUsername = authentication.getName(); - - // Check if the provided username matches the current session's username - if (currentUsername.equals(username)) { - throw new IllegalArgumentException("Cannot delete currently logined in user."); - } - - userService.deleteUser(username); - return "redirect:/addUsers"; - } - - @PostMapping("/get-api-key") - public ResponseEntity getApiKey(Principal principal) { - if (principal == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated."); - } - String username = principal.getName(); - String apiKey = userService.getApiKeyForUser(username); - if (apiKey == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("API key not found for user."); - } - return ResponseEntity.ok(apiKey); - } - - @PostMapping("/update-api-key") - public ResponseEntity updateApiKey(Principal principal) { - if (principal == null) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not authenticated."); - } - String username = principal.getName(); - User user = userService.refreshApiKeyForUser(username); - String apiKey = user.getApiKey(); - if (apiKey == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("API key not found for user."); - } - return ResponseEntity.ok(apiKey); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java deleted file mode 100644 index e821a36a..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEpubToPdf.java +++ /dev/null @@ -1,130 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.utils.FileToPdf; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/convert") -@Tag(name = "Convert", description = "Convert APIs") -public class ConvertEpubToPdf { - //TODO - @PostMapping(consumes = "multipart/form-data", value = "/epub-to-single-pdf") - @Hidden - @Operation( - summary = "Convert an EPUB file to a single PDF", - description = "This endpoint takes an EPUB file input and converts it to a single PDF." - ) - public ResponseEntity epubToSinglePdf( - @ModelAttribute GeneralFile request) - throws Exception { - MultipartFile fileInput = request.getFileInput(); - if (fileInput == null) { - throw new IllegalArgumentException("Please provide an EPUB file for conversion."); - } - - String originalFilename = fileInput.getOriginalFilename(); - if (originalFilename == null || !originalFilename.endsWith(".epub")) { - throw new IllegalArgumentException("File must be in .epub format."); - } - - Map epubContents = extractEpubContent(fileInput); - List htmlFilesOrder = getHtmlFilesOrderFromOpf(epubContents); - - List individualPdfs = new ArrayList<>(); - - for (String htmlFile : htmlFilesOrder) { - byte[] htmlContent = epubContents.get(htmlFile); - byte[] pdfBytes = FileToPdf.convertHtmlToPdf(htmlContent, htmlFile.replace(".html", ".pdf")); - individualPdfs.add(pdfBytes); - } - - // Pseudo-code to merge individual PDFs into one. - byte[] mergedPdfBytes = mergeMultiplePdfsIntoOne(individualPdfs); - - return WebResponseUtils.bytesToWebResponse(mergedPdfBytes, originalFilename.replace(".epub", ".pdf")); - } - - // Assuming a pseudo-code function that merges multiple PDFs into one. - private byte[] mergeMultiplePdfsIntoOne(List individualPdfs) { - // You can use a library such as PDFBox to perform the merging here. - // Return the byte[] of the merged PDF. - return null; - } - - private Map extractEpubContent(MultipartFile fileInput) throws IOException { - Map contentMap = new HashMap<>(); - - try (ZipInputStream zis = new ZipInputStream(fileInput.getInputStream())) { - ZipEntry zipEntry = zis.getNextEntry(); - while (zipEntry != null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int read = 0; - while ((read = zis.read(buffer)) != -1) { - baos.write(buffer, 0, read); - } - contentMap.put(zipEntry.getName(), baos.toByteArray()); - zipEntry = zis.getNextEntry(); - } - } - - return contentMap; - } - - private List getHtmlFilesOrderFromOpf(Map epubContents) throws Exception { - String opfContent = new String(epubContents.get("OEBPS/content.opf")); // Adjusting for given path - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); - InputSource is = new InputSource(new StringReader(opfContent)); - Document doc = dBuilder.parse(is); - - NodeList itemRefs = doc.getElementsByTagName("itemref"); - List htmlFilesOrder = new ArrayList<>(); - - for (int i = 0; i < itemRefs.getLength(); i++) { - Element itemRef = (Element) itemRefs.item(i); - String idref = itemRef.getAttribute("idref"); - - NodeList items = doc.getElementsByTagName("item"); - for (int j = 0; j < items.getLength(); j++) { - Element item = (Element) items.item(j); - if (idref.equals(item.getAttribute("id"))) { - htmlFilesOrder.add(item.getAttribute("href")); // Fetching the actual href - break; - } - } - } - - return htmlFilesOrder; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java deleted file mode 100644 index 5839dd2d..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ /dev/null @@ -1,52 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.utils.FileToPdf; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@Tag(name = "Convert", description = "Convert APIs") -@RequestMapping("/api/v1/convert") -public class ConvertHtmlToPDF { - - - @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") - @Operation( - summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF", - description = "This endpoint takes an HTML or ZIP file input and converts it to a PDF format." - ) - public ResponseEntity HtmlToPdf( - @ModelAttribute GeneralFile request) - throws Exception { - MultipartFile fileInput = request.getFileInput(); - - if (fileInput == null) { - throw new IllegalArgumentException("Please provide an HTML or ZIP file for conversion."); - } - - String originalFilename = fileInput.getOriginalFilename(); - if (originalFilename == null || (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) { - throw new IllegalArgumentException("File must be either .html or .zip format."); - }byte[] pdfBytes = FileToPdf.convertHtmlToPdf( fileInput.getBytes(), originalFilename); - - String outputFilename = originalFilename.replaceFirst("[.][^.]+$", "") + ".pdf"; // Remove file extension and append .pdf - - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - - - - - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java deleted file mode 100644 index 0064a3ab..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ /dev/null @@ -1,103 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.io.IOException; - -import org.apache.pdfbox.rendering.ImageType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.converters.ConvertToImageRequest; -import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest; -import stirling.software.SPDF.utils.PdfUtils; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/convert") -@Tag(name = "Convert", description = "Convert APIs") -public class ConvertImgPDFController { - - private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/img") - @Operation(summary = "Convert PDF to image(s)", - description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images. Input:PDF Output:Image Type:SI-Conditional") - public ResponseEntity convertToImage(@ModelAttribute ConvertToImageRequest request) throws IOException { - MultipartFile file = request.getFileInput(); - String imageFormat = request.getImageFormat(); - String singleOrMultiple = request.getSingleOrMultiple(); - String colorType = request.getColorType(); - String dpi = request.getDpi(); - - byte[] pdfBytes = file.getBytes(); - ImageType colorTypeResult = ImageType.RGB; - if ("greyscale".equals(colorType)) { - colorTypeResult = ImageType.GRAY; - } else if ("blackwhite".equals(colorType)) { - colorTypeResult = ImageType.BINARY; - } - // returns bytes for image - boolean singleImage = singleOrMultiple.equals("single"); - byte[] result = null; - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); - try { - result = PdfUtils.convertFromPdf(pdfBytes, imageFormat.toUpperCase(), colorTypeResult, singleImage, Integer.valueOf(dpi), filename); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - if (singleImage) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.parseMediaType(getMediaType(imageFormat))); - ResponseEntity response = new ResponseEntity<>(new ByteArrayResource(result), headers, HttpStatus.OK); - return response; - } else { - ByteArrayResource resource = new ByteArrayResource(result); - // return the Resource in the response - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename + "_convertedToImages.zip") - .contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(resource.contentLength()).body(resource); - } - } - - @PostMapping(consumes = "multipart/form-data", value = "/img/pdf") - @Operation(summary = "Convert images to a PDF file", - description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images. Input:Image Output:PDF Type:SISO?") - public ResponseEntity convertToPdf(@ModelAttribute ConvertToPdfRequest request) throws IOException { - MultipartFile[] file = request.getFileInput(); - String fitOption = request.getFitOption(); - String colorType = request.getColorType(); - boolean autoRotate = request.isAutoRotate(); - - // Convert the file to PDF and get the resulting bytes - byte[] bytes = PdfUtils.imageToPdf(file, fitOption, autoRotate, colorType); - return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_converted.pdf"); - } - - private String getMediaType(String imageFormat) { - if (imageFormat.equalsIgnoreCase("PNG")) - return "image/png"; - else if (imageFormat.equalsIgnoreCase("JPEG") || imageFormat.equalsIgnoreCase("JPG")) - return "image/jpeg"; - else if (imageFormat.equalsIgnoreCase("GIF")) - return "image/gif"; - else - return "application/octet-stream"; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java deleted file mode 100644 index 4191ecdf..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ /dev/null @@ -1,54 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import org.commonmark.node.Node; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.utils.FileToPdf; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@Tag(name = "Convert", description = "Convert APIs") -@RequestMapping("/api/v1/convert") -public class ConvertMarkdownToPdf { - - @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") - @Operation( - summary = "Convert a Markdown file to PDF", - description = "This endpoint takes a Markdown file input, converts it to HTML, and then to PDF format." - ) - public ResponseEntity markdownToPdf( - @ModelAttribute GeneralFile request) - throws Exception { - MultipartFile fileInput = request.getFileInput(); - - if (fileInput == null) { - throw new IllegalArgumentException("Please provide a Markdown file for conversion."); - } - - String originalFilename = fileInput.getOriginalFilename(); - if (originalFilename == null || !originalFilename.endsWith(".md")) { - throw new IllegalArgumentException("File must be in .md format."); - } - - // Convert Markdown to HTML using CommonMark - Parser parser = Parser.builder().build(); - Node document = parser.parse(new String(fileInput.getBytes())); - HtmlRenderer renderer = HtmlRenderer.builder().build(); - String htmlContent = renderer.render(document); - - byte[] pdfBytes = FileToPdf.convertHtmlToPdf(htmlContent.getBytes(), "converted.html"); - - String outputFilename = originalFilename.replaceFirst("[.][^.]+$", "") + ".pdf"; // Remove file extension and append .pdf - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java deleted file mode 100644 index e1c18a49..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ /dev/null @@ -1,78 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.apache.commons.io.FilenameUtils; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@Tag(name = "Convert", description = "Convert APIs") -@RequestMapping("/api/v1/convert") -public class ConvertOfficeController { - - public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { - // Check for valid file extension - String originalFilename = inputFile.getOriginalFilename(); - if (originalFilename == null || !isValidFileExtension(FilenameUtils.getExtension(originalFilename))) { - throw new IllegalArgumentException("Invalid file extension"); - } - - // Save the uploaded file to a temporary location - Path tempInputFile = Files.createTempFile("input_", "." + FilenameUtils.getExtension(originalFilename)); - Files.copy(inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); - - // Prepare the output file path - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - - // Run the LibreOffice command - List command = new ArrayList<>(Arrays.asList("unoconv", "-vvv", "-f", "pdf", "-o", tempOutputFile.toString(), tempInputFile.toString())); - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE).runCommandWithOutputHandling(command); - - // Read the converted PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); - - // Clean up the temporary files - Files.delete(tempInputFile); - Files.delete(tempOutputFile); - - return pdfBytes; - } - private boolean isValidFileExtension(String fileExtension) { - String extensionPattern = "^(?i)[a-z0-9]{2,4}$"; - return fileExtension.matches(extensionPattern); - } - - @PostMapping(consumes = "multipart/form-data", value = "/file/pdf") - @Operation( - summary = "Convert a file to a PDF using LibreOffice", - description = "This endpoint converts a given file to a PDF using LibreOffice API Input:Any Output:PDF Type:SISO" - ) - public ResponseEntity processFileToPDF(@ModelAttribute GeneralFile request) - throws Exception { - MultipartFile inputFile = request.getFileInput(); - // unused but can start server instance if startup time is to long - // LibreOfficeListener.getInstance().start(); - - byte[] pdfByteArray = convertToPdf(inputFile); - return WebResponseUtils.bytesToWebResponse(pdfByteArray, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_convertedToPDF.pdf"); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java deleted file mode 100644 index 11279a27..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java +++ /dev/null @@ -1,72 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.io.IOException; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.model.api.converters.PdfToPresentationRequest; -import stirling.software.SPDF.model.api.converters.PdfToTextOrRTFRequest; -import stirling.software.SPDF.model.api.converters.PdfToWordRequest; -import stirling.software.SPDF.utils.PDFToFile; - -@RestController -@RequestMapping("/api/v1/convert") -@Tag(name = "Convert", description = "Convert APIs") -public class ConvertPDFToOffice { - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/html") - @Operation(summary = "Convert PDF to HTML", description = "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO") - public ResponseEntity processPdfToHTML(@ModelAttribute PDFFile request) - throws Exception { - MultipartFile inputFile = request.getFileInput(); - PDFToFile pdfToFile = new PDFToFile(); - return pdfToFile.processPdfToOfficeFormat(inputFile, "html", "writer_pdf_import"); - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation") - @Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format. Input:PDF Output:PPT Type:SISO") - public ResponseEntity processPdfToPresentation(@ModelAttribute PdfToPresentationRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String outputFormat = request.getOutputFormat(); - PDFToFile pdfToFile = new PDFToFile(); - return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import"); - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/text") - @Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format. Input:PDF Output:TXT Type:SISO") - public ResponseEntity processPdfToRTForTXT(@ModelAttribute PdfToTextOrRTFRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String outputFormat = request.getOutputFormat(); - - PDFToFile pdfToFile = new PDFToFile(); - return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/word") - @Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format. Input:PDF Output:WORD Type:SISO") - public ResponseEntity processPdfToWord(@ModelAttribute PdfToWordRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String outputFormat = request.getOutputFormat(); - PDFToFile pdfToFile = new PDFToFile(); - return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/xml") - @Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML Type:SISO") - public ResponseEntity processPdfToXML(@ModelAttribute PDFFile request) - throws Exception { - MultipartFile inputFile = request.getFileInput(); - - PDFToFile pdfToFile = new PDFToFile(); - return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import"); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java deleted file mode 100644 index 32ccb84a..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ /dev/null @@ -1,67 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/convert") -@Tag(name = "Convert", description = "Convert APIs") -public class ConvertPDFToPDFA { - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/pdfa") - @Operation( - summary = "Convert a PDF to a PDF/A", - description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity pdfToPdfA(@ModelAttribute PDFFile request) - throws Exception { - MultipartFile inputFile = request.getFileInput(); - - // Save the uploaded file to a temporary location - Path tempInputFile = Files.createTempFile("input_", ".pdf"); - inputFile.transferTo(tempInputFile.toFile()); - - // Prepare the output file path - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - - // Prepare the OCRmyPDF command - List command = new ArrayList<>(); - command.add("ocrmypdf"); - command.add("--skip-text"); - command.add("--tesseract-timeout=0"); - command.add("--output-type"); - command.add("pdfa"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF).runCommandWithOutputHandling(command); - - // Read the optimized PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); - - // Clean up the temporary files - Files.delete(tempInputFile); - Files.delete(tempOutputFile); - - // Return the optimized PDF as a response - String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java deleted file mode 100644 index 7c81edf2..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ /dev/null @@ -1,76 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; -import stirling.software.SPDF.utils.GeneralUtils; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@Tag(name = "Convert", description = "Convert APIs") -@RequestMapping("/api/v1/convert") -public class ConvertWebsiteToPDF { - - @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") - @Operation( - summary = "Convert a URL to a PDF", - description = "This endpoint fetches content from a URL and converts it to a PDF format." - ) - public ResponseEntity urlToPdf(@ModelAttribute UrlToPdfRequest request) throws IOException, InterruptedException { - String URL = request.getUrlInput(); - - // Validate the URL format - if(!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) { - throw new IllegalArgumentException("Invalid URL format provided."); - } - Path tempOutputFile = null; - byte[] pdfBytes; - try { - // Prepare the output file path - tempOutputFile = Files.createTempFile("output_", ".pdf"); - - // Prepare the OCRmyPDF command - List command = new ArrayList<>(); - command.add("weasyprint"); - command.add(URL); - command.add(tempOutputFile.toString()); - - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT).runCommandWithOutputHandling(command); - - // Read the optimized PDF file - pdfBytes = Files.readAllBytes(tempOutputFile); - } - finally { - // Clean up the temporary files - Files.delete(tempOutputFile); - } - // Convert URL to a safe filename - String outputFilename = convertURLToFileName(URL); - - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - - private String convertURLToFileName(String url) { - String safeName = url.replaceAll("[^a-zA-Z0-9]", "_"); - if(safeName.length() > 50) { - safeName = safeName.substring(0, 50); // restrict to 50 characters - } - return safeName + ".pdf"; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java deleted file mode 100644 index bdbb6613..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java +++ /dev/null @@ -1,196 +0,0 @@ -package stirling.software.SPDF.controller.api.filters; - -import java.io.IOException; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFComparisonAndCount; -import stirling.software.SPDF.model.api.PDFWithPageNums; -import stirling.software.SPDF.model.api.filter.ContainsTextRequest; -import stirling.software.SPDF.model.api.filter.FileSizeRequest; -import stirling.software.SPDF.model.api.filter.PageRotationRequest; -import stirling.software.SPDF.model.api.filter.PageSizeRequest; -import stirling.software.SPDF.utils.PdfUtils; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/filter") -@Tag(name = "Filter", description = "Filter APIs") -public class FilterController { - - @PostMapping(consumes = "multipart/form-data", value = "/filter-contains-text") - @Operation(summary = "Checks if a PDF contains set text, returns true if does", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity containsText(@ModelAttribute ContainsTextRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String text = request.getText(); - String pageNumber = request.getPageNumbers(); - - PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); - if (PdfUtils.hasText(pdfDocument, pageNumber, text)) - return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename()); - return null; - } - - // TODO - @PostMapping(consumes = "multipart/form-data", value = "/filter-contains-image") - @Operation(summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity containsImage(@ModelAttribute PDFWithPageNums request) - throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String pageNumber = request.getPageNumbers(); - - PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); - if (PdfUtils.hasImages(pdfDocument, pageNumber)) - return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename()); - return null; - } - - @PostMapping(consumes = "multipart/form-data", value = "/filter-page-count") - @Operation(summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageCount(@ModelAttribute PDFComparisonAndCount request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String pageCount = request.getPageCount(); - String comparator = request.getComparator(); - // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); - int actualPageCount = document.getNumberOfPages(); - - boolean valid = false; - // Perform the comparison - switch (comparator) { - case "Greater": - valid = actualPageCount > Integer.parseInt(pageCount); - break; - case "Equal": - valid = actualPageCount == Integer.parseInt(pageCount); - break; - case "Less": - valid = actualPageCount < Integer.parseInt(pageCount); - break; - default: - throw new IllegalArgumentException("Invalid comparator: " + comparator); - } - - if (valid) - return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; - } - - @PostMapping(consumes = "multipart/form-data", value = "/filter-page-size") - @Operation(summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageSize(@ModelAttribute PageSizeRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String standardPageSize = request.getStandardPageSize(); - String comparator = request.getComparator(); - - // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); - - PDPage firstPage = document.getPage(0); - PDRectangle actualPageSize = firstPage.getMediaBox(); - - // Calculate the area of the actual page size - float actualArea = actualPageSize.getWidth() * actualPageSize.getHeight(); - - // Get the standard size and calculate its area - PDRectangle standardSize = PdfUtils.textToPageSize(standardPageSize); - float standardArea = standardSize.getWidth() * standardSize.getHeight(); - - boolean valid = false; - // Perform the comparison - switch (comparator) { - case "Greater": - valid = actualArea > standardArea; - break; - case "Equal": - valid = actualArea == standardArea; - break; - case "Less": - valid = actualArea < standardArea; - break; - default: - throw new IllegalArgumentException("Invalid comparator: " + comparator); - } - - if (valid) - return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; - } - - @PostMapping(consumes = "multipart/form-data", value = "/filter-file-size") - @Operation(summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity fileSize(@ModelAttribute FileSizeRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - String fileSize = request.getFileSize(); - String comparator = request.getComparator(); - - // Get the file size - long actualFileSize = inputFile.getSize(); - - boolean valid = false; - // Perform the comparison - switch (comparator) { - case "Greater": - valid = actualFileSize > Long.parseLong(fileSize); - break; - case "Equal": - valid = actualFileSize == Long.parseLong(fileSize); - break; - case "Less": - valid = actualFileSize < Long.parseLong(fileSize); - break; - default: - throw new IllegalArgumentException("Invalid comparator: " + comparator); - } - - if (valid) - return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; - } - - @PostMapping(consumes = "multipart/form-data", value = "/filter-page-rotation") - @Operation(summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO") - public ResponseEntity pageRotation(@ModelAttribute PageRotationRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - int rotation = request.getRotation(); - String comparator = request.getComparator(); - - // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); - - // Get the rotation of the first page - PDPage firstPage = document.getPage(0); - int actualRotation = firstPage.getRotation(); - boolean valid = false; - // Perform the comparison - switch (comparator) { - case "Greater": - valid = actualRotation > rotation; - break; - case "Equal": - valid = actualRotation == rotation; - break; - case "Less": - valid = actualRotation < rotation; - break; - default: - throw new IllegalArgumentException("Invalid comparator: " + comparator); - } - - if (valid) - return WebResponseUtils.multiPartFileToWebResponse(inputFile); - return null; - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java deleted file mode 100644 index fe8337d2..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ /dev/null @@ -1,128 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.text.PDFTextStripper; -import org.apache.pdfbox.text.TextPosition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class AutoRenameController { - - private static final Logger logger = LoggerFactory.getLogger(AutoRenameController.class); - - private static final float TITLE_FONT_SIZE_THRESHOLD = 20.0f; - private static final int LINE_LIMIT = 11; - - @PostMapping(consumes = "multipart/form-data", value = "/auto-rename") - @Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO") - public ResponseEntity extractHeader(@ModelAttribute ExtractHeaderRequest request) throws Exception { - MultipartFile file = request.getFileInput(); - Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback(); - - PDDocument document = PDDocument.load(file.getInputStream()); - PDFTextStripper reader = new PDFTextStripper() { - class LineInfo { - String text; - float fontSize; - - LineInfo(String text, float fontSize) { - this.text = text; - this.fontSize = fontSize; - } - } - - List lineInfos = new ArrayList<>(); - StringBuilder lineBuilder = new StringBuilder(); - float lastY = -1; - float maxFontSizeInLine = 0.0f; - int lineCount = 0; - - @Override - protected void processTextPosition(TextPosition text) { - if (lastY != text.getY() && lineCount < LINE_LIMIT) { - processLine(); - lineBuilder = new StringBuilder(text.getUnicode()); - maxFontSizeInLine = text.getFontSizeInPt(); - lastY = text.getY(); - lineCount++; - } else if (lineCount < LINE_LIMIT) { - lineBuilder.append(text.getUnicode()); - if (text.getFontSizeInPt() > maxFontSizeInLine) { - maxFontSizeInLine = text.getFontSizeInPt(); - } - } - } - - private void processLine() { - if (lineBuilder.length() > 0 && lineCount < LINE_LIMIT) { - lineInfos.add(new LineInfo(lineBuilder.toString(), maxFontSizeInLine)); - } - } - - @Override - public String getText(PDDocument doc) throws IOException { - this.lineInfos.clear(); - this.lineBuilder = new StringBuilder(); - this.lastY = -1; - this.maxFontSizeInLine = 0.0f; - this.lineCount = 0; - super.getText(doc); - processLine(); // Process the last line - - // Merge lines with same font size - List mergedLineInfos = new ArrayList<>(); - for (int i = 0; i < lineInfos.size(); i++) { - String mergedText = lineInfos.get(i).text; - float fontSize = lineInfos.get(i).fontSize; - while (i + 1 < lineInfos.size() && lineInfos.get(i + 1).fontSize == fontSize) { - mergedText += " " + lineInfos.get(i + 1).text; - i++; - } - mergedLineInfos.add(new LineInfo(mergedText, fontSize)); - } - - // Sort lines by font size in descending order and get the first one - mergedLineInfos.sort(Comparator.comparing((LineInfo li) -> li.fontSize).reversed()); - String title = mergedLineInfos.isEmpty() ? null : mergedLineInfos.get(0).text; - - return title != null ? title : (useFirstTextAsFallback ? (mergedLineInfos.isEmpty() ? null : mergedLineInfos.get(mergedLineInfos.size() - 1).text) : null); - } - - }; - - String header = reader.getText(document); - - - - // Sanitize the header string by removing characters not allowed in a filename. - if (header != null && header.length() < 255) { - header = header.replaceAll("[/\\\\?%*:|\"<>]", ""); - return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf"); - } else { - logger.info("File has no good title to be found"); - return WebResponseUtils.pdfDocToWebResponse(document, file.getOriginalFilename()); - } - } - - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java deleted file mode 100644 index b4b9b951..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ /dev/null @@ -1,144 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; -import java.awt.image.BufferedImage; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferInt; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.google.zxing.BinaryBitmap; -import com.google.zxing.LuminanceSource; -import com.google.zxing.MultiFormatReader; -import com.google.zxing.NotFoundException; -import com.google.zxing.PlanarYUVLuminanceSource; -import com.google.zxing.Result; -import com.google.zxing.common.HybridBinarizer; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class AutoSplitPdfController { - - private static final String QR_CONTENT = "https://github.com/Frooodle/Stirling-PDF"; - - @PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data") - @Operation(summary = "Auto split PDF pages into separate documents", description = "This endpoint accepts a PDF file, scans each page for a specific QR code, and splits the document at the QR code boundaries. The output is a zip file containing each separate PDF document. Input:PDF Output:ZIP Type:SISO") - public ResponseEntity autoSplitPdf(@ModelAttribute AutoSplitPdfRequest request) throws IOException { - MultipartFile file = request.getFileInput(); - boolean duplexMode = request.isDuplexMode(); - - InputStream inputStream = file.getInputStream(); - PDDocument document = PDDocument.load(inputStream); - PDFRenderer pdfRenderer = new PDFRenderer(document); - - List splitDocuments = new ArrayList<>(); - List splitDocumentsBoas = new ArrayList<>(); - - for (int page = 0; page < document.getNumberOfPages(); ++page) { - BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150); - String result = decodeQRCode(bim); - - if (QR_CONTENT.equals(result) && page != 0) { - splitDocuments.add(new PDDocument()); - } - - if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result)) { - splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); - } else if (page == 0) { - PDDocument firstDocument = new PDDocument(); - firstDocument.addPage(document.getPage(page)); - splitDocuments.add(firstDocument); - } - - // If duplexMode is true and current page is a divider, then skip next page - if (duplexMode && QR_CONTENT.equals(result)) { - page++; - } - } - - // Remove split documents that have no pages - splitDocuments.removeIf(pdDocument -> pdDocument.getNumberOfPages() == 0); - - for (PDDocument splitDocument : splitDocuments) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - splitDocument.save(baos); - splitDocumentsBoas.add(baos); - splitDocument.close(); - } - - document.close(); - - Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); - byte[] data; - - try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { - for (int i = 0; i < splitDocumentsBoas.size(); i++) { - String fileName = filename + "_" + (i + 1) + ".pdf"; - ByteArrayOutputStream baos = splitDocumentsBoas.get(i); - byte[] pdf = baos.toByteArray(); - - ZipEntry pdfEntry = new ZipEntry(fileName); - zipOut.putNextEntry(pdfEntry); - zipOut.write(pdf); - zipOut.closeEntry(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - data = Files.readAllBytes(zipFile); - Files.delete(zipFile); - } - - return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); - } - - - private static String decodeQRCode(BufferedImage bufferedImage) { - LuminanceSource source; - - if (bufferedImage.getRaster().getDataBuffer() instanceof DataBufferByte) { - byte[] pixels = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); - source = new PlanarYUVLuminanceSource(pixels, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), false); - } else if (bufferedImage.getRaster().getDataBuffer() instanceof DataBufferInt) { - int[] pixels = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()).getData(); - byte[] newPixels = new byte[pixels.length]; - for (int i = 0; i < pixels.length; i++) { - newPixels[i] = (byte) (pixels[i] & 0xff); - } - source = new PlanarYUVLuminanceSource(newPixels, bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), false); - } else { - throw new IllegalArgumentException("BufferedImage must have 8-bit gray scale, 24-bit RGB, 32-bit ARGB (packed int), byte gray, or 3-byte/4-byte RGB image data"); - } - - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - - try { - Result result = new MultiFormatReader().decode(bitmap); - return result.getText(); - } catch (NotFoundException e) { - return null; // there is no QR code in the image - } - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java deleted file mode 100644 index c52ff61a..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ /dev/null @@ -1,122 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import javax.imageio.ImageIO; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.apache.pdfbox.text.PDFTextStripper; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest; -import stirling.software.SPDF.utils.PdfUtils; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class BlankPageController { - - @PostMapping(consumes = "multipart/form-data", value = "/remove-blanks") - @Operation( - summary = "Remove blank pages from a PDF file", - description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity removeBlankPages(@ModelAttribute RemoveBlankPagesRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - int threshold = request.getThreshold(); - float whitePercent = request.getWhitePercent(); - - PDDocument document = null; - try { - document = PDDocument.load(inputFile.getInputStream()); - PDPageTree pages = document.getDocumentCatalog().getPages(); - PDFTextStripper textStripper = new PDFTextStripper(); - - List pagesToKeepIndex = new ArrayList<>(); - int pageIndex = 0; - PDFRenderer pdfRenderer = new PDFRenderer(document); - - for (PDPage page : pages) { - System.out.println("checking page " + pageIndex); - textStripper.setStartPage(pageIndex + 1); - textStripper.setEndPage(pageIndex + 1); - String pageText = textStripper.getText(document); - boolean hasText = !pageText.trim().isEmpty(); - if (hasText) { - pagesToKeepIndex.add(pageIndex); - System.out.println("page " + pageIndex + " has text"); - } else { - boolean hasImages = PdfUtils.hasImagesOnPage(page); - if (hasImages) { - System.out.println("page " + pageIndex + " has image"); - - Path tempFile = Files.createTempFile("image_", ".png"); - - // Render image and save as temp file - BufferedImage image = pdfRenderer.renderImageWithDPI(pageIndex, 300); - ImageIO.write(image, "png", tempFile.toFile()); - - List command = new ArrayList<>(Arrays.asList("python3", System.getProperty("user.dir") + "/scripts/detect-blank-pages.py", tempFile.toString() ,"--threshold", String.valueOf(threshold), "--white_percent", String.valueOf(whitePercent))); - - // Run CLI command - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV).runCommandWithOutputHandling(command); - - // does contain data - if (returnCode.getRc() == 0) { - System.out.println("page " + pageIndex + " has image which is not blank"); - pagesToKeepIndex.add(pageIndex); - } else { - System.out.println("Skipping, Image was blank for page #" + pageIndex); - } - } - } - pageIndex++; - - } - System.out.print("pagesToKeep=" + pagesToKeepIndex.size()); - - // Remove pages not present in pagesToKeepIndex - List pageIndices = IntStream.range(0, pages.getCount()).boxed().collect(Collectors.toList()); - Collections.reverse(pageIndices); // Reverse to prevent index shifting during removal - for (Integer i : pageIndices) { - if (!pagesToKeepIndex.contains(i)) { - pages.remove(i); - } - } - - return WebResponseUtils.pdfDocToWebResponse(document, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf"); - } catch (IOException e) { - e.printStackTrace(); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); - } finally { - if (document != null) - document.close(); - } - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java deleted file mode 100644 index dd864bc1..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java +++ /dev/null @@ -1,242 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import javax.imageio.ImageIO; - -import org.apache.commons.io.FileUtils; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.graphics.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.OptimizePdfRequest; -import stirling.software.SPDF.utils.GeneralUtils; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class CompressController { - - private static final Logger logger = LoggerFactory.getLogger(CompressController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/compress-pdf") - @Operation(summary = "Optimize PDF file", description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters. Input:PDF Output:PDF Type:SISO") - public ResponseEntity optimizePdf(@ModelAttribute OptimizePdfRequest request) throws Exception { - MultipartFile inputFile = request.getFileInput(); - Integer optimizeLevel = request.getOptimizeLevel(); - String expectedOutputSizeString = request.getExpectedOutputSize(); - - - if(expectedOutputSizeString == null && optimizeLevel == null) { - throw new Exception("Both expected output size and optimize level are not specified"); - } - - Long expectedOutputSize = 0L; - boolean autoMode = false; - if (expectedOutputSizeString != null && expectedOutputSizeString.length() > 1 ) { - expectedOutputSize = GeneralUtils.convertSizeToBytes(expectedOutputSizeString); - autoMode = true; - } - - // Save the uploaded file to a temporary location - Path tempInputFile = Files.createTempFile("input_", ".pdf"); - inputFile.transferTo(tempInputFile.toFile()); - - long inputFileSize = Files.size(tempInputFile); - - // Prepare the output file path - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - - // Determine initial optimization level based on expected size reduction, only if in autoMode - if(autoMode) { - double sizeReductionRatio = expectedOutputSize / (double) inputFileSize; - if (sizeReductionRatio > 0.7) { - optimizeLevel = 1; - } else if (sizeReductionRatio > 0.5) { - optimizeLevel = 2; - } else if (sizeReductionRatio > 0.35) { - optimizeLevel = 3; - } else { - optimizeLevel = 3; - } - } - - boolean sizeMet = false; - while (!sizeMet && optimizeLevel <= 4) { - // Prepare the Ghostscript command - List command = new ArrayList<>(); - command.add("gs"); - command.add("-sDEVICE=pdfwrite"); - command.add("-dCompatibilityLevel=1.4"); - - switch (optimizeLevel) { - case 1: - command.add("-dPDFSETTINGS=/prepress"); - break; - case 2: - command.add("-dPDFSETTINGS=/printer"); - break; - case 3: - command.add("-dPDFSETTINGS=/ebook"); - break; - case 4: - command.add("-dPDFSETTINGS=/screen"); - break; - default: - command.add("-dPDFSETTINGS=/default"); - } - - command.add("-dNOPAUSE"); - command.add("-dQUIET"); - command.add("-dBATCH"); - command.add("-sOutputFile=" + tempOutputFile.toString()); - command.add(tempInputFile.toString()); - - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT).runCommandWithOutputHandling(command); - - // Check if file size is within expected size or not auto mode so instantly finish - long outputFileSize = Files.size(tempOutputFile); - if (outputFileSize <= expectedOutputSize || !autoMode) { - sizeMet = true; - } else { - // Increase optimization level for next iteration - optimizeLevel++; - if(autoMode && optimizeLevel > 3) { - System.out.println("Skipping level 4 due to bad results in auto mode"); - sizeMet = true; - } else if(optimizeLevel == 5) { - - } else { - System.out.println("Increasing ghostscript optimisation level to " + optimizeLevel); - } - } - } - - - - if (expectedOutputSize != null && autoMode) { - long outputFileSize = Files.size(tempOutputFile); - if (outputFileSize > expectedOutputSize) { - try (PDDocument doc = PDDocument.load(new File(tempOutputFile.toString()))) { - long previousFileSize = 0; - double scaleFactor = 1.0; - while (true) { - for (PDPage page : doc.getPages()) { - PDResources res = page.getResources(); - - for (COSName name : res.getXObjectNames()) { - PDXObject xobj = res.getXObject(name); - if (xobj instanceof PDImageXObject) { - PDImageXObject image = (PDImageXObject) xobj; - - // Get the image in BufferedImage format - BufferedImage bufferedImage = image.getImage(); - - // Calculate the new dimensions - int newWidth = (int)(bufferedImage.getWidth() * scaleFactor); - int newHeight = (int)(bufferedImage.getHeight() * scaleFactor); - - // If the new dimensions are zero, skip this iteration - if (newWidth == 0 || newHeight == 0) { - continue; - } - - // Otherwise, proceed with the scaling - Image scaledImage = bufferedImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); - - // Convert the scaled image back to a BufferedImage - BufferedImage scaledBufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); - scaledBufferedImage.getGraphics().drawImage(scaledImage, 0, 0, null); - - // Compress the scaled image - ByteArrayOutputStream compressedImageStream = new ByteArrayOutputStream(); - ImageIO.write(scaledBufferedImage, "jpeg", compressedImageStream); - byte[] imageBytes = compressedImageStream.toByteArray(); - compressedImageStream.close(); - - // Convert compressed image back to PDImageXObject - ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes); - PDImageXObject compressedImage = PDImageXObject.createFromByteArray(doc, imageBytes, image.getCOSObject().toString()); - - // Replace the image in the resources with the compressed version - res.put(name, compressedImage); - } - } - } - - // save the document to tempOutputFile again - doc.save(tempOutputFile.toString()); - - long currentSize = Files.size(tempOutputFile); - // Check if the overall PDF size is still larger than expectedOutputSize - if (currentSize > expectedOutputSize) { - // Log the current file size and scaleFactor - - System.out.println("Current file size: " + FileUtils.byteCountToDisplaySize(currentSize)); - System.out.println("Current scale factor: " + scaleFactor); - - // The file is still too large, reduce scaleFactor and try again - scaleFactor *= 0.9; // reduce scaleFactor by 10% - // Avoid scaleFactor being too small, causing the image to shrink to 0 - if(scaleFactor < 0.2 || previousFileSize == currentSize){ - throw new RuntimeException("Could not reach the desired size without excessively degrading image quality, lowest size recommended is " + FileUtils.byteCountToDisplaySize(currentSize) + ", " + currentSize + " bytes"); - } - previousFileSize = currentSize; - } else { - // The file is small enough, break the loop - break; - } - } - - } - - - } - } - - // Read the optimized PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); - - // Check if optimized file is larger than the original - if(pdfBytes.length > inputFileSize) { - // Log the occurrence - logger.warn("Optimized file is larger than the original. Returning the original file instead."); - - // Read the original file again - pdfBytes = Files.readAllBytes(tempInputFile); - } - - // Clean up the temporary files - Files.delete(tempInputFile); - Files.delete(tempOutputFile); - - // Return the optimized PDF as a response - String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java deleted file mode 100644 index d5906970..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java +++ /dev/null @@ -1,153 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.imageio.ImageIO; - -import org.apache.commons.io.FileUtils; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.parameters.RequestBody; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class ExtractImageScansController { - - private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/extract-image-scans") - @Operation(summary = "Extract image scans from an input file", - description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP Type:SIMO") - public ResponseEntity extractImageScans( - @RequestBody( - description = "Form data containing file and extraction parameters", - required = true, - content = @Content( - mediaType = "multipart/form-data", - schema = @Schema(implementation = ExtractImageScansRequest.class) // This should represent your form's structure - ) - ) - ExtractImageScansRequest form) throws IOException, InterruptedException { - String fileName = form.getFileInput().getOriginalFilename(); - String extension = fileName.substring(fileName.lastIndexOf(".") + 1); - - List images = new ArrayList<>(); - - // Check if input file is a PDF - if (extension.equalsIgnoreCase("pdf")) { - // Load PDF document - try (PDDocument document = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) { - PDFRenderer pdfRenderer = new PDFRenderer(document); - int pageCount = document.getNumberOfPages(); - images = new ArrayList<>(); - - // Create images of all pages - for (int i = 0; i < pageCount; i++) { - // Create temp file to save the image - Path tempFile = Files.createTempFile("image_", ".png"); - - // Render image and save as temp file - BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300); - ImageIO.write(image, "png", tempFile.toFile()); - - // Add temp file path to images list - images.add(tempFile.toString()); - } - } - } else { - Path tempInputFile = Files.createTempFile("input_", "." + extension); - Files.copy(form.getFileInput().getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); - // Add input file path to images list - images.add(tempInputFile.toString()); - } - - List processedImageBytes = new ArrayList<>(); - - // Process each image - for (int i = 0; i < images.size(); i++) { - - Path tempDir = Files.createTempDirectory("openCV_output"); - List command = new ArrayList<>(Arrays.asList( - "python3", - "./scripts/split_photos.py", - images.get(i), - tempDir.toString(), - "--angle_threshold", String.valueOf(form.getAngleThreshold()), - "--tolerance", String.valueOf(form.getTolerance()), - "--min_area", String.valueOf(form.getMinArea()), - "--min_contour_area", String.valueOf(form.getMinContourArea()), - "--border_size", String.valueOf(form.getBorderSize()) - )); - - - // Run CLI command - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV).runCommandWithOutputHandling(command); - - // Read the output photos in temp directory - List tempOutputFiles = Files.list(tempDir).sorted().collect(Collectors.toList()); - for (Path tempOutputFile : tempOutputFiles) { - byte[] imageBytes = Files.readAllBytes(tempOutputFile); - processedImageBytes.add(imageBytes); - } - // Clean up the temporary directory - FileUtils.deleteDirectory(tempDir.toFile()); - } - - // Create zip file if multiple images - if (processedImageBytes.size() > 1) { - String outputZipFilename = fileName.replaceFirst("[.][^.]+$", "") + "_processed.zip"; - Path tempZipFile = Files.createTempFile("output_", ".zip"); - - try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tempZipFile.toFile()))) { - // Add processed images to the zip - for (int i = 0; i < processedImageBytes.size(); i++) { - ZipEntry entry = new ZipEntry(fileName.replaceFirst("[.][^.]+$", "") + "_" + (i + 1) + ".png"); - zipOut.putNextEntry(entry); - zipOut.write(processedImageBytes.get(i)); - zipOut.closeEntry(); - } - } - - byte[] zipBytes = Files.readAllBytes(tempZipFile); - - // Clean up the temporary zip file - Files.delete(tempZipFile); - - return WebResponseUtils.bytesToWebResponse(zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM); - } else { - // Return the processed image as a response - byte[] imageBytes = processedImageBytes.get(0); - return WebResponseUtils.bytesToWebResponse(imageBytes, fileName.replaceFirst("[.][^.]+$", "") + ".png", MediaType.IMAGE_PNG); - } - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java deleted file mode 100644 index b24ac892..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ /dev/null @@ -1,119 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.awt.image.RenderedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.zip.Deflater; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.imageio.ImageIO; - -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFWithImageFormatRequest; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class ExtractImagesController { - - private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/extract-images") - @Operation(summary = "Extract images from a PDF file", - description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO") - public ResponseEntity extractImages(@ModelAttribute PDFWithImageFormatRequest request) throws IOException { - MultipartFile file = request.getFileInput(); - String format = request.getFormat(); - - System.out.println(System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format); - PDDocument document = PDDocument.load(file.getBytes()); - - // Create ByteArrayOutputStream to write zip file to byte array - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - // Create ZipOutputStream to create zip file - ZipOutputStream zos = new ZipOutputStream(baos); - - // Set compression level - zos.setLevel(Deflater.BEST_COMPRESSION); - - int imageIndex = 1; - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); - int pageNum = 0; - Set processedImages = new HashSet<>(); - // Iterate over each page - for (PDPage page : document.getPages()) { - ++pageNum; - // Extract images from page - for (COSName name : page.getResources().getXObjectNames()) { - if (page.getResources().isImageXObject(name)) { - PDImageXObject image = (PDImageXObject) page.getResources().getXObject(name); - int imageHash = image.hashCode(); - if(processedImages.contains(imageHash)) { - continue; // Skip already processed images - } - processedImages.add(imageHash); - - // Convert image to desired format - RenderedImage renderedImage = image.getImage(); - BufferedImage bufferedImage = null; - if (format.equalsIgnoreCase("png")) { - bufferedImage = new BufferedImage(renderedImage.getWidth(), renderedImage.getHeight(), BufferedImage.TYPE_INT_ARGB); - } else if (format.equalsIgnoreCase("jpeg") || format.equalsIgnoreCase("jpg")) { - bufferedImage = new BufferedImage(renderedImage.getWidth(), renderedImage.getHeight(), BufferedImage.TYPE_INT_RGB); - } else if (format.equalsIgnoreCase("gif")) { - bufferedImage = new BufferedImage(renderedImage.getWidth(), renderedImage.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); - } - - // Write image to zip file - String imageName = filename + "_" + imageIndex + " (Page " + pageNum + ")." + format; - ZipEntry zipEntry = new ZipEntry(imageName); - zos.putNextEntry(zipEntry); - - Graphics2D g = bufferedImage.createGraphics(); - g.drawImage((Image) renderedImage, 0, 0, null); - g.dispose(); - // Write image bytes to zip file - ByteArrayOutputStream imageBaos = new ByteArrayOutputStream(); - ImageIO.write(bufferedImage, format, imageBaos); - zos.write(imageBaos.toByteArray()); - - zos.closeEntry(); - imageIndex++; - } - } - } - - // Close ZipOutputStream and PDDocument - zos.close(); - document.close(); - - // Create ByteArrayResource from byte array - byte[] zipContents = baos.toByteArray(); - - return WebResponseUtils.boasToWebResponse(baos, filename + "_extracted-images.zip", MediaType.APPLICATION_OCTET_STREAM); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java deleted file mode 100644 index 68e026ab..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java +++ /dev/null @@ -1,150 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.awt.Color; -import java.awt.geom.AffineTransform; -import java.awt.image.AffineTransformOp; -//Required for image manipulation -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.awt.image.ConvolveOp; -import java.awt.image.Kernel; -import java.awt.image.RescaleOp; -import java.io.ByteArrayOutputStream; -//Required for file input/output -import java.io.File; -import java.io.IOException; -//Other required classes -import java.util.Random; - -//Required for image input/output -import javax.imageio.ImageIO; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class FakeScanControllerWIP { - - private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class); - - //TODO - @Hidden - @PostMapping(consumes = "multipart/form-data", value = "/fakeScan") - @Operation( - summary = "Repair a PDF file", - description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response." - ) - public ResponseEntity repairPdf(@ModelAttribute PDFFile request) throws IOException { - MultipartFile inputFile = request.getFileInput(); - - PDDocument document = PDDocument.load(inputFile.getBytes()); - PDFRenderer pdfRenderer = new PDFRenderer(document); - for (int page = 0; page < document.getNumberOfPages(); ++page) - { - BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); - ImageIO.write(image, "png", new File("scanned-" + (page+1) + ".png")); - } - document.close(); - - // Constants - int scannedness = 90; // Value between 0 and 100 - int dirtiness = 0; // Value between 0 and 100 - - // Load the source image - BufferedImage sourceImage = ImageIO.read(new File("scanned-1.png")); - - // Create the destination image - BufferedImage destinationImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), sourceImage.getType()); - - // Apply a brightness and contrast effect based on the "scanned-ness" - float scaleFactor = 1.0f + (scannedness / 100.0f) * 0.5f; // Between 1.0 and 1.5 - float offset = scannedness * 1.5f; // Between 0 and 150 - BufferedImageOp op = new RescaleOp(scaleFactor, offset, null); - op.filter(sourceImage, destinationImage); - - // Apply a rotation effect - double rotationRequired = Math.toRadians((new Random().nextInt(3 - 1) + 1)); // Random angle between 1 and 3 degrees - double locationX = destinationImage.getWidth() / 2; - double locationY = destinationImage.getHeight() / 2; - AffineTransform tx = AffineTransform.getRotateInstance(rotationRequired, locationX, locationY); - AffineTransformOp rotateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR); - destinationImage = rotateOp.filter(destinationImage, null); - - // Apply a blur effect based on the "scanned-ness" - float blurIntensity = scannedness / 100.0f * 0.2f; // Between 0.0 and 0.2 - float[] matrix = { - blurIntensity, blurIntensity, blurIntensity, - blurIntensity, blurIntensity, blurIntensity, - blurIntensity, blurIntensity, blurIntensity - }; - BufferedImageOp blurOp = new ConvolveOp(new Kernel(3, 3, matrix), ConvolveOp.EDGE_NO_OP, null); - destinationImage = blurOp.filter(destinationImage, null); - - // Add noise to the image based on the "dirtiness" - Random random = new Random(); - for (int y = 0; y < destinationImage.getHeight(); y++) { - for (int x = 0; x < destinationImage.getWidth(); x++) { - if (random.nextInt(100) < dirtiness) { - // Change the pixel color to black randomly based on the "dirtiness" - destinationImage.setRGB(x, y, Color.BLACK.getRGB()); - } - } - } - - // Save the image - ImageIO.write(destinationImage, "PNG", new File("scanned-1.png")); - - - - - - - - PDDocument documentOut = new PDDocument(); - for (int page = 1; page <= document.getNumberOfPages(); ++page) - { - BufferedImage bim = ImageIO.read(new File("scanned-" + page + ".png")); - - // Adjust the dimensions of the page - PDPage pdPage = new PDPage(new PDRectangle(bim.getWidth() - 1, bim.getHeight() - 1)); - documentOut.addPage(pdPage); - - PDImageXObject pdImage = LosslessFactory.createFromImage(documentOut, bim); - PDPageContentStream contentStream = new PDPageContentStream(documentOut, pdPage); - - // Draw the image with a slight offset and enlarged dimensions - contentStream.drawImage(pdImage, -1, -1, bim.getWidth() + 2, bim.getHeight() + 2); - contentStream.close(); - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - documentOut.save(baos); - documentOut.close(); - - // Return the optimized PDF as a response - String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scanned.pdf"; - return WebResponseUtils.boasToWebResponse(baos, outputFilename); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java deleted file mode 100644 index 027c6240..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ /dev/null @@ -1,153 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentInformation; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.MetadataRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class MetadataController { - - - private String checkUndefined(String entry) { - // Check if the string is "undefined" - if ("undefined".equals(entry)) { - // Return null if it is - return null; - } - // Return the original string if it's not "undefined" - return entry; - - } - - @PostMapping(consumes = "multipart/form-data", value = "/update-metadata") - @Operation(summary = "Update metadata of a PDF file", - description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields. Input:PDF Output:PDF Type:SISO") - public ResponseEntity metadata(@ModelAttribute MetadataRequest request) throws IOException { - - // Extract PDF file from the request object - MultipartFile pdfFile = request.getFileInput(); - - // Extract metadata information - Boolean deleteAll = request.isDeleteAll(); - String author = request.getAuthor(); - String creationDate = request.getCreationDate(); - String creator = request.getCreator(); - String keywords = request.getKeywords(); - String modificationDate = request.getModificationDate(); - String producer = request.getProducer(); - String subject = request.getSubject(); - String title = request.getTitle(); - String trapped = request.getTrapped(); - - // Extract additional custom parameters - Map allRequestParams = request.getAllRequestParams(); - if(allRequestParams == null) { - allRequestParams = new java.util.HashMap(); - } - // Load the PDF file into a PDDocument - PDDocument document = PDDocument.load(pdfFile.getBytes()); - - // Get the document information from the PDF - PDDocumentInformation info = document.getDocumentInformation(); - - // Check if each metadata value is "undefined" and set it to null if it is - author = checkUndefined(author); - creationDate = checkUndefined(creationDate); - creator = checkUndefined(creator); - keywords = checkUndefined(keywords); - modificationDate = checkUndefined(modificationDate); - producer = checkUndefined(producer); - subject = checkUndefined(subject); - title = checkUndefined(title); - trapped = checkUndefined(trapped); - - // If the "deleteAll" flag is set, remove all metadata from the document - // information - if (deleteAll) { - for (String key : info.getMetadataKeys()) { - info.setCustomMetadataValue(key, null); - } - // Remove metadata from the PDF history - document.getDocumentCatalog().getCOSObject().removeItem(COSName.getPDFName("Metadata")); - document.getDocumentCatalog().getCOSObject().removeItem(COSName.getPDFName("PieceInfo")); - author = null; - creationDate = null; - creator = null; - keywords = null; - modificationDate = null; - producer = null; - subject = null; - title = null; - trapped = null; - } else { - // Iterate through the request parameters and set the metadata values - for (Entry entry : allRequestParams.entrySet()) { - String key = entry.getKey(); - // Check if the key is a standard metadata key - if (!key.equalsIgnoreCase("Author") && !key.equalsIgnoreCase("CreationDate") && !key.equalsIgnoreCase("Creator") && !key.equalsIgnoreCase("Keywords") - && !key.equalsIgnoreCase("modificationDate") && !key.equalsIgnoreCase("Producer") && !key.equalsIgnoreCase("Subject") && !key.equalsIgnoreCase("Title") - && !key.equalsIgnoreCase("Trapped") && !key.contains("customKey") && !key.contains("customValue")) { - info.setCustomMetadataValue(key, entry.getValue()); - } else if (key.contains("customKey")) { - int number = Integer.parseInt(key.replaceAll("\\D", "")); - String customKey = entry.getValue(); - String customValue = allRequestParams.get("customValue" + number); - info.setCustomMetadataValue(customKey, customValue); - } - } - } - if (creationDate != null && creationDate.length() > 0) { - Calendar creationDateCal = Calendar.getInstance(); - try { - creationDateCal.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(creationDate)); - } catch (ParseException e) { - e.printStackTrace(); - } - info.setCreationDate(creationDateCal); - } else { - info.setCreationDate(null); - } - if (modificationDate != null && modificationDate.length() > 0) { - Calendar modificationDateCal = Calendar.getInstance(); - try { - modificationDateCal.setTime(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse(modificationDate)); - } catch (ParseException e) { - e.printStackTrace(); - } - info.setModificationDate(modificationDateCal); - } else { - info.setModificationDate(null); - } - info.setCreator(creator); - info.setKeywords(keywords); - info.setAuthor(author); - info.setProducer(producer); - info.setSubject(subject); - info.setTitle(title); - info.setTrapped(trapped); - - document.setDocumentInformation(info); - return WebResponseUtils.pdfDocToWebResponse(document, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java deleted file mode 100644 index 5ee06c19..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ /dev/null @@ -1,189 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class OCRController { - - private static final Logger logger = LoggerFactory.getLogger(OCRController.class); - - public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tesseract-ocr/4.00/tessdata"; - File[] files = new File(tessdataDir).listFiles(); - if (files == null) { - return Collections.emptyList(); - } - return Arrays.stream(files).filter(file -> file.getName().endsWith(".traineddata")).map(file -> file.getName().replace(".traineddata", "")) - .filter(lang -> !lang.equalsIgnoreCase("osd")).collect(Collectors.toList()); - } - - @PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") - @Operation(summary = "Process a PDF file with OCR", - description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. Input:PDF Output:PDF Type:SI-Conditional") - public ResponseEntity processPdfWithOCR(@ModelAttribute ProcessPdfWithOcrRequest request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - List selectedLanguages = request.getLanguages(); - Boolean sidecar = request.isSidecar(); - Boolean deskew = request.isDeskew(); - Boolean clean = request.isClean(); - Boolean cleanFinal = request.isCleanFinal(); - String ocrType = request.getOcrType(); - String ocrRenderType = request.getOcrRenderType(); - Boolean removeImagesAfter = request.isRemoveImagesAfter(); - // --output-type pdfa - if (selectedLanguages == null || selectedLanguages.isEmpty()) { - throw new IOException("Please select at least one language."); - } - - if(!ocrRenderType.equals("hocr") && !ocrRenderType.equals("sandwich")) { - throw new IOException("ocrRenderType wrong"); - } - - // Get available Tesseract languages - List availableLanguages = getAvailableTesseractLanguages(); - - // Validate selected languages - selectedLanguages = selectedLanguages.stream().filter(availableLanguages::contains).toList(); - - if (selectedLanguages.isEmpty()) { - throw new IOException("None of the selected languages are valid."); - } - // Save the uploaded file to a temporary location - Path tempInputFile = Files.createTempFile("input_", ".pdf"); - Files.copy(inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); - - // Prepare the output file path - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - - // Prepare the output file path - Path sidecarTextPath = null; - - // Run OCR Command - String languageOption = String.join("+", selectedLanguages); - - - List command = new ArrayList<>(Arrays.asList("ocrmypdf", "--verbose", "2", "--output-type", "pdf", "--pdf-renderer" , ocrRenderType)); - - if (sidecar != null && sidecar) { - sidecarTextPath = Files.createTempFile("sidecar", ".txt"); - command.add("--sidecar"); - command.add(sidecarTextPath.toString()); - } - - if (deskew != null && deskew) { - command.add("--deskew"); - } - if (clean != null && clean) { - command.add("--clean"); - } - if (cleanFinal != null && cleanFinal) { - command.add("--clean-final"); - } - if (ocrType != null && !ocrType.equals("")) { - if ("skip-text".equals(ocrType)) { - command.add("--skip-text"); - } else if ("force-ocr".equals(ocrType)) { - command.add("--force-ocr"); - } else if ("Normal".equals(ocrType)) { - - } - } - - command.addAll(Arrays.asList("--language", languageOption, tempInputFile.toString(), tempOutputFile.toString())); - - // Run CLI command - ProcessExecutorResult result = ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF).runCommandWithOutputHandling(command); - if(result.getRc() != 0 && result.getMessages().contains("multiprocessing/synchronize.py") && result.getMessages().contains("OSError: [Errno 38] Function not implemented")) { - command.add("--jobs"); - command.add("1"); - result = ProcessExecutor.getInstance(ProcessExecutor.Processes.OCR_MY_PDF).runCommandWithOutputHandling(command); - } - - - - - // Remove images from the OCR processed PDF if the flag is set to true - if (removeImagesAfter != null && removeImagesAfter) { - Path tempPdfWithoutImages = Files.createTempFile("output_", "_no_images.pdf"); - - List gsCommand = Arrays.asList("gs", "-sDEVICE=pdfwrite", "-dFILTERIMAGE", "-o", tempPdfWithoutImages.toString(), tempOutputFile.toString()); - - ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT).runCommandWithOutputHandling(gsCommand); - tempOutputFile = tempPdfWithoutImages; - } - // Read the OCR processed PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); - // Clean up the temporary files - Files.delete(tempInputFile); - - // Return the OCR processed PDF as a response - String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.pdf"; - - if (sidecar != null && sidecar) { - // Create a zip file containing both the PDF and the text file - String outputZipFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.zip"; - Path tempZipFile = Files.createTempFile("output_", ".zip"); - - try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tempZipFile.toFile()))) { - // Add PDF file to the zip - ZipEntry pdfEntry = new ZipEntry(outputFilename); - zipOut.putNextEntry(pdfEntry); - Files.copy(tempOutputFile, zipOut); - zipOut.closeEntry(); - - // Add text file to the zip - ZipEntry txtEntry = new ZipEntry(outputFilename.replace(".pdf", ".txt")); - zipOut.putNextEntry(txtEntry); - Files.copy(sidecarTextPath, zipOut); - zipOut.closeEntry(); - } - - byte[] zipBytes = Files.readAllBytes(tempZipFile); - - // Clean up the temporary zip file - Files.delete(tempZipFile); - Files.delete(tempOutputFile); - Files.delete(sidecarTextPath); - - // Return the zip file containing both the PDF and the text file - return WebResponseUtils.bytesToWebResponse(zipBytes, outputZipFilename, MediaType.APPLICATION_OCTET_STREAM); - } else { - // Return the OCR processed PDF as a response - Files.delete(tempOutputFile); - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java deleted file mode 100644 index e28f7535..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ /dev/null @@ -1,50 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.IOException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.OverlayImageRequest; -import stirling.software.SPDF.utils.PdfUtils; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class OverlayImageController { - - private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/add-image") - @Operation( - summary = "Overlay image onto a PDF file", - description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified. Input:PDF/IMAGE Output:PDF Type:MF-SISO" - ) - public ResponseEntity overlayImage(@ModelAttribute OverlayImageRequest request) { - MultipartFile pdfFile = request.getFileInput(); - MultipartFile imageFile = request.getImageFile(); - float x = request.getX(); - float y = request.getY(); - boolean everyPage = request.isEveryPage(); - try { - byte[] pdfBytes = pdfFile.getBytes(); - byte[] imageBytes = imageFile.getBytes(); - byte[] result = PdfUtils.overlayImage(pdfBytes, imageBytes, x, y, everyPage); - - return WebResponseUtils.bytesToWebResponse(result, pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); - } catch (IOException e) { - logger.error("Failed to add image to PDF", e); - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java deleted file mode 100644 index 61a1ec97..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java +++ /dev/null @@ -1,135 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDType1Font; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.misc.AddPageNumbersRequest; -import stirling.software.SPDF.utils.GeneralUtils; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class PageNumbersController { - - private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class); - - @PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data") - @Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO") - public ResponseEntity addPageNumbers(@ModelAttribute AddPageNumbersRequest request) throws IOException { - MultipartFile file = request.getFileInput(); - String customMargin = request.getCustomMargin(); - int position = request.getPosition(); - int startingNumber = request.getStartingNumber(); - String pagesToNumber = request.getPagesToNumber(); - String customText = request.getCustomText(); - int pageNumber = startingNumber; - byte[] fileBytes = file.getBytes(); - PDDocument document = PDDocument.load(fileBytes); - - float marginFactor; - switch (customMargin.toLowerCase()) { - case "small": - marginFactor = 0.02f; - break; - case "medium": - marginFactor = 0.035f; - break; - case "large": - marginFactor = 0.05f; - break; - case "x-large": - marginFactor = 0.075f; - break; - - - default: - marginFactor = 0.035f; - break; - } - - float fontSize = 12.0f; - PDType1Font font = PDType1Font.HELVETICA; - if(pagesToNumber == null || pagesToNumber.length() == 0) { - pagesToNumber = "all"; - } - if(customText == null || customText.length() == 0) { - customText = "{n}"; - } - List pagesToNumberList = GeneralUtils.parsePageList(pagesToNumber.split(","), document.getNumberOfPages()); - - for (int i : pagesToNumberList) { - PDPage page = document.getPage(i); - PDRectangle pageSize = page.getMediaBox(); - - String text = customText != null ? customText.replace("{n}", String.valueOf(pageNumber)).replace("{total}", String.valueOf(document.getNumberOfPages())).replace("{filename}", file.getOriginalFilename().replaceFirst("[.][^.]+$", "")) : String.valueOf(pageNumber); - - float x, y; - - int xGroup = (position - 1) % 3; - int yGroup = 2 - (position - 1) / 3; - - switch (xGroup) { - case 0: // left - x = pageSize.getLowerLeftX() + marginFactor * pageSize.getWidth(); - break; - case 1: // center - x = pageSize.getLowerLeftX() + (pageSize.getWidth() / 2); - break; - default: // right - x = pageSize.getUpperRightX() - marginFactor * pageSize.getWidth(); - break; - } - - switch (yGroup) { - case 0: // bottom - y = pageSize.getLowerLeftY() + marginFactor * pageSize.getHeight(); - break; - case 1: // middle - y = pageSize.getLowerLeftY() + (pageSize.getHeight() / 2); - break; - default: // top - y = pageSize.getUpperRightY() - marginFactor * pageSize.getHeight(); - break; - } - - PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true); - contentStream.beginText(); - contentStream.setFont(font, fontSize); - contentStream.newLineAtOffset(x, y); - contentStream.showText(text); - contentStream.endText(); - contentStream.close(); - - pageNumber++; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - document.close(); - - return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", MediaType.APPLICATION_PDF); - - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java deleted file mode 100644 index f9ae541d..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java +++ /dev/null @@ -1,68 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class RepairController { - - private static final Logger logger = LoggerFactory.getLogger(RepairController.class); - - @PostMapping(consumes = "multipart/form-data", value = "/repair") - @Operation( - summary = "Repair a PDF file", - description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity repairPdf(@ModelAttribute PDFFile request) throws IOException, InterruptedException { - MultipartFile inputFile = request.getFileInput(); - // Save the uploaded file to a temporary location - Path tempInputFile = Files.createTempFile("input_", ".pdf"); - inputFile.transferTo(tempInputFile.toFile()); - - // Prepare the output file path - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - - List command = new ArrayList<>(); - command.add("gs"); - command.add("-o"); - command.add(tempOutputFile.toString()); - command.add("-sDEVICE=pdfwrite"); - command.add(tempInputFile.toString()); - - - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.GHOSTSCRIPT).runCommandWithOutputHandling(command); - - // Read the optimized PDF file - byte[] pdfBytes = Files.readAllBytes(tempOutputFile); - - // Clean up the temporary files - Files.delete(tempInputFile); - Files.delete(tempOutputFile); - - // Return the optimized PDF as a response - String outputFilename = inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java deleted file mode 100644 index 27431346..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java +++ /dev/null @@ -1,61 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.nio.charset.StandardCharsets; -import java.util.Map; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class ShowJavascript { - - private static final Logger logger = LoggerFactory.getLogger(ShowJavascript.class); - @PostMapping(consumes = "multipart/form-data", value = "/show-javascript") - public ResponseEntity extractHeader(@ModelAttribute PDFFile request) throws Exception { - MultipartFile inputFile = request.getFileInput(); - String script = ""; - - try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { - - if(document.getDocumentCatalog() != null && document.getDocumentCatalog().getNames() != null) { - PDNameTreeNode jsTree = document.getDocumentCatalog().getNames().getJavaScript(); - - if (jsTree != null) { - Map jsEntries = jsTree.getNames(); - - for (Map.Entry entry : jsEntries.entrySet()) { - String name = entry.getKey(); - PDActionJavaScript jsAction = entry.getValue(); - String jsCodeStr = jsAction.getAction(); - - script += "// File: " + inputFile.getOriginalFilename() + ", Script: " + name + "\n" + jsCodeStr + "\n"; - } - } - } - - if (script.isEmpty()) { - script = "PDF '" + inputFile.getOriginalFilename() + "' does not contain Javascript"; - } - - return WebResponseUtils.bytesToWebResponse(script.getBytes(StandardCharsets.UTF_8), inputFile.getOriginalFilename() + ".js"); - } - } - - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java deleted file mode 100644 index c12fe724..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ /dev/null @@ -1,524 +0,0 @@ -package stirling.software.SPDF.controller.api.pipeline; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.multipart.MultipartFile; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.ApplicationProperties; -import stirling.software.SPDF.model.PipelineConfig; -import stirling.software.SPDF.model.PipelineOperation; -import stirling.software.SPDF.model.api.HandleDataRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/pipeline") -@Tag(name = "Pipeline", description = "Pipeline APIs") -public class PipelineController { - - private static final Logger logger = LoggerFactory.getLogger(PipelineController.class); - @Autowired - private ObjectMapper objectMapper; - - final String jsonFileName = "pipelineConfig.json"; - final String watchedFoldersDir = "./pipeline/watchedFolders/"; - final String finishedFoldersDir = "./pipeline/finishedFolders/"; - - @Scheduled(fixedRate = 25000) - public void scanFolders() { - logger.info("Scanning folders..."); - Path watchedFolderPath = Paths.get(watchedFoldersDir); - if (!Files.exists(watchedFolderPath)) { - try { - Files.createDirectories(watchedFolderPath); - logger.info("Created directory: {}", watchedFolderPath); - } catch (IOException e) { - logger.error("Error creating directory: {}", watchedFolderPath, e); - return; - } - } - try (Stream paths = Files.walk(watchedFolderPath)) { - paths.filter(Files::isDirectory).forEach(t -> { - try { - if (!t.equals(watchedFolderPath) && !t.endsWith("processing")) { - handleDirectory(t); - } - } catch (Exception e) { - logger.error("Error handling directory: {}", t, e); - } - }); - } catch (Exception e) { - logger.error("Error walking through directory: {}", watchedFolderPath, e); - } - } - - @Autowired - ApplicationProperties applicationProperties; - - - private void handleDirectory(Path dir) throws Exception { - logger.info("Handling directory: {}", dir); - Path jsonFile = dir.resolve(jsonFileName); - Path processingDir = dir.resolve("processing"); // Directory to move files during processing - if (!Files.exists(processingDir)) { - Files.createDirectory(processingDir); - logger.info("Created processing directory: {}", processingDir); - } - - if (Files.exists(jsonFile)) { - // Read JSON file - String jsonString; - try { - jsonString = new String(Files.readAllBytes(jsonFile)); - logger.info("Read JSON file: {}", jsonFile); - } catch (IOException e) { - logger.error("Error reading JSON file: {}", jsonFile, e); - return; - } - - // Decode JSON to PipelineConfig - PipelineConfig config; - try { - config = objectMapper.readValue(jsonString, PipelineConfig.class); - // Assuming your PipelineConfig class has getters for all necessary fields, you - // can perform checks here - if (config.getOperations() == null || config.getOutputDir() == null || config.getName() == null) { - throw new IOException("Invalid JSON format"); - } - } catch (IOException e) { - logger.error("Error parsing PipelineConfig: {}", jsonString, e); - return; - } - - // For each operation in the pipeline - for (PipelineOperation operation : config.getOperations()) { - // Collect all files based on fileInput - File[] files; - String fileInput = (String) operation.getParameters().get("fileInput"); - if ("automated".equals(fileInput)) { - // If fileInput is "automated", process all files in the directory - try (Stream paths = Files.list(dir)) { - files = paths - .filter(path -> !Files.isDirectory(path)) // exclude directories - .filter(path -> !path.equals(jsonFile)) // exclude jsonFile - .map(Path::toFile) - .toArray(File[]::new); - - } catch (IOException e) { - e.printStackTrace(); - return; - } - } else { - // If fileInput contains a path, process only this file - files = new File[] { new File(fileInput) }; - } - - // Prepare the files for processing - List filesToProcess = new ArrayList<>(); - for (File file : files) { - logger.info(file.getName()); - logger.info("{} to {}",file.toPath(), processingDir.resolve(file.getName())); - Files.move(file.toPath(), processingDir.resolve(file.getName())); - filesToProcess.add(processingDir.resolve(file.getName()).toFile()); - } - - // Process the files - try { - List resources = handleFiles(filesToProcess.toArray(new File[0]), jsonString); - - if(resources == null) { - return; - } - // Move resultant files and rename them as per config in JSON file - for (Resource resource : resources) { - String resourceName = resource.getFilename(); - String baseName = resourceName.substring(0, resourceName.lastIndexOf(".")); - String extension = resourceName.substring(resourceName.lastIndexOf(".")+1); - - String outputFileName = config.getOutputPattern().replace("{filename}", baseName); - - outputFileName = outputFileName.replace("{pipelineName}", config.getName()); - DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd"); - outputFileName = outputFileName.replace("{date}", LocalDate.now().format(dateFormatter)); - DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmss"); - outputFileName = outputFileName.replace("{time}", LocalTime.now().format(timeFormatter)); - - outputFileName += "." + extension; - // {filename} {folder} {date} {tmime} {pipeline} - String outputDir = config.getOutputDir(); - - String outputFolder = applicationProperties.getAutoPipeline().getOutputFolder(); - - if (outputFolder == null || outputFolder.isEmpty()) { - // If the environment variable is not set, use the default value - outputFolder = finishedFoldersDir; - } - logger.info("outputDir 0={}", outputDir); - // Replace the placeholders in the outputDir string - outputDir = outputDir.replace("{outputFolder}", outputFolder); - outputDir = outputDir.replace("{folderName}", dir.toString()); - logger.info("outputDir 1={}", outputDir); - outputDir = outputDir.replace("\\watchedFolders", ""); - outputDir = outputDir.replace("//watchedFolders", ""); - outputDir = outputDir.replace("\\\\watchedFolders", ""); - outputDir = outputDir.replace("/watchedFolders", ""); - - Path outputPath; - logger.info("outputDir 2={}", outputDir); - if (Paths.get(outputDir).isAbsolute()) { - // If it's an absolute path, use it directly - outputPath = Paths.get(outputDir); - } else { - // If it's a relative path, make it relative to the current working directory - outputPath = Paths.get(".", outputDir); - } - - logger.info("outputPath={}", outputPath); - - if (!Files.exists(outputPath)) { - try { - Files.createDirectories(outputPath); - logger.info("Created directory: {}", outputPath); - } catch (IOException e) { - logger.error("Error creating directory: {}", outputPath, e); - return; - } - } - logger.info("outputPath {}", outputPath); - logger.info("outputPath.resolve(outputFileName).toString() {}", outputPath.resolve(outputFileName).toString()); - File newFile = new File(outputPath.resolve(outputFileName).toString()); - OutputStream os = new FileOutputStream(newFile); - os.write(((ByteArrayResource)resource).getByteArray()); - os.close(); - logger.info("made {}", outputPath.resolve(outputFileName)); - } - - // If successful, delete the original files - for (File file : filesToProcess) { - Files.deleteIfExists(processingDir.resolve(file.getName())); - } - } catch (Exception e) { - // If an error occurs, move the original files back - for (File file : filesToProcess) { - Files.move(processingDir.resolve(file.getName()), file.toPath()); - } - throw e; - } - } - } - } - - List processFiles(List outputFiles, String jsonString) throws Exception { - - ObjectMapper mapper = new ObjectMapper(); - JsonNode jsonNode = mapper.readTree(jsonString); - - JsonNode pipelineNode = jsonNode.get("pipeline"); - logger.info("Running pipelineNode: {}", pipelineNode); - ByteArrayOutputStream logStream = new ByteArrayOutputStream(); - PrintStream logPrintStream = new PrintStream(logStream); - - boolean hasErrors = false; - - for (JsonNode operationNode : pipelineNode) { - String operation = operationNode.get("operation").asText(); - logger.info("Running operation: {}", operation); - JsonNode parametersNode = operationNode.get("parameters"); - String inputFileExtension = ""; - if (operationNode.has("inputFileType")) { - inputFileExtension = operationNode.get("inputFileType").asText(); - } else { - inputFileExtension = ".pdf"; - } - - List newOutputFiles = new ArrayList<>(); - boolean hasInputFileType = false; - - for (Resource file : outputFiles) { - if (file.getFilename().endsWith(inputFileExtension)) { - hasInputFileType = true; - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("fileInput", file); - - Iterator> parameters = parametersNode.fields(); - while (parameters.hasNext()) { - Map.Entry parameter = parameters.next(); - body.add(parameter.getKey(), parameter.getValue().asText()); - } - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - - HttpEntity> entity = new HttpEntity<>(body, headers); - - RestTemplate restTemplate = new RestTemplate(); - String url = "http://localhost:8080/" + operation; - - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, byte[].class); - - // If the operation is filter and the response body is null or empty, skip this file - if (operation.startsWith("filter-") && (response.getBody() == null || response.getBody().length == 0)) { - logger.info("Skipping file due to failing {}", operation); - continue; - } - - if (!response.getStatusCode().equals(HttpStatus.OK)) { - logPrintStream.println("Error: " + response.getBody()); - hasErrors = true; - continue; - } - - - // Define filename - String filename; - if ("auto-rename".equals(operation)) { - // If the operation is "auto-rename", generate a new filename. - // This is a simple example of generating a filename using current timestamp. - // Modify as per your needs. - filename = "file_" + System.currentTimeMillis(); - } else { - // Otherwise, keep the original filename. - filename = file.getFilename(); - } - - // Check if the response body is a zip file - if (isZip(response.getBody())) { - // Unzip the file and add all the files to the new output files - newOutputFiles.addAll(unzip(response.getBody())); - } else { - Resource outputResource = new ByteArrayResource(response.getBody()) { - @Override - public String getFilename() { - return filename; - } - }; - newOutputFiles.add(outputResource); - } - } - - if (!hasInputFileType) { - logPrintStream.println( - "No files with extension " + inputFileExtension + " found for operation " + operation); - hasErrors = true; - } - - outputFiles = newOutputFiles; - } - logPrintStream.close(); - - } - if (hasErrors) { - logger.error("Errors occurred during processing. Log: {}", logStream.toString()); - } - return outputFiles; - } - - List handleFiles(File[] files, String jsonString) throws Exception { - if(files == null || files.length == 0) { - logger.info("No files"); - return null; - } - - logger.info("Handling files: {} files, with JSON string of length: {}", files.length, jsonString.length()); - - ObjectMapper mapper = new ObjectMapper(); - JsonNode jsonNode = mapper.readTree(jsonString); - - JsonNode pipelineNode = jsonNode.get("pipeline"); - - boolean hasErrors = false; - List outputFiles = new ArrayList<>(); - - for (File file : files) { - Path path = Paths.get(file.getAbsolutePath()); - System.out.println("Reading file: " + path); // debug statement - - if (Files.exists(path)) { - Resource fileResource = new ByteArrayResource(Files.readAllBytes(path)) { - @Override - public String getFilename() { - return file.getName(); - } - }; - outputFiles.add(fileResource); - } else { - System.out.println("File not found: " + path); // debug statement - } - } - logger.info("Files successfully loaded. Starting processing..."); - return processFiles(outputFiles, jsonString); - } - - List handleFiles(MultipartFile[] files, String jsonString) throws Exception { - if(files == null || files.length == 0) { - logger.info("No files"); - return null; - } - logger.info("Handling files: {} files, with JSON string of length: {}", files.length, jsonString.length()); - ObjectMapper mapper = new ObjectMapper(); - JsonNode jsonNode = mapper.readTree(jsonString); - - JsonNode pipelineNode = jsonNode.get("pipeline"); - - boolean hasErrors = false; - List outputFiles = new ArrayList<>(); - - for (MultipartFile file : files) { - Resource fileResource = new ByteArrayResource(file.getBytes()) { - @Override - public String getFilename() { - return file.getOriginalFilename(); - } - }; - outputFiles.add(fileResource); - } - logger.info("Files successfully loaded. Starting processing..."); - return processFiles(outputFiles, jsonString); - } - - @PostMapping("/handleData") - public ResponseEntity handleData(@ModelAttribute HandleDataRequest request) { - MultipartFile[] files = request.getFileInputs(); - String jsonString = request.getJsonString(); - logger.info("Received POST request to /handleData with {} files", files.length); - try { - List outputFiles = handleFiles(files, jsonString); - - if (outputFiles != null && outputFiles.size() == 1) { - // If there is only one file, return it directly - Resource singleFile = outputFiles.get(0); - InputStream is = singleFile.getInputStream(); - byte[] bytes = new byte[(int) singleFile.contentLength()]; - is.read(bytes); - is.close(); - - logger.info("Returning single file response..."); - return WebResponseUtils.bytesToWebResponse(bytes, singleFile.getFilename(), - MediaType.APPLICATION_OCTET_STREAM); - } else if (outputFiles == null) { - return null; - } - - // Create a ByteArrayOutputStream to hold the zip - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ZipOutputStream zipOut = new ZipOutputStream(baos); - - // Loop through each file and add it to the zip - for (Resource file : outputFiles) { - ZipEntry zipEntry = new ZipEntry(file.getFilename()); - zipOut.putNextEntry(zipEntry); - - // Read the file into a byte array - InputStream is = file.getInputStream(); - byte[] bytes = new byte[(int) file.contentLength()]; - is.read(bytes); - - // Write the bytes of the file to the zip - zipOut.write(bytes, 0, bytes.length); - zipOut.closeEntry(); - - is.close(); - } - - zipOut.close(); - - logger.info("Returning zipped file response..."); - return WebResponseUtils.boasToWebResponse(baos, "output.zip", MediaType.APPLICATION_OCTET_STREAM); - } catch (Exception e) { - logger.error("Error handling data: ", e); - return null; - } - } - - private boolean isZip(byte[] data) { - if (data == null || data.length < 4) { - return false; - } - - // Check the first four bytes of the data against the standard zip magic number - return data[0] == 0x50 && data[1] == 0x4B && data[2] == 0x03 && data[3] == 0x04; - } - - private List unzip(byte[] data) throws IOException { - logger.info("Unzipping data of length: {}", data.length); - List unzippedFiles = new ArrayList<>(); - - try (ByteArrayInputStream bais = new ByteArrayInputStream(data); - ZipInputStream zis = new ZipInputStream(bais)) { - - ZipEntry entry; - while ((entry = zis.getNextEntry()) != null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int count; - - while ((count = zis.read(buffer)) != -1) { - baos.write(buffer, 0, count); - } - - final String filename = entry.getName(); - Resource fileResource = new ByteArrayResource(baos.toByteArray()) { - @Override - public String getFilename() { - return filename; - } - }; - - // If the unzipped file is a zip file, unzip it - if (isZip(baos.toByteArray())) { - logger.info("File {} is a zip file. Unzipping...", filename); - unzippedFiles.addAll(unzip(baos.toByteArray())); - } else { - unzippedFiles.add(fileResource); - } - } - } - - logger.info("Unzipping completed. {} files were unzipped.", unzippedFiles.size()); - return unzippedFiles; - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java deleted file mode 100644 index b0e5f2aa..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ /dev/null @@ -1,258 +0,0 @@ -package stirling.software.SPDF.controller.api.security; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.security.KeyFactory; -import java.security.KeyStore; -import java.security.PrivateKey; -import java.security.Security; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; -import java.security.spec.PKCS8EncodedKeySpec; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Collections; -import java.util.Date; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDType1Font; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.ExternalSigningSupport; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; -import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.bouncycastle.cert.jcajce.JcaCertStore; -import org.bouncycastle.cms.CMSProcessableByteArray; -import org.bouncycastle.cms.CMSSignedData; -import org.bouncycastle.cms.CMSSignedDataGenerator; -import org.bouncycastle.cms.CMSTypedData; -import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.operator.ContentSigner; -import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; -import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; -import org.bouncycastle.util.io.pem.PemReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class CertSignController { - - private static final Logger logger = LoggerFactory.getLogger(CertSignController.class); - - static { - Security.addProvider(new BouncyCastleProvider()); - } - - @PostMapping(consumes = "multipart/form-data", value = "/cert-sign") - @Operation(summary = "Sign PDF with a Digital Certificate", description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO") - public ResponseEntity signPDFWithCert(@ModelAttribute SignPDFWithCertRequest request) throws Exception { - MultipartFile pdf = request.getFileInput(); - String certType = request.getCertType(); - MultipartFile privateKeyFile = request.getPrivateKeyFile(); - MultipartFile certFile = request.getCertFile(); - MultipartFile p12File = request.getP12File(); - String password = request.getPassword(); - Boolean showSignature = request.isShowSignature(); - String reason = request.getReason(); - String location = request.getLocation(); - String name = request.getName(); - Integer pageNumber = request.getPageNumber(); - - PrivateKey privateKey = null; - X509Certificate cert = null; - - if (certType != null) { - logger.info("Cert type provided: {}", certType); - switch (certType) { - case "PKCS12": - if (p12File != null) { - KeyStore ks = KeyStore.getInstance("PKCS12"); - ks.load(new ByteArrayInputStream(p12File.getBytes()), password.toCharArray()); - String alias = ks.aliases().nextElement(); - if (!ks.isKeyEntry(alias)) { - throw new IllegalArgumentException("The provided PKCS12 file does not contain a private key."); - } - privateKey = (PrivateKey) ks.getKey(alias, password.toCharArray()); - cert = (X509Certificate) ks.getCertificate(alias); - } - break; - case "PEM": - if (privateKeyFile != null && certFile != null) { - // Load private key - KeyFactory keyFactory = KeyFactory.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME); - if (isPEM(privateKeyFile.getBytes())) { - privateKey = keyFactory - .generatePrivate(new PKCS8EncodedKeySpec(parsePEM(privateKeyFile.getBytes()))); - } else { - privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKeyFile.getBytes())); - } - - // Load certificate - CertificateFactory certFactory = CertificateFactory.getInstance("X.509", - BouncyCastleProvider.PROVIDER_NAME); - if (isPEM(certFile.getBytes())) { - cert = (X509Certificate) certFactory - .generateCertificate(new ByteArrayInputStream(parsePEM(certFile.getBytes()))); - } else { - cert = (X509Certificate) certFactory - .generateCertificate(new ByteArrayInputStream(certFile.getBytes())); - } - } - break; - } - } - PDSignature signature = new PDSignature(); - signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); // default filter - signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_SHA1); - signature.setName(name); - signature.setLocation(location); - signature.setReason(reason); - signature.setSignDate(Calendar.getInstance()); - - // Load the PDF - try (PDDocument document = PDDocument.load(pdf.getBytes())) { - logger.info("Successfully loaded the provided PDF"); - SignatureOptions signatureOptions = new SignatureOptions(); - - // If you want to show the signature - - // ATTEMPT 2 - if (showSignature != null && showSignature) { - PDPage page = document.getPage(pageNumber - 1); - - PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); - if (acroForm == null) { - acroForm = new PDAcroForm(document); - document.getDocumentCatalog().setAcroForm(acroForm); - } - - // Create a new signature field and widget - - PDSignatureField signatureField = new PDSignatureField(acroForm); - PDAnnotationWidget widget = signatureField.getWidgets().get(0); - PDRectangle rect = new PDRectangle(100, 100, 200, 50); // Define the rectangle size here - widget.setRectangle(rect); - page.getAnnotations().add(widget); - -// Set the appearance for the signature field - PDAppearanceDictionary appearanceDict = new PDAppearanceDictionary(); - PDAppearanceStream appearanceStream = new PDAppearanceStream(document); - appearanceStream.setResources(new PDResources()); - appearanceStream.setBBox(rect); - appearanceDict.setNormalAppearance(appearanceStream); - widget.setAppearance(appearanceDict); - - try (PDPageContentStream contentStream = new PDPageContentStream(document, appearanceStream)) { - contentStream.beginText(); - contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); - contentStream.newLineAtOffset(110, 130); - contentStream.showText("Digitally signed by: " + (name != null ? name : "Unknown")); - contentStream.newLineAtOffset(0, -15); - contentStream.showText("Date: " + new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z").format(new Date())); - contentStream.newLineAtOffset(0, -15); - if (reason != null && !reason.isEmpty()) { - contentStream.showText("Reason: " + reason); - contentStream.newLineAtOffset(0, -15); - } - if (location != null && !location.isEmpty()) { - contentStream.showText("Location: " + location); - contentStream.newLineAtOffset(0, -15); - } - contentStream.endText(); - } - - // Add the widget annotation to the page - page.getAnnotations().add(widget); - - // Add the signature field to the acroform - acroForm.getFields().add(signatureField); - - // Handle multiple signatures by ensuring a unique field name - String baseFieldName = "Signature"; - String signatureFieldName = baseFieldName; - int suffix = 1; - while (acroForm.getField(signatureFieldName) != null) { - suffix++; - signatureFieldName = baseFieldName + suffix; - } - signatureField.setPartialName(signatureFieldName); - } - - document.addSignature(signature, signatureOptions); - logger.info("Signature added to the PDF document"); - // External signing - ExternalSigningSupport externalSigning = document - .saveIncrementalForExternalSigning(new ByteArrayOutputStream()); - - byte[] content = IOUtils.toByteArray(externalSigning.getContent()); - - // Using BouncyCastle to sign - CMSTypedData cmsData = new CMSProcessableByteArray(content); - - CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); - ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA") - .setProvider(BouncyCastleProvider.PROVIDER_NAME).build(privateKey); - - gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder( - new JcaDigestCalculatorProviderBuilder().setProvider(BouncyCastleProvider.PROVIDER_NAME).build()) - .build(signer, cert)); - - gen.addCertificates(new JcaCertStore(Collections.singletonList(cert))); - CMSSignedData signedData = gen.generate(cmsData, false); - - byte[] cmsSignature = signedData.getEncoded(); - logger.info("About to sign content using BouncyCastle"); - externalSigning.setSignature(cmsSignature); - logger.info("Signature set successfully"); - - // After setting the signature, return the resultant PDF - try (ByteArrayOutputStream signedPdfOutput = new ByteArrayOutputStream()) { - document.save(signedPdfOutput); - return WebResponseUtils.boasToWebResponse(signedPdfOutput, - pdf.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_signed.pdf"); - - } catch (Exception e) { - e.printStackTrace(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return null; - } - - private byte[] parsePEM(byte[] content) throws IOException { - PemReader pemReader = new PemReader(new InputStreamReader(new ByteArrayInputStream(content))); - return pemReader.readPemObject().getContent(); - } - - private boolean isPEM(byte[] content) { - String contentStr = new String(content); - return contentStr.contains("-----BEGIN") && contentStr.contains("-----END"); - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java deleted file mode 100644 index 791dc736..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ /dev/null @@ -1,807 +0,0 @@ -package stirling.software.SPDF.controller.api.security; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.pdfbox.cos.COSDocument; -import org.apache.pdfbox.cos.COSInputStream; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSObject; -import org.apache.pdfbox.cos.COSStream; -import org.apache.pdfbox.cos.COSString; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.PDDocumentInformation; -import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary; -import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; -import org.apache.pdfbox.pdmodel.PDJavascriptNameTreeNode; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDMetadata; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.common.PDStream; -import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; -import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; -import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; -import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureNode; -import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; -import org.apache.pdfbox.pdmodel.encryption.AccessPermission; -import org.apache.pdfbox.pdmodel.encryption.PDEncryption; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDFontDescriptor; -import org.apache.pdfbox.pdmodel.graphics.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; -import org.apache.pdfbox.pdmodel.graphics.color.PDICCBased; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentGroup; -import org.apache.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentProperties; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationFileAttachment; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; -import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; -import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.apache.pdfbox.text.PDFTextStripper; -import org.apache.xmpbox.XMPMetadata; -import org.apache.xmpbox.xml.DomXmpParser; -import org.apache.xmpbox.xml.XmpParsingException; -import org.apache.xmpbox.xml.XmpSerializer; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class GetInfoOnPDF { - - static ObjectMapper objectMapper = new ObjectMapper(); - - @PostMapping(consumes = "multipart/form-data", value = "/get-info-on-pdf") - @Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO") - public ResponseEntity getPdfInfo(@ModelAttribute PDFFile request) - throws IOException { - MultipartFile inputFile = request.getFileInput(); - try ( - PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream()); - ) { - ObjectMapper objectMapper = new ObjectMapper(); - ObjectNode jsonOutput = objectMapper.createObjectNode(); - - // Metadata using PDFBox - PDDocumentInformation info = pdfBoxDoc.getDocumentInformation(); - ObjectNode metadata = objectMapper.createObjectNode(); - ObjectNode basicInfo = objectMapper.createObjectNode(); - ObjectNode docInfoNode = objectMapper.createObjectNode(); - ObjectNode compliancy = objectMapper.createObjectNode(); - ObjectNode encryption = objectMapper.createObjectNode(); - ObjectNode other = objectMapper.createObjectNode(); - - - metadata.put("Title", info.getTitle()); - metadata.put("Author", info.getAuthor()); - metadata.put("Subject", info.getSubject()); - metadata.put("Keywords", info.getKeywords()); - metadata.put("Producer", info.getProducer()); - metadata.put("Creator", info.getCreator()); - metadata.put("CreationDate", formatDate(info.getCreationDate())); - metadata.put("ModificationDate", formatDate(info.getModificationDate())); - jsonOutput.set("Metadata", metadata); - - - - - // Total file size of the PDF - long fileSizeInBytes = inputFile.getSize(); - basicInfo.put("FileSizeInBytes", fileSizeInBytes); - - // Number of words, paragraphs, and images in the entire document - String fullText = new PDFTextStripper().getText(pdfBoxDoc); - String[] words = fullText.split("\\s+"); - int wordCount = words.length; - int paragraphCount = fullText.split("\r\n|\r|\n").length; - basicInfo.put("WordCount", wordCount); - basicInfo.put("ParagraphCount", paragraphCount); - // Number of characters in the entire document (including spaces and special characters) - int charCount = fullText.length(); - basicInfo.put("CharacterCount", charCount); - - - // Initialize the flags and types - boolean hasCompression = false; - String compressionType = "None"; - - COSDocument cosDoc = pdfBoxDoc.getDocument(); - for (COSObject cosObject : cosDoc.getObjects()) { - if (cosObject.getObject() instanceof COSStream) { - COSStream cosStream = (COSStream) cosObject.getObject(); - if (COSName.OBJ_STM.equals(cosStream.getItem(COSName.TYPE))) { - hasCompression = true; - compressionType = "Object Streams"; - break; - } - } - } - basicInfo.put("Compression", hasCompression); - if(hasCompression) - basicInfo.put("CompressionType", compressionType); - - String language = pdfBoxDoc.getDocumentCatalog().getLanguage(); - basicInfo.put("Language", language); - basicInfo.put("Number of pages", pdfBoxDoc.getNumberOfPages()); - - - PDDocumentCatalog catalog = pdfBoxDoc.getDocumentCatalog(); - String pageMode = catalog.getPageMode().name(); - - // Document Information using PDFBox - docInfoNode.put("PDF version", pdfBoxDoc.getVersion()); - docInfoNode.put("Trapped", info.getTrapped()); - docInfoNode.put("Page Mode", getPageModeDescription(pageMode));; - - - - - - PDAcroForm acroForm = pdfBoxDoc.getDocumentCatalog().getAcroForm(); - - ObjectNode formFieldsNode = objectMapper.createObjectNode(); - if (acroForm != null) { - for (PDField field : acroForm.getFieldTree()) { - formFieldsNode.put(field.getFullyQualifiedName(), field.getValueAsString()); - } - } - jsonOutput.set("FormFields", formFieldsNode); - - - - - - - //embeed files TODO size - if(catalog.getNames() != null) { - PDEmbeddedFilesNameTreeNode efTree = catalog.getNames().getEmbeddedFiles(); - - ArrayNode embeddedFilesArray = objectMapper.createArrayNode(); - if (efTree != null) { - Map efMap = efTree.getNames(); - if (efMap != null) { - for (Map.Entry entry : efMap.entrySet()) { - ObjectNode embeddedFileNode = objectMapper.createObjectNode(); - embeddedFileNode.put("Name", entry.getKey()); - PDEmbeddedFile embeddedFile = entry.getValue().getEmbeddedFile(); - if (embeddedFile != null) { - embeddedFileNode.put("FileSize", embeddedFile.getLength()); // size in bytes - } - embeddedFilesArray.add(embeddedFileNode); - } - } - } - other.set("EmbeddedFiles", embeddedFilesArray); - } - - - - //attachments TODO size - ArrayNode attachmentsArray = objectMapper.createArrayNode(); - for (PDPage page : pdfBoxDoc.getPages()) { - for (PDAnnotation annotation : page.getAnnotations()) { - if (annotation instanceof PDAnnotationFileAttachment) { - PDAnnotationFileAttachment fileAttachmentAnnotation = (PDAnnotationFileAttachment) annotation; - - ObjectNode attachmentNode = objectMapper.createObjectNode(); - attachmentNode.put("Name", fileAttachmentAnnotation.getAttachmentName()); - attachmentNode.put("Description", fileAttachmentAnnotation.getContents()); - - attachmentsArray.add(attachmentNode); - } - } - } - other.set("Attachments", attachmentsArray); - - //Javascript - PDDocumentNameDictionary namesDict = catalog.getNames(); - ArrayNode javascriptArray = objectMapper.createArrayNode(); - - if (namesDict != null) { - PDJavascriptNameTreeNode javascriptDict = namesDict.getJavaScript(); - if (javascriptDict != null) { - try { - Map jsEntries = javascriptDict.getNames(); - - for (Map.Entry entry : jsEntries.entrySet()) { - ObjectNode jsNode = objectMapper.createObjectNode(); - jsNode.put("JS Name", entry.getKey()); - - PDActionJavaScript jsAction = entry.getValue(); - if (jsAction != null) { - String jsCodeStr = jsAction.getAction(); - if (jsCodeStr != null) { - jsNode.put("JS Script Length", jsCodeStr.length()); - } - } - - javascriptArray.add(jsNode); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - } - other.set("JavaScript", javascriptArray); - - - //TODO size - PDOptionalContentProperties ocProperties = pdfBoxDoc.getDocumentCatalog().getOCProperties(); - ArrayNode layersArray = objectMapper.createArrayNode(); - - if (ocProperties != null) { - for (PDOptionalContentGroup ocg : ocProperties.getOptionalContentGroups()) { - ObjectNode layerNode = objectMapper.createObjectNode(); - layerNode.put("Name", ocg.getName()); - layersArray.add(layerNode); - } - } - - other.set("Layers", layersArray); - - //TODO Security - - - - - - PDStructureTreeRoot structureTreeRoot = pdfBoxDoc.getDocumentCatalog().getStructureTreeRoot(); - ArrayNode structureTreeArray; - try { - if(structureTreeRoot != null) { - structureTreeArray = exploreStructureTree(structureTreeRoot.getKids()); - other.set("StructureTree", structureTreeArray); - } - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - boolean isPdfACompliant = checkForStandard(pdfBoxDoc, "PDF/A"); - boolean isPdfXCompliant = checkForStandard(pdfBoxDoc, "PDF/X"); - boolean isPdfECompliant = checkForStandard(pdfBoxDoc, "PDF/E"); - boolean isPdfVTCompliant = checkForStandard(pdfBoxDoc, "PDF/VT"); - boolean isPdfUACompliant = checkForStandard(pdfBoxDoc, "PDF/UA"); - boolean isPdfBCompliant = checkForStandard(pdfBoxDoc, "PDF/B"); // If you want to check for PDF/Broadcast, though this isn't an official ISO standard. - boolean isPdfSECCompliant = checkForStandard(pdfBoxDoc, "PDF/SEC"); // This might not be effective since PDF/SEC was under development in 2021. - - compliancy.put("IsPDF/ACompliant", isPdfACompliant); - compliancy.put("IsPDF/XCompliant", isPdfXCompliant); - compliancy.put("IsPDF/ECompliant", isPdfECompliant); - compliancy.put("IsPDF/VTCompliant", isPdfVTCompliant); - compliancy.put("IsPDF/UACompliant", isPdfUACompliant); - compliancy.put("IsPDF/BCompliant", isPdfBCompliant); - compliancy.put("IsPDF/SECCompliant", isPdfSECCompliant); - - - - - - PDOutlineNode root = pdfBoxDoc.getDocumentCatalog().getDocumentOutline(); - ArrayNode bookmarksArray = objectMapper.createArrayNode(); - - if (root != null) { - for (PDOutlineItem child : root.children()) { - addOutlinesToArray(child, bookmarksArray); - } - } - - other.set("Bookmarks/Outline/TOC", bookmarksArray); - - - - PDMetadata pdMetadata = pdfBoxDoc.getDocumentCatalog().getMetadata(); - - String xmpString = null; - - if (pdMetadata != null) { - try { - COSInputStream is = pdMetadata.createInputStream(); - DomXmpParser domXmpParser = new DomXmpParser(); - XMPMetadata xmpMeta = domXmpParser.parse(is); - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - new XmpSerializer().serialize(xmpMeta, os, true); - xmpString = new String(os.toByteArray(), StandardCharsets.UTF_8); - } catch (XmpParsingException | IOException e) { - e.printStackTrace(); - } - } - - other.put("XMPMetadata", xmpString); - - - - if (pdfBoxDoc.isEncrypted()) { - encryption.put("IsEncrypted", true); - - // Retrieve encryption details using getEncryption() - PDEncryption pdfEncryption = pdfBoxDoc.getEncryption(); - encryption.put("EncryptionAlgorithm", pdfEncryption.getFilter()); - encryption.put("KeyLength", pdfEncryption.getLength()); - AccessPermission ap = pdfBoxDoc.getCurrentAccessPermission(); - if (ap != null) { - ObjectNode permissionsNode = objectMapper.createObjectNode(); - - permissionsNode.put("CanAssembleDocument", ap.canAssembleDocument()); - permissionsNode.put("CanExtractContent", ap.canExtractContent()); - permissionsNode.put("CanExtractForAccessibility", ap.canExtractForAccessibility()); - permissionsNode.put("CanFillInForm", ap.canFillInForm()); - permissionsNode.put("CanModify", ap.canModify()); - permissionsNode.put("CanModifyAnnotations", ap.canModifyAnnotations()); - permissionsNode.put("CanPrint", ap.canPrint()); - permissionsNode.put("CanPrintDegraded", ap.canPrintDegraded()); - - encryption.set("Permissions", permissionsNode); // set the node under "Permissions" - } - // Add other encryption-related properties as needed - } else { - encryption.put("IsEncrypted", false); - } - - - - - ObjectNode pageInfoParent = objectMapper.createObjectNode(); - for (int pageNum = 0; pageNum < pdfBoxDoc.getNumberOfPages(); pageNum++) { - ObjectNode pageInfo = objectMapper.createObjectNode(); - - // Retrieve the page - PDPage page = pdfBoxDoc.getPage(pageNum); - - // Page-level Information - PDRectangle mediaBox = page.getMediaBox(); - - float width = mediaBox.getWidth(); - float height = mediaBox.getHeight(); - - ObjectNode sizeInfo = objectMapper.createObjectNode(); - - getDimensionInfo(sizeInfo, width, height); - - sizeInfo.put("Standard Page", getPageSize(width, height)); - pageInfo.set("Size", sizeInfo); - - pageInfo.put("Rotation", page.getRotation()); - pageInfo.put("Page Orientation", getPageOrientation(width, height)); - - - // Boxes - pageInfo.put("MediaBox", mediaBox.toString()); - - // Assuming the following boxes are defined for your document; if not, you may get null values. - PDRectangle cropBox = page.getCropBox(); - pageInfo.put("CropBox", cropBox == null ? "Undefined" : cropBox.toString()); - - PDRectangle bleedBox = page.getBleedBox(); - pageInfo.put("BleedBox", bleedBox == null ? "Undefined" : bleedBox.toString()); - - PDRectangle trimBox = page.getTrimBox(); - pageInfo.put("TrimBox", trimBox == null ? "Undefined" : trimBox.toString()); - - PDRectangle artBox = page.getArtBox(); - pageInfo.put("ArtBox", artBox == null ? "Undefined" : artBox.toString()); - - // Content Extraction - PDFTextStripper textStripper = new PDFTextStripper(); - textStripper.setStartPage(pageNum + 1); - textStripper.setEndPage(pageNum +1); - String pageText = textStripper.getText(pdfBoxDoc); - - pageInfo.put("Text Characters Count", pageText.length()); // - - // Annotations - - List annotations = page.getAnnotations(); - - int subtypeCount = 0; - int contentsCount = 0; - - for (PDAnnotation annotation : annotations) { - if (annotation.getSubtype() != null) { - subtypeCount++; // Increase subtype count - } - if (annotation.getContents() != null) { - contentsCount++; // Increase contents count - } - } - - ObjectNode annotationsObject = objectMapper.createObjectNode(); - annotationsObject.put("AnnotationsCount", annotations.size()); - annotationsObject.put("SubtypeCount", subtypeCount); - annotationsObject.put("ContentsCount", contentsCount); - pageInfo.set("Annotations", annotationsObject); - - - - // Images (simplified) - // This part is non-trivial as images can be embedded in multiple ways in a PDF. - // Here is a basic structure to recognize image XObjects on a page. - ArrayNode imagesArray = objectMapper.createArrayNode(); - PDResources resources = page.getResources(); - - - for (COSName name : resources.getXObjectNames()) { - PDXObject xObject = resources.getXObject(name); - if (xObject instanceof PDImageXObject) { - PDImageXObject image = (PDImageXObject) xObject; - - ObjectNode imageNode = objectMapper.createObjectNode(); - imageNode.put("Width", image.getWidth()); - imageNode.put("Height", image.getHeight()); - if(image.getMetadata() != null && image.getMetadata().getFile() != null && image.getMetadata().getFile().getFile() != null) { - imageNode.put("Name", image.getMetadata().getFile().getFile()); - } - if (image.getColorSpace() != null) { - imageNode.put("ColorSpace", image.getColorSpace().getName()); - } - - imagesArray.add(imageNode); - } - } - pageInfo.set("Images", imagesArray); - - - // Links - ArrayNode linksArray = objectMapper.createArrayNode(); - Set uniqueURIs = new HashSet<>(); // To store unique URIs - - for (PDAnnotation annotation : annotations) { - if (annotation instanceof PDAnnotationLink) { - PDAnnotationLink linkAnnotation = (PDAnnotationLink) annotation; - if (linkAnnotation.getAction() instanceof PDActionURI) { - PDActionURI uriAction = (PDActionURI) linkAnnotation.getAction(); - String uri = uriAction.getURI(); - uniqueURIs.add(uri); // Add to set to ensure uniqueness - } - } - } - - // Add unique URIs to linksArray - for (String uri : uniqueURIs) { - ObjectNode linkNode = objectMapper.createObjectNode(); - linkNode.put("URI", uri); - linksArray.add(linkNode); - } - pageInfo.set("Links", linksArray); - - - // Fonts - ArrayNode fontsArray = objectMapper.createArrayNode(); - Map uniqueFontsMap = new HashMap<>(); - - for (COSName fontName : resources.getFontNames()) { - PDFont font = resources.getFont(fontName); - ObjectNode fontNode = objectMapper.createObjectNode(); - - fontNode.put("IsEmbedded", font.isEmbedded()); - - // PDFBox provides Font's BaseFont (i.e., the font name) directly - fontNode.put("Name", font.getName()); - - fontNode.put("Subtype", font.getType()); - - PDFontDescriptor fontDescriptor = font.getFontDescriptor(); - - if (fontDescriptor != null) { - fontNode.put("ItalicAngle", fontDescriptor.getItalicAngle()); - int flags = fontDescriptor.getFlags(); - fontNode.put("IsItalic", (flags & 1) != 0); - fontNode.put("IsBold", (flags & 64) != 0); - fontNode.put("IsFixedPitch", (flags & 2) != 0); - fontNode.put("IsSerif", (flags & 4) != 0); - fontNode.put("IsSymbolic", (flags & 8) != 0); - fontNode.put("IsScript", (flags & 16) != 0); - fontNode.put("IsNonsymbolic", (flags & 32) != 0); - - fontNode.put("FontFamily", fontDescriptor.getFontFamily()); - // Font stretch and BBox are not directly available in PDFBox's API, so these are omitted for simplicity - fontNode.put("FontWeight", fontDescriptor.getFontWeight()); - } - - - // Create a unique key for this font node based on its attributes - String uniqueKey = fontNode.toString(); - - // Increment count if this font exists, or initialize it if new - if (uniqueFontsMap.containsKey(uniqueKey)) { - ObjectNode existingFontNode = uniqueFontsMap.get(uniqueKey); - int count = existingFontNode.get("Count").asInt() + 1; - existingFontNode.put("Count", count); - } else { - fontNode.put("Count", 1); - uniqueFontsMap.put(uniqueKey, fontNode); - } - } - - // Add unique font entries to fontsArray - for (ObjectNode uniqueFontNode : uniqueFontsMap.values()) { - fontsArray.add(uniqueFontNode); - } - - pageInfo.set("Fonts", fontsArray); - - - - - - - - - - - - // Access resources dictionary - ArrayNode colorSpacesArray = objectMapper.createArrayNode(); - - Iterable colorSpaceNames = resources.getColorSpaceNames(); - for (COSName name : colorSpaceNames) { - PDColorSpace colorSpace = resources.getColorSpace(name); - if (colorSpace instanceof PDICCBased) { - PDICCBased iccBased = (PDICCBased) colorSpace; - PDStream iccData = iccBased.getPDStream(); - byte[] iccBytes = iccData.toByteArray(); - - // TODO: Further decode and analyze the ICC data if needed - ObjectNode iccProfileNode = objectMapper.createObjectNode(); - iccProfileNode.put("ICC Profile Length", iccBytes.length); - colorSpacesArray.add(iccProfileNode); - } - } - pageInfo.set("Color Spaces & ICC Profiles", colorSpacesArray); - - - // Other XObjects - Map xObjectCountMap = new HashMap<>(); // To store the count for each type - for (COSName name : resources.getXObjectNames()) { - PDXObject xObject = resources.getXObject(name); - String xObjectType; - - if (xObject instanceof PDImageXObject) { - xObjectType = "Image"; - } else if (xObject instanceof PDFormXObject) { - xObjectType = "Form"; - } else { - xObjectType = "Other"; - } - - // Increment the count for this type in the map - xObjectCountMap.put(xObjectType, xObjectCountMap.getOrDefault(xObjectType, 0) + 1); - } - - // Add the count map to pageInfo (or wherever you want to store it) - ObjectNode xObjectCountNode = objectMapper.createObjectNode(); - for (Map.Entry entry : xObjectCountMap.entrySet()) { - xObjectCountNode.put(entry.getKey(), entry.getValue()); - } - pageInfo.set("XObjectCounts", xObjectCountNode); - - - - - ArrayNode multimediaArray = objectMapper.createArrayNode(); - - for (PDAnnotation annotation : annotations) { - if ("RichMedia".equals(annotation.getSubtype())) { - ObjectNode multimediaNode = objectMapper.createObjectNode(); - // Extract details from the annotation as needed - multimediaArray.add(multimediaNode); - } - } - - pageInfo.set("Multimedia", multimediaArray); - - - - pageInfoParent.set("Page " + (pageNum+1), pageInfo); - } - - - jsonOutput.set("BasicInfo", basicInfo); - jsonOutput.set("DocumentInfo", docInfoNode); - jsonOutput.set("Compliancy", compliancy); - jsonOutput.set("Encryption", encryption); - jsonOutput.set("Other", other); - jsonOutput.set("PerPageInfo", pageInfoParent); - - - - // Save JSON to file - String jsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonOutput); - - - - return WebResponseUtils.bytesToWebResponse(jsonString.getBytes(StandardCharsets.UTF_8), "response.json", MediaType.APPLICATION_JSON); - - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - private static void addOutlinesToArray(PDOutlineItem outline, ArrayNode arrayNode) { - if (outline == null) return; - - ObjectNode outlineNode = objectMapper.createObjectNode(); - outlineNode.put("Title", outline.getTitle()); - // You can add other properties if needed - arrayNode.add(outlineNode); - - PDOutlineItem child = outline.getFirstChild(); - while (child != null) { - addOutlinesToArray(child, arrayNode); - child = child.getNextSibling(); - } - } - - public String getPageOrientation(double width, double height) { - if (width > height) { - return "Landscape"; - } else if (height > width) { - return "Portrait"; - } else { - return "Square"; - } - } - public String getPageSize(float width, float height) { - // Define standard page sizes - Map standardSizes = new HashMap<>(); - standardSizes.put("Letter", PDRectangle.LETTER); - standardSizes.put("LEGAL", PDRectangle.LEGAL); - standardSizes.put("A0", PDRectangle.A0); - standardSizes.put("A1", PDRectangle.A1); - standardSizes.put("A2", PDRectangle.A2); - standardSizes.put("A3", PDRectangle.A3); - standardSizes.put("A4", PDRectangle.A4); - standardSizes.put("A5", PDRectangle.A5); - standardSizes.put("A6", PDRectangle.A6); - - for (Map.Entry entry : standardSizes.entrySet()) { - PDRectangle size = entry.getValue(); - if (isCloseToSize(width, height, size.getWidth(), size.getHeight())) { - return entry.getKey(); - } - } - return "Custom"; - } - - private boolean isCloseToSize(float width, float height, float standardWidth, float standardHeight) { - float tolerance = 1.0f; // You can adjust the tolerance as needed - return Math.abs(width - standardWidth) <= tolerance && Math.abs(height - standardHeight) <= tolerance; - } - - - public ObjectNode getDimensionInfo(ObjectNode dimensionInfo, float width, float height) { - float ppi = 72; // Points Per Inch - - float widthInInches = width / ppi; - float heightInInches = height / ppi; - - float widthInCm = widthInInches * 2.54f; - float heightInCm = heightInInches * 2.54f; - - dimensionInfo.put("Width (px)", String.format("%.2f", width)); - dimensionInfo.put("Height (px)", String.format("%.2f", height)); - dimensionInfo.put("Width (in)", String.format("%.2f", widthInInches)); - dimensionInfo.put("Height (in)", String.format("%.2f", heightInInches)); - dimensionInfo.put("Width (cm)", String.format("%.2f", widthInCm)); - dimensionInfo.put("Height (cm)", String.format("%.2f", heightInCm)); - return dimensionInfo; - } - - - -public static boolean checkForStandard(PDDocument document, String standardKeyword) { - // Check XMP Metadata - try { - PDMetadata pdMetadata = document.getDocumentCatalog().getMetadata(); - if (pdMetadata != null) { - COSInputStream metaStream = pdMetadata.createInputStream(); - DomXmpParser domXmpParser = new DomXmpParser(); - XMPMetadata xmpMeta = domXmpParser.parse(metaStream); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - new XmpSerializer().serialize(xmpMeta, baos, true); - String xmpString = new String(baos.toByteArray(), StandardCharsets.UTF_8); - - if (xmpString.contains(standardKeyword)) { - return true; - } - } - } catch (Exception e) { // Catching general exception for brevity, ideally you'd catch specific exceptions. - e.printStackTrace(); - } - - return false; -} - - - public ArrayNode exploreStructureTree(List nodes) { - ArrayNode elementsArray = objectMapper.createArrayNode(); - if (nodes != null) { - for (Object obj : nodes) { - if (obj instanceof PDStructureNode) { - PDStructureNode node = (PDStructureNode) obj; - ObjectNode elementNode = objectMapper.createObjectNode(); - - if (node instanceof PDStructureElement) { - PDStructureElement structureElement = (PDStructureElement) node; - elementNode.put("Type", structureElement.getStructureType()); - elementNode.put("Content", getContent(structureElement)); - - // Recursively explore child elements - ArrayNode childElements = exploreStructureTree(structureElement.getKids()); - if (childElements.size() > 0) { - elementNode.set("Children", childElements); - } - } - elementsArray.add(elementNode); - } - } - } - return elementsArray; - } - - - public String getContent(PDStructureElement structureElement) { - StringBuilder contentBuilder = new StringBuilder(); - - for (Object item : structureElement.getKids()) { - if (item instanceof COSString) { - COSString cosString = (COSString) item; - contentBuilder.append(cosString.getString()); - } else if (item instanceof PDStructureElement) { - // For simplicity, we're handling only COSString and PDStructureElement here - // but a more comprehensive method would handle other types too - contentBuilder.append(getContent((PDStructureElement) item)); - } - } - - return contentBuilder.toString(); - } - - - private String formatDate(Calendar calendar) { - if (calendar != null) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - return sdf.format(calendar.getTime()); - } else { - return null; - } - } - - private String getPageModeDescription(String pageMode) { - return pageMode != null ? pageMode.toString().replaceFirst("/", "") : "Unknown"; - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java deleted file mode 100644 index 639b6973..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java +++ /dev/null @@ -1,89 +0,0 @@ -package stirling.software.SPDF.controller.api.security; - -import java.io.IOException; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.encryption.AccessPermission; -import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.security.AddPasswordRequest; -import stirling.software.SPDF.model.api.security.PDFPasswordRequest; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class PasswordController { - - private static final Logger logger = LoggerFactory.getLogger(PasswordController.class); - - - @PostMapping(consumes = "multipart/form-data", value = "/remove-password") - @Operation( - summary = "Remove password from a PDF file", - description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password. Input:PDF Output:PDF Type:SISO" - ) - public ResponseEntity removePassword(@ModelAttribute PDFPasswordRequest request) throws IOException { - MultipartFile fileInput = request.getFileInput(); - String password = request.getPassword(); - - - - PDDocument document = PDDocument.load(fileInput.getBytes(), password); - document.setAllSecurityToBeRemoved(true); - return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf"); - } - - @PostMapping(consumes = "multipart/form-data", value = "/add-password") - @Operation( - summary = "Add password to a PDF file", - description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file. Input:PDF Output:PDF" - ) - public ResponseEntity addPassword(@ModelAttribute AddPasswordRequest request) throws IOException { - MultipartFile fileInput = request.getFileInput(); - String ownerPassword = request.getOwnerPassword(); - String password = request.getPassword(); - int keyLength = request.getKeyLength(); - boolean canAssembleDocument = request.isCanAssembleDocument(); - boolean canExtractContent = request.isCanExtractContent(); - boolean canExtractForAccessibility = request.isCanExtractForAccessibility(); - boolean canFillInForm = request.isCanFillInForm(); - boolean canModify = request.isCanModify(); - boolean canModifyAnnotations = request.isCanModifyAnnotations(); - boolean canPrint = request.isCanPrint(); - boolean canPrintFaithful = request.isCanPrintFaithful(); - - PDDocument document = PDDocument.load(fileInput.getBytes()); - AccessPermission ap = new AccessPermission(); - ap.setCanAssembleDocument(!canAssembleDocument); - ap.setCanExtractContent(!canExtractContent); - ap.setCanExtractForAccessibility(!canExtractForAccessibility); - ap.setCanFillInForm(!canFillInForm); - ap.setCanModify(!canModify); - ap.setCanModifyAnnotations(!canModifyAnnotations); - ap.setCanPrint(!canPrint); - ap.setCanPrintFaithful(!canPrintFaithful); - StandardProtectionPolicy spp = new StandardProtectionPolicy(ownerPassword, password, ap); - - if(!"".equals(ownerPassword) || !"".equals(password)) { - spp.setEncryptionKeyLength(keyLength); - } - spp.setPermissions(ap); - document.protect(spp); - - if("".equals(ownerPassword) && "".equals(password)) - return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_permissions.pdf"); - return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java deleted file mode 100644 index 825544dc..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ /dev/null @@ -1,123 +0,0 @@ -package stirling.software.SPDF.controller.api.security; - -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.PDFText; -import stirling.software.SPDF.model.api.security.RedactPdfRequest; -import stirling.software.SPDF.pdf.TextFinder; -import stirling.software.SPDF.utils.WebResponseUtils; -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class RedactController { - - private static final Logger logger = LoggerFactory.getLogger(RedactController.class); - - - @PostMapping(value = "/auto-redact", consumes = "multipart/form-data") - @Operation(summary = "Redacts listOfText in a PDF document", - description = "This operation takes an input PDF file and redacts the provided listOfText. Input:PDF, Output:PDF, Type:SISO") - public ResponseEntity redactPdf(@ModelAttribute RedactPdfRequest request) throws Exception { - MultipartFile file = request.getFileInput(); - String listOfTextString = request.getListOfText(); - boolean useRegex = request.isUseRegex(); - boolean wholeWordSearchBool = request.isWholeWordSearch(); - String colorString = request.getRedactColor(); - float customPadding = request.getCustomPadding(); - boolean convertPDFToImage = request.isConvertPDFToImage(); - - System.out.println(listOfTextString); - String[] listOfText = listOfTextString.split("\n"); - byte[] bytes = file.getBytes(); - PDDocument document = PDDocument.load(new ByteArrayInputStream(bytes)); - - Color redactColor; - try { - if (!colorString.startsWith("#")) { - colorString = "#" + colorString; - } - redactColor = Color.decode(colorString); - } catch (NumberFormatException e) { - logger.warn("Invalid color string provided. Using default color BLACK for redaction."); - redactColor = Color.BLACK; - } - - - - for (String text : listOfText) { - text = text.trim(); - System.out.println(text); - TextFinder textFinder = new TextFinder(text, useRegex, wholeWordSearchBool); - List foundTexts = textFinder.getTextLocations(document); - redactFoundText(document, foundTexts, customPadding,redactColor); - } - - - - if (convertPDFToImage) { - PDDocument imageDocument = new PDDocument(); - PDFRenderer pdfRenderer = new PDFRenderer(document); - for (int page = 0; page < document.getNumberOfPages(); ++page) { - BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); - PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight())); - imageDocument.addPage(newPage); - PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim); - PDPageContentStream contentStream = new PDPageContentStream(imageDocument, newPage); - contentStream.drawImage(pdImage, 0, 0); - contentStream.close(); - } - document.close(); - document = imageDocument; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - document.close(); - - byte[] pdfContent = baos.toByteArray(); - return WebResponseUtils.bytesToWebResponse(pdfContent, - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_redacted.pdf"); - } - - - private void redactFoundText(PDDocument document, List blocks, float customPadding, Color redactColor) throws IOException { - var allPages = document.getDocumentCatalog().getPages(); - - for (PDFText block : blocks) { - var page = allPages.get(block.getPageIndex()); - PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); - contentStream.setNonStrokingColor(redactColor); - float padding = (block.getY2() - block.getY1()) * 0.3f + customPadding; - PDRectangle pageBox = page.getBBox(); - contentStream.addRect(block.getX1(), pageBox.getHeight() - block.getY1() - padding, block.getX2() - block.getX1(), block.getY2() - block.getY1() + 2 * padding); - contentStream.fill(); - contentStream.close(); - } - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java deleted file mode 100644 index dab9d1d7..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java +++ /dev/null @@ -1,167 +0,0 @@ -package stirling.software.SPDF.controller.api.security; -import java.io.IOException; - -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageTree; -import org.apache.pdfbox.pdmodel.PDResources; -import org.apache.pdfbox.pdmodel.common.PDMetadata; -import org.apache.pdfbox.pdmodel.interactive.action.PDAction; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionLaunch; -import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI; -import org.apache.pdfbox.pdmodel.interactive.action.PDFormFieldAdditionalActions; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; -import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.security.SanitizePdfRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class SanitizeController { - - @PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf") - @Operation(summary = "Sanitize a PDF file", - description = "This endpoint processes a PDF file and removes specific elements based on the provided options. Input:PDF Output:PDF Type:SISO") - public ResponseEntity sanitizePDF(@ModelAttribute SanitizePdfRequest request) throws IOException { - MultipartFile inputFile = request.getFileInput(); - boolean removeJavaScript = request.isRemoveJavaScript(); - boolean removeEmbeddedFiles = request.isRemoveEmbeddedFiles(); - boolean removeMetadata = request.isRemoveMetadata(); - boolean removeLinks = request.isRemoveLinks(); - boolean removeFonts = request.isRemoveFonts(); - - try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { - if (removeJavaScript) { - sanitizeJavaScript(document); - } - - if (removeEmbeddedFiles) { - sanitizeEmbeddedFiles(document); - } - - if (removeMetadata) { - sanitizeMetadata(document); - } - - if (removeLinks) { - sanitizeLinks(document); - } - - if (removeFonts) { - sanitizeFonts(document); - } - - return WebResponseUtils.pdfDocToWebResponse(document, inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_sanitized.pdf"); - } - } - private void sanitizeJavaScript(PDDocument document) throws IOException { - // Get the root dictionary (catalog) of the PDF - PDDocumentCatalog catalog = document.getDocumentCatalog(); - - // Get the Names dictionary - COSDictionary namesDict = (COSDictionary) catalog.getCOSObject().getDictionaryObject(COSName.NAMES); - - if (namesDict != null) { - // Get the JavaScript dictionary - COSDictionary javaScriptDict = (COSDictionary) namesDict.getDictionaryObject(COSName.getPDFName("JavaScript")); - - if (javaScriptDict != null) { - // Remove the JavaScript dictionary - namesDict.removeItem(COSName.getPDFName("JavaScript")); - } - } - - for (PDPage page : document.getPages()) { - for (PDAnnotation annotation : page.getAnnotations()) { - if (annotation instanceof PDAnnotationWidget) { - PDAnnotationWidget widget = (PDAnnotationWidget) annotation; - PDAction action = widget.getAction(); - if (action instanceof PDActionJavaScript) { - widget.setAction(null); - } - } - } - PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); - if (acroForm != null) { - for (PDField field : acroForm.getFields()) { - PDFormFieldAdditionalActions actions = field.getActions(); - if(actions != null) { - if (actions.getC() instanceof PDActionJavaScript) { - actions.setC(null); - } - if (actions.getF() instanceof PDActionJavaScript) { - actions.setF(null); - } - if (actions.getK() instanceof PDActionJavaScript) { - actions.setK(null); - } - if (actions.getV() instanceof PDActionJavaScript) { - actions.setV(null); - } - } - } - } - } - } - - - - - private void sanitizeEmbeddedFiles(PDDocument document) { - PDPageTree allPages = document.getPages(); - - for (PDPage page : allPages) { - PDResources res = page.getResources(); - - // Remove embedded files from the PDF - res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles")); - } - } - - - private void sanitizeMetadata(PDDocument document) { - PDMetadata metadata = document.getDocumentCatalog().getMetadata(); - if (metadata != null) { - document.getDocumentCatalog().setMetadata(null); - } - } - - - - private void sanitizeLinks(PDDocument document) throws IOException { - for (PDPage page : document.getPages()) { - for (PDAnnotation annotation : page.getAnnotations()) { - if (annotation instanceof PDAnnotationLink) { - PDAction action = ((PDAnnotationLink) annotation).getAction(); - if (action instanceof PDActionLaunch || action instanceof PDActionURI) { - ((PDAnnotationLink) annotation).setAction(null); - } - } - } - } - } - - private void sanitizeFonts(PDDocument document) { - for (PDPage page : document.getPages()) { - page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font")); - } - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java deleted file mode 100644 index b19636cd..00000000 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ /dev/null @@ -1,191 +0,0 @@ -package stirling.software.SPDF.controller.api.security; - -import java.awt.Color; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; - -import javax.imageio.ImageIO; - -import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.font.PDFont; -import org.apache.pdfbox.pdmodel.font.PDType0Font; -import org.apache.pdfbox.pdmodel.font.PDType1Font; -import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; -import org.apache.pdfbox.util.Matrix; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import stirling.software.SPDF.model.api.security.AddWatermarkRequest; -import stirling.software.SPDF.utils.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/security") -@Tag(name = "Security", description = "Security APIs") -public class WatermarkController { - - @PostMapping(consumes = "multipart/form-data", value = "/add-watermark") - @Operation(summary = "Add watermark to a PDF file", description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark type (text or image), rotation, opacity, width spacer, and height spacer. Input:PDF Output:PDF Type:SISO") - public ResponseEntity addWatermark(@ModelAttribute AddWatermarkRequest request) throws IOException, Exception { - MultipartFile pdfFile = request.getFileInput(); - String watermarkType = request.getWatermarkType(); - String watermarkText = request.getWatermarkText(); - MultipartFile watermarkImage = request.getWatermarkImage(); - String alphabet = request.getAlphabet(); - float fontSize = request.getFontSize(); - float rotation = request.getRotation(); - float opacity = request.getOpacity(); - int widthSpacer = request.getWidthSpacer(); - int heightSpacer = request.getHeightSpacer(); - - // Load the input PDF - PDDocument document = PDDocument.load(pdfFile.getInputStream()); - - // Create a page in the document - for (PDPage page : document.getPages()) { - - // Get the page's content stream - PDPageContentStream contentStream = new PDPageContentStream(document, page, - PDPageContentStream.AppendMode.APPEND, true); - - // Set transparency - PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState(); - graphicsState.setNonStrokingAlphaConstant(opacity); - contentStream.setGraphicsStateParameters(graphicsState); - - if (watermarkType.equalsIgnoreCase("text")) { - addTextWatermark(contentStream, watermarkText, document, page, rotation, widthSpacer, heightSpacer, - fontSize, alphabet); - } else if (watermarkType.equalsIgnoreCase("image")) { - addImageWatermark(contentStream, watermarkImage, document, page, rotation, widthSpacer, heightSpacer, - fontSize); - } - - // Close the content stream - contentStream.close(); - } - - return WebResponseUtils.pdfDocToWebResponse(document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); - } - - private void addTextWatermark(PDPageContentStream contentStream, String watermarkText, PDDocument document, - PDPage page, float rotation, int widthSpacer, int heightSpacer, float fontSize, String alphabet) throws IOException { - String resourceDir = ""; - PDFont font = PDType1Font.HELVETICA_BOLD; - switch (alphabet) { - case "arabic": - resourceDir = "static/fonts/NotoSansArabic-Regular.ttf"; - break; - case "japanese": - resourceDir = "static/fonts/Meiryo.ttf"; - break; - case "korean": - resourceDir = "static/fonts/malgun.ttf"; - break; - case "chinese": - resourceDir = "static/fonts/SimSun.ttf"; - break; - case "roman": - default: - resourceDir = "static/fonts/NotoSans-Regular.ttf"; - break; - } - - - if(!resourceDir.equals("")) { - ClassPathResource classPathResource = new ClassPathResource(resourceDir); - String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); - File tempFile = File.createTempFile("NotoSansFont", fileExtension); - try (InputStream is = classPathResource.getInputStream(); FileOutputStream os = new FileOutputStream(tempFile)) { - IOUtils.copy(is, os); - } - - font = PDType0Font.load(document, tempFile); - tempFile.deleteOnExit(); - } - - contentStream.setFont(font, fontSize); - contentStream.setNonStrokingColor(Color.LIGHT_GRAY); - - // Set size and location of text watermark - float watermarkWidth = widthSpacer + font.getStringWidth(watermarkText) * fontSize / 1000; - float watermarkHeight = heightSpacer + fontSize; - float pageWidth = page.getMediaBox().getWidth(); - float pageHeight = page.getMediaBox().getHeight(); - int watermarkRows = (int) (pageHeight / watermarkHeight + 1); - int watermarkCols = (int) (pageWidth / watermarkWidth + 1); - - // Add the text watermark - for (int i = 0; i < watermarkRows; i++) { - for (int j = 0; j < watermarkCols; j++) { - contentStream.beginText(); - contentStream.setTextMatrix(Matrix.getRotateInstance((float) Math.toRadians(rotation), - j * watermarkWidth, i * watermarkHeight)); - contentStream.showText(watermarkText); - contentStream.endText(); - } - } - } - - private void addImageWatermark(PDPageContentStream contentStream, MultipartFile watermarkImage, PDDocument document, PDPage page, float rotation, - int widthSpacer, int heightSpacer, float fontSize) throws IOException { - -// Load the watermark image -BufferedImage image = ImageIO.read(watermarkImage.getInputStream()); - -// Compute width based on original aspect ratio -float aspectRatio = (float) image.getWidth() / (float) image.getHeight(); - -// Desired physical height (in PDF points) -float desiredPhysicalHeight = fontSize ; - -// Desired physical width based on the aspect ratio -float desiredPhysicalWidth = desiredPhysicalHeight * aspectRatio; - -// Convert the BufferedImage to PDImageXObject -PDImageXObject xobject = LosslessFactory.createFromImage(document, image); - -// Calculate the number of rows and columns for watermarks -float pageWidth = page.getMediaBox().getWidth(); -float pageHeight = page.getMediaBox().getHeight(); -int watermarkRows = (int) ((pageHeight + heightSpacer) / (desiredPhysicalHeight + heightSpacer)); -int watermarkCols = (int) ((pageWidth + widthSpacer) / (desiredPhysicalWidth + widthSpacer)); - -for (int i = 0; i < watermarkRows; i++) { -for (int j = 0; j < watermarkCols; j++) { -float x = j * (desiredPhysicalWidth + widthSpacer); -float y = i * (desiredPhysicalHeight + heightSpacer); - -// Save the graphics state -contentStream.saveGraphicsState(); - -// Create rotation matrix and rotate -contentStream.transform(Matrix.getTranslateInstance(x + desiredPhysicalWidth / 2, y + desiredPhysicalHeight / 2)); -contentStream.transform(Matrix.getRotateInstance(Math.toRadians(rotation), 0, 0)); -contentStream.transform(Matrix.getTranslateInstance(-desiredPhysicalWidth / 2, -desiredPhysicalHeight / 2)); - -// Draw the image and restore the graphics state -contentStream.drawImage(xobject, 0, 0, desiredPhysicalWidth, desiredPhysicalHeight); -contentStream.restoreGraphicsState(); -} - -} - - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java deleted file mode 100644 index cba7ebb5..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ /dev/null @@ -1,135 +0,0 @@ -package stirling.software.SPDF.controller.web; -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; -import stirling.software.SPDF.model.User; -import stirling.software.SPDF.repository.UserRepository; -@Controller -@Tag(name = "Account Security", description = "Account Security APIs") -public class AccountWebController { - - - @GetMapping("/login") - public String login(HttpServletRequest request, Model model, Authentication authentication) { - if (authentication != null && authentication.isAuthenticated()) { - return "redirect:/"; - } - - if (request.getParameter("error") != null) { - - model.addAttribute("error", request.getParameter("error")); - } - if (request.getParameter("logout") != null) { - - model.addAttribute("logoutMessage", "You have been logged out."); - } - - return "login"; - } - @Autowired - private UserRepository userRepository; // Assuming you have a repository for user operations - - - @PreAuthorize("hasRole('ROLE_ADMIN')") - @GetMapping("/addUsers") - public String showAddUserForm(Model model, Authentication authentication) { - List allUsers = userRepository.findAll(); - model.addAttribute("users", allUsers); - model.addAttribute("currentUsername", authentication.getName()); - return "addUsers"; - } - - - - @GetMapping("/account") - public String account(HttpServletRequest request, Model model, Authentication authentication) { - if (authentication == null || !authentication.isAuthenticated()) { - return "redirect:/"; - } - if (authentication != null && authentication.isAuthenticated()) { - Object principal = authentication.getPrincipal(); - - if (principal instanceof UserDetails) { - // Cast the principal object to UserDetails - UserDetails userDetails = (UserDetails) principal; - - // Retrieve username and other attributes - String username = userDetails.getUsername(); - - // Fetch user details from the database - Optional user = userRepository.findByUsername(username); // Assuming findByUsername method exists - if (!user.isPresent()) { - // Handle error appropriately - return "redirect:/error"; // Example redirection in case of error - } - - // Convert settings map to JSON string - ObjectMapper objectMapper = new ObjectMapper(); - String settingsJson; - try { - settingsJson = objectMapper.writeValueAsString(user.get().getSettings()); - } catch (JsonProcessingException e) { - // Handle JSON conversion error - e.printStackTrace(); - return "redirect:/error"; // Example redirection in case of error - } - - // Add attributes to the model - model.addAttribute("username", username); - model.addAttribute("role", user.get().getRolesAsString()); - model.addAttribute("settings", settingsJson); - model.addAttribute("changeCredsFlag", user.get().isFirstLogin()); - } - } else { - return "redirect:/"; - } - return "account"; - } - - - - @GetMapping("/change-creds") - public String changeCreds(HttpServletRequest request, Model model, Authentication authentication) { - if (authentication == null || !authentication.isAuthenticated()) { - return "redirect:/"; - } - if (authentication != null && authentication.isAuthenticated()) { - Object principal = authentication.getPrincipal(); - - if (principal instanceof UserDetails) { - // Cast the principal object to UserDetails - UserDetails userDetails = (UserDetails) principal; - - // Retrieve username and other attributes - String username = userDetails.getUsername(); - - // Fetch user details from the database - Optional user = userRepository.findByUsername(username); // Assuming findByUsername method exists - if (!user.isPresent()) { - // Handle error appropriately - return "redirect:/error"; // Example redirection in case of error - } - // Add attributes to the model - model.addAttribute("username", username); - } - } else { - return "redirect:/"; - } - return "change-creds"; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java deleted file mode 100644 index 76e7be8f..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ /dev/null @@ -1,109 +0,0 @@ -package stirling.software.SPDF.controller.web; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.servlet.ModelAndView; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Controller -@Tag(name = "Convert", description = "Convert APIs") -public class ConverterWebController { - - @GetMapping("/img-to-pdf") - @Hidden - public String convertImgToPdfForm(Model model) { - model.addAttribute("currentPage", "img-to-pdf"); - return "convert/img-to-pdf"; - } - - @GetMapping("/html-to-pdf") - @Hidden - public String convertHTMLToPdfForm(Model model) { - model.addAttribute("currentPage", "html-to-pdf"); - return "convert/html-to-pdf"; - } - @GetMapping("/markdown-to-pdf") - @Hidden - public String convertMarkdownToPdfForm(Model model) { - model.addAttribute("currentPage", "markdown-to-pdf"); - return "convert/markdown-to-pdf"; - } - - - @GetMapping("/url-to-pdf") - @Hidden - public String convertURLToPdfForm(Model model) { - model.addAttribute("currentPage", "url-to-pdf"); - return "convert/url-to-pdf"; - } - - - @GetMapping("/pdf-to-img") - @Hidden - public String pdfToimgForm(Model model) { - model.addAttribute("currentPage", "pdf-to-img"); - return "convert/pdf-to-img"; - } - - @GetMapping("/file-to-pdf") - @Hidden - public String convertToPdfForm(Model model) { - model.addAttribute("currentPage", "file-to-pdf"); - return "convert/file-to-pdf"; - } - - - - //PDF TO...... - - @GetMapping("/pdf-to-html") - @Hidden - public ModelAndView pdfToHTML() { - ModelAndView modelAndView = new ModelAndView("convert/pdf-to-html"); - modelAndView.addObject("currentPage", "pdf-to-html"); - return modelAndView; - } - - @GetMapping("/pdf-to-presentation") - @Hidden - public ModelAndView pdfToPresentation() { - ModelAndView modelAndView = new ModelAndView("convert/pdf-to-presentation"); - modelAndView.addObject("currentPage", "pdf-to-presentation"); - return modelAndView; - } - - @GetMapping("/pdf-to-text") - @Hidden - public ModelAndView pdfToText() { - ModelAndView modelAndView = new ModelAndView("convert/pdf-to-text"); - modelAndView.addObject("currentPage", "pdf-to-text"); - return modelAndView; - } - - @GetMapping("/pdf-to-word") - @Hidden - public ModelAndView pdfToWord() { - ModelAndView modelAndView = new ModelAndView("convert/pdf-to-word"); - modelAndView.addObject("currentPage", "pdf-to-word"); - return modelAndView; - } - - @GetMapping("/pdf-to-xml") - @Hidden - public ModelAndView pdfToXML() { - ModelAndView modelAndView = new ModelAndView("convert/pdf-to-xml"); - modelAndView.addObject("currentPage", "pdf-to-xml"); - return modelAndView; - } - - - @GetMapping("/pdf-to-pdfa") - @Hidden - public String pdfToPdfAForm(Model model) { - model.addAttribute("currentPage", "pdf-to-pdfa"); - return "convert/pdf-to-pdfa"; - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java deleted file mode 100644 index 6c934290..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ /dev/null @@ -1,268 +0,0 @@ -package stirling.software.SPDF.controller.web; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.io.support.ResourcePatternUtils; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Controller -@Tag(name = "General", description = "General APIs") -public class GeneralWebController { - - - - - @GetMapping("/pipeline") - @Hidden - public String pipelineForm(Model model) { - model.addAttribute("currentPage", "pipeline"); - - List pipelineConfigs = new ArrayList<>(); - try (Stream paths = Files.walk(Paths.get("./pipeline/defaultWebUIConfigs/"))) { - List jsonFiles = paths - .filter(Files::isRegularFile) - .filter(p -> p.toString().endsWith(".json")) - .collect(Collectors.toList()); - - for (Path jsonFile : jsonFiles) { - String content = Files.readString(jsonFile, StandardCharsets.UTF_8); - pipelineConfigs.add(content); - } - List> pipelineConfigsWithNames = new ArrayList<>(); - for (String config : pipelineConfigs) { - Map jsonContent = new ObjectMapper().readValue(config, new TypeReference>(){}); - - String name = (String) jsonContent.get("name"); - Map configWithName = new HashMap<>(); - configWithName.put("json", config); - configWithName.put("name", name); - pipelineConfigsWithNames.add(configWithName); - } - model.addAttribute("pipelineConfigsWithNames", pipelineConfigsWithNames); - - } catch (IOException e) { - e.printStackTrace(); - } - - model.addAttribute("pipelineConfigs", pipelineConfigs); - - return "pipeline"; - } - - - - - @GetMapping("/merge-pdfs") - @Hidden - public String mergePdfForm(Model model) { - model.addAttribute("currentPage", "merge-pdfs"); - return "merge-pdfs"; - } - - - @GetMapping("/multi-tool") - @Hidden - public String multiToolForm(Model model) { - model.addAttribute("currentPage", "multi-tool"); - return "multi-tool"; - } - - - @GetMapping("/remove-pages") - @Hidden - public String pageDeleter(Model model) { - model.addAttribute("currentPage", "remove-pages"); - return "remove-pages"; - } - - @GetMapping("/pdf-organizer") - @Hidden - public String pageOrganizer(Model model) { - model.addAttribute("currentPage", "pdf-organizer"); - return "pdf-organizer"; - } - - @GetMapping("/extract-page") - @Hidden - public String extractPages(Model model) { - model.addAttribute("currentPage", "extract-page"); - return "extract-page"; - } - - @GetMapping("/pdf-to-single-page") - @Hidden - public String pdfToSinglePage(Model model) { - model.addAttribute("currentPage", "pdf-to-single-page"); - return "pdf-to-single-page"; - } - - @GetMapping("/rotate-pdf") - @Hidden - public String rotatePdfForm(Model model) { - model.addAttribute("currentPage", "rotate-pdf"); - return "rotate-pdf"; - } - - @GetMapping("/split-pdfs") - @Hidden - public String splitPdfForm(Model model) { - model.addAttribute("currentPage", "split-pdfs"); - return "split-pdfs"; - } - - @GetMapping("/sign") - @Hidden - public String signForm(Model model) { - model.addAttribute("currentPage", "sign"); - model.addAttribute("fonts", getFontNames()); - return "sign"; - } - - @GetMapping("/multi-page-layout") - @Hidden - public String multiPageLayoutForm(Model model) { - model.addAttribute("currentPage", "multi-page-layout"); - return "multi-page-layout"; - } - - - @GetMapping("/scale-pages") - @Hidden - public String scalePagesFrom(Model model) { - model.addAttribute("currentPage", "scale-pages"); - return "scale-pages"; - } - - - - @Autowired - private ResourceLoader resourceLoader; - - private List getFontNames() { - List fontNames = new ArrayList<>(); - - // Extract font names from classpath - fontNames.addAll(getFontNamesFromLocation("classpath:static/fonts/*.woff2")); - - // Extract font names from external directory - fontNames.addAll(getFontNamesFromLocation("file:customFiles/static/fonts/*")); - - return fontNames; - } - - private List getFontNamesFromLocation(String locationPattern) { - try { - Resource[] resources = ResourcePatternUtils.getResourcePatternResolver(resourceLoader) - .getResources(locationPattern); - return Arrays.stream(resources) - .map(resource -> { - try { - String filename = resource.getFilename(); - if (filename != null) { - int lastDotIndex = filename.lastIndexOf('.'); - if (lastDotIndex != -1) { - String name = filename.substring(0, lastDotIndex); - String extension = filename.substring(lastDotIndex + 1); - return new FontResource(name, extension); - } - } - return null; - } catch (Exception e) { - throw new RuntimeException("Error processing filename", e); - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } catch (Exception e) { - throw new RuntimeException("Failed to read font directory from " + locationPattern, e); - } - } - - - public String getFormatFromExtension(String extension) { - switch (extension) { - case "ttf": return "truetype"; - case "woff": return "woff"; - case "woff2": return "woff2"; - case "eot": return "embedded-opentype"; - case "svg": return "svg"; - default: return ""; // or throw an exception if an unexpected extension is encountered - } - } - - - public class FontResource { - private String name; - private String extension; - private String type; - public FontResource(String name, String extension) { - this.name = name; - this.extension = extension; - this.type = getFormatFromExtension(extension); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getExtension() { - return extension; - } - - public void setExtension(String extension) { - this.extension = extension; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - } - - - @GetMapping("/crop") - @Hidden - public String cropForm(Model model) { - model.addAttribute("currentPage", "crop"); - return "crop"; - } - - - @GetMapping("/auto-split-pdf") - @Hidden - public String autoSPlitPDFForm(Model model) { - model.addAttribute("currentPage", "auto-split-pdf"); - return "auto-split-pdf"; - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java deleted file mode 100644 index b6d08fbf..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ /dev/null @@ -1,52 +0,0 @@ -package stirling.software.SPDF.controller.web; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import io.swagger.v3.oas.annotations.Hidden; -import stirling.software.SPDF.model.ApplicationProperties; - -@Controller -public class HomeWebController { - - @GetMapping("/about") - @Hidden - public String gameForm(Model model) { - model.addAttribute("currentPage", "about"); - return "about"; - } - - - - @GetMapping("/") - public String home(Model model) { - model.addAttribute("currentPage", "home"); - return "home"; - } - - @GetMapping("/home") - public String root(Model model) { - return "redirect:/"; - } - - @Autowired - ApplicationProperties applicationProperties; - - - @GetMapping(value = "/robots.txt", produces = MediaType.TEXT_PLAIN_VALUE) - @ResponseBody - @Hidden - public String getRobotsTxt() { - Boolean allowGoogle = applicationProperties.getSystem().getGooglevisibility(); - if(Boolean.TRUE.equals(allowGoogle)) { - return "User-agent: Googlebot\nAllow: /\n\nUser-agent: *\nAllow: /"; - } else { - return "User-agent: Googlebot\nDisallow: /\n\nUser-agent: *\nDisallow: /"; - } - } - -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java deleted file mode 100644 index 9dc4f2b7..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java +++ /dev/null @@ -1,265 +0,0 @@ -package stirling.software.SPDF.controller.web; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import io.micrometer.core.instrument.Counter; -import io.micrometer.core.instrument.Meter; -import io.micrometer.core.instrument.MeterRegistry; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.PostConstruct; -import stirling.software.SPDF.config.StartupApplicationListener; -import stirling.software.SPDF.model.ApplicationProperties; - -@RestController -@RequestMapping("/api/v1") -@Tag(name = "API", description = "Info APIs") -public class MetricsController { - - - @Autowired - ApplicationProperties applicationProperties; - - - private final MeterRegistry meterRegistry; - - private boolean metricsEnabled; - - @PostConstruct - public void init() { - Boolean metricsEnabled = applicationProperties.getMetrics().getEnabled(); - if(metricsEnabled == null) - metricsEnabled = true; - this.metricsEnabled = metricsEnabled; - } - - public MetricsController(MeterRegistry meterRegistry) { - this.meterRegistry = meterRegistry; - } - - @GetMapping("/status") - @Operation(summary = "Application status and version", - description = "This endpoint returns the status of the application and its version number.") - public ResponseEntity getStatus() { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - - Map status = new HashMap<>(); - status.put("status", "UP"); - status.put("version", getClass().getPackage().getImplementationVersion()); - return ResponseEntity.ok(status); - } - - @GetMapping("/loads") - @Operation(summary = "GET request count", - description = "This endpoint returns the total count of GET requests or the count of GET requests for a specific endpoint.") - public ResponseEntity getPageLoads(@RequestParam(required = false, name = "endpoint") @Parameter(description = "endpoint") Optional endpoint) { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - try { - - double count = 0.0; - - for (Meter meter : meterRegistry.getMeters()) { - if (meter.getId().getName().equals("http.requests")) { - String method = meter.getId().getTag("method"); - if (method != null && method.equals("GET")) { - - if (endpoint.isPresent() && !endpoint.get().isBlank()) { - if(!endpoint.get().startsWith("/")) { - endpoint = Optional.of("/" + endpoint.get()); - } - System.out.println("loads " + endpoint.get() + " vs " + meter.getId().getTag("uri")); - if(endpoint.get().equals(meter.getId().getTag("uri"))){ - if (meter instanceof Counter) { - count += ((Counter) meter).count(); - } - } - } else { - if (meter instanceof Counter) { - count += ((Counter) meter).count(); - } - } - } - } - } - - return ResponseEntity.ok(count); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - @GetMapping("/loads/all") - @Operation(summary = "GET requests count for all endpoints", - description = "This endpoint returns the count of GET requests for each endpoint.") - public ResponseEntity getAllEndpointLoads() { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - try { - Map counts = new HashMap<>(); - - for (Meter meter : meterRegistry.getMeters()) { - if (meter.getId().getName().equals("http.requests")) { - String method = meter.getId().getTag("method"); - if (method != null && method.equals("GET")) { - String uri = meter.getId().getTag("uri"); - if (uri != null) { - double currentCount = counts.getOrDefault(uri, 0.0); - if (meter instanceof Counter) { - currentCount += ((Counter) meter).count(); - } - counts.put(uri, currentCount); - } - } - } - } - - List results = counts.entrySet().stream() - .map(entry -> new EndpointCount(entry.getKey(), entry.getValue())) - .sorted(Comparator.comparing(EndpointCount::getCount).reversed()) - .collect(Collectors.toList()); - - return ResponseEntity.ok(results); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - public class EndpointCount { - private String endpoint; - private double count; - - public EndpointCount(String endpoint, double count) { - this.endpoint = endpoint; - this.count = count; - } - public String getEndpoint() { - return endpoint; - } - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - public double getCount() { - return count; - } - public void setCount(double count) { - this.count = count; - } - - } - - - @GetMapping("/requests") - @Operation(summary = "POST request count", - description = "This endpoint returns the total count of POST requests or the count of POST requests for a specific endpoint.") - public ResponseEntity getTotalRequests(@RequestParam(required = false, name = "endpoint") @Parameter(description = "endpoint") Optional endpoint) { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - try { - double count = 0.0; - - for (Meter meter : meterRegistry.getMeters()) { - if (meter.getId().getName().equals("http.requests")) { - String method = meter.getId().getTag("method"); - if (method != null && method.equals("POST")) { - if (endpoint.isPresent() && !endpoint.get().isBlank()) { - if (!endpoint.get().startsWith("/")) { - endpoint = Optional.of("/" + endpoint.get()); - } - if (endpoint.get().equals(meter.getId().getTag("uri"))) { - if (meter instanceof Counter) { - count += ((Counter) meter).count(); - } - } - } else { - if (meter instanceof Counter) { - count += ((Counter) meter).count(); - } - } - } - } - } - return ResponseEntity.ok(count); - } catch (Exception e) { - return ResponseEntity.ok(-1); - } - } - - - @GetMapping("/requests/all") - @Operation(summary = "POST requests count for all endpoints", - description = "This endpoint returns the count of POST requests for each endpoint.") - public ResponseEntity getAllPostRequests() { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - try { - Map counts = new HashMap<>(); - - for (Meter meter : meterRegistry.getMeters()) { - if (meter.getId().getName().equals("http.requests")) { - String method = meter.getId().getTag("method"); - if (method != null && method.equals("POST")) { - String uri = meter.getId().getTag("uri"); - if (uri != null) { - double currentCount = counts.getOrDefault(uri, 0.0); - if (meter instanceof Counter) { - currentCount += ((Counter) meter).count(); - } - counts.put(uri, currentCount); - } - } - } - } - - List results = counts.entrySet().stream() - .map(entry -> new EndpointCount(entry.getKey(), entry.getValue())) - .sorted(Comparator.comparing(EndpointCount::getCount).reversed()) - .collect(Collectors.toList()); - - return ResponseEntity.ok(results); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - - @GetMapping("/uptime") - public ResponseEntity getUptime() { - if (!metricsEnabled) { - return ResponseEntity.status(HttpStatus.FORBIDDEN).body("This endpoint is disabled."); - } - - LocalDateTime now = LocalDateTime.now(); - Duration uptime = Duration.between(StartupApplicationListener.startTime, now); - return ResponseEntity.ok(formatDuration(uptime)); - } - - private String formatDuration(Duration duration) { - long days = duration.toDays(); - long hours = duration.toHoursPart(); - long minutes = duration.toMinutesPart(); - long seconds = duration.toSecondsPart(); - return String.format("%dd %dh %dm %ds", days, hours, minutes, seconds); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java deleted file mode 100644 index 827523cb..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ /dev/null @@ -1,147 +0,0 @@ -package stirling.software.SPDF.controller.web; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.servlet.ModelAndView; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Controller -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class OtherWebController { - @GetMapping("/compress-pdf") - @Hidden - public String compressPdfForm(Model model) { - model.addAttribute("currentPage", "compress-pdf"); - return "misc/compress-pdf"; - } - - @GetMapping("/extract-image-scans") - @Hidden - public ModelAndView extractImageScansForm() { - ModelAndView modelAndView = new ModelAndView("misc/extract-image-scans"); - modelAndView.addObject("currentPage", "extract-image-scans"); - return modelAndView; - } - - @GetMapping("/show-javascript") - @Hidden - public String extractJavascriptForm(Model model) { - model.addAttribute("currentPage", "show-javascript"); - return "misc/show-javascript"; - } - - - @GetMapping("/add-page-numbers") - @Hidden - public String addPageNumbersForm(Model model) { - model.addAttribute("currentPage", "add-page-numbers"); - return "misc/add-page-numbers"; - } - - @GetMapping("/extract-images") - @Hidden - public String extractImagesForm(Model model) { - model.addAttribute("currentPage", "extract-images"); - return "misc/extract-images"; - } - - @GetMapping("/flatten") - @Hidden - public String flattenForm(Model model) { - model.addAttribute("currentPage", "flatten"); - return "misc/flatten"; - } - - - - @GetMapping("/change-metadata") - @Hidden - public String addWatermarkForm(Model model) { - model.addAttribute("currentPage", "change-metadata"); - return "misc/change-metadata"; - } - - @GetMapping("/compare") - @Hidden - public String compareForm(Model model) { - model.addAttribute("currentPage", "compare"); - return "misc/compare"; - } - - public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tesseract-ocr/4.00/tessdata"; - File[] files = new File(tessdataDir).listFiles(); - if (files == null) { - return Collections.emptyList(); - } - return Arrays.stream(files).filter(file -> file.getName().endsWith(".traineddata")).map(file -> file.getName().replace(".traineddata", "")) - .filter(lang -> !lang.equalsIgnoreCase("osd")).collect(Collectors.toList()); - } - - @GetMapping("/ocr-pdf") - @Hidden - public ModelAndView ocrPdfPage() { - ModelAndView modelAndView = new ModelAndView("misc/ocr-pdf"); - List languages = getAvailableTesseractLanguages(); - Collections.sort(languages); - modelAndView.addObject("languages", languages); - modelAndView.addObject("currentPage", "ocr-pdf"); - return modelAndView; - } - - - @GetMapping("/add-image") - @Hidden - public String overlayImage(Model model) { - model.addAttribute("currentPage", "add-image"); - return "misc/add-image"; - } - - @GetMapping("/adjust-contrast") - @Hidden - public String contrast(Model model) { - model.addAttribute("currentPage", "adjust-contrast"); - return "misc/adjust-contrast"; - } - - @GetMapping("/repair") - @Hidden - public String repairForm(Model model) { - model.addAttribute("currentPage", "repair"); - return "misc/repair"; - } - - @GetMapping("/remove-blanks") - @Hidden - public String removeBlanksForm(Model model) { - model.addAttribute("currentPage", "remove-blanks"); - return "misc/remove-blanks"; - } - - - @GetMapping("/auto-crop") - @Hidden - public String autoCropForm(Model model) { - model.addAttribute("currentPage", "auto-crop"); - return "misc/auto-crop"; - } - - @GetMapping("/auto-rename") - @Hidden - public String autoRenameForm(Model model) { - model.addAttribute("currentPage", "auto-rename"); - return "misc/auto-rename"; - } - - - -} diff --git a/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java b/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java deleted file mode 100644 index 2cbf245f..00000000 --- a/src/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java +++ /dev/null @@ -1,68 +0,0 @@ -package stirling.software.SPDF.controller.web; - -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; - -import io.swagger.v3.oas.annotations.Hidden; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Controller -@Tag(name = "Security", description = "Security APIs") -public class SecurityWebController { - - @GetMapping("/auto-redact") - @Hidden - public String autoRedactForm(Model model) { - model.addAttribute("currentPage", "auto-redact"); - return "security/auto-redact"; - } - - @GetMapping("/add-password") - @Hidden - public String addPasswordForm(Model model) { - model.addAttribute("currentPage", "add-password"); - return "security/add-password"; - } - @GetMapping("/change-permissions") - @Hidden - public String permissionsForm(Model model) { - model.addAttribute("currentPage", "change-permissions"); - return "security/change-permissions"; - } - - @GetMapping("/remove-password") - @Hidden - public String removePasswordForm(Model model) { - model.addAttribute("currentPage", "remove-password"); - return "security/remove-password"; - } - - @GetMapping("/add-watermark") - @Hidden - public String addWatermarkForm(Model model) { - model.addAttribute("currentPage", "add-watermark"); - return "security/add-watermark"; - } - - @GetMapping("/cert-sign") - @Hidden - public String certSignForm(Model model) { - model.addAttribute("currentPage", "cert-sign"); - return "security/cert-sign"; - } - - @GetMapping("/sanitize-pdf") - @Hidden - public String sanitizeForm(Model model) { - model.addAttribute("currentPage", "sanitize-pdf"); - return "security/sanitize-pdf"; - } - - @GetMapping("/get-info-on-pdf") - @Hidden - public String getInfo(Model model) { - model.addAttribute("currentPage", "get-info-on-pdf"); - return "security/get-info-on-pdf"; - } -} diff --git a/src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java b/src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java deleted file mode 100644 index 54b61c1b..00000000 --- a/src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java +++ /dev/null @@ -1,49 +0,0 @@ -package stirling.software.SPDF.model; -import java.util.Collection; - -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; - -public class ApiKeyAuthenticationToken extends AbstractAuthenticationToken { - - private final Object principal; - private Object credentials; - - public ApiKeyAuthenticationToken(String apiKey) { - super(null); - this.principal = null; - this.credentials = apiKey; - setAuthenticated(false); - } - - public ApiKeyAuthenticationToken(Object principal, String apiKey, Collection authorities) { - super(authorities); - this.principal = principal; // principal can be a UserDetails object - this.credentials = apiKey; - super.setAuthenticated(true); // this authentication is trusted - } - - @Override - public Object getCredentials() { - return credentials; - } - - @Override - public Object getPrincipal() { - return principal; - } - - @Override - public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { - if (isAuthenticated) { - throw new IllegalArgumentException("Cannot set this token to trusted. Use constructor which takes a GrantedAuthority list instead."); - } - super.setAuthenticated(false); - } - - @Override - public void eraseCredentials() { - super.eraseCredentials(); - credentials = null; - } -} diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java deleted file mode 100644 index dc068779..00000000 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ /dev/null @@ -1,335 +0,0 @@ -package stirling.software.SPDF.model; - -import java.util.List; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; - -import stirling.software.SPDF.config.YamlPropertySourceFactory; - -@Configuration -@ConfigurationProperties(prefix = "") -@PropertySource(value = "file:./configs/settings.yml", factory = YamlPropertySourceFactory.class) -public class ApplicationProperties { - private Security security; - private System system; - private Ui ui; - private Endpoints endpoints; - private Metrics metrics; - private AutomaticallyGenerated automaticallyGenerated; - private AutoPipeline autoPipeline; - - public AutoPipeline getAutoPipeline() { - return autoPipeline != null ? autoPipeline : new AutoPipeline(); - } - - public void setAutoPipeline(AutoPipeline autoPipeline) { - this.autoPipeline = autoPipeline; - } - - public Security getSecurity() { - return security != null ? security : new Security(); - } - - public void setSecurity(Security security) { - this.security = security; - } - - public System getSystem() { - return system != null ? system : new System(); - } - - public void setSystem(System system) { - this.system = system; - } - - public Ui getUi() { - return ui != null ? ui : new Ui(); - } - - public void setUi(Ui ui) { - this.ui = ui; - } - - public Endpoints getEndpoints() { - return endpoints != null ? endpoints : new Endpoints(); - } - - public void setEndpoints(Endpoints endpoints) { - this.endpoints = endpoints; - } - - public Metrics getMetrics() { - return metrics != null ? metrics : new Metrics(); - } - - public void setMetrics(Metrics metrics) { - this.metrics = metrics; - } - - public AutomaticallyGenerated getAutomaticallyGenerated() { - return automaticallyGenerated != null ? automaticallyGenerated : new AutomaticallyGenerated(); - } - - public void setAutomaticallyGenerated(AutomaticallyGenerated automaticallyGenerated) { - this.automaticallyGenerated = automaticallyGenerated; - } - - @Override - public String toString() { - return "ApplicationProperties [security=" + security + ", system=" + system + ", ui=" + ui + ", endpoints=" - + endpoints + ", metrics=" + metrics + ", automaticallyGenerated=" + automaticallyGenerated - + ", autoPipeline=" + autoPipeline + "]"; - } - - public static class AutoPipeline { - private String outputFolder; - - public String getOutputFolder() { - return outputFolder; - } - - public void setOutputFolder(String outputFolder) { - this.outputFolder = outputFolder; - } - - @Override - public String toString() { - return "AutoPipeline [outputFolder=" + outputFolder + "]"; - } - - - - } - public static class Security { - private Boolean enableLogin; - private Boolean csrfDisabled; - private InitialLogin initialLogin; - - public InitialLogin getInitialLogin() { - return initialLogin != null ? initialLogin : new InitialLogin(); - } - - public void setInitialLogin(InitialLogin initialLogin) { - this.initialLogin = initialLogin; - } - - public Boolean getEnableLogin() { - return enableLogin; - } - - public void setEnableLogin(Boolean enableLogin) { - this.enableLogin = enableLogin; - } - - public Boolean getCsrfDisabled() { - return csrfDisabled; - } - - public void setCsrfDisabled(Boolean csrfDisabled) { - this.csrfDisabled = csrfDisabled; - } - - - @Override - public String toString() { - return "Security [enableLogin=" + enableLogin + ", initialLogin=" + initialLogin + ", csrfDisabled=" - + csrfDisabled + "]"; - } - - public static class InitialLogin { - - private String username; - private String password; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - @Override - public String toString() { - return "InitialLogin [username=" + username + ", password=" + (password != null && !password.isEmpty() ? "MASKED" : "NULL") + "]"; - } - - - - } - } - - public static class System { - private String defaultLocale; - private Boolean googlevisibility; - private String rootURIPath; - private String customStaticFilePath; - private Integer maxFileSize; - - public String getDefaultLocale() { - return defaultLocale; - } - - public void setDefaultLocale(String defaultLocale) { - this.defaultLocale = defaultLocale; - } - - public Boolean getGooglevisibility() { - return googlevisibility; - } - - public void setGooglevisibility(Boolean googlevisibility) { - this.googlevisibility = googlevisibility; - } - - public String getRootURIPath() { - return rootURIPath; - } - - public void setRootURIPath(String rootURIPath) { - this.rootURIPath = rootURIPath; - } - - public String getCustomStaticFilePath() { - return customStaticFilePath; - } - - public void setCustomStaticFilePath(String customStaticFilePath) { - this.customStaticFilePath = customStaticFilePath; - } - - public Integer getMaxFileSize() { - return maxFileSize; - } - - public void setMaxFileSize(Integer maxFileSize) { - this.maxFileSize = maxFileSize; - } - - @Override - public String toString() { - return "System [defaultLocale=" + defaultLocale + ", googlevisibility=" + googlevisibility + ", rootURIPath=" - + rootURIPath + ", customStaticFilePath=" + customStaticFilePath + ", maxFileSize=" + maxFileSize - + "]"; - } - - - } - - public static class Ui { - private String appName; - private String homeDescription; - private String appNameNavbar; - - public String getAppName() { - if(appName != null && appName.trim().length() == 0) - return null; - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } - - public String getHomeDescription() { - if(homeDescription != null && homeDescription.trim().length() == 0) - return null; - return homeDescription; - } - - public void setHomeDescription(String homeDescription) { - this.homeDescription = homeDescription; - } - - public String getAppNameNavbar() { - if(appNameNavbar != null && appNameNavbar.trim().length() == 0) - return null; - return appNameNavbar; - } - - public void setAppNameNavbar(String appNameNavbar) { - this.appNameNavbar = appNameNavbar; - } - - @Override - public String toString() { - return "UserInterface [appName=" + appName + ", homeDescription=" + homeDescription + ", appNameNavbar=" + appNameNavbar + "]"; - } - } - - - public static class Endpoints { - private List toRemove; - private List groupsToRemove; - - public List getToRemove() { - return toRemove; - } - - public void setToRemove(List toRemove) { - this.toRemove = toRemove; - } - - public List getGroupsToRemove() { - return groupsToRemove; - } - - public void setGroupsToRemove(List groupsToRemove) { - this.groupsToRemove = groupsToRemove; - } - - @Override - public String toString() { - return "Endpoints [toRemove=" + toRemove + ", groupsToRemove=" + groupsToRemove + "]"; - } - - - } - - public static class Metrics { - private Boolean enabled; - - public Boolean getEnabled() { - return enabled; - } - - public void setEnabled(Boolean enabled) { - this.enabled = enabled; - } - - @Override - public String toString() { - return "Metrics [enabled=" + enabled + "]"; - } - - - } - - public static class AutomaticallyGenerated { - private String key; - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - @Override - public String toString() { - return "AutomaticallyGenerated [key=" + (key != null && !key.isEmpty() ? "MASKED" : "NULL") + "]"; - } - - } -} diff --git a/src/main/java/stirling/software/SPDF/model/Authority.java b/src/main/java/stirling/software/SPDF/model/Authority.java deleted file mode 100644 index 8be853ea..00000000 --- a/src/main/java/stirling/software/SPDF/model/Authority.java +++ /dev/null @@ -1,64 +0,0 @@ -package stirling.software.SPDF.model; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; - -@Entity -@Table(name = "authorities") -public class Authority { - - public Authority() { - - } - - - public Authority(String authority, User user) { - this.authority = authority; - this.user = user; - user.getAuthorities().add(this); - } - - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "authority") - private String authority; - - @ManyToOne - @JoinColumn(name = "user_id") - private User user; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAuthority() { - return authority; - } - - public void setAuthority(String authority) { - this.authority = authority; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/model/PDFText.java b/src/main/java/stirling/software/SPDF/model/PDFText.java deleted file mode 100644 index 9a4909d0..00000000 --- a/src/main/java/stirling/software/SPDF/model/PDFText.java +++ /dev/null @@ -1,42 +0,0 @@ -package stirling.software.SPDF.model; -public class PDFText { - private final int pageIndex; - private final float x1; - private final float y1; - private final float x2; - private final float y2; - private final String text; - - public PDFText(int pageIndex, float x1, float y1, float x2, float y2, String text) { - this.pageIndex = pageIndex; - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; - this.text = text; - } - - public int getPageIndex() { - return pageIndex; - } - - public float getX1() { - return x1; - } - - public float getY1() { - return y1; - } - - public float getX2() { - return x2; - } - - public float getY2() { - return y2; - } - - public String getText() { - return text; - } -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/model/PersistentLogin.java b/src/main/java/stirling/software/SPDF/model/PersistentLogin.java deleted file mode 100644 index 0747c1eb..00000000 --- a/src/main/java/stirling/software/SPDF/model/PersistentLogin.java +++ /dev/null @@ -1,61 +0,0 @@ -package stirling.software.SPDF.model; - -import java.util.Date; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -@Entity -@Table(name = "persistent_logins") -public class PersistentLogin { - - @Id - @Column(name = "series") - private String series; - - @Column(name = "username", length = 64, nullable = false) - private String username; - - @Column(name = "token", length = 64, nullable = false) - private String token; - - @Column(name = "last_used", nullable = false) - private Date lastUsed; - - public String getSeries() { - return series; - } - - public void setSeries(String series) { - this.series = series; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public Date getLastUsed() { - return lastUsed; - } - - public void setLastUsed(Date lastUsed) { - this.lastUsed = lastUsed; - } - - - // Getters, setters, etc. -} diff --git a/src/main/java/stirling/software/SPDF/model/PipelineConfig.java b/src/main/java/stirling/software/SPDF/model/PipelineConfig.java deleted file mode 100644 index 77ef7a05..00000000 --- a/src/main/java/stirling/software/SPDF/model/PipelineConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -package stirling.software.SPDF.model; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; - -public class PipelineConfig { - private String name; - - @JsonProperty("pipeline") - private List operations; - - private String outputDir; - - @JsonProperty("outputFileName") - private String outputPattern; - - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getOperations() { - return operations; - } - - public void setOperations(List operations) { - this.operations = operations; - } - - public String getOutputDir() { - return outputDir; - } - - public void setOutputDir(String outputDir) { - this.outputDir = outputDir; - } - - public String getOutputPattern() { - return outputPattern; - } - - public void setOutputPattern(String outputPattern) { - this.outputPattern = outputPattern; - } - - -} diff --git a/src/main/java/stirling/software/SPDF/model/PipelineOperation.java b/src/main/java/stirling/software/SPDF/model/PipelineOperation.java deleted file mode 100644 index 10c27bfc..00000000 --- a/src/main/java/stirling/software/SPDF/model/PipelineOperation.java +++ /dev/null @@ -1,32 +0,0 @@ -package stirling.software.SPDF.model; - -import java.util.Map; - -public class PipelineOperation { - private String operation; - private Map parameters; - - - public String getOperation() { - return operation; - } - - public void setOperation(String operation) { - this.operation = operation; - } - - public Map getParameters() { - return parameters; - } - - public void setParameters(Map parameters) { - this.parameters = parameters; - } - - @Override - public String toString() { - return "PipelineOperation [operation=" + operation + ", parameters=" + parameters + "]"; - } - - - } \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/model/Role.java b/src/main/java/stirling/software/SPDF/model/Role.java deleted file mode 100644 index 1b775de0..00000000 --- a/src/main/java/stirling/software/SPDF/model/Role.java +++ /dev/null @@ -1,50 +0,0 @@ -package stirling.software.SPDF.model; -public enum Role { - - // Unlimited access - ADMIN("ROLE_ADMIN", Integer.MAX_VALUE, Integer.MAX_VALUE), - - // Unlimited access - USER("ROLE_USER", Integer.MAX_VALUE, Integer.MAX_VALUE), - - // 40 API calls Per Day, 40 web calls - LIMITED_API_USER("ROLE_LIMITED_API_USER", 40, 40), - - // 20 API calls Per Day, 20 web calls - EXTRA_LIMITED_API_USER("ROLE_EXTRA_LIMITED_API_USER", 20, 20), - - // 0 API calls per day and 20 web calls - WEB_ONLY_USER("ROLE_WEB_ONLY_USER", 0, 20); - - private final String roleId; - private final int apiCallsPerDay; - private final int webCallsPerDay; - - Role(String roleId, int apiCallsPerDay, int webCallsPerDay) { - this.roleId = roleId; - this.apiCallsPerDay = apiCallsPerDay; - this.webCallsPerDay = webCallsPerDay; - } - - public String getRoleId() { - return roleId; - } - - public int getApiCallsPerDay() { - return apiCallsPerDay; - } - - public int getWebCallsPerDay() { - return webCallsPerDay; - } - - public static Role fromString(String roleId) { - for (Role role : Role.values()) { - if (role.getRoleId().equalsIgnoreCase(roleId)) { - return role; - } - } - throw new IllegalArgumentException("No Role defined for id: " + roleId); - } - -} diff --git a/src/main/java/stirling/software/SPDF/model/SortTypes.java b/src/main/java/stirling/software/SPDF/model/SortTypes.java deleted file mode 100644 index 21181cfa..00000000 --- a/src/main/java/stirling/software/SPDF/model/SortTypes.java +++ /dev/null @@ -1,4 +0,0 @@ -package stirling.software.SPDF.model; -public enum SortTypes { - REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, SIDE_STITCH_BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST, -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/model/User.java b/src/main/java/stirling/software/SPDF/model/User.java deleted file mode 100644 index f771a821..00000000 --- a/src/main/java/stirling/software/SPDF/model/User.java +++ /dev/null @@ -1,134 +0,0 @@ -package stirling.software.SPDF.model; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.CollectionTable; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.MapKeyColumn; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -@Entity -@Table(name = "users") -public class User { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "user_id") - private Long id; - - @Column(name = "username", unique = true) - private String username; - - @Column(name = "password") - private String password; - - @Column(name = "apiKey") - private String apiKey; - - @Column(name = "enabled") - private boolean enabled; - - @Column(name = "isFirstLogin") - private Boolean isFirstLogin = false; - - @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user") - private Set authorities = new HashSet<>(); - - @ElementCollection - @MapKeyColumn(name = "setting_key") - @Column(name = "setting_value") - @CollectionTable(name = "user_settings", joinColumns = @JoinColumn(name = "user_id")) - private Map settings = new HashMap<>(); // Key-value pairs of settings. - - - public boolean isFirstLogin() { - return isFirstLogin != null && isFirstLogin; - } - - public void setFirstLogin(boolean isFirstLogin) { - this.isFirstLogin = isFirstLogin; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getApiKey() { - return apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public Map getSettings() { - return settings; - } - - public void setSettings(Map settings) { - this.settings = settings; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public Set getAuthorities() { - return authorities; - } - - public void setAuthorities(Set authorities) { - this.authorities = authorities; - } - - public void addAuthorities(Set authorities) { - this.authorities.addAll(authorities); - } - public void addAuthority(Authority authorities) { - this.authorities.add(authorities); - } - - public String getRolesAsString() { - return this.authorities.stream() - .map(Authority::getAuthority) - .collect(Collectors.joining(", ")); - } - - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java deleted file mode 100644 index 441d904a..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java +++ /dev/null @@ -1,17 +0,0 @@ -package stirling.software.SPDF.model.api; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Data -@EqualsAndHashCode -@NoArgsConstructor -public class GeneralFile { - - @Schema(description = "The input file") - private MultipartFile fileInput; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java deleted file mode 100644 index 1d7a8afe..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package stirling.software.SPDF.model.api; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@EqualsAndHashCode -public class HandleDataRequest { - - @Schema(description = "The input files") - private MultipartFile[] fileInputs; - - @Schema(description = "JSON String") - private String jsonString; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java deleted file mode 100644 index 02079843..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java +++ /dev/null @@ -1,16 +0,0 @@ -package stirling.software.SPDF.model.api; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@EqualsAndHashCode -public class ImageFile { - @Schema(description = "The input image file") - private MultipartFile fileInput; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java deleted file mode 100644 index 937a4265..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java +++ /dev/null @@ -1,15 +0,0 @@ -package stirling.software.SPDF.model.api; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -@EqualsAndHashCode -public class MultiplePDFFiles { - @Schema(description = "The input PDF files", type = "array", format = "binary") - private MultipartFile[] fileInput; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java deleted file mode 100644 index 1f902d88..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java +++ /dev/null @@ -1,16 +0,0 @@ -package stirling.software.SPDF.model.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper=true) -public class PDFComparison extends PDFFile { - - @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = { - "Greater", "Equal", "Less" }) - private String comparator; - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java deleted file mode 100644 index 14462f0a..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java +++ /dev/null @@ -1,15 +0,0 @@ -package stirling.software.SPDF.model.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper=true) -public class PDFComparisonAndCount extends PDFComparison { - @Schema(description = "Count") - private String pageCount; - - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java deleted file mode 100644 index 378b3c03..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package stirling.software.SPDF.model.api; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -@Data -@EqualsAndHashCode -public class PDFFile { - @Schema(description = "The input PDF file") - private MultipartFile fileInput; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java deleted file mode 100644 index aa8fe08b..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PDFWithImageFormatRequest extends PDFFile { - - @Schema(description = "The output image format e.g., 'png', 'jpeg', or 'gif'", - allowableValues = { "png", "jpeg", "gif" }) - private String format; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java deleted file mode 100644 index d53d8d12..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ /dev/null @@ -1,39 +0,0 @@ -package stirling.software.SPDF.model.api; - -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.pdmodel.PDDocument; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import stirling.software.SPDF.utils.GeneralUtils; -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper=true) -public class PDFWithPageNums extends PDFFile { - - @Schema(description = "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')\"") - private String pageNumbers; - - - public List getPageNumbersList(){ - int pageCount = 0; - try { - pageCount = PDDocument.load(getFileInput().getInputStream()).getNumberOfPages(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return GeneralUtils.parsePageString(pageNumbers, pageCount); - - } - public List getPageNumbersList(PDDocument doc){ - int pageCount = 0; - pageCount = doc.getNumberOfPages(); - return GeneralUtils.parsePageString(pageNumbers, pageCount); - - } -} diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java deleted file mode 100644 index 661a4ffe..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java +++ /dev/null @@ -1,16 +0,0 @@ -package stirling.software.SPDF.model.api; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PDFWithPageSize extends PDFFile { - - @Schema(description = "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER, LEGAL.", - allowableValues = { - "A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL" - }) - private String pageSize; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java deleted file mode 100644 index 18026618..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class ConvertToImageRequest extends PDFFile { - - @Schema(description = "The output image format", allowableValues = {"png", "jpeg", "jpg", "gif"}) - private String imageFormat; - - @Schema(description = "Choose between a single image containing all pages or separate images for each page", allowableValues = {"single", "multiple"}) - private String singleOrMultiple; - - @Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"}) - private String colorType; - - @Schema(description = "The DPI (dots per inch) for the output image(s)") - private String dpi; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java deleted file mode 100644 index 37df6f9e..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode -public class ConvertToPdfRequest { - - @Schema(description = "The input images to be converted to a PDF file") - private MultipartFile[] fileInput; - - @Schema(description = "Option to determine how the image will fit onto the page", - allowableValues = { "fillPage", "fitDocumentToImage", "maintainAspectRatio" }) - private String fitOption; - - - - @Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"}) - private String colorType; - - @Schema(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true") - private boolean autoRotate; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java deleted file mode 100644 index 0e8b79ad..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PdfToPresentationRequest extends PDFFile { - - @Schema(description = "The output Presentation format", allowableValues = {"ppt", "pptx", "odp"}) - private String outputFormat; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java deleted file mode 100644 index 687ed621..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PdfToTextOrRTFRequest extends PDFFile { - - @Schema(description = "The output Text or RTF format", allowableValues = {"rtf", "txt:Text"}) - private String outputFormat; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java deleted file mode 100644 index 87150c73..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PdfToWordRequest extends PDFFile { - - @Schema(description = "The output Word document format", allowableValues = {"doc", "docx", "odt"}) - private String outputFormat; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java deleted file mode 100644 index 4607c153..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package stirling.software.SPDF.model.api.converters; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode -public class UrlToPdfRequest { - - @Schema(description = "The input URL to be converted to a PDF file", required = true) - private String urlInput; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java deleted file mode 100644 index 0b6cb1cb..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.filter; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFWithPageNums; - -@Data -@EqualsAndHashCode(callSuper=true) -public class ContainsTextRequest extends PDFWithPageNums { - - @Schema(description = "The text to check for", required = true) - private String text; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java deleted file mode 100644 index ce9a9236..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package stirling.software.SPDF.model.api.filter; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFComparison; - -@Data -@EqualsAndHashCode(callSuper=true) -public class FileSizeRequest extends PDFComparison { - - @Schema(description = "File Size", required = true) - private String fileSize; - - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java deleted file mode 100644 index d5fb9739..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package stirling.software.SPDF.model.api.filter; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFComparison; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PageRotationRequest extends PDFComparison { - - @Schema(description = "Rotation in degrees", required = true) - private int rotation; - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java deleted file mode 100644 index 12083636..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package stirling.software.SPDF.model.api.filter; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFComparison; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PageSizeRequest extends PDFComparison { - - @Schema(description = "Standard Page Size", required = true) - private String standardPageSize; - - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java deleted file mode 100644 index 52821515..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java +++ /dev/null @@ -1,24 +0,0 @@ -package stirling.software.SPDF.model.api.general; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class CropPdfForm extends PDFFile { - - - @Schema(description = "The x-coordinate of the top-left corner of the crop area", type = "number") - private float x; - - @Schema(description = "The y-coordinate of the top-left corner of the crop area", type = "number") - private float y; - - @Schema(description = "The width of the crop area", type = "number") - private float width; - - @Schema(description = "The height of the crop area", type = "number") - private float height; -} - diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java deleted file mode 100644 index 4642cb75..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package stirling.software.SPDF.model.api.general; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class MergeMultiplePagesRequest extends PDFFile { - - @Schema(description = "The number of pages to fit onto a single sheet in the output PDF.", - type = "integer", allowableValues = {"2", "3", "4", "9", "16"}) - private int pagesPerSheet; - - @Schema(description = "Boolean for if you wish to add border around the pages") - private boolean addBorder; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java deleted file mode 100644 index b7b3bda7..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package stirling.software.SPDF.model.api.general; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.MultiplePDFFiles; - -@Data -@EqualsAndHashCode(callSuper=true) -public class MergePdfsRequest extends MultiplePDFFiles { - - @Schema(description = "The type of sorting to be applied on the input files before merging.", - allowableValues = { - "orderProvided", - "byFileName", - "byDateModified", - "byDateCreated", - "byPDFTitle" - }, - defaultValue = "orderProvided") - private String sortType = "orderProvided"; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java deleted file mode 100644 index 3e5b4f23..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package stirling.software.SPDF.model.api.general; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.SortTypes; -import stirling.software.SPDF.model.api.PDFWithPageNums; -@Data -@EqualsAndHashCode(callSuper=true) -public class RearrangePagesRequest extends PDFWithPageNums { - - @Schema(implementation = SortTypes.class, description = "The custom mode for page rearrangement. Valid values are:\n" - + "REVERSE_ORDER: Reverses the order of all pages.\n" - + "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). " - + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n" - + "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n" - + "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n" - + "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n") - private String customMode; - - - -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java deleted file mode 100644 index 8f48c605..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.general; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class RotatePDFRequest extends PDFFile { - - @Schema(description = "The angle by which to rotate the PDF file. This should be a multiple of 90.", example = "90") - private Integer angle; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java deleted file mode 100644 index 28be3990..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package stirling.software.SPDF.model.api.general; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; -import stirling.software.SPDF.model.api.PDFWithPageSize; - -@Data -@EqualsAndHashCode(callSuper=true) -public class ScalePagesRequest extends PDFWithPageSize { - - @Schema(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.") - private float scaleFactor; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java deleted file mode 100644 index 313d42ab..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFWithPageNums; - -@Data -@EqualsAndHashCode(callSuper=true) -public class AddPageNumbersRequest extends PDFWithPageNums { - - @Schema(description = "Custom margin: small/medium/large", allowableValues = {"small", "medium", "large"}) - private String customMargin; - - @Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9") - private int position; - - @Schema(description = "Starting number", minimum = "1") - private int startingNumber; - - @Schema(description = "Which pages to number, default all") - private String pagesToNumber; - - @Schema(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"") - private String customText; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java deleted file mode 100644 index c4923746..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class AutoSplitPdfRequest extends PDFFile { - - @Schema(description = "Flag indicating if the duplex mode is active, where the page after the divider also gets removed.", required = false, defaultValue = "false") - private boolean duplexMode; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java deleted file mode 100644 index f3028445..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class ExtractHeaderRequest extends PDFFile { - - @Schema(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false, defaultValue = "false") - private boolean useFirstTextAsFallback; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java deleted file mode 100644 index 1a575fe6..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode -public class ExtractImageScansRequest { - @Schema(description = "The input file containing image scans", required = true) - private MultipartFile fileInput; - - @Schema(description = "The angle threshold for the image scan extraction", defaultValue = "5", example = "5") - private int angleThreshold = 5; - - @Schema(description = "The tolerance for the image scan extraction", defaultValue = "20", example = "20") - private int tolerance = 20; - - @Schema(description = "The minimum area for the image scan extraction", defaultValue = "8000", example = "8000") - private int minArea = 8000; - - @Schema(description = "The minimum contour area for the image scan extraction", defaultValue = "500", example = "500") - private int minContourArea = 500; - - @Schema(description = "The border size for the image scan extraction", defaultValue = "1", example = "1") - private int borderSize =1; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java deleted file mode 100644 index d62890aa..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import java.util.Map; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class MetadataRequest extends PDFFile { - - @Schema(description = "Delete all metadata if set to true") - private boolean deleteAll; - - @Schema(description = "The author of the document") - private String author; - - @Schema(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)") - private String creationDate; - - @Schema(description = "The creator of the document") - private String creator; - - @Schema(description = "The keywords for the document") - private String keywords; - - @Schema(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)") - private String modificationDate; - - @Schema(description = "The producer of the document") - private String producer; - - @Schema(description = "The subject of the document") - private String subject; - - @Schema(description = "The title of the document") - private String title; - - @Schema(description = "The trapped status of the document") - private String trapped; - - @Schema(description = "Map list of key and value of custom parameters. Note these must start with customKey and customValue if they are non-standard") - private Map allRequestParams; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java deleted file mode 100644 index bc00cf20..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class OptimizePdfRequest extends PDFFile { - - @Schema(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", - allowableValues = { "1", "2", "3", "4", "5" }) - private Integer optimizeLevel; - - @Schema(description = "The expected output size, e.g. '100MB', '25KB', etc.") - private String expectedOutputSize; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java deleted file mode 100644 index 50ec4abb..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class OverlayImageRequest extends PDFFile { - - @Schema(description = "The image file to be overlaid onto the PDF.") - private MultipartFile imageFile; - - @Schema(description = "The x-coordinate at which to place the top-left corner of the image.", example = "0") - private float x; - - @Schema(description = "The y-coordinate at which to place the top-left corner of the image.", example = "0") - private float y; - - @Schema(description = "Whether to overlay the image onto every page of the PDF.", example = "false") - private boolean everyPage; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java deleted file mode 100644 index 392f8d54..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import java.util.List; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class ProcessPdfWithOcrRequest extends PDFFile { - - @Schema(description = "List of languages to use in OCR processing") - private List languages; - - @Schema(description = "Include OCR text in a sidecar text file if set to true") - private boolean sidecar; - - @Schema(description = "Deskew the input file if set to true") - private boolean deskew; - - @Schema(description = "Clean the input file if set to true") - private boolean clean; - - @Schema(description = "Clean the final output if set to true") - private boolean cleanFinal; - - @Schema(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", allowableValues = {"skip-text", "force-ocr", "Normal"}) - private String ocrType; - - @Schema(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", allowableValues = {"hocr", "sandwich"}, defaultValue = "hocr") - private String ocrRenderType = "hocr"; - - @Schema(description = "Remove images from the output PDF if set to true") - private boolean removeImagesAfter; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java deleted file mode 100644 index 0d2e11c7..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package stirling.software.SPDF.model.api.misc; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class RemoveBlankPagesRequest extends PDFFile { - - @Schema(description = "The threshold value to determine blank pages", example = "10", defaultValue = "10") - private int threshold = 10; - - @Schema(description = "The percentage of white color on a page to consider it as blank", example = "99.9", defaultValue = "99.9") - private float whitePercent = 99.9f; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java deleted file mode 100644 index ea83e470..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class AddPasswordRequest extends PDFFile { - - @Schema(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)", defaultValue = "") - private String ownerPassword; - - @Schema(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)", defaultValue = "") - private String password; - - @Schema(description = "The length of the encryption key", allowableValues = {"40", "128", "256"}, defaultValue = "256") - private int keyLength = 256; - - @Schema(description = "Whether the document assembly is allowed", example = "false") - private boolean canAssembleDocument; - - @Schema(description = "Whether content extraction for accessibility is allowed", example = "false") - private boolean canExtractContent; - - @Schema(description = "Whether content extraction for accessibility is allowed", example = "false") - private boolean canExtractForAccessibility; - - @Schema(description = "Whether form filling is allowed", example = "false") - private boolean canFillInForm; - - @Schema(description = "Whether the document modification is allowed", example = "false") - private boolean canModify; - - @Schema(description = "Whether modification of annotations is allowed", example = "false") - private boolean canModifyAnnotations; - - @Schema(description = "Whether printing of the document is allowed", example = "false") - private boolean canPrint; - - @Schema(description = "Whether faithful printing is allowed", example = "false") - private boolean canPrintFaithful; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java deleted file mode 100644 index cd800948..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class AddWatermarkRequest extends PDFFile { - - @Schema(description = "The watermark type (text or image)", - allowableValues = {"text", "image"}, - required = true) - private String watermarkType; - - @Schema(description = "The watermark text") - private String watermarkText; - - @Schema(description = "The watermark image") - private MultipartFile watermarkImage; - - @Schema(description = "The selected alphabet", - allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"}, - defaultValue = "roman") - private String alphabet = "roman"; - - @Schema(description = "The font size of the watermark text", example = "30") - private float fontSize = 30; - - @Schema(description = "The rotation of the watermark in degrees", example = "0") - private float rotation = 0; - - @Schema(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") - private float opacity; - - @Schema(description = "The width spacer between watermark elements", example = "50") - private int widthSpacer; - - @Schema(description = "The height spacer between watermark elements", example = "50") - private int heightSpacer; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java deleted file mode 100644 index 94d04d1e..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class PDFPasswordRequest extends PDFFile { - - @Schema(description = "The password of the PDF file", required = true) - private String password; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java deleted file mode 100644 index 1966c53a..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class RedactPdfRequest extends PDFFile { - - @Schema(description = "List of text to redact from the PDF", type = "string", required = true) - private String listOfText; - - @Schema(description = "Whether to use regex for the listOfText", defaultValue = "false") - private boolean useRegex; - - @Schema(description = "Whether to use whole word search", defaultValue = "false") - private boolean wholeWordSearch; - - @Schema(description = "The color for redaction", defaultValue = "#000000") - private String redactColor = "#000000"; - - @Schema(description = "Custom padding for redaction", type = "number") - private float customPadding; - - @Schema(description = "Convert the redacted PDF to an image", defaultValue = "false") - private boolean convertPDFToImage; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java deleted file mode 100644 index 98c7743f..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class SanitizePdfRequest extends PDFFile { - - @Schema(description = "Remove JavaScript actions from the PDF", defaultValue = "false") - private boolean removeJavaScript; - - @Schema(description = "Remove embedded files from the PDF", defaultValue = "false") - private boolean removeEmbeddedFiles; - - @Schema(description = "Remove metadata from the PDF", defaultValue = "false") - private boolean removeMetadata; - - @Schema(description = "Remove links from the PDF", defaultValue = "false") - private boolean removeLinks; - - @Schema(description = "Remove fonts from the PDF", defaultValue = "false") - private boolean removeFonts; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java deleted file mode 100644 index 8e537c6a..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ /dev/null @@ -1,43 +0,0 @@ -package stirling.software.SPDF.model.api.security; - -import org.springframework.web.multipart.MultipartFile; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper=true) -public class SignPDFWithCertRequest extends PDFFile { - - @Schema(description = "The type of the digital certificate", allowableValues = { "PKCS12", "PEM" }) - private String certType; - - @Schema(description = "The private key for the digital certificate (required for PEM type certificates)") - private MultipartFile privateKeyFile; - - @Schema(description = "The digital certificate (required for PEM type certificates)") - private MultipartFile certFile; - - @Schema(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") - private MultipartFile p12File; - - @Schema(description = "The password for the keystore or the private key") - private String password; - - @Schema(description = "Whether to visually show the signature in the PDF file") - private boolean showSignature; - - @Schema(description = "The reason for signing the PDF") - private String reason; - - @Schema(description = "The location where the PDF is signed") - private String location; - - @Schema(description = "The name of the signer") - private String name; - - @Schema(description = "The page number where the signature should be visible. This is required if showSignature is set to true") - private Integer pageNumber; -} diff --git a/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java b/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java deleted file mode 100644 index 0f49af76..00000000 --- a/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java +++ /dev/null @@ -1,130 +0,0 @@ -package stirling.software.SPDF.pdf; - -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - -import org.apache.pdfbox.contentstream.operator.Operator; -import org.apache.pdfbox.contentstream.operator.OperatorName; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.graphics.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.apache.pdfbox.pdmodel.graphics.image.PDImage; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; - -public class ImageFinder extends org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine { - private boolean hasImages = false; - - public ImageFinder(PDPage page) { - super(page); - } - - public boolean hasImages() { - return hasImages; - } - - @Override - protected void processOperator(Operator operator, List operands) throws IOException { - String operation = operator.getName(); - if (operation.equals(OperatorName.DRAW_OBJECT)) { - COSBase base = operands.get(0); - if (base instanceof COSName) { - COSName objectName = (COSName) base; - PDXObject xobject = getResources().getXObject(objectName); - if (xobject instanceof PDImageXObject) { - hasImages = true; - } else if (xobject instanceof PDFormXObject) { - PDFormXObject form = (PDFormXObject) xobject; - ImageFinder innerFinder = new ImageFinder(getPage()); - innerFinder.processPage(getPage()); - if (innerFinder.hasImages()) { - hasImages = true; - } - } - } - } - super.processOperator(operator, operands); - } - - @Override - public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void drawImage(PDImage pdImage) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void clip(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void moveTo(float x, float y) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void lineTo(float x, float y) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public Point2D getCurrentPoint() throws IOException { - // TODO Auto-generated method stub - return null; - } - - @Override - public void closePath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void endPath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void strokePath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void fillPath(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void fillAndStrokePath(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void shadingFill(COSName shadingName) throws IOException { - // TODO Auto-generated method stub - - } - - // ... rest of the overridden methods -} diff --git a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java b/src/main/java/stirling/software/SPDF/pdf/TextFinder.java deleted file mode 100644 index f7eb9e3f..00000000 --- a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java +++ /dev/null @@ -1,90 +0,0 @@ -package stirling.software.SPDF.pdf; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.text.PDFTextStripper; -import org.apache.pdfbox.text.TextPosition; - -import stirling.software.SPDF.model.PDFText; - -public class TextFinder extends PDFTextStripper { - - private final String searchText; - private final boolean useRegex; - private final boolean wholeWordSearch; - private final List textOccurrences = new ArrayList<>(); - - public TextFinder(String searchText, boolean useRegex, boolean wholeWordSearch) throws IOException { - this.searchText = searchText.toLowerCase(); - this.useRegex = useRegex; - this.wholeWordSearch = wholeWordSearch; - setSortByPosition(true); - } - - private List findOccurrencesInText(String searchText, String content) { - List indexes = new ArrayList<>(); - Pattern pattern; - - if (useRegex) { - // Use regex-based search - pattern = wholeWordSearch - ? Pattern.compile("(\\b|_|\\.)" + searchText + "(\\b|_|\\.)") - : Pattern.compile(searchText); - } else { - // Use normal text search - pattern = wholeWordSearch - ? Pattern.compile("(\\b|_|\\.)" + Pattern.quote(searchText) + "(\\b|_|\\.)") - : Pattern.compile(Pattern.quote(searchText)); - } - - Matcher matcher = pattern.matcher(content); - while (matcher.find()) { - indexes.add(matcher.start()); - } - return indexes; - } - - @Override - protected void writeString(String text, List textPositions) { - for (Integer index : findOccurrencesInText(searchText, text.toLowerCase())) { - if (index + searchText.length() <= textPositions.size()) { - // Initial values based on the first character - TextPosition first = textPositions.get(index); - float minX = first.getX(); - float minY = first.getY(); - float maxX = first.getX() + first.getWidth(); - float maxY = first.getY() + first.getHeight(); - - // Loop over the rest of the characters and adjust bounding box values - for (int i = index; i < index + searchText.length(); i++) { - TextPosition position = textPositions.get(i); - minX = Math.min(minX, position.getX()); - minY = Math.min(minY, position.getY()); - maxX = Math.max(maxX, position.getX() + position.getWidth()); - maxY = Math.max(maxY, position.getY() + position.getHeight()); - } - - textOccurrences.add(new PDFText( - getCurrentPageNo() - 1, - minX, - minY, - maxX, - maxY, - text - )); - } - } - } - - public List getTextLocations(PDDocument document) throws Exception { - this.getText(document); - System.out.println("Found " + textOccurrences.size() + " occurrences of '" + searchText + "' in the document."); - - return textOccurrences; - } - -} \ No newline at end of file diff --git a/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java b/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java deleted file mode 100644 index 62f546b8..00000000 --- a/src/main/java/stirling/software/SPDF/repository/AuthorityRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package stirling.software.SPDF.repository; - -import java.util.Set; - -import org.springframework.data.jpa.repository.JpaRepository; - -import stirling.software.SPDF.model.Authority; - -public interface AuthorityRepository extends JpaRepository { - //Set findByUsername(String username); - Set findByUser_Username(String username); -} diff --git a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java b/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java deleted file mode 100644 index e7753903..00000000 --- a/src/main/java/stirling/software/SPDF/repository/JPATokenRepositoryImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package stirling.software.SPDF.repository; - -import java.util.Date; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken; -import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; - -import stirling.software.SPDF.model.PersistentLogin; - -public class JPATokenRepositoryImpl implements PersistentTokenRepository { - - @Autowired - private PersistentLoginRepository persistentLoginRepository; - - @Override - public void createNewToken(PersistentRememberMeToken token) { - PersistentLogin newToken = new PersistentLogin(); - newToken.setSeries(token.getSeries()); - newToken.setUsername(token.getUsername()); - newToken.setToken(token.getTokenValue()); - newToken.setLastUsed(token.getDate()); - persistentLoginRepository.save(newToken); - } - - @Override - public void updateToken(String series, String tokenValue, Date lastUsed) { - PersistentLogin existingToken = persistentLoginRepository.findById(series).orElse(null); - if (existingToken != null) { - existingToken.setToken(tokenValue); - existingToken.setLastUsed(lastUsed); - persistentLoginRepository.save(existingToken); - } - } - - @Override - public PersistentRememberMeToken getTokenForSeries(String seriesId) { - PersistentLogin token = persistentLoginRepository.findById(seriesId).orElse(null); - if (token != null) { - return new PersistentRememberMeToken(token.getUsername(), token.getSeries(), token.getToken(), token.getLastUsed()); - } - return null; - } - - @Override - public void removeUserTokens(String username) { - for (PersistentLogin token : persistentLoginRepository.findAll()) { - if (token.getUsername().equals(username)) { - persistentLoginRepository.delete(token); - } - } - } -} diff --git a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java b/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java deleted file mode 100644 index 10c1acae..00000000 --- a/src/main/java/stirling/software/SPDF/repository/PersistentLoginRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package stirling.software.SPDF.repository; - -import org.springframework.data.jpa.repository.JpaRepository; - -import stirling.software.SPDF.model.PersistentLogin; - -public interface PersistentLoginRepository extends JpaRepository { -} diff --git a/src/main/java/stirling/software/SPDF/repository/UserRepository.java b/src/main/java/stirling/software/SPDF/repository/UserRepository.java deleted file mode 100644 index 744953d7..00000000 --- a/src/main/java/stirling/software/SPDF/repository/UserRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package stirling.software.SPDF.repository; - -import java.util.Optional; - -import org.springframework.data.jpa.repository.JpaRepository; - -import stirling.software.SPDF.model.User; - -public interface UserRepository extends JpaRepository { - Optional findByUsername(String username); - User findByApiKey(String apiKey); -} - diff --git a/src/main/java/stirling/software/SPDF/utils/ErrorUtils.java b/src/main/java/stirling/software/SPDF/utils/ErrorUtils.java deleted file mode 100644 index 493ce63e..00000000 --- a/src/main/java/stirling/software/SPDF/utils/ErrorUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import org.springframework.ui.Model; -import org.springframework.web.servlet.ModelAndView; - -public class ErrorUtils { - - public static Model exceptionToModel(Model model, Exception ex) { - StringWriter sw = new StringWriter(); - ex.printStackTrace(new PrintWriter(sw)); - String stackTrace = sw.toString(); - - model.addAttribute("errorMessage", ex.getMessage()); - model.addAttribute("stackTrace", stackTrace); - return model; - } - - public static ModelAndView exceptionToModelView(Model model, Exception ex) { - StringWriter sw = new StringWriter(); - ex.printStackTrace(new PrintWriter(sw)); - String stackTrace = sw.toString(); - - ModelAndView modelAndView = new ModelAndView(); - modelAndView.addObject("errorMessage", ex.getMessage()); - modelAndView.addObject("stackTrace", stackTrace); - return modelAndView; - } - -} diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java deleted file mode 100644 index 9515a3ac..00000000 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ /dev/null @@ -1,95 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; - -public class FileToPdf { - public static byte[] convertHtmlToPdf(byte[] fileBytes, String fileName) throws IOException, InterruptedException { - - Path tempOutputFile = Files.createTempFile("output_", ".pdf"); - Path tempInputFile = null; - byte[] pdfBytes; - try { - if (fileName.endsWith(".html")) { - tempInputFile = Files.createTempFile("input_", ".html"); - Files.write(tempInputFile, fileBytes); - } else { - tempInputFile = unzipAndGetMainHtml(fileBytes); - } - - List command = new ArrayList<>(); - command.add("weasyprint"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - ProcessExecutorResult returnCode; - if (fileName.endsWith(".zip")) { - returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) - .runCommandWithOutputHandling(command, tempInputFile.getParent().toFile()); - } else { - - returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) - .runCommandWithOutputHandling(command); - } - - pdfBytes = Files.readAllBytes(tempOutputFile); - } finally { - // Clean up temporary files - Files.delete(tempOutputFile); - Files.delete(tempInputFile); - - if (fileName.endsWith(".zip")) { - GeneralUtils.deleteDirectory(tempInputFile.getParent()); - } - } - - return pdfBytes; - } - - - private static Path unzipAndGetMainHtml(byte[] fileBytes) throws IOException { - Path tempDirectory = Files.createTempDirectory("unzipped_"); - try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(fileBytes))) { - ZipEntry entry = zipIn.getNextEntry(); - while (entry != null) { - Path filePath = tempDirectory.resolve(entry.getName()); - if (entry.isDirectory()) { - Files.createDirectories(filePath); // Explicitly create the directory structure - } else { - Files.createDirectories(filePath.getParent()); // Create parent directories if they don't exist - Files.copy(zipIn, filePath); - } - zipIn.closeEntry(); - entry = zipIn.getNextEntry(); - } - } - - //search for the main HTML file. - try (Stream walk = Files.walk(tempDirectory)) { - List htmlFiles = walk.filter(file -> file.toString().endsWith(".html")) - .collect(Collectors.toList()); - - if (htmlFiles.isEmpty()) { - throw new IOException("No HTML files found in the unzipped directory."); - } - - // Prioritize 'index.html' if it exists, otherwise use the first .html file - for (Path htmlFile : htmlFiles) { - if (htmlFile.getFileName().toString().equals("index.html")) { - return htmlFile; - } - } - - return htmlFiles.get(0); - } - } -} diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java deleted file mode 100644 index 3097fc1b..00000000 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ /dev/null @@ -1,157 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.List; - -public class GeneralUtils { - - public static void deleteDirectory(Path path) throws IOException { - Files.walkFileTree(path, new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); - } - - public static String convertToFileName(String name) { - String safeName = name.replaceAll("[^a-zA-Z0-9]", "_"); - if (safeName.length() > 50) { - safeName = safeName.substring(0, 50); - } - return safeName; - } - - - public static boolean isValidURL(String urlStr) { - try { - new URL(urlStr); - return true; - } catch (MalformedURLException e) { - return false; - } - } - - - public static Long convertSizeToBytes(String sizeStr) { - if (sizeStr == null) { - return null; - } - - sizeStr = sizeStr.trim().toUpperCase(); - try { - if (sizeStr.endsWith("KB")) { - return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); - } else if (sizeStr.endsWith("MB")) { - return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024); - } else if (sizeStr.endsWith("GB")) { - return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024 * 1024 * 1024); - } else if (sizeStr.endsWith("B")) { - return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1)); - } else { - // Assume MB if no unit is specified - return (long) (Double.parseDouble(sizeStr) * 1024 * 1024); - } - } catch (NumberFormatException e) { - // The numeric part of the input string cannot be parsed, handle this case - } - - return null; - } - - public static List parsePageString(String pageOrder, int totalPages) { - return parsePageList(pageOrder.split(","), totalPages); - } - public static List parsePageList(String[] pageOrderArr, int totalPages) { - List newPageOrder = new ArrayList<>(); - - // loop through the page order array - for (String element : pageOrderArr) { - if (element.equalsIgnoreCase("all")) { - for (int i = 0; i < totalPages; i++) { - newPageOrder.add(i); - } - // As all pages are already added, no need to check further - break; - } - else if (element.matches("\\d*n\\+?-?\\d*|\\d*\\+?n")) { - // Handle page order as a function - int coefficient = 0; - int constant = 0; - boolean coefficientExists = false; - boolean constantExists = false; - - if (element.contains("n")) { - String[] parts = element.split("n"); - if (!parts[0].equals("") && parts[0] != null) { - coefficient = Integer.parseInt(parts[0]); - coefficientExists = true; - } - if (parts.length > 1 && !parts[1].equals("") && parts[1] != null) { - constant = Integer.parseInt(parts[1]); - constantExists = true; - } - } else if (element.contains("+")) { - constant = Integer.parseInt(element.replace("+", "")); - constantExists = true; - } - - for (int i = 1; i <= totalPages; i++) { - int pageNum = coefficientExists ? coefficient * i : i; - pageNum += constantExists ? constant : 0; - - if (pageNum <= totalPages && pageNum > 0) { - newPageOrder.add(pageNum - 1); - } - } - } else if (element.contains("-")) { - // split the range into start and end page - String[] range = element.split("-"); - int start = Integer.parseInt(range[0]); - int end = Integer.parseInt(range[1]); - // check if the end page is greater than total pages - if (end > totalPages) { - end = totalPages; - } - // loop through the range of pages - for (int j = start; j <= end; j++) { - // print the current index - newPageOrder.add(j - 1); - } - } else { - // if the element is a single page - newPageOrder.add(Integer.parseInt(element) - 1); - } - } - - return newPageOrder; - } - public static boolean createDir(String path) { - Path folder = Paths.get(path); - if (!Files.exists(folder)) { - try { - Files.createDirectories(folder); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - return true; - } -} diff --git a/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java b/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java deleted file mode 100644 index e34892d5..00000000 --- a/src/main/java/stirling/software/SPDF/utils/ImageProcessingUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.awt.image.BufferedImage; - -public class ImageProcessingUtils { - - static BufferedImage convertColorType(BufferedImage sourceImage, String colorType) { - BufferedImage convertedImage; - switch (colorType) { - case "greyscale": - convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY); - convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null); - break; - case "blackwhite": - convertedImage = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_BYTE_BINARY); - convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null); - break; - default: // full color - convertedImage = sourceImage; - break; - } - return convertedImage; - } - -} diff --git a/src/main/java/stirling/software/SPDF/utils/PDFManipulationUtils.java b/src/main/java/stirling/software/SPDF/utils/PDFManipulationUtils.java deleted file mode 100644 index 5718cd8a..00000000 --- a/src/main/java/stirling/software/SPDF/utils/PDFManipulationUtils.java +++ /dev/null @@ -1,5 +0,0 @@ -package stirling.software.SPDF.utils; - -public class PDFManipulationUtils { - -} diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java deleted file mode 100644 index af658f79..00000000 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ /dev/null @@ -1,99 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.multipart.MultipartFile; - -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; - -public class PDFToFile { - public ResponseEntity processPdfToOfficeFormat(MultipartFile inputFile, String outputFormat, String libreOfficeFilter) throws IOException, InterruptedException { - - if (!"application/pdf".equals(inputFile.getContentType())) { - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - - // Get the original PDF file name without the extension - String originalPdfFileName = inputFile.getOriginalFilename(); - String pdfBaseName = originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.')); - - // Validate output format - List allowedFormats = Arrays.asList("doc", "docx", "odt", "ppt", "pptx", "odp", "rtf", "html", "xml", "txt:Text"); - if (!allowedFormats.contains(outputFormat)) { - return new ResponseEntity<>(HttpStatus.BAD_REQUEST); - } - - Path tempInputFile = null; - Path tempOutputDir = null; - byte[] fileBytes; - String fileName = "temp.file"; - - try { - // Save the uploaded file to a temporary location - tempInputFile = Files.createTempFile("input_", ".pdf"); - Files.copy(inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING); - - // Prepare the output directory - tempOutputDir = Files.createTempDirectory("output_"); - - // Run the LibreOffice command - List command = new ArrayList<>( - Arrays.asList("soffice", "--infilter=" + libreOfficeFilter, "--convert-to", outputFormat, "--outdir", tempOutputDir.toString(), tempInputFile.toString())); - ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE).runCommandWithOutputHandling(command); - - // Get output files - List outputFiles = Arrays.asList(tempOutputDir.toFile().listFiles()); - - if (outputFiles.size() == 1) { - // Return single output file - File outputFile = outputFiles.get(0); - if (outputFormat.equals("txt:Text")) { - outputFormat = "txt"; - } - fileName = pdfBaseName + "." + outputFormat; - fileBytes = FileUtils.readFileToByteArray(outputFile); - } else { - // Return output files in a ZIP archive - fileName = pdfBaseName + "To" + outputFormat + ".zip"; - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream); - - for (File outputFile : outputFiles) { - ZipEntry entry = new ZipEntry(outputFile.getName()); - zipOutputStream.putNextEntry(entry); - FileInputStream fis = new FileInputStream(outputFile); - IOUtils.copy(fis, zipOutputStream); - fis.close(); - zipOutputStream.closeEntry(); - } - - zipOutputStream.close(); - fileBytes = byteArrayOutputStream.toByteArray(); - } - - } finally { - // Clean up the temporary files - if (tempInputFile != null) - Files.delete(tempInputFile); - if (tempOutputDir != null) - FileUtils.deleteDirectory(tempOutputDir.toFile()); - } - return WebResponseUtils.bytesToWebResponse(fileBytes, fileName, MediaType.APPLICATION_OCTET_STREAM); - } -} diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java deleted file mode 100644 index 2f57fe10..00000000 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ /dev/null @@ -1,377 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.imageio.ImageIO; -import javax.imageio.ImageReader; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; -import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; -import org.apache.pdfbox.text.PDFTextStripper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.multipart.MultipartFile; - -import stirling.software.SPDF.pdf.ImageFinder; - -public class PdfUtils { - - private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); - - - public static PDRectangle textToPageSize(String size) { - switch (size.toUpperCase()) { - case "A0": - return PDRectangle.A0; - case "A1": - return PDRectangle.A1; - case "A2": - return PDRectangle.A2; - case "A3": - return PDRectangle.A3; - case "A4": - return PDRectangle.A4; - case "A5": - return PDRectangle.A5; - case "A6": - return PDRectangle.A6; - case "LETTER": - return PDRectangle.LETTER; - case "LEGAL": - return PDRectangle.LEGAL; - default: - throw new IllegalArgumentException("Invalid standard page size: " + size); - } - } - - - - - public static boolean hasImages(PDDocument document, String pagesToCheck) throws IOException { - String[] pageOrderArr = pagesToCheck.split(","); - List pageList = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages()); - - for (int pageNumber : pageList) { - PDPage page = document.getPage(pageNumber); - if (hasImagesOnPage(page)) { - return true; - } - } - - return false; - } - - public static boolean hasText(PDDocument document, String pageNumbersToCheck, String phrase) throws IOException { - String[] pageOrderArr = pageNumbersToCheck.split(","); - List pageList = GeneralUtils.parsePageList(pageOrderArr, document.getNumberOfPages()); - - for (int pageNumber : pageList) { - PDPage page = document.getPage(pageNumber); - if (hasTextOnPage(page, phrase)) { - return true; - } - } - - return false; - } - - - public static boolean hasImagesOnPage(PDPage page) throws IOException { - ImageFinder imageFinder = new ImageFinder(page); - imageFinder.processPage(page); - return imageFinder.hasImages(); - } - - - - - public static boolean hasTextOnPage(PDPage page, String phrase) throws IOException { - PDFTextStripper textStripper = new PDFTextStripper(); - PDDocument tempDoc = new PDDocument(); - tempDoc.addPage(page); - String pageText = textStripper.getText(tempDoc); - tempDoc.close(); - return pageText.contains(phrase); - } - - - public boolean containsTextInFile(PDDocument pdfDocument, String text, String pagesToCheck) throws IOException { - PDFTextStripper textStripper = new PDFTextStripper(); - String pdfText = ""; - - if(pagesToCheck == null || pagesToCheck.equals("all")) { - pdfText = textStripper.getText(pdfDocument); - } else { - // remove whitespaces - pagesToCheck = pagesToCheck.replaceAll("\\s+", ""); - - String[] splitPoints = pagesToCheck.split(","); - for (String splitPoint : splitPoints) { - if (splitPoint.contains("-")) { - // Handle page ranges - String[] range = splitPoint.split("-"); - int startPage = Integer.parseInt(range[0]); - int endPage = Integer.parseInt(range[1]); - - for (int i = startPage; i <= endPage; i++) { - textStripper.setStartPage(i); - textStripper.setEndPage(i); - pdfText += textStripper.getText(pdfDocument); - } - } else { - // Handle individual page - int page = Integer.parseInt(splitPoint); - textStripper.setStartPage(page); - textStripper.setEndPage(page); - pdfText += textStripper.getText(pdfDocument); - } - } - } - - pdfDocument.close(); - - return pdfText.contains(text); - } - - - - - - public boolean pageCount(PDDocument pdfDocument, int pageCount, String comparator) throws IOException { - int actualPageCount = pdfDocument.getNumberOfPages(); - pdfDocument.close(); - - switch(comparator.toLowerCase()) { - case "greater": - return actualPageCount > pageCount; - case "equal": - return actualPageCount == pageCount; - case "less": - return actualPageCount < pageCount; - default: - throw new IllegalArgumentException("Invalid comparator. Only 'greater', 'equal', and 'less' are supported."); - } - } - - public boolean pageSize(PDDocument pdfDocument, String expectedPageSize) throws IOException { - PDPage firstPage = pdfDocument.getPage(0); - PDRectangle mediaBox = firstPage.getMediaBox(); - - float actualPageWidth = mediaBox.getWidth(); - float actualPageHeight = mediaBox.getHeight(); - - pdfDocument.close(); - - // Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842" for A4 - String[] dimensions = expectedPageSize.split("x"); - float expectedPageWidth = Float.parseFloat(dimensions[0]); - float expectedPageHeight = Float.parseFloat(dimensions[1]); - - // Checks if the actual page size matches the expected page size - return actualPageWidth == expectedPageWidth && actualPageHeight == expectedPageHeight; - } - - - - - - public static byte[] convertFromPdf(byte[] inputStream, String imageType, ImageType colorType, boolean singleImage, int DPI, String filename) throws IOException, Exception { - try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputStream))) { - PDFRenderer pdfRenderer = new PDFRenderer(document); - int pageCount = document.getNumberOfPages(); - List images = new ArrayList<>(); - - // Create images of all pages - for (int i = 0; i < pageCount; i++) { - images.add(pdfRenderer.renderImageWithDPI(i, DPI, colorType)); - } - - if (singleImage) { - // Combine all images into a single big image - BufferedImage combined = new BufferedImage(images.get(0).getWidth(), images.get(0).getHeight() * pageCount, BufferedImage.TYPE_INT_RGB); - Graphics g = combined.getGraphics(); - for (int i = 0; i < images.size(); i++) { - g.drawImage(images.get(i), 0, i * images.get(0).getHeight(), null); - } - images = Arrays.asList(combined); - } - - // Create a ByteArrayOutputStream to save the image(s) to - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - if (singleImage) { - // Write the image to the output stream - ImageIO.write(images.get(0), imageType, baos); - - // Log that the image was successfully written to the byte array - logger.info("Image successfully written to byte array"); - } else { - // Zip the images and return as byte array - try (ZipOutputStream zos = new ZipOutputStream(baos)) { - for (int i = 0; i < images.size(); i++) { - BufferedImage image = images.get(i); - try (ByteArrayOutputStream baosImage = new ByteArrayOutputStream()) { - ImageIO.write(image, imageType, baosImage); - - // Add the image to the zip file - zos.putNextEntry(new ZipEntry(String.format(filename + "_%d.%s", i + 1, imageType.toLowerCase()))); - zos.write(baosImage.toByteArray()); - } - } - // Log that the images were successfully written to the byte array - logger.info("Images successfully written to byte array as a zip"); - } - } - return baos.toByteArray(); - } catch (IOException e) { - // Log an error message if there is an issue converting the PDF to an image - logger.error("Error converting PDF to image", e); - throw e; - } - } - public static byte[] imageToPdf(MultipartFile[] files, String fitOption, boolean autoRotate, String colorType) throws IOException { - try (PDDocument doc = new PDDocument()) { - for (MultipartFile file : files) { - String contentType = file.getContentType(); - String originalFilename = file.getOriginalFilename(); - if (originalFilename != null && (originalFilename.toLowerCase().endsWith(".tiff") || originalFilename.toLowerCase().endsWith(".tif")) ) { - ImageReader reader = ImageIO.getImageReadersByFormatName("tiff").next(); - reader.setInput(ImageIO.createImageInputStream(file.getInputStream())); - int numPages = reader.getNumImages(true); - for (int i = 0; i < numPages; i++) { - BufferedImage pageImage = reader.read(i); - BufferedImage convertedImage = ImageProcessingUtils.convertColorType(pageImage, colorType); - PDImageXObject pdImage = LosslessFactory.createFromImage(doc, convertedImage); - addImageToDocument(doc, pdImage, fitOption, autoRotate); - } - } else { - File imageFile = Files.createTempFile("image", ".png").toFile(); - try (FileOutputStream fos = new FileOutputStream(imageFile); InputStream input = file.getInputStream()) { - byte[] buffer = new byte[1024]; - int len; - while ((len = input.read(buffer)) != -1) { - fos.write(buffer, 0, len); - } - BufferedImage image = ImageIO.read(imageFile); - BufferedImage convertedImage = ImageProcessingUtils.convertColorType(image, colorType); - PDImageXObject pdImage; - if (contentType != null && (contentType.equals("image/jpeg"))) { - pdImage = JPEGFactory.createFromImage(doc, convertedImage); - } else { - pdImage = LosslessFactory.createFromImage(doc, convertedImage); - } - addImageToDocument(doc, pdImage, fitOption, autoRotate); - } catch (IOException e) { - logger.error("Error writing image to file: {}", imageFile.getAbsolutePath(), e); - throw e; - } finally { - imageFile.delete(); - } - } - } - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - doc.save(byteArrayOutputStream); - logger.info("PDF successfully saved to byte array"); - return byteArrayOutputStream.toByteArray(); - } - } - - private static void addImageToDocument(PDDocument doc, PDImageXObject image, String fitOption, boolean autoRotate) throws IOException { - boolean imageIsLandscape = image.getWidth() > image.getHeight(); - PDRectangle pageSize = PDRectangle.A4; - - System.out.println(fitOption); - - if (autoRotate && imageIsLandscape) { - pageSize = new PDRectangle(pageSize.getHeight(), pageSize.getWidth()); - } - - if ("fitDocumentToImage".equals(fitOption)) { - pageSize = new PDRectangle(image.getWidth(), image.getHeight()); - } - - PDPage page = new PDPage(pageSize); - doc.addPage(page); - - float pageWidth = page.getMediaBox().getWidth(); - float pageHeight = page.getMediaBox().getHeight(); - - try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) { - if ("fillPage".equals(fitOption) || "fitDocumentToImage".equals(fitOption)) { - contentStream.drawImage(image, 0, 0, pageWidth, pageHeight); - } else if ("maintainAspectRatio".equals(fitOption)) { - float imageAspectRatio = (float) image.getWidth() / (float) image.getHeight(); - float pageAspectRatio = pageWidth / pageHeight; - - float scaleFactor = 1.0f; - if (imageAspectRatio > pageAspectRatio) { - scaleFactor = pageWidth / image.getWidth(); - } else { - scaleFactor = pageHeight / image.getHeight(); - } - - float xPos = (pageWidth - (image.getWidth() * scaleFactor)) / 2; - float yPos = (pageHeight - (image.getHeight() * scaleFactor)) / 2; - contentStream.drawImage(image, xPos, yPos, image.getWidth() * scaleFactor, image.getHeight() * scaleFactor); - } - } catch (IOException e) { - logger.error("Error adding image to PDF", e); - throw e; - } - } - - - public static byte[] overlayImage(byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage) throws IOException { - - PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes)); - - // Get the first page of the PDF - int pages = document.getNumberOfPages(); - for (int i = 0; i < pages; i++) { - PDPage page = document.getPage(i); - try (PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true)) { - // Create an image object from the image bytes - PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, ""); - // Draw the image onto the page at the specified x and y coordinates - contentStream.drawImage(image, x, y); - logger.info("Image successfully overlayed onto PDF"); - if (!everyPage && i == 0) { - break; - } - } catch (IOException e) { - // Log an error message if there is an issue overlaying the image onto the PDF - logger.error("Error overlaying image onto PDF", e); - throw e; - } - - } - // Create a ByteArrayOutputStream to save the PDF to - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - logger.info("PDF successfully saved to byte array"); - return baos.toByteArray(); - } - - - - -} diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java deleted file mode 100644 index fe5c6717..00000000 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ /dev/null @@ -1,135 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Semaphore; - -public class ProcessExecutor { - - public enum Processes { - LIBRE_OFFICE, OCR_MY_PDF, PYTHON_OPENCV, GHOSTSCRIPT, WEASYPRINT - } - - private static final Map instances = new ConcurrentHashMap<>(); - - public static ProcessExecutor getInstance(Processes processType) { - return instances.computeIfAbsent(processType, key -> { - int semaphoreLimit = switch (key) { - case LIBRE_OFFICE -> 1; - case OCR_MY_PDF -> 2; - case PYTHON_OPENCV -> 8; - case GHOSTSCRIPT -> 16; - case WEASYPRINT -> 16; - }; - return new ProcessExecutor(semaphoreLimit); - }); - } - - private final Semaphore semaphore; - - private ProcessExecutor(int semaphoreLimit) { - this.semaphore = new Semaphore(semaphoreLimit); - } - public ProcessExecutorResult runCommandWithOutputHandling(List command) throws IOException, InterruptedException { - return runCommandWithOutputHandling(command, null); - } - public ProcessExecutorResult runCommandWithOutputHandling(List command, File workingDirectory) throws IOException, InterruptedException { - int exitCode = 1; - String messages = ""; - semaphore.acquire(); - try { - - System.out.print("Running command: " + String.join(" ", command)); - ProcessBuilder processBuilder = new ProcessBuilder(command); - - // Use the working directory if it's set - if (workingDirectory != null) { - processBuilder.directory(workingDirectory); - } - Process process = processBuilder.start(); - - // Read the error stream and standard output stream concurrently - List errorLines = new ArrayList<>(); - List outputLines = new ArrayList<>(); - - Thread errorReaderThread = new Thread(() -> { - try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8))) { - String line; - while ((line = errorReader.readLine()) != null) { - errorLines.add(line); - } - } catch (IOException e) { - e.printStackTrace(); - } - }); - - Thread outputReaderThread = new Thread(() -> { - try (BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8))) { - String line; - while ((line = outputReader.readLine()) != null) { - outputLines.add(line); - } - } catch (IOException e) { - e.printStackTrace(); - } - }); - - errorReaderThread.start(); - outputReaderThread.start(); - - // Wait for the conversion process to complete - exitCode = process.waitFor(); - - // Wait for the reader threads to finish - errorReaderThread.join(); - outputReaderThread.join(); - - if (outputLines.size() > 0) { - String outputMessage = String.join("\n", outputLines); - messages += outputMessage; - System.out.println("Command output:\n" + outputMessage); - } - - if (errorLines.size() > 0) { - String errorMessage = String.join("\n", errorLines); - messages += errorMessage; - System.out.println("Command error output:\n" + errorMessage); - if (exitCode != 0) { - throw new IOException("Command process failed with exit code " + exitCode + ". Error message: " + errorMessage); - } - } - } finally { - semaphore.release(); - } - return new ProcessExecutorResult(exitCode, messages); - } - public class ProcessExecutorResult{ - int rc; - String messages; - public ProcessExecutorResult(int rc, String messages) { - this.rc = rc; - this.messages = messages; - } - public int getRc() { - return rc; - } - public void setRc(int rc) { - this.rc = rc; - } - public String getMessages() { - return messages; - } - public void setMessages(String messages) { - this.messages = messages; - } - - - } -} diff --git a/src/main/java/stirling/software/SPDF/utils/PropertyConfigs.java b/src/main/java/stirling/software/SPDF/utils/PropertyConfigs.java deleted file mode 100644 index 8d12267c..00000000 --- a/src/main/java/stirling/software/SPDF/utils/PropertyConfigs.java +++ /dev/null @@ -1,49 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.util.List; - -public class PropertyConfigs { - - - public static boolean getBooleanValue(List keys, boolean defaultValue) { - for (String key : keys) { - String value = System.getProperty(key); - if (value == null) - value = System.getenv(key); - - if (value != null) - return Boolean.valueOf(value); - } - return defaultValue; - } - - public static String getStringValue(List keys, String defaultValue) { - for (String key : keys) { - String value = System.getProperty(key); - if (value == null) - value = System.getenv(key); - - if (value != null) - return value; - } - return defaultValue; - } - - - - - public static boolean getBooleanValue(String key, boolean defaultValue) { - String value = System.getProperty(key); - if (value == null) - value = System.getenv(key); - return (value != null) ? Boolean.valueOf(value) : defaultValue; - } - - public static String getStringValue(String key, String defaultValue) { - String value = System.getProperty(key); - if (value == null) - value = System.getenv(key); - return (value != null) ? value : defaultValue; - } - -} diff --git a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java deleted file mode 100644 index 131aaf03..00000000 --- a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -package stirling.software.SPDF.utils; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.multipart.MultipartFile; - - -public class WebResponseUtils { - - public static ResponseEntity boasToWebResponse(ByteArrayOutputStream baos, String docName) throws IOException { - return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), docName); - } - - public static ResponseEntity boasToWebResponse(ByteArrayOutputStream baos, String docName, MediaType mediaType) throws IOException { - return WebResponseUtils.bytesToWebResponse(baos.toByteArray(), docName, mediaType); - } - - - public static ResponseEntity multiPartFileToWebResponse(MultipartFile file) throws IOException { - String fileName = file.getOriginalFilename(); - MediaType mediaType = MediaType.parseMediaType(file.getContentType()); - - byte[] bytes = file.getBytes(); - - return bytesToWebResponse(bytes, fileName, mediaType); - } - - public static ResponseEntity bytesToWebResponse(byte[] bytes, String docName, MediaType mediaType) throws IOException { - - // Return the PDF as a response - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(mediaType); - headers.setContentLength(bytes.length); - String encodedDocName = URLEncoder.encode(docName, StandardCharsets.UTF_8.toString()).replaceAll("\\+", "%20"); - headers.setContentDispositionFormData("attachment", encodedDocName); - return new ResponseEntity<>(bytes, headers, HttpStatus.OK); - } - - public static ResponseEntity bytesToWebResponse(byte[] bytes, String docName) throws IOException { - return bytesToWebResponse(bytes, docName, MediaType.APPLICATION_PDF); - } - - public static ResponseEntity pdfDocToWebResponse(PDDocument document, String docName) throws IOException { - - // Open Byte Array and save document to it - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - document.save(baos); - // Close the document - document.close(); - - return boasToWebResponse(baos, docName); - } - - - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index f8cfc519..00000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,47 +0,0 @@ -multipart.enabled=true - - -server.forward-headers-strategy=NATIVE - -server.error.path=/error -server.error.whitelabel.enabled=false -server.error.include-stacktrace=always -server.error.include-exception=true -server.error.include-message=always - -#logging.level.org.springframework.web=DEBUG -#logging.level.org.springframework=DEBUG -#logging.level.org.springframework.security=DEBUG - -spring.servlet.multipart.max-file-size=2000MB -spring.servlet.multipart.max-request-size=2000MB - -server.servlet.session.tracking-modes=cookie -server.servlet.context-path=${SYSTEM_ROOTURIPATH:/} - -spring.devtools.restart.enabled=true -spring.devtools.livereload.enabled=true - -spring.thymeleaf.encoding=UTF-8 - -server.connection-timeout=${SYSTEM_CONNECTIONTIMEOUTMINUTES:5m} -spring.mvc.async.request-timeout=${SYSTEM_CONNECTIONTIMEOUTMILLISECONDS:300000} - -spring.resources.static-locations=file:customFiles/static/ -#spring.thymeleaf.prefix=file:/customFiles/templates/,classpath:/templates/ -#spring.thymeleaf.cache=false - -spring.datasource.url=jdbc:h2:file:./configs/stirling-pdf-DB;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE -spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= -spring.h2.console.enabled=true -spring.jpa.hibernate.ddl-auto=update - -# Change the default URL path for OpenAPI JSON -springdoc.api-docs.path=/v1/api-docs - -# Set the URL of the OpenAPI JSON for the Swagger UI -springdoc.swagger-ui.url=/v1/api-docs - - diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties deleted file mode 100644 index d6a58a9f..00000000 --- a/src/main/resources/log4j.properties +++ /dev/null @@ -1,8 +0,0 @@ -log4j.rootLogger=ERROR,stdout -log4j.logger.com.endeca=INFO -# Logger for crawl metrics -log4j.logger.com.endeca.itl.web.metrics=INFO - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%p\t%d{ISO8601}\t%r\t%c\t[%t]\t%m%n \ No newline at end of file diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties deleted file mode 100644 index 96c66e3d..00000000 --- a/src/main/resources/messages.properties +++ /dev/null @@ -1,11 +0,0 @@ -fileToPDF.fileTypesList=Microsoft Word: (DOC, DOCX, DOT, DOTX)
\ -Microsoft Excel: (CSV, XLS, XLSX, XLT, XLTX, SLK, DIF)
\ -Microsoft PowerPoint: (PPT, PPTX)
\ -OpenDocument Formats: (ODT, OTT, ODS, OTS, ODP, OTP, ODG, OTG)
\ -Plain Text: (TXT, TEXT, XML)
\ -Rich Text Format: (RTF)
\ -Images: (BMP, GIF, JPEG, PNG, TIF, PBM, PGM, PPM, RAS, XBM, XPM, SVG, SVM, WMF)
\ -HTML: (HTML)
\ -Lotus Word Pro: (LWP)
\ -StarOffice formats: (SDA, SDC, SDD, SDW, STC, STD, STI, STW, SXD, SXG, SXI, SXW)
\ -Other formats: (DBF, FODS, VSD, VOR, VOR3, VOR4, UOP, PCT, PS, PDF) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties deleted file mode 100644 index d8722e95..00000000 --- a/src/main/resources/messages_ar_AR.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=rtl - -pdfPrompt=اختر PDF -multiPdfPrompt=اختر ملفات PDF (2+) -multiPdfDropPrompt=حدد (أو اسحب وأفلت) جميع ملفات PDF التي تحتاجها -imgPrompt=اختر صورة -genericSubmit=إرسال -processTimeWarning=تحذير: يمكن أن تستغرق هذه العملية ما يصل إلى دقيقة حسب حجم الملف -pageOrderPrompt=ترتيب الصفحات (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): -goToPage=اذهب -true=\u0635\u062D\u064A\u062D -false=\u062E\u0637\u0623 -unknown=\u063A\u064A\u0631 \u0645\u0639\u0631\u0648\u0641 -save=\u062D\u0641\u0638 -close=\u0625\u063A\u0644\u0627\u0642 -filesSelected=الملفات المحددة -noFavourites=لم تتم إضافة أي مفضلات -bored=الانتظار بالملل؟ -alphabet=\u0627\u0644\u0623\u0628\u062C\u062F\u064A\u0629 -downloadPdf=تنزيل PDF -text=نص -font=الخط -selectFillter=- حدد - -pageNum=رقم الصفحة -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=تحويل -navbar.security=الأمان -navbar.other=أخرى -navbar.darkmode=الوضع الداكن -navbar.pageOps=عمليات الصفحة -navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A - -############# -# SETTINGS # -############# -settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A -settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D -settings.appVersion=\u0625\u0635\u062F\u0627\u0631 \u0627\u0644\u062A\u0637\u0628\u064A\u0642: -settings.downloadOption.title=\u062A\u062D\u062F\u064A\u062F \u062E\u064A\u0627\u0631 \u0627\u0644\u062A\u0646\u0632\u064A\u0644 (\u0644\u0644\u062A\u0646\u0632\u064A\u0644\u0627\u062A \u0630\u0627\u062A \u0627\u0644\u0645\u0644\u0641 \u0627\u0644\u0648\u0627\u062D\u062F \u063A\u064A\u0631 \u0627\u0644\u0645\u0636\u063A\u0648\u0637): -settings.downloadOption.1=\u0641\u062A\u062D \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0646\u0627\u0641\u0630\u0629 -settings.downloadOption.2=\u0641\u062A\u062D \u0641\u064A \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629 -settings.downloadOption.3=\u062A\u0646\u0632\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 -settings.zipThreshold=\u0645\u0644\u0641\u0627\u062A \u0645\u0636\u063A\u0648\u0637\u0629 \u0639\u0646\u062F \u062A\u062C\u0627\u0648\u0632 \u0639\u062F\u062F \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0645 \u062A\u0646\u0632\u064A\u0644\u0647\u0627 -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=متجرك الشامل المستضاف محليًا لجميع احتياجات PDF الخاصة بك. - - -home.multiTool.title=أداة متعددة PDF -home.multiTool.desc=دمج الصفحات وتدويرها وإعادة ترتيبها وإزالتها -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=دمج ملفات -home.merge.desc=دمج ملفات PDF متعددة في ملف واحد بسهولة. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=انقسام ملفات -home.split.desc=تقسيم ملفات PDF إلى مستندات متعددة -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=تدوير ملفات -home.rotate.desc=قم بتدوير ملفات PDF الخاصة بك بسهولة. -rotate.tags=server side - - -home.imageToPdf.title=صورة إلى PDF -home.imageToPdf.desc=تحويل الصور (PNG ، JPEG ، GIF) إلى PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=تحويل PDF إلى صورة -home.pdfToImage.desc=تحويل ملف PDF إلى صورة. (PNG ، JPEG ، GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=منظم -home.pdfOrganiser.desc=إزالة / إعادة ترتيب الصفحات بأي ترتيب -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=إضافة صورة إلى ملف PDF -home.addImage.desc=إضافة صورة إلى موقع معين في PDF (العمل قيد التقدم) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=إضافة علامة مائية -home.watermark.desc=أضف علامة مائية مخصصة إلى مستند PDF الخاص بك. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=تغيير الأذونات -home.permissions.desc=قم بتغيير أذونات مستند PDF الخاص بك -permissions.tags=read,write,edit,print - - -home.removePages.title=إزالة الصفحات -home.removePages.desc=حذف الصفحات غير المرغوب فيها من مستند PDF الخاص بك. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=إضافة كلمة مرور -home.addPassword.desc=تشفير مستند PDF الخاص بك بكلمة مرور. -addPassword.tags=secure,security - -home.removePassword.title=إزالة كلمة المرور -home.removePassword.desc=إزالة الحماية بكلمة مرور من مستند PDF الخاص بك. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=ضغط ملفات -home.compressPdfs.desc=ضغط ملفات PDF لتقليل حجم الملف. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 -home.changeMetadata.desc=\u062A\u063A\u064A\u064A\u0631 / \u0625\u0632\u0627\u0644\u0629 / \u0625\u0636\u0627\u0641\u0629 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u0646 \u0645\u0633\u062A\u0646\u062F PDF -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u0644\u0641 \u0625\u0644\u0649 PDF -home.fileToPDF.desc=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u062A\u0642\u0631\u064A\u0628\u0627 \u0625\u0644\u0649 PDF (DOCX \u0648PNG \u0648XLS \u0648PPT \u0648TXT \u0648\u0627\u0644\u0645\u0632\u064A\u062F) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=\u062A\u0634\u063A\u064A\u0644 OCR \u0639\u0644\u0649 PDF \u0648 / \u0623\u0648 \u0645\u0633\u062D \u0636\u0648\u0626\u064A -home.ocr.desc=\u064A\u0642\u0648\u0645 \u0628\u0631\u0646\u0627\u0645\u062C \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0628\u0645\u0633\u062D \u0648\u0627\u0643\u062A\u0634\u0627\u0641 \u0627\u0644\u0646\u0635 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631 \u062F\u0627\u062E\u0644 \u0645\u0644\u0641 PDF \u0648\u064A\u0639\u064A\u062F \u0625\u0636\u0627\u0641\u062A\u0647 \u0643\u0646\u0635 -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 -home.extractImages.desc=\u064A\u0633\u062A\u062E\u0631\u062C \u062C\u0645\u064A\u0639 \u0627\u0644\u0635\u0648\u0631 \u0645\u0646 \u0645\u0644\u0641 PDF \u0648\u064A\u062D\u0641\u0638\u0647\u0627 \u0641\u064A \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=\u062A\u062D\u0648\u064A\u0644 \u0645\u0644\u0641\u0627\u062A PDF \u0625\u0644\u0649 PDF / A -home.pdfToPDFA.desc=\u062A\u062D\u0648\u064A\u0644 PDF \u0625\u0644\u0649 PDF / A \u0644\u0644\u062A\u062E\u0632\u064A\u0646 \u0637\u0648\u064A\u0644 \u0627\u0644\u0645\u062F\u0649 -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=تحويل PDF إلى Word -home.PDFToWord.desc=تحويل PDF إلى تنسيقات Word (DOC و DOCX و ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF للعرض التقديمي -home.PDFToPresentation.desc=تحويل PDF إلى تنسيقات عرض تقديمي (PPT و PPTX و ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=تحويل PDF إلى نص / RTF -home.PDFToText.desc=تحويل PDF إلى تنسيق نص أو RTF -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=تحويل PDF إلى HTML -home.PDFToHTML.desc=تحويل PDF إلى تنسيق HTML -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=تحويل PDF إلى XML -home.PDFToXML.desc=تحويل PDF إلى تنسيق XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=كشف / انقسام الصور الممسوحة ضوئيًا -home.ScannerImageSplit.desc=تقسيم عدة صور من داخل صورة / ملف PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=تسجيل الدخول -home.sign.desc=إضافة التوقيع إلى PDF عن طريق الرسم أو النص أو الصورة -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=تسطيح -home.flatten.desc=قم بإزالة كافة العناصر والنماذج التفاعلية من ملف PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=إصلاح -home.repair.desc=يحاول إصلاح ملف PDF تالف / معطل -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=إزالة الصفحات الفارغة -home.removeBlanks.desc=يكتشف ويزيل الصفحات الفارغة من المستند -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=قارن -home.compare.desc=يقارن ويظهر الاختلافات بين 2 من مستندات PDF -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=توقيع الشهادة -certSign.header=قم بتوقيع ملف PDF بشهادتك (العمل قيد التقدم) -certSign.selectPDF=حدد ملف PDF للتوقيع: -certSign.selectKey=حدد ملف المفتاح الخاص (تنسيق PKCS # 8 ، يمكن أن يكون .pem أو .der): -certSign.selectCert=حدد ملف الشهادة الخاص بك (تنسيق X.509 ، يمكن أن يكون .pem أو .der): -certSign.selectP12=حدد ملف تخزين المفاتيح PKCS # 12 (.p12 أو .pfx) (اختياري ، إذا تم توفيره ، يجب أن يحتوي على مفتاحك الخاص وشهادتك): -certSign.certType=نوع الشهادة -certSign.password=أدخل ملف تخزين المفاتيح أو كلمة المرور الخاصة (إن وجدت): -certSign.showSig=إظهار التوقيع -certSign.reason=السبب -certSign.location=الموقع -certSign.name=الاسم -certSign.submit=تسجيل PDF - - -#removeBlanks -removeBlanks.title=إزالة الفراغات -removeBlanks.header=إزالة الصفحات الفارغة -removeBlanks.threshold=العتبة: -removeBlanks.thresholdDesc=الحد الفاصل لتحديد مدى بياض البكسل الأبيض -removeBlanks.whitePercent=نسبة الأبيض (٪): -removeBlanks.whitePercentDesc=النسبة المئوية للصفحة التي يجب أن تكون بيضاء لتتم إزالتها -removeBlanks.submit=إزالة الفراغات - - -#compare -compare.title=يقارن -compare.header=قارن ملفات PDF -compare.document.1=المستند 1 -compare.document.2=المستند 2 -compare.submit=يقارن - - -#sign -sign.title=تسجيل الدخول -sign.header=توقيع ملفات PDF -sign.upload=تحميل الصورة -sign.draw=رسم التوقيع -sign.text=Text Input -sign.clear=واضح -sign.add=إضافة - - -#repair -repair.title=إصلاح -repair.header=إصلاح ملفات PDF -repair.submit=الإصلاح - - -#flatten -flatten.title=تسطيح -flatten.header=تسوية ملفات PDF -flatten.submit=تسطيح - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=عتبة الزاوية: -ScannerImageSplit.selectText.2=تعيين الحد الأدنى للزاوية المطلقة المطلوبة لتدوير الصورة (افتراضي: 10). -ScannerImageSplit.selectText.3=التسامح: -ScannerImageSplit.selectText.4=يحدد نطاق تباين اللون حول لون الخلفية المقدر (الافتراضي: 30). -ScannerImageSplit.selectText.5=أدنى مساحة: -ScannerImageSplit.selectText.6=تعيين الحد الأدنى لمنطقة الصورة (الافتراضي: 10000). -ScannerImageSplit.selectText.7=الحد الأدنى لمنطقة المحيط: -ScannerImageSplit.selectText.8=تعيين الحد الأدنى لمنطقة المحيط للصورة -ScannerImageSplit.selectText.9=حجم الحدود: -ScannerImageSplit.selectText.10=يضبط حجم الحدود المضافة والمزالة لمنع الحدود البيضاء في الإخراج (الافتراضي: 1). - - -#OCR -ocr.title=\u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 / \u062A\u0646\u0638\u064A\u0641 \u0627\u0644\u0645\u0633\u062D \u0627\u0644\u0636\u0648\u0626\u064A -ocr.header=\u0645\u0633\u062D \u0627\u0644\u0645\u0633\u062D \u0627\u0644\u0636\u0648\u0626\u064A / \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 (\u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641) -ocr.selectText.1=\u062D\u062F\u062F \u0627\u0644\u0644\u063A\u0627\u062A \u0627\u0644\u062A\u064A \u0633\u064A\u062A\u0645 \u0627\u0643\u062A\u0634\u0627\u0641\u0647\u0627 \u062F\u0627\u062E\u0644 \u0645\u0644\u0641 PDF (\u0627\u0644\u0644\u063A\u0627\u062A \u0627\u0644\u0645\u062F\u0631\u062C\u0629 \u0647\u064A \u062A\u0644\u0643 \u0627\u0644\u062A\u064A \u062A\u0645 \u0627\u0643\u062A\u0634\u0627\u0641\u0647\u0627 \u062D\u0627\u0644\u064A\u064B\u0627): -ocr.selectText.2=\u0625\u0646\u062A\u0627\u062C \u0645\u0644\u0641 \u0646\u0635\u064A \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635 OCR \u0628\u062C\u0627\u0646\u0628 \u0645\u0644\u0641 PDF \u0627\u0644\u0630\u064A \u062A\u0645 \u0625\u0639\u062F\u0627\u062F\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 OCR -ocr.selectText.3=\u062A\u0645 \u0645\u0633\u062D \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u0635\u062D\u064A\u062D\u0629 \u0636\u0648\u0626\u064A\u064B\u0627 \u0628\u0632\u0627\u0648\u064A\u0629 \u0645\u0646\u062D\u0631\u0641\u0629 \u0639\u0646 \u0637\u0631\u064A\u0642 \u062A\u062F\u0648\u064A\u0631\u0647\u0627 \u0645\u0631\u0629 \u0623\u062E\u0631\u0649 \u0641\u064A \u0645\u0643\u0627\u0646\u0647\u0627 -ocr.selectText.4=\u0635\u0641\u062D\u0629 \u0646\u0638\u064A\u0641\u0629 \u0644\u0630\u0644\u0643 \u0645\u0646 \u063A\u064A\u0631 \u0627\u0644\u0645\u062D\u062A\u0645\u0644 \u0623\u0646 \u064A\u062C\u062F OCR \u0646\u0635\u064B\u0627 \u0641\u064A \u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u062E\u0644\u0641\u064A\u0629. (\u0644\u0627 \u064A\u0648\u062C\u062F \u062A\u063A\u064A\u064A\u0631 \u0641\u064A \u0627\u0644\u0625\u062E\u0631\u0627\u062C) -ocr.selectText.5=\u0635\u0641\u062D\u0629 \u0646\u0638\u064A\u0641\u0629 \u060C \u0644\u0630\u0644\u0643 \u0645\u0646 \u063A\u064A\u0631 \u0627\u0644\u0645\u062D\u062A\u0645\u0644 \u0623\u0646 \u064A\u062C\u062F OCR \u0646\u0635\u064B\u0627 \u0641\u064A \u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u062E\u0644\u0641\u064A\u0629 \u060C \u0648\u064A\u062D\u0627\u0641\u0638 \u0639\u0644\u0649 \u0627\u0644\u062A\u0646\u0638\u064A\u0641 \u0641\u064A \u0627\u0644\u0625\u062E\u0631\u0627\u062C. -ocr.selectText.6=\u064A\u062A\u062C\u0627\u0647\u0644 \u0627\u0644\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635 \u062A\u0641\u0627\u0639\u0644\u064A \u060C \u0641\u0642\u0637 \u0635\u0641\u062D\u0627\u062A OCRs \u0627\u0644\u062A\u064A \u0647\u064A \u0635\u0648\u0631 -ocr.selectText.7=\u0641\u0631\u0636 \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 \u060C \u0633\u064A\u0624\u062F\u064A \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 \u0639\u0644\u0649 \u0643\u0644 \u0635\u0641\u062D\u0629 \u0625\u0644\u0649 \u0625\u0632\u0627\u0644\u0629 \u062C\u0645\u064A\u0639 \u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0646\u0635 \u0627\u0644\u0623\u0635\u0644\u064A -ocr.selectText.8=\u0639\u0627\u062F\u064A (\u062E\u0637\u0623 \u0625\u0630\u0627 \u0643\u0627\u0646 PDF \u064A\u062D\u062A\u0648\u064A \u0639\u0644\u0649 \u0646\u0635) -ocr.selectText.9=\u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0625\u0636\u0627\u0641\u064A\u0629 -ocr.selectText.10=\u0648\u0636\u0639 \u0627\u0644\u062A\u0639\u0631\u0641 \u0627\u0644\u0636\u0648\u0626\u064A \u0639\u0644\u0649 \u0627\u0644\u062D\u0631\u0648\u0641 -ocr.selectText.11=إزالة الصور بعد التعرف الضوئي على الحروف (يزيل كل الصور ، يكون مفيدًا فقط إذا كان جزءًا من خطوة التحويل) -ocr.selectText.12=نوع العرض (متقدم) -ocr.help=\u064A\u0631\u062C\u0649 \u0642\u0631\u0627\u0621\u0629 \u0647\u0630\u0647 \u0627\u0644\u0648\u062B\u0627\u0626\u0642 \u062D\u0648\u0644 \u0643\u064A\u0641\u064A\u0629 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0647\u0630\u0627 \u0644\u0644\u063A\u0627\u062A \u0623\u062E\u0631\u0649 \u0648 / \u0623\u0648 \u0627\u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0644\u064A\u0633 \u0641\u064A \u0639\u0627\u0645\u0644 \u0627\u0644\u0625\u0631\u0633\u0627\u0621 -ocr.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0648 Tesseract \u0644 OCR. -ocr.submit=\u0645\u0639\u0627\u0644\u062C\u0629 PDF \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645 OCR - - -#extractImages -extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 -extractImages.header=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 -extractImages.selectText=\u062D\u062F\u062F \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0633\u062A\u062E\u0631\u062C\u0629 \u0625\u0644\u0649 -extractImages.submit=\u0627\u0633\u062A\u062E\u0631\u0627\u062C - - -#File to PDF -fileToPDF.title=\u0645\u0644\u0641 \u0625\u0644\u0649 PDF -fileToPDF.header=\u062A\u062D\u0648\u064A\u0644 \u0623\u064A \u0645\u0644\u0641 \u0625\u0644\u0649 PDF -fileToPDF.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 \u0644\u064A\u0628\u0631 \u0623\u0648\u0641\u064A\u0633 \u0648\u0623\u0648\u0646\u0648\u0643\u0648\u0646\u0641 \u0644\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A. -fileToPDF.supportedFileTypes=\u064A\u062C\u0628 \u0623\u0646 \u062A\u062A\u0636\u0645\u0646 \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0645\u062F\u0639\u0648\u0645\u0629 \u0645\u0627 \u064A\u0644\u064A \u0648\u0644\u0643\u0646 \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0645\u062D\u062F\u062B\u0629 \u0643\u0627\u0645\u0644\u0629 \u0628\u0627\u0644\u062A\u0646\u0633\u064A\u0642\u0627\u062A \u0627\u0644\u0645\u062F\u0639\u0648\u0645\u0629 \u060C \u064A\u0631\u062C\u0649 \u0627\u0644\u0631\u062C\u0648\u0639 \u0625\u0644\u0649 \u0648\u062B\u0627\u0626\u0642 LibreOffice -fileToPDF.submit=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 PDF - - -#compress -compress.title=ضغط -compress.header=ضغط ملف PDF -compress.credit=تستخدم هذه الخدمة OCRmyPDF لضغط / تحسين PDF. -compress.selectText.1=الوضع اليدوي - من 1 إلى 4 -compress.selectText.2=مستوى التحسين: -compress.selectText.3=4 (رهيب للصور النصية) -compress.selectText.4=الوضع التلقائي - يضبط الجودة تلقائيًا للحصول على ملف PDF بالحجم المحدد -compress.selectText.5=حجم PDF المتوقع (على سبيل المثال 25 ميجا بايت ، 10.8 ميجا بايت ، 25 كيلو بايت) -compress.submit=ضغطضغط - - -#Add image -addImage.title=إضافة صورة -addImage.header=إضافة صورة إلى PDF -addImage.everyPage=كل صفحة؟ -addImage.upload=إضافة صورة -addImage.submit=إضافة صورة - - -#merge -merge.title=دمج -merge.header=دمج ملفات PDF متعددة (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=دمج - - -#pdfOrganiser -pdfOrganiser.title=منظم الصفحة -pdfOrganiser.header=منظم صفحات PDF -pdfOrganiser.submit=إعادة ترتيب الصفحات - - -#multiTool -multiTool.title=أداة متعددة PDF -multiTool.header=أداة متعددة PDF - - -#pageRemover -pageRemover.title=مزيل الصفحة -pageRemover.header=مزيل صفحة PDF -pageRemover.pagesToDelete=الصفحات المراد حذفها (أدخل قائمة بأرقام الصفحات مفصولة بفواصل): -pageRemover.submit=حذف الصفحات - - -#rotate -rotate.title=تدوير PDF -rotate.header=تدوير PDF -rotate.selectAngle=حدد زاوية الدوران (بمضاعفات 90 درجة): -rotate.submit=استدارة - - -#merge -split.title=انقسام PDF -split.header=تقسيم PDF -split.desc.1=الأرقام التي تحددها هي رقم الصفحة التي تريد تقسيمها -split.desc.2=على هذا النحو ، سيؤدي تحديد 1،3،7-8 إلى تقسيم مستند من 10 صفحات إلى 6 PDFS منفصلة مع: -split.desc.3=المستند رقم 1: الصفحة 1 -split.desc.4=المستند رقم 2: الصفحتان 2 و 3 -split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 -split.desc.6=المستند رقم 4: الصفحة 7 -split.desc.7=المستند رقم 5: الصفحة 8 -split.desc.8=المستند رقم 6: الصفحتان 9 و 10 -split.splitPages=أدخل الصفحات المراد تقسيمها: -split.submit=Split - - -#merge -imageToPDF.title=صورة إلى PDF -imageToPDF.header=صورة إلى PDF -imageToPDF.submit=تحول -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=\u062F\u0648\u0631\u0627\u0646 PDF \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 -imageToPDF.selectText.3=\u0627\u0644\u0645\u0646\u0637\u0642 \u0627\u0644\u0645\u062A\u0639\u062F\u062F \u0644\u0644\u0645\u0644\u0641\u0627\u062A (\u0645\u0641\u0639\u0651\u0644 \u0641\u0642\u0637 \u0625\u0630\u0627 \u0643\u0646\u062A \u062A\u0639\u0645\u0644 \u0645\u0639 \u0635\u0648\u0631 \u0645\u062A\u0639\u062F\u062F\u0629) -imageToPDF.selectText.4=\u062F\u0645\u062C \u0641\u064A \u0645\u0644\u0641 PDF \u0648\u0627\u062D\u062F -imageToPDF.selectText.5=\u062A\u062D\u0648\u064A\u0644 \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A PDF \u0645\u0646\u0641\u0635\u0644\u0629 - - -#pdfToImage -pdfToImage.title=تحويل PDF إلى صورة -pdfToImage.header=تحويل PDF إلى صورة -pdfToImage.selectText=تنسيق الصورة -pdfToImage.singleOrMultiple=\u0646\u0648\u0639 \u0646\u062A\u064A\u062C\u0629 \u0627\u0644\u0635\u0648\u0631\u0629 -pdfToImage.single=\u0635\u0648\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0643\u0628\u064A\u0631\u0629 -pdfToImage.multi=\u0635\u0648\u0631 \u0645\u062A\u0639\u062F\u062F\u0629 -pdfToImage.colorType=\u0646\u0648\u0639 \u0627\u0644\u0644\u0648\u0646 -pdfToImage.color=\u0627\u0644\u0644\u0648\u0646 -pdfToImage.grey=\u062A\u062F\u0631\u062C \u0627\u0644\u0631\u0645\u0627\u062F\u064A -pdfToImage.blackwhite=\u0623\u0628\u064A\u0636 \u0648\u0623\u0633\u0648\u062F (\u0642\u062F \u064A\u0641\u0642\u062F \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A!) -pdfToImage.submit=تحول - - -#addPassword -addPassword.title=إضافة كلمة مرور -addPassword.header=إضافة كلمة مرور (تشفير) -addPassword.selectText.1=حدد ملف PDF للتشفير -addPassword.selectText.2=كلمة المرور -addPassword.selectText.3=طول مفتاح التشفير -addPassword.selectText.4=القيم الأعلى تكون أقوى ، لكن القيم الأقل لها توافق أفضل. -addPassword.selectText.5=أذونات للتعيين -addPassword.selectText.6=منع تجميع المستند -addPassword.selectText.7=منع استخراج المحتوى -addPassword.selectText.8=منع الاستخراج للوصول -addPassword.selectText.9=منع ملء النموذج -addPassword.selectText.10=منع التعديل -addPassword.selectText.11=منع تعديل التعليقات التوضيحية -addPassword.selectText.12=منع الطباعة -addPassword.selectText.13=منع طباعة تنسيقات مختلفة -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=تشفير - - -#watermark -watermark.title=إضافة علامة مائية -watermark.header=إضافة علامة مائية -watermark.selectText.1=حدد PDF لإضافة العلامة المائية إلى: -watermark.selectText.2=نص العلامة المائية: -watermark.selectText.3=حجم الخط: -watermark.selectText.4=دوران (0-360): -watermark.selectText.5=widthSpacer (مسافة بين كل علامة مائية أفقيًا): -watermark.selectText.6=heightSpacer (مسافة بين كل علامة مائية عموديًا): -watermark.selectText.7=\u0627\u0644\u062A\u0639\u062A\u064A\u0645 (0\u066A - 100\u066A): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=إضافة علامة مائية - - -#Change permissions -permissions.title=تغيير الأذونات -permissions.header=تغيير الأذونات -permissions.warning=تحذير من أن تكون هذه الأذونات غير قابلة للتغيير ، يوصى بتعيينها بكلمة مرور عبر صفحة إضافة كلمة المرور -permissions.selectText.1=حدد ملف PDF لتغيير الأذونات -permissions.selectText.2=أذونات لتعيينها -permissions.selectText.3=منع تجميع المستند -permissions.selectText.4=منع استخراج المحتوى -permissions.selectText.5=منع الاستخراج للوصول -permissions.selectText.6=منع ملء النموذج -permissions.selectText.7=منع التعديل -permissions.selectText.8=منع تعديل التعليق التوضيحي -permissions.selectText.9=منع الطباعة -permissions.selectText.10=منع طباعة التنسيقات المختلفة -permissions.submit=تغيير - - -#remove password -removePassword.title=إزالة كلمة المرور -removePassword.header=إزالة كلمة المرور (فك التشفير) -removePassword.selectText.1=حدد PDF لفك التشفير -removePassword.selectText.2=كلمة المرور -removePassword.submit=إزالة - - -#changeMetadata -changeMetadata.title=\u0627\u0644\u0639\u0646\u0648\u0627\u0646: -changeMetadata.header=\u062A\u063A\u064A\u064A\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 -changeMetadata.selectText.1=\u064A\u0631\u062C\u0649 \u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0645\u062A\u063A\u064A\u0631\u0627\u062A \u0627\u0644\u062A\u064A \u062A\u0631\u063A\u0628 \u0641\u064A \u062A\u063A\u064A\u064A\u0631\u0647\u0627 -changeMetadata.selectText.2=\u062D\u0630\u0641 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629 -changeMetadata.selectText.3=\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0623\u0648\u0644\u064A\u0629 \u0627\u0644\u0645\u062E\u0635\u0635\u0629: -changeMetadata.author=\u0627\u0644\u0645\u0624\u0644\u0641: -changeMetadata.creationDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u0625\u0646\u0634\u0627\u0621 (yyyy / MM / dd HH: mm: ss): -changeMetadata.creator=\u0627\u0644\u0645\u0646\u0634\u0626: -changeMetadata.keywords=\u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629: -changeMetadata.modDate=\u062A\u0627\u0631\u064A\u062E \u0627\u0644\u062A\u0639\u062F\u064A\u0644 (yyyy / MM / dd HH: mm: ss): -changeMetadata.producer=\u0627\u0644\u0645\u0646\u062A\u062C: -changeMetadata.subject=\u0627\u0644\u0645\u0648\u0636\u0648\u0639: -changeMetadata.title=\u0627\u0644\u0639\u0646\u0648\u0627\u0646: -changeMetadata.trapped=\u0645\u062D\u0627\u0635\u0631: -changeMetadata.selectText.4=\u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0635\u0641\u064A\u0629 \u0623\u062E\u0631\u0649: -changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0627\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648\u0644\u064A\u0629 \u0645\u062E\u0635\u0635 -changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631 - - -#pdfToPDFA -pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A -pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A -pdfToPDFA.credit=\u062A\u0633\u062A\u062E\u062F\u0645 \u0647\u0630\u0647 \u0627\u0644\u062E\u062F\u0645\u0629 OCRmyPDF \u0644\u062A\u062D\u0648\u064A\u0644 PDF / A. -pdfToPDFA.submit=\u062A\u062D\u0648\u064A\u0644 - - -#PDFToWord -PDFToWord.title=تحويل PDF إلى Word -PDFToWord.header=تحويل PDF إلى Word -PDFToWord.selectText.1=تنسيق ملف الإخراج -PDFToWord.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. -PDFToWord.submit=تحويل - - -#PDFToPresentation -PDFToPresentation.title=PDF للعرض التقديمي -PDFToPresentation.header=PDF للعرض التقديمي -PDFToPresentation.selectText.1=تنسيق ملف الإخراج -PDFToPresentation.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملف. -PDFToPresentation.submit=تحويل - - -#PDFToText -PDFToText.title=تحويل PDF إلى نص / RTF -PDFToText.header=تحويل PDF إلى نص / RTF -PDFToText.selectText.1=تنسيق ملف الإخراج -PDFToText.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. -PDFToText.submit=تحويل - - -#PDFToHTML -PDFToHTML.title=PDF إلى HTML -PDFToHTML.header=PDF إلى HTML -PDFToHTML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. -PDFToHTML.submit=تحويل - - -#PDFToXML -PDFToXML.title=تحويل PDF إلى XML -PDFToXML.header=تحويل PDF إلى XML -PDFToXML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات. -PDFToXML.submit=تحويل diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties deleted file mode 100644 index 90db3fca..00000000 --- a/src/main/resources/messages_bg_BG.properties +++ /dev/null @@ -1,817 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr = left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Изберете PDF(и) -multiPdfPrompt=Изберете PDF (2+) -multiPdfDropPrompt=Изберете (или плъзнете и пуснете) всички PDF файлове, от които се нуждаете -imgPrompt=Изберете изображение(я) -genericSubmit=Подайте -processTimeWarning=Предупреждение: Този процес може да отнеме до минута в зависимост от размера на файла -pageOrderPrompt=Персонализиран ред на страниците (Въведете разделен със запетаи списък с номера на страници или функции като 2n+1): -goToPage=Давай -true=Вярно -false=Невярно -unknown=Непознат -save=Съхранете -close=Затворете -filesSelected=избрани файлове -noFavourites=Няма добавени любими -bored=Отекчени сте да чакате? -alphabet=Азбука -downloadPdf=Изтеглете PDF -text=Текст -font=Шрифт -selectFillter=-- Изберете -- -pageNum=Брой страница -sizes.small=Малък -sizes.medium=Среден -sizes.large=Голям -sizes.x-large=X-Голям -error.pdfPassword=PDF документът е с парола и или паролата не е предоставена, или е неправилна -delete=Изтрий -username=Потребителско име -password=Парола -welcome=Добре дошли -property=Свойство -black=Черно -white=Бяло -red=Червено -green=Зелено -blue=Синьо -custom=Персонализиране... - -changedCredsMessage=Идентификационните данни са променени! -notAuthenticatedMessage=Потребителят не е автентикиран. -userNotFoundMessage=Потребителят не е намерен -incorrectPasswordMessage=Текущата парола е неправилна. -usernameExistsMessage=Новият потребител вече съществува. - - - -############# -# NAVBAR # -############# -navbar.convert=Преобразуване -navbar.security=Сигурност -navbar.other=Разни -navbar.darkmode=Тъмна тема -navbar.pageOps=Операции със страници -navbar.settings=Настройки - -############# -# SETTINGS # -############# -settings.title=Настройки -settings.update=Налична актуализация -settings.appVersion=Версия на приложението: -settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран): -settings.downloadOption.1=Отваряне в същия прозорец -settings.downloadOption.2=Отваряне в нов прозорец -settings.downloadOption.3=Изтегли файл -settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава -settings.signOut=Изход -settings.accountSettings=Настройки на акаунта - - - -changeCreds.title=Промяна на идентификационните данни -changeCreds.header=Актуализирайте данните за акаунта си -changeCreds.changeUserAndPassword=Използвате идентификационни данни за вход по подразбиране. Моля, въведете нова парола (и потребителско име, ако искате) -changeCreds.newUsername=Ново потребителско име -changeCreds.oldPassword=Текуща парола -changeCreds.newPassword=Нова парола -changeCreds.confirmNewPassword=Подтвърдете новата парола -changeCreds.submit=Изпращане на промените - - - -account.title=Настройки на акаунта -account.accountSettings=Настройки на акаунта -account.adminSettings=Настройки на администратора - Преглед и добавяне на потребители -account.userControlSettings=Настройки за потребителски контрол -account.changeUsername=Нов потребител -account.changeUsername=Промени потребител -account.password=Парола за потвърждение -account.oldPassword=Стара парола -account.newPassword=Нова парола -account.changePassword=Промени паролата -account.confirmNewPassword=Потвърдете новата парола -account.signOut=Изход -account.yourApiKey=Вашият API ключ -account.syncTitle=Синхронизиране на настройките на браузъра с акаунта -account.settingsCompare=Сравняване на настройките: -account.property=Свойство -account.webBrowserSettings=Уеб-браузър настройки -account.syncToBrowser=Синхронизиране на акаунт -> Бразър -account.syncToAccount=Синхронизиране на акаунт <- Бразър - - -adminUserSettings.title=Настройки за потребителски контрол -adminUserSettings.header=Настройки за администраторски потребителски контрол -adminUserSettings.admin=Администратор -adminUserSettings.user=Потребител -adminUserSettings.addUser=Добавяне на нов потребител -adminUserSettings.roles=Роли -adminUserSettings.role=Роля -adminUserSettings.actions=Действия -adminUserSettings.apiUser=Ограничен API потребител -adminUserSettings.webOnlyUser=Само за уеб-потребител -adminUserSettings.forceChange = Принудете потребителя да промени потребителското име/парола при влизане -adminUserSettings.submit=Съхранете потребителя - -############# -# HOME-PAGE # -############# -home.desc=Вашето локално хоствано обслужване на едно място за всички ваши PDF нужди. - - -home.multiTool.title=PDF Мулти инструмент -home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници -multiTool.tags=Мултиинструмент,Мулти операции,UI,плъзгане с щракване,потребителска част,страна на клиента,интерактивен,неразрешим,преместване - -home.merge.title=Обединяване -home.merge.desc=Лесно обединете множество PDF файлове в един. -merge.tags=сливане,операции на страници,администраторска зона,от страна на сървъра - -home.split.title=Разделяне -home.split.desc=Разделяне на PDF файлове на множество документи -split.tags=Операции на страницата,разделяне,Множество страници,изрязване,сървърна страна - -home.rotate.title=Завъртане -home.rotate.desc=Лесно завъртете вашите PDF файлове. -rotate.tags=от страната на сървъра - - -home.imageToPdf.title=Изображение към PDF -home.imageToPdf.desc=Преобразуване на изображение (PNG, JPEG, GIF) към PDF. -imageToPdf.tags=преобразуване,img,jpg,изображение,снимка - -home.pdfToImage.title=PDF към изображение -home.pdfToImage.desc=Преобразуване на PDF към изображение. (PNG, JPEG, GIF) -pdfToImage.tags=преобразуване,img,jpg,изображение,снимка - -home.pdfOrganiser.title=Организиране -home.pdfOrganiser.desc=Премахване/пренареждане на страници към произволен ред -pdfOrganiser.tags=дуплекс,четно,нечетно,сортиране,преместване - - -home.addImage.title=Добавяне на изображение -home.addImage.desc=Добавя изображение към зададено място към PDF файла -addImage.tags=img,jpg,изображение,снимка - -home.watermark.title=Добавяне на воден знак -home.watermark.desc=Добавете персонализиран воден знак към вашия PDF документ. -watermark.tags=Текст,повтарящ се,етикет,собствено,авторско право,търговска марка,img,jpg,изображение,снимка - -home.permissions.title=Промяна на правата -home.permissions.desc=Променете правата на вашия PDF документ -permissions.tags=четене,писане,редактиране,печат - - -home.removePages.title=Премахване -home.removePages.desc=Изтрийте нежеланите страници от вашия PDF документ. -removePages.tags=Премахване на страници,изтриване на страници - -home.addPassword.title=Добавете парола -home.addPassword.desc=Шифровайте вашия PDF документ с парола. -addPassword.tags=сигурен,сигурност - -home.removePassword.title=Премахване на парола -home.removePassword.desc=Премахнете защитата с парола от вашия PDF документ. -removePassword.tags=сигурно,декриптиране,сигурност,отмяна на парола,изтриване на парола - -home.compressPdfs.title=Компресиране -home.compressPdfs.desc=Компресирайте PDF файлове, за да намалите размера на файла. -compressPdfs.tags=мачкам,малък,мъничък - - -home.changeMetadata.title=Промяна на метаданни -home.changeMetadata.desc=Промяна/Премахване/Добавяне на метаданни от PDF документ -changeMetadata.tags=Заглавие,автор,дата,създаване,час,издател,продуцент,статистика - -home.fileToPDF.title=Преобразуване на файл към PDF -home.fileToPDF.desc=Преобразуване почти всеки файл към PDF (DOCX, PNG, XLS, PPT, TXT и други) -fileToPDF.tags=трансформация,формат,документ,изображение,слайд,текст,преобразуване,офис,документи,word,excel,powerpoint - -home.ocr.title=OCR / Почистващи сканирания -home.ocr.desc=Cleanup сканира и открива текст от изображения към PDF и го добавя отново като текст. -ocr.tags=разпознаване,текст,изображение,сканиране,четене,идентифициране,откриване,редактиране - - -home.extractImages.title=Извличане на изображения -home.extractImages.desc=Извлича всички изображения от PDF и ги записва към архив -extractImages.tags=изображение,снимка,запазване,архивиране,архив,заснемане,грабване - -home.pdfToPDFA.title=PDF към PDF/A -home.pdfToPDFA.desc=Конвертирайте PDF към PDF/A за дългосрочно съхранение -pdfToPDFA.tags=архив,дълготраен,стандартен,преобразуване,съхранение,консервиране - -home.PDFToWord.title=PDF към Word -home.PDFToWord.desc=Преобразуване на PDF към Word формати (DOC, DOCX и ODT) -PDFToWord.tags=doc,docx,odt,word,трансформация,формат,преобразуване,офис,microsoft,docfile - -home.PDFToPresentation.title=PDF към презентация -home.PDFToPresentation.desc=Преобразуване на PDF във формати за презентация (PPT, PPTX и ODP) -PDFToPresentation.tags=слайдове,покажи,офис,microsoft - -home.PDFToText.title=PDF към RTF (Текст) -home.PDFToText.desc=Преобразуване PDF към Text или RTF формат -PDFToText.tags=richformat,richtextformat,богат текстов формат - -home.PDFToHTML.title=PDF към HTML -home.PDFToHTML.desc=Преобразуване PDF към HTML формат -PDFToHTML.tags=уеб-съдържание,удобен за браузър - - -home.PDFToXML.title=PDF към XML -home.PDFToXML.desc=Преобразуване на PDF към XML формат -PDFToXML.tags=извличане на данни,структурирано съдържание,взаимодействие,трансформация,преобразуване - -home.ScannerImageSplit.title=Откриване/Разделяне на сканирани снимки -home.ScannerImageSplit.desc=Разделя множество снимки от една снимка/PDF -ScannerImageSplit.tags=разделяне,автоматично откриване,сканиране,много снимки,организиране - -home.sign.title=Подпишете -home.sign.desc=Добавя подпис към PDF чрез рисунка, текст или изображение -sign.tags=упълномощаване,инициали,нарисуван-подпис,текстов-знак,изображение-подпис - -home.flatten.title=Изравняване -home.flatten.desc=Премахнете всички интерактивни елементи и формуляри от PDF -flatten.tags=статичен,деактивиран,неинтерактивен,рационализиран - -home.repair.title=Поправи -home.repair.desc=Опитва се да поправи повреден/счупен PDF -repair.tags=поправка,възстановяване,корекция,възстановяване - -home.removeBlanks.title=Премахване на празни страници -home.removeBlanks.desc=Открива и премахва празни страници от документ -removeBlanks.tags=почистване,рационализиране,без съдържание,организиране - -home.compare.title=Сравнете -home.compare.desc=Сравнява и показва разликите между 2 PDF документа -compare.tags=разграничаване,контраст,промени,анализ - -home.certSign.title=Подпишете със сертификат -home.certSign.desc=Подписва PDF със сертификат/ключ (PEM/P12) -certSign.tags=удостоверяване,PEM,P12,официален,шифроване - -home.pageLayout.title=Оформление с няколко страници -home.pageLayout.desc=Слейте няколко страници от PDF документ в една страница -pageLayout.tags=сливане,комбиниран,единичен изглед,организиране - -home.scalePages.title=Коригирайте размера/мащаба на страницата -home.scalePages.desc=Промяна на размера/мащаба на страница и/или нейното съдържание. -scalePages.tags=преоразмеряване,промяна,размер,адаптиране - -home.pipeline.title=Pipeline (Разширено) -home.pipeline.desc=Изпълнявайте множество действия върху PDF файлове чрез дефиниране на конвейерни скриптове -pipeline.tags=автоматизиране,последователност,чрез скриптове,пакетен процес - -home.add-page-numbers.title=Добавяне на номера на страници -home.add-page-numbers.desc=Добавете номера на страници в документ на определено място -add-page-numbers.tags=страничен, етикетиране, организиране, индексиране - -home.auto-rename.title=Автоматично преименуване на PDF файл -home.auto-rename.desc=Автоматично преименува PDF файл въз основа на откритата му заглавка -auto-rename.tags=автоматично откриване,базирано на заглавка,организиране,преетикетиране - -home.adjust-contrast.title=Коригиране на цветове/контраст -home.adjust-contrast.desc=Коригиране на контраста, наситеността и яркостта на PDF -adjust-contrast.tags=корекция на цвета,настройте,модифицирайте,подобрете - -home.crop.title=Изрязване на PDF -home.crop.desc=Изрежете PDF, за да намалите размера му (поддържа текст!) -crop.tags=изрязване,свиване,редактиране,оформяне - -home.autoSplitPDF.title=Автоматично разделяне на страници -home.autoSplitPDF.desc=Автоматично разделяне на сканиран PDF файл с QR код за разделяне на физически сканирани страници -autoSplitPDF.tags=QR-базиран,отделен,сканиране-сегмент,организиране - -home.sanitizePdf.title=Дезинфекцирай -home.sanitizePdf.desc=Премахване на скриптове и други елементи от PDF файлове -sanitizePdf.tags=чисти,сигурни,безопасни,премахване-заплахи - -home.URLToPDF.title=URL/уеб-сайт към PDF -home.URLToPDF.desc=Преобразува всеки http(s) URL към PDF -URLToPDF.tags=уеб-заснемане,запазване на страница,уеб към документ,архив - -home.HTMLToPDF.title=HTML към PDF -home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF -HTMLToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване - - -home.MarkdownToPDF.title=Markdown към PDF -home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF -MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване - - -home.getPdfInfo.title=Вземете ЦЯЛАТА информация към PDF -home.getPdfInfo.desc=Взема всяка възможна информация от PDF файлове -getPdfInfo.tags=информация,данни,статистики,статистика - - -home.extractPage.title=Извличане на страница(и) -home.extractPage.desc=Извлича избрани страници от PDF -extractPage.tags=извличане - - -home.PdfToSinglePage.title=PDF към една голяма страница -home.PdfToSinglePage.desc=Обединява всички PDF страници в една голяма страница -PdfToSinglePage.tags=единична страница - - -home.showJS.title=Показване на Javascript -home.showJS.desc=Търси и показва всеки JS, инжектиран в PDF -showJS.tags=JS - -home.autoRedact.title=Автоматично редактиране -home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст -showJS.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Вход -login.signin=Впишете се -login.rememberme=Запомни ме -login.invalid=Невалидно потребителско име или парола. -login.locked=Вашият акаунт е заключен. -login.signinTitle=Моля впишете се - - -#auto-redact -autoRedact.title=Автоматично редактиране -autoRedact.header=Автоматично редактиране -autoRedact.colorLabel=Цвят -autoRedact.textsToRedactLabel=Текст за редактиране (разделен с редове) -autoRedact.textsToRedactPlaceholder=например: \nПоверително \nСтрого секретно -autoRedact.useRegexLabel=Използване на Regex -autoRedact.wholeWordSearchLabel=Търсене на цялата дума -autoRedact.customPaddingLabel=Персонализирана допълнителна подложка -autoRedact.convertPDFToImageLabel=Преобразуване на PDF към PDF-изображение (използва се за премахване на текст зад полето) -autoRedact.submitButton=Изпращане - - -#showJS -showJS.title=Покажи Javascript -showJS.header=Покажи Javascript -showJS.downloadJS=Изтегли Javascript -showJS.submit=Покажи - - -#pdfToSinglePage -pdfToSinglePage.title=PDF към единична страница -pdfToSinglePage.header=PDF към единична страница -pdfToSinglePage.submit=Преобразуване към единична страница - - -#pageExtracter -pageExtrater.title=Извличане на страници -pageExtrater.header=Извличане на страници -pageExtrater.submit=Извличане - - -#getPdfInfo -getPdfInfo.title=Вземете информация за PDF -getPdfInfo.header=Вземете информация за PDF -getPdfInfo.submit=Вземете информация -getPdfInfo.downloadJson=Изтеглете JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown към PDF -MarkdownToPDF.header=Markdown към PDF -MarkdownToPDF.submit=Преобразуване -MarkdownToPDF.help=Работата е в ход -MarkdownToPDF.credit=Използва WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL към PDF -URLToPDF.header=URL към PDF -URLToPDF.submit=Преобразуване -URLToPDF.credit=Използва WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML към PDF -HTMLToPDF.header=HTML към PDF -HTMLToPDF.help=Приема HTML файлове и ZIP файлове, съдържащи html/css/изображения и т.н -HTMLToPDF.submit=Преобразуване -HTMLToPDF.credit=Използва WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Дезинфектирай PDF -sanitizePDF.header=Дезинфектира PDF файл -sanitizePDF.selectText.1=Премахва JavaScript действия -sanitizePDF.selectText.2=Премахва вградени файлове -sanitizePDF.selectText.3=Премахва метаданни -sanitizePDF.selectText.4=Премахва линкове -sanitizePDF.selectText.5=Премахва шрифтове -sanitizePDF.submit=Дезинфектирай PDF - - -#addPageNumbers -addPageNumbers.title=Добавяне на номера на страници -addPageNumbers.header=Добавяне на номера на страници -addPageNumbers.selectText.1=Изберете PDF файл: -addPageNumbers.selectText.2=Размер на полето -addPageNumbers.selectText.3=Позиция -addPageNumbers.selectText.4=Начален номер -addPageNumbers.selectText.5=Страници към номер -addPageNumbers.selectText.6=Персонализиран текст -addPageNumbers.customTextDesc=Персонализиран текст -addPageNumbers.numberPagesDesc=Кои страници да номерирате, по подразбиране 'всички', също приема 1-5 или 2,5,9 и т.н. -addPageNumbers.customNumberDesc=По подразбиране е {n}, също приема 'Страница {n} от {total}', 'Текст-{n}', '{filename}-{n} -addPageNumbers.submit=Добавяне на номера на страници - - -#auto-rename -auto-rename.title=Автоматично преименуване -auto-rename.header=Автоматично преименуване на PDF -auto-rename.submit=Автоматично преименуване - - -#adjustContrast -adjustContrast.title=Настройка на контраста -adjustContrast.header=Коригиране на контраста -adjustContrast.contrast=Контраст: -adjustContrast.brightness=Яркост: -adjustContrast.saturation=Наситеност: -adjustContrast.download=Изтегли - - -#crop -crop.title=Изрязване -crop.header=Изрязване на изображение -crop.submit=Подайте - - -#autoSplitPDF -autoSplitPDF.title=Автоматично разделяне на PDF -autoSplitPDF.header=Автоматично разделяне на PDF -autoSplitPDF.description=Печатайте, вмъквайте, сканирайте, качвайте и ни позволете да разделим автоматично вашите документи. Не е необходимо ръчно сортиране. -autoSplitPDF.selectText.1=Отпечатайте някои разделителни листове отдолу (Черно-бялото е добре). -autoSplitPDF.selectText.2=Сканирайте всичките си документи наведнъж, като поставите разделителния лист между тях. -autoSplitPDF.selectText.3=Качете единствения голям сканиран PDF файл и оставете Stirling PDF да се справи с останалото. -autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ. -autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF: -autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад) -autoSplitPDF.dividerDownload1=Изтеглете 'Автоматичен сплитер разделител (минимален).pdf' -autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf' -autoSplitPDF.submit=Подайте - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Многостранично оформление -pageLayout.header=Оформление на няколко страници -pageLayout.pagesPerSheet=Страници на лист: -pageLayout.addBorder=Добавяне на граници -pageLayout.submit=Подайте - - -#scalePages -scalePages.title=Коригиране на мащаба на страницата -scalePages.header=Коригиране на мащаба на страницата -scalePages.pageSize=Размер на страница от документа. -scalePages.scaleFactor=Ниво на мащабиране (изрязване) на страница. -scalePages.submit=Подайте - - -#certSign -certSign.title=Подписване на сертификат -certSign.header=Подпишете PDF с вашия сертификат (В процес на работа) -certSign.selectPDF=Изберете PDF файл за подписване: -certSign.selectKey=Изберете вашия файл с личен ключ (формат PKCS#8, може да бъде .pem или .der): -certSign.selectCert=Изберете вашия файл със сертификат (формат X.509, може да бъде .pem или .der): -certSign.selectP12=Изберете вашия PKCS#12 Keystore файл (.p12 или .pfx) (По избор, ако е предоставен, трябва да съдържа вашия личен ключ и сертификат): -certSign.certType=Тип сертификат -certSign.password=Въведете вашата парола за Keystore за ключове или частен ключ (ако има): -certSign.showSig=Показване на подпис -certSign.reason=Причина -certSign.location=Местоположение -certSign.name=Име -certSign.submit=Подпишете PDF - - -#removeBlanks -removeBlanks.title=Премахване на празни места -removeBlanks.header=Премахване на празни страници -removeBlanks.threshold=Праг на белота на пикселите: -removeBlanks.thresholdDesc=Праг за определяне колко бял трябва да бъде един бял пиксел, за да бъде класифициран като 'бял'. 0 = черно, 255 чисто бяло. -removeBlanks.whitePercent=Процент бяло (%): -removeBlanks.whitePercentDesc=Процент от страницата, която трябва да бъде в 'бели' пиксели, които да бъдат премахнати -removeBlanks.submit=Премахване на празни места - - -#compare -compare.title=Сравнявай -compare.header=Сравнявай PDF-и -compare.document.1=Документ 1 -compare.document.2=Документ 2 -compare.submit=Сравнявай - - -#sign -sign.title=Подпишете -sign.header=Подпишете PDF-и -sign.upload=Качи изображение -sign.draw=Начертайте подпис -sign.text=Въвеждане на текст -sign.clear=Изчисти -sign.add=Добави - - -#repair -repair.title=Поправи -repair.header=Поправи PDF-и -repair.submit=Поправи - - -#flatten -flatten.title=Изравнете -flatten.header=Изравнете PDF-и -flatten.submit=Изравнете - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Праг на ъгъла: -ScannerImageSplit.selectText.2=Задава минималния абсолютен ъгъл, необходим за завъртане на изображението (по подразбиране: 10). -ScannerImageSplit.selectText.3=Толеранс: -ScannerImageSplit.selectText.4=Определя обхвата на цветовата вариация около предполагаемия фонов цвят (по подразбиране: 30). -ScannerImageSplit.selectText.5=Минимална площ: -ScannerImageSplit.selectText.6=Задава минималния праг на площ за изображение (по подразбиране: 10000). -ScannerImageSplit.selectText.7=Минимална контурна площ: -ScannerImageSplit.selectText.8=Задава минималния праг на контурната площ за изображение -ScannerImageSplit.selectText.9=Размер на рамката: -ScannerImageSplit.selectText.10=Задава размера на добавената и премахната граница, за да предотврати бели граници към изхода (по подразбиране: 1). - - -#OCR -ocr.title=OCR / Почистване на сканиране -ocr.header=Почистващи сканирания / OCR (оптично разпознаване на знаци) -ocr.selectText.1=Изберете езици, които да бъдат открити в рамките на PDF (изброените са откритите към момента): -ocr.selectText.2=Създаване на текстов файл, съдържащ OCR текст заедно с OCR PDF -ocr.selectText.3=Правилните страници бяха сканирани под изкривен ъгъл чрез завъртането им обратно на мястото им -ocr.selectText.4=Чиста страница, така че е по-малко вероятно OCR да намери текст във фонов шум. (Без промяна на изхода) -ocr.selectText.5=Чиста страница, така че е по-малко вероятно OCR да намери текст във фонов шум, поддържа почистване към изхода. -ocr.selectText.6=Игнорира страници, които имат интерактивен текст, само OCR страници, които са изображения -ocr.selectText.7=Принудително OCR, ще премахва чрез OCR на всяка страница всички оригинални текстови елементи -ocr.selectText.8=Нормално (Ще има грешка, ако PDF съдържа текст) -ocr.selectText.9=Допълнителни настройки -ocr.selectText.10=OCR режим -ocr.selectText.11=Премахване на изображения след OCR (Премахва ВСИЧКИ изображения, полезно само ако е част от стъпката на преобразуване) -ocr.selectText.12=Тип изобразяване (Разширен) -ocr.help=Моля, прочетете тази документация за това как да използвате това за други езици и/или да не използвате в docker -ocr.credit=Тази услуга използва OCRmyPDF и Tesseract за OCR. -ocr.submit=Обработка на PDF чрез OCR - - -#extractImages -extractImages.title=Извличане на изображения -extractImages.header=Извличане на изображения -extractImages.selectText=Изберете формат на изображението, в който да преобразувате извлечените изображения -extractImages.submit=Извличане - - -#File to PDF -fileToPDF.title=Файл към PDF -fileToPDF.header=Конвертирайте всеки файл към PDF -fileToPDF.credit=Тази услуга използва LibreOffice и Unoconv за преобразуване на файлове. -fileToPDF.supportedFileTypes=Поддържаните типове файлове трябва да включват по-долу, но за пълен актуализиран списък на поддържаните формати, моля, вижте документацията на LibreOffice -fileToPDF.submit=Преобразуване към PDF - - -#compress -compress.title=Компресиране -compress.header=Компресиране на PDF -compress.credit=Тази услуга използва Ghostscript за PDF компресиране/оптимизиране. -compress.selectText.1=Ръчен режим - От 1 до 4 -compress.selectText.2=Ниво на оптимизация: -compress.selectText.3=4 (Ужасно за текстови изображения) -compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF точен размер -compress.selectText.5=Очакван PDF размер (напр. 25MB, 10.8MB, 25KB) -compress.submit=Компресиране - - -#Add image -addImage.title=Добавяне на изображение -addImage.header=Добавяне на изображение към PDF -addImage.everyPage=Всяка страница? -addImage.upload=Добавяне на изображение -addImage.submit=Добавяне на изображение - - -#merge -merge.title=Обединяване -merge.header=Обединяване на множество PDF файлове (2+) -merge.sortByName=Сортиране по име -merge.sortByDate=Сортиране по дата -merge.submit=Обединяване - - -#pdfOrganiser -pdfOrganiser.title=Организатор на страници -pdfOrganiser.header=Организатор на PDF страници -pdfOrganiser.submit=Пренареждане на страниците - - -#multiTool -multiTool.title=PDF Мулти инструмент -multiTool.header=PDF Мулти инструмент - - -#pageRemover -pageRemover.title=Премахване на страници -pageRemover.header=Премахване на PDF страници -pageRemover.pagesToDelete=Страници за изтриване (Въведете списък с номера на страници, разделени със запетая) : -pageRemover.submit=Изтриване на страници - - -#rotate -rotate.title=Завъртане на PDF -rotate.header=Завъртане на PDF -rotate.selectAngle=Изберете ъгъл на въртене (кратно на 90 градуса): -rotate.submit=Завъртане - - -#merge -split.title=Разделяне на PDF -split.header=Разделяне на PDF -split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне -split.desc.2=Така че избирането на 1,3,7-8 ще раздели документ от 10 страници на 6 отделни PDF файла с: -split.desc.3=Документ #1: Страница 1 -split.desc.4=Документ #2: Страница 2 и 3 -split.desc.5=Документ #3: Страница 4, 5 и 6 -split.desc.6=Документ #4: Страница 7 -split.desc.7=Документ #5: Страница 8 -split.desc.8=Документ #6: Страница 9 и 10 -split.splitPages=Въведете страници за разделяне: -split.submit=Разделяне - - -#merge -imageToPDF.title=Изображение към PDF -imageToPDF.header=Изображение към PDF -imageToPDF.submit=Преобразуване -imageToPDF.selectLabel=Опции за прилягане на изображението -imageToPDF.fillPage=Попълване на страница -imageToPDF.fitDocumentToImage=Побиране на страницата в изображението -imageToPDF.maintainAspectRatio=Поддържане на пропорции -imageToPDF.selectText.2=Автоматично завъртане на PDF -imageToPDF.selectText.3=Файлова логика с много (Активирано само ако работите с множество изображения) -imageToPDF.selectText.4=Сливане към един PDF -imageToPDF.selectText.5=Преобразуване към отделни PDF файлове - - -#pdfToImage -pdfToImage.title=PDF към Изображение -pdfToImage.header=PDF към Изображение -pdfToImage.selectText=Формат на изображението -pdfToImage.singleOrMultiple=Тип резултат от страница към изображение -pdfToImage.single=Единично голямо изображение комбиниране на всички страници -pdfToImage.multi=Множество изображения, по едно изображение на страница -pdfToImage.colorType=Тип цвят -pdfToImage.color=Цвят -pdfToImage.grey=Скала на сивото -pdfToImage.blackwhite=Черно и бяло (може да загубите данни!) -pdfToImage.submit=Преобразуване - - -#addPassword -addPassword.title=Добавяне на парола -addPassword.header=Добавяне на парола (Шифроване) -addPassword.selectText.1=Изберете PDF, който да шифровате -addPassword.selectText.2=Потребителска парола -addPassword.selectText.3=Предотвратяване на сглобяването на документ -addPassword.selectText.4=По-високите стойности са по-силни, но по-ниските стойности имат по-добра съвместимост. -addPassword.selectText.5=Разрешения за задаване (препоръчва се да се използва заедно с паролата на собственика) -addPassword.selectText.6=Предотвратяване на сглобяването на документ -addPassword.selectText.7=Предотвратете извличането на съдържание -addPassword.selectText.8=Предотвратете извличането за достъпност -addPassword.selectText.9=Предотвратяване на попълване на формуляр -addPassword.selectText.10=Предотвратяване на промени -addPassword.selectText.11=Предотвратяване на промени на анотация -addPassword.selectText.12=Предотвратяване на печат -addPassword.selectText.13=Предотвратете отпечатването в различни формати -addPassword.selectText.14=Парола на собственика -addPassword.selectText.15=Ограничава какво може да се прави с документа, след като бъде отворен (не се поддържа от всички четци) -addPassword.selectText.16=Ограничава отварянето на самия документ -addPassword.submit=Шифроване - - -#watermark -watermark.title=Добавяне на воден знак -watermark.header=Добавяне на воден знак -watermark.selectText.1=Изберете PDF, към който да добавите воден знак: -watermark.selectText.2=Текст на воден знак: -watermark.selectText.3=Размер на шрифта: -watermark.selectText.4=Завъртане (0-360): -watermark.selectText.5=ширинаSpacer (Разстояние между всеки воден знак хоризонтално): -watermark.selectText.6=дължинаSpacer (Разстояние между всеки воден знак вертикално): -watermark.selectText.7=Непрозрачност (0% - 100%): -watermark.selectText.8=Тип воден знак: -watermark.selectText.9=Изображение за воден знак: -watermark.submit=Добавяне на воден знак - - -#Change permissions -permissions.title=Промяна на правата -permissions.header=Промени правата -permissions.warning=Предупреждение, че тези разрешения са непроменими, препоръчва се да ги зададете с парола чрез страницата за добавяне на парола -permissions.selectText.1=Изберете PDF, за да промените правата -permissions.selectText.2=Разрешения за задаване -permissions.selectText.3=Предотвратяване на сглобяването на документ -permissions.selectText.4=Предотвратете извличането на съдържание -permissions.selectText.5=Предотвратете извличането за достъпност -permissions.selectText.6=Предотвратяване на попълване на формуляр -permissions.selectText.7=Предотвратяване на модификация -permissions.selectText.8=Предотвратяване на модификация на анотация -permissions.selectText.9=Предотвратявам на отпечатването -permissions.selectText.10=Предотвратете отпечатването на различни формати -permissions.submit=Промени - - -#remove password -removePassword.title=Премахване на паролата -removePassword.header=Премахване на паролата (Декриптиране) -removePassword.selectText.1=Изберете PDF за Декриптиране -removePassword.selectText.2=Парола -removePassword.submit=Премахване - - -#changeMetadata -changeMetadata.title=Промени метаданните -changeMetadata.header=Промени метаданните -changeMetadata.selectText.1=Моля, редактирайте променливите, които искате да промените -changeMetadata.selectText.2=Изтрий всички метаданни -changeMetadata.selectText.3=Покажи персонализирани метаданни: -changeMetadata.author=Автор: -changeMetadata.creationDate=Дата на създаване (гггг/ММ/дд ЧЧ:мм:сс): -changeMetadata.creator=Създател: -changeMetadata.keywords=Ключови думи: -changeMetadata.modDate=Дата на промяна (гггг/ММ/дд ЧЧ:мм:сс): -changeMetadata.producer=Продуцент: -changeMetadata.subject=Тема: -changeMetadata.title=Заглавие: -changeMetadata.trapped=В капан: -changeMetadata.selectText.4=Други метаданни: -changeMetadata.selectText.5=Добавяне на персонализиране метаданни -changeMetadata.submit=Промени - - -#pdfToPDFA -pdfToPDFA.title=PDF към PDF/A -pdfToPDFA.header=PDF към PDF/A -pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. -pdfToPDFA.submit=Преобразуване - - -#PDFToWord -PDFToWord.title=PDF към Word -PDFToWord.header=PDF към Word -PDFToWord.selectText.1=Изходен файлов формат -PDFToWord.credit=Тази услуга използва LibreOffice за преобразуване на файлове. -PDFToWord.submit=Преобразуване - - -#PDFToPresentation -PDFToPresentation.title=PDF към Презентация -PDFToPresentation.header=PDF към Презентация -PDFToPresentation.selectText.1=Изходен файлов формат -PDFToPresentation.credit=Тази услуга използва LibreOffice за преобразуване на файлове. -PDFToPresentation.submit=Преобразуване - - -#PDFToText -PDFToText.title=PDF към RTF (Текст) -PDFToText.header=PDF към RTF (Текст) -PDFToText.selectText.1=Изходен файлов формат -PDFToText.credit=Тази услуга използва LibreOffice за преобразуване на файлове. -PDFToText.submit=Преобразуване - - -#PDFToHTML -PDFToHTML.title=PDF към HTML -PDFToHTML.header=PDF към HTML -PDFToHTML.credit=Тази услуга използва LibreOffice за преобразуване на файлове. -PDFToHTML.submit=Преобразуване - - -#PDFToXML -PDFToXML.title=PDF към XML -PDFToXML.header=PDF към XML -PDFToXML.credit=Тази услуга използва LibreOffice за преобразуване на файлове. -PDFToXML.submit=Преобразуване \ No newline at end of file diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties deleted file mode 100644 index b6341fa0..00000000 --- a/src/main/resources/messages_ca_CA.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Selecciona PDF(s) -multiPdfPrompt=Selecciona PDFs (2+) -multiPdfDropPrompt=Selecciona (o arrossega) els documents PDF -imgPrompt=Selecciona Imatge(s) -genericSubmit=Envia -processTimeWarning=Alerta: Aquest procés pot tardar 1 minut depenent de la mida de l'arxiu -pageOrderPrompt=Ordre de Pàgines (Llista separada per comes) : -goToPage=Anar -true=Verdader -false=Fals -unknown=Desconegut -save=Desa -close=Tanca -filesSelected=fitxers seleccionats -noFavourites=No s'ha afegit cap favorit -bored=Avorrit esperant? -alphabet=Alfabet -downloadPdf=Descarregueu PDF -text=Text -font=Tipus de lletra -selectFillter=-- Selecciona -- -pageNum=Número de pàgina -sizes.small=Petit -sizes.medium=Mitjà -sizes.large=Llarg -sizes.x-large=X-Large -error.pdfPassword=El PDF està protegit o bé el password és incorrecte -delete=Esborra -username=Usuari -password=Contrasenya -welcome=Benvingut -property=Propietat -black=Negre -white=Blanc -red=Vermell -green=Verd -blue=Blau -custom=Personalitzat... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Converteix -navbar.security=Seguretat -navbar.other=Altres -navbar.darkmode=Mode Fosc -navbar.pageOps=Operacions de Pàgina -navbar.settings=Opcions - -############# -# SETTINGS # -############# -settings.title=Opcions -settings.update=Actualització Disponible -settings.appVersion=Versió App: -settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): -settings.downloadOption.1=Obre mateixa finestra -settings.downloadOption.2=Obre mateixa finestra -settings.downloadOption.3=Descarrega Arxiu -settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi -settings.signOut=Sortir -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Opcions del compte -account.accountSettings=Opcions del compte -account.adminSettings=Opcions d'Admin - Veure i afegir usuaris -account.userControlSettings=Opcions de Control d'Usuari -account.changeUsername=Canvia nom usuari -account.changeUsername=Canvia nom usuari -account.password=Confirma contrasenya -account.oldPassword=Password Antic -account.newPassword=Password Nou -account.changePassword=Canvia contrasenya -account.confirmNewPassword=Confirma Nova contrasenya -account.signOut=Sortir -account.yourApiKey=Clau API -account.syncTitle=Sincronitza opcions navegador amb compte -account.settingsCompare=Comparador Opcions: -account.property=Propietat: -account.webBrowserSettings=Opcins Navegador -account.syncToBrowser=Sincronitza Compte -> Navegador -account.syncToAccount=Sincronitza Compte <- Navegador - - -adminUserSettings.title=Opcions Control Usuari -adminUserSettings.header=Usuari Admin Opcions Control -adminUserSettings.admin=Admin -adminUserSettings.user=Usuari -adminUserSettings.addUser=Afegir Usuari -adminUserSettings.roles=Rols -adminUserSettings.role=Rol -adminUserSettings.actions=Accions -adminUserSettings.apiUser=Usuari amb API limitada -adminUserSettings.webOnlyUser=Usuari només WEB -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Desar Usuari - -############# -# HOME-PAGE # -############# -home.desc=L'eina allotjada localment per a necessitats PDF. - - -home.multiTool.title=PDF Multi Tool -home.multiTool.desc=Fusiona, Rota, Reorganitza, i Esborra pàgines -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Fusiona -home.merge.desc=Fusiona fàcilment pàgines en una. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Divideix -home.split.desc=Divideix PDFs en múltiples documents -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Rota -home.rotate.desc=Rota els PDFs. -rotate.tags=server side - - -home.imageToPdf.title=Imatge a PDF -home.imageToPdf.desc=Converteix imatge (PNG, JPEG, GIF) a PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF a Imatge -home.pdfToImage.desc=Converteix PDF a imatge. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Organitza -home.pdfOrganiser.desc=Elimina/Reorganitza pàgines en qualsevol ordre -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Afegir imatge a PDF -home.addImage.desc=Afegeix imatge en un PDF (En progrés) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Afegir Marca d'aigua -home.watermark.desc=Afegir Marca d'aigua personalitzada en un PDF -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Canvia permissos -home.permissions.desc=Canvia permisos del document PDF -permissions.tags=read,write,edit,print - - -home.removePages.title=Elimina -home.removePages.desc=Elimina pàgines del document PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Afegir Contrasenya -home.addPassword.desc=Xifra document PDF amb contrasenya. -addPassword.tags=secure,security - -home.removePassword.title=Elimina Contrasenya -home.removePassword.desc=Elimia contrasenya de document PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Comprimeix -home.compressPdfs.desc=Comprimeix PDFs per reduir la mida. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Canvia Metadades -home.changeMetadata.desc=Canvia/Treu/Afegeix matadades al document PDF. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Converteix arxiu a PDF -home.fileToPDF.desc=Converteix qualsevol arxiu a PDF (DOCX, PNG, XLS, PPT, TXT i més) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=Executa exploracions OCR i/o neteja escanejos -home.ocr.desc=Neteja escanejats i detecta text d'imatges dins d'un PDF i el torna a afegir com a text. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Extreu Imatges -home.extractImages.desc=Extreu les Imatges del PDF i les desa a zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF a PDF/A -home.pdfToPDFA.desc=Converteix PDF a PDF/A per desar a llarg termini. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF a Word -home.PDFToWord.desc=Converteix PDF a formats de Word (DOC, DOCX and ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF a Presentació -home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF a Text/RTF -home.PDFToText.desc=Converteix PDF a Text o format RTF -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF a HTML -home.PDFToHTML.desc=Converteix PDF a format HTML -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF a XML -home.PDFToXML.desc=Converteix PDF a format XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detecta/Divideix fotos escanejades -home.ScannerImageSplit.desc=Divideix múltiples fotos dins del PDF/foto -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Signa -home.sign.desc=Afegeix signatura al PDF mitjançant dibuix, text o imatge -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Aplanar -home.flatten.desc=Elimineu tots els elements i formularis interactius d'un PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Reparar -home.repair.desc=Intenta reparar un PDF danyat o trencat -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Elimina les pàgines en blanc -home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Compara -home.compare.desc=Compara i mostra les diferències entre 2 documents PDF -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Signa amb Certificat -home.certSign.desc=Sign PDF amb Certificate/Clau (PEM/P12) -certSign.tags=authentica,PEM,P12,official,encripta - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Afegir Números de Pàgina -home.add-page-numbers.desc=Afegir Números de Pàgina en una localització -add-page-numbers.tags=pagina,etiqueta,organitza,indexa - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Ajusta Colors/Contrast -home.adjust-contrast.desc=Ajusta Colors/Contrast, Saturació i Brillantor -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Talla PDF -home.crop.desc=Talla PDF per reduïr la mida (manté text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Accedir -login.signin=Accedir -login.rememberme=Recordar -login.invalid=Nom usuari / password no vàlid -login.locked=Compte bloquejat -login.signinTitle=Autenticat - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Afegir Números de Pàgina -addPageNumbers.header=Afegir Números de Pàgina -addPageNumbers.selectText.1=Selecciona PDF: -addPageNumbers.selectText.2=Mida Marge -addPageNumbers.selectText.3=Posició -addPageNumbers.selectText.4=Número Inicial -addPageNumbers.selectText.5=Pàgines a enumerar -addPageNumbers.selectText.6=Text Personalitzat -addPageNumbers.customTextDesc=Text Personalitzat -addPageNumbers.numberPagesDesc=Pàgines a enumerar, defecte 'totes', accepta 1-5 o 2,5,9 etc -addPageNumbers.customNumberDesc=Defecte a {n}, accepta 'Pàgina {n} de {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Afegir Números de Pàgina - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Talla -crop.header=Talla Imatge -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=Significació del certificat -certSign.header=Firmar un PDF amb el vostre certificat (Treball en curs) -certSign.selectPDF=Seleccioneu un fitxer PDF per signar: -certSign.selectKey=Seleccioneu el vostre fitxer de clau privada (format PKCS#8, podria ser .pem o .der): -certSign.selectCert=Seleccioneu el vostre fitxer de certificat (format X.509, podria ser .pem o .der): -certSign.selectP12=Seleccioneu el vostre fitxer de magatzem de claus PKCS#12 (.p12 o .pfx) (Opcional, si es proporciona, hauria de contenir la vostra clau privada i certificat): -certSign.certType=Tipus de certificat -certSign.password=Introduïu el vostre magatzem de claus o contrasenya de clau privada (si n'hi ha): -certSign.showSig=Mostra la signatura -certSign.reason=Motiu -certSign.location=Ubicació -certSign.name=Nom -certSign.submit=Firma PDF - - -#removeBlanks -removeBlanks.title=Elimina els espais en blanc -removeBlanks.header=Elimina les pàgines en blanc -removeBlanks.threshold=Llindar: -removeBlanks.thresholdDesc=Llindar per determinar el blanc que ha de ser un píxel blanc -removeBlanks.whitePercent=Percentatge blanc (%): -removeBlanks.whitePercentDesc=Percentatge de pàgina que ha de ser blanca per eliminar-la -removeBlanks.submit=Elimina els espais en blanc - - -#compare -compare.title=Comparar -compare.header=Compara PDF -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Comparar - - -#sign -sign.title=Sign -sign.header=Firma els PDF -sign.upload=Penja la imatge -sign.draw=Dibuixa la signatura -sign.text=Entrada de text -sign.clear=Esborrar -sign.add=Afegeix - - -#repair -repair.title=Reparar -repair.header=Repara els PDF -repair.submit=Reparar - - -#flatten -flatten.title=Aplanar -flatten.header=Aplana els PDF -flatten.submit=Aplanar - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Llindar d'angle: -ScannerImageSplit.selectText.2=Estableix l'angle absolut mínim necessari perquè la imatge es giri (per defecte: 10). -ScannerImageSplit.selectText.3=Tolerància: -ScannerImageSplit.selectText.4=Determina l'interval de variació de color al voltant del color de fons estimat (per defecte: 30). -ScannerImageSplit.selectText.5=Àrea Mínima: -ScannerImageSplit.selectText.6=Estableix el llindar d'àrea mínima per a una foto (per defecte: 10000). -ScannerImageSplit.selectText.7=Àrea de contorn mínima: -ScannerImageSplit.selectText.8=Estableix el llindar mínim de l'àrea de contorn per a una foto -ScannerImageSplit.selectText.9=Mida Vora: -ScannerImageSplit.selectText.10=Estableix la mida de la vora afegida i eliminada per evitar vores blanques a la sortida (per defecte: 1). - - -#OCR -ocr.title=OCR / Neteja escaneig -ocr.header=Neteja Escanejos / OCR (Reconeixement òptic de caràcters) -ocr.selectText.1=Selecciona els idiomes que s'han de detectar dins del PDF (els que s'indiquen són els detectats): -ocr.selectText.2=Produeix un fitxer de text que contingui text OCR juntament amb el PDF editat per OCR -ocr.selectText.3=Corregeix pàgines escanejades amb un angle esbiaixat girant-les de nou al seu lloc -ocr.selectText.4=Neteja la pàgina, de manera que és menys probable que l'OCR trobi soroll de text de fons. (Sense canvis de sortida) -ocr.selectText.5=Neteja la pàgina, de manera que és menys probable que l'OCR trobi text al soroll de fons, mantenint la neteja a la sortida. -ocr.selectText.6=Ignora les pàgines que tenen text interactiu, només les pàgines OCR que són imatges -ocr.selectText.7=Força OCR, l'OCR de cada pàgina elimina tots els elements de text originals -ocr.selectText.8=Normal (error si el PDF conté text) -ocr.selectText.9=Opcions Addicionals -ocr.selectText.10=Mode OCR -ocr.selectText.11=Elimia Imatges després de l'OCR (Alimina TOTES les imatges, útil si és part d'un procés de conversió) -ocr.selectText.12=Tipus de Renderització (Avançat) -ocr.help=Llegiu aquesta documentació sobre com utilitzar-la per a altres idiomes i/o no utilitzar-la a Docker -ocr.credit=Aquest servei empra OCRmyPDF i Tesseract per OCR. -ocr.submit=Processa PDF amb OCR - - -#extractImages -extractImages.title=Extreu Imatges -extractImages.header=Extreu Imatges -extractImages.selectText=Selecciona el format d'imatge al qual convertir les imatges extretes -extractImages.submit=Extreu - - -#File to PDF -fileToPDF.title=Arxiu a PDF -fileToPDF.header=Converteix arxiu a PDF -fileToPDF.credit=Utilitza LibreOffice i Unoconv per a la conversió. -fileToPDF.supportedFileTypes=Els tipus de fitxers admesos haurien d'incloure el següent, però per obtenir una llista completa actualitzada dels formats compatibles, consulteu la documentació de LibreOffice -fileToPDF.submit=Converteix a PDF - - -#compress -compress.title=Comprimir -compress.header=Comprimir PDF -compress.credit=Aquest servei utilitza Ghostscript per a la compressió/optimització de PDF. -compress.selectText.1=Mode manual: de l'1 al 4 -compress.selectText.2=Nivell d'optimització: -compress.selectText.3=4 (terrible per a imatges de text) -compress.selectText.4=Mode automàtic: ajusta automàticament la qualitat per tal que el PDF tingui la mida exacta -compress.selectText.5=Mida esperada del PDF (p. ex. 25 MB, 10,8 MB, 25 KB) -compress.submit=Comprimir - - -#Add image -addImage.title=Afegir Imatge -addImage.header=Afegir Imatge a PDF (en construcció) -addImage.everyPage=Totes les pàgines? -addImage.upload=Afegir Imatge -addImage.submit=Afegir Imatge - - -#merge -merge.title=Fusiona -merge.header=Fusiona múltiples PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Fusiona - - -#pdfOrganiser -pdfOrganiser.title=Organitzador de pàgines -pdfOrganiser.header=Organitzador de pàgines PDF -pdfOrganiser.submit=Reorganitza Pàgines - - -#multiTool -multiTool.title=PDF Multi Tool -multiTool.header=PDF Multi Tool - - -#pageRemover -pageRemover.title=Eliminació Pàgines -pageRemover.header=Eliminació Pàgines PDF -pageRemover.pagesToDelete=Pàgines a esborrar (Números de pàgina) : -pageRemover.submit=Esborra Pàgines - - -#rotate -rotate.title=Rota PDF -rotate.header=Rota PDF -rotate.selectAngle=Selecciona l'angle de gir (en múltiples de 90 graus): -rotate.submit=Rota - - -#merge -split.title=Divideix PDF -split.header=Divideix PDF -split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió -split.desc.2=Per tant, seleccionant 1,3,7-8 dividiria un document de 10 pàgines en 6 PDFS separats amb: -split.desc.3=Document #1: Pàgina 1 -split.desc.4=Document #2: Pàgina 2 i 3 -split.desc.5=Document #3: Pàgina 4, 5 i 6 -split.desc.6=Document #4: Pàgina 7 -split.desc.7=Document #5: Pàgina 8 -split.desc.8=Document #6: Pàgina 9 i 10 -split.splitPages=Introdueix pàgines per dividir-les: -split.submit=Divideix - - -#merge -imageToPDF.title=Imatge a PDF -imageToPDF.header=Imatge a PDF -imageToPDF.submit=Converteix -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Auto rota PDF -imageToPDF.selectText.3=Lògica de diversos fitxers (només està activada si es treballa amb diverses imatges) -imageToPDF.selectText.4=Combina en un únic PDF -imageToPDF.selectText.5=Converteix per separar PDFs - - -#pdfToImage -pdfToImage.title=PDF a Imatge -pdfToImage.header=PDF a Imatge -pdfToImage.selectText=Format Imatge -pdfToImage.singleOrMultiple=Tipus Imatge Resultant -pdfToImage.single=Única Imatge Gran -pdfToImage.multi=Múltiples Imatges -pdfToImage.colorType=Tipus Color -pdfToImage.color=Color -pdfToImage.grey=Escala de Grisos -pdfToImage.blackwhite=Blanc i Negre (Pot perdre dades!) -pdfToImage.submit=Converteix - - -#addPassword -addPassword.title=Afegir Password -addPassword.header=Afegir password (Encriptat) -addPassword.selectText.1=PDF a encriptar -addPassword.selectText.2=Password -addPassword.selectText.3=Longitud clau de xifratge -addPassword.selectText.4=Valors més alts són més forts, però els valors més baixos tenen una millor compatibilitat. -addPassword.selectText.5=Permissos a Establir -addPassword.selectText.6=Evita muntatge del document -addPassword.selectText.7=Evita extracció de contingut -addPassword.selectText.8=Evita extracció per accessibilitat -addPassword.selectText.9=Evita emplenar formularis -addPassword.selectText.10=Evita modificacions -addPassword.selectText.11=Evita modificacions d'annotacions -addPassword.selectText.12=Evita impressió -addPassword.selectText.13=Evita impressió de diferents formats -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Encripta - - -#watermark -watermark.title=Afegir Marca d'Aigua -watermark.header=Afegir Marca d'Aigua -watermark.selectText.1=Seleciona PDF per afegir Marca d'Aigua: -watermark.selectText.2=Text de la Marca d'Aigua -watermark.selectText.3=Mida de la Font: -watermark.selectText.4=Rotació (0-360): -watermark.selectText.5=separació d'amplada (Espai horitzontal entre cada Marca d'Aigua): -watermark.selectText.6=separació d'alçada (Espai vertical entre cada Marca d'Aigua): -watermark.selectText.7=Opacitat (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Afegir Marca d'Aigua - - -#Change permissions -permissions.title=Canviar Permissos -permissions.header=Canviar Permissos -permissions.warning=Advertència perquè aquests permisos siguin inalterables, es recomana establir-los amb una contrasenya a través de la pàgina d'afegir contrasenya -permissions.selectText.1=Selecciona PDF per Canviar Permissos -permissions.selectText.2=Permissos a canviar -permissions.selectText.3=Evita muntatge del document -permissions.selectText.4=Evita extracció de contingut -permissions.selectText.5=evita extracció de contingut per accessibilitat -permissions.selectText.6=Evita emplenar formularis -permissions.selectText.7=Evita modificacions -permissions.selectText.8=Evita modificacions d'annotacions -permissions.selectText.9=Evita impressió -permissions.selectText.10=Evita impressió de diferents formats -permissions.submit=Canviar Permissos - - -#remove password -removePassword.title=Treure Password -removePassword.header=Treure Password (Decriptar) -removePassword.selectText.1=Selecciona PDF a Decriptar -removePassword.selectText.2=Password -removePassword.submit=Treu Password - - -#changeMetadata -changeMetadata.title=Títol: -changeMetadata.header=Canvia Metadades -changeMetadata.selectText.1=Edit les variables a canviar -changeMetadata.selectText.2=Neteja totes les matadades -changeMetadata.selectText.3=Mostra Metadades Personalitzades: -changeMetadata.author=Autor: -changeMetadata.creationDate=Data Creació (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Creador: -changeMetadata.keywords=Keywords: -changeMetadata.modDate=Data Modificació (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Productor: -changeMetadata.subject=Assumpte: -changeMetadata.title=Títol: -changeMetadata.trapped=Atrapat: -changeMetadata.selectText.4=Altres Metadades: -changeMetadata.selectText.5=Afegir entrada personalizada -changeMetadata.submit=Canvia - - -#pdfToPDFA -pdfToPDFA.title=PDF a PDF/A -pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A -pdfToPDFA.submit=Converteix - - -#PDFToWord -PDFToWord.title=PDF a Word -PDFToWord.header=PDF a Word -PDFToWord.selectText.1=Format d'Arxiu de Sortida -PDFToWord.credit=Utilitza LibreOffice per a la conversió d'Arxius. -PDFToWord.submit=Converteix - - -#PDFToPresentation -PDFToPresentation.title=PDF a Presentació -PDFToPresentation.header=PDF a Presentació -PDFToPresentation.selectText.1=Format d'Arxiu de Sortida -PDFToPresentation.credit=Utilitza LibreOffice per a la conversió d'Arxius. -PDFToPresentation.submit=Converteix - - -#PDFToText -PDFToText.title=PDF a Text/RTF -PDFToText.header=PDF a Text/RTF -PDFToText.selectText.1=Format d'Arxiu de Sortida -PDFToText.credit=Utilitza LibreOffice per a la conversió d'Arxius. -PDFToText.submit=Converteix - - -#PDFToHTML -PDFToHTML.title=PDF a HTML -PDFToHTML.header=PDF a HTML -PDFToHTML.credit=Utilitza LibreOffice per a la conversió d'Arxius. -PDFToHTML.submit=Converteix - - -#PDFToXML -PDFToXML.title=PDF a XML -PDFToXML.header=PDF a XML -PDFToXML.credit=Utilitza LibreOffice per a la conversió d'Arxius. -PDFToXML.submit=Converteix diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties deleted file mode 100644 index 02f87df6..00000000 --- a/src/main/resources/messages_de_DE.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=PDF auswählen -multiPdfPrompt=PDFs auswählen(2+) -multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) -imgPrompt=Wählen Sie ein Bild -genericSubmit=Einreichen -processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern -pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein): -goToPage=Los -true=Wahr -false=Falsch -unknown=Unbekannt -save=Speichern -close=Schließen -filesSelected=Dateien ausgewählt -noFavourites=Keine Favoriten hinzugefügt -bored=Langeweile beim Warten? -alphabet=Alphabet -downloadPdf=PDF herunterladen -text=Text -font=Schriftart -selectFillter=-- Auswählen -- -pageNum=Seitenzahl -sizes.small=Klein -sizes.medium=Mittel -sizes.large=Groß -sizes.x-large=Extra Groß -error.pdfPassword=Das PDF-Dokument ist passwortgeschützt und das Passwort wurde entweder nicht angegeben oder war falsch -delete=Löschen -username=Benutzername -password=Passwort -welcome=Willkommen -property=Eigenschaft -black=Schwarz -white=Weiß -red=Rot -green=Grün -blue=Blau -custom=benutzerdefiniert... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Konvertieren -navbar.security=Sicherheit -navbar.other=Anderes -navbar.darkmode=Dark Mode -navbar.pageOps=Seitenoperationen -navbar.settings=Einstellungen - -############# -# SETTINGS # -############# -settings.title=Einstellungen -settings.update=Update verfügbar -settings.appVersion=App-Version: -settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind): -settings.downloadOption.1=Im selben Fenster öffnen -settings.downloadOption.2=In neuem Fenster öffnen -settings.downloadOption.3=Datei herunterladen -settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird -settings.signOut=Abmelden -settings.accountSettings=Kontoeinstellungen - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Kontoeinstellungen -account.accountSettings=Kontoeinstellungen -account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen -account.userControlSettings=Benutzerkontrolle -account.changeUsername=Passwort ändern -account.changeUsername=Passwort ändern -account.password=Bestätigungspasswort -account.oldPassword=Altes Passwort -account.newPassword=Neues Passwort -account.changePassword=Password ändern -account.confirmNewPassword=Neues Passwort bestätigen -account.signOut=Abmelden -account.yourApiKey=Dein API Schlüssel -account.syncTitle=Browsereinstellungen mit Konto synchronisieren -account.settingsCompare=Einstellungen vergleichen: -account.property=Eigenschaft -account.webBrowserSettings=Webbrowser-Einstellung -account.syncToBrowser=Synchronisiere Konto -> Browser -account.syncToAccount=Synchronisiere Konto <- Browser - - -adminUserSettings.title=Benutzerkontrolle -adminUserSettings.header=Administrator-Benutzerkontrolle -adminUserSettings.admin=Admin -adminUserSettings.user=Benutzer -adminUserSettings.addUser=Neuen Benutzer hinzufügen -adminUserSettings.roles=Rollen -adminUserSettings.role=Rolle -adminUserSettings.actions=Aktion -adminUserSettings.apiUser=Eingeschränkter API-Benutzer -adminUserSettings.webOnlyUser=Nur Web-Benutzer -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Benutzer speichern - -############# -# HOME-PAGE # -############# -home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen. - - -home.multiTool.title=PDF-Multitool -home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Zusammenführen -home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Aufteilen -home.split.desc=PDFs in mehrere Dokumente aufteilen. -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Drehen -home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach. -rotate.tags=server side - - -home.imageToPdf.title=Bild zu PDF -home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF zu Bild -home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF). -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Organisieren -home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern. -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Bild einfügen -home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit). -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Wasserzeichen hinzufügen -home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Berechtigungen ändern -home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern. -permissions.tags=read,write,edit,print - - -home.removePages.title=Entfernen -home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Passwort hinzufügen -home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln. -addPassword.tags=secure,security - -home.removePassword.title=Passwort entfernen -home.removePassword.desc=Den Passwortschutz eines PDFs entfernen. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Komprimieren -home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Metadaten ändern -home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Datei in PDF konvertieren -home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=Führe OCR/Cleanup-Scans aus -home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Bilder extrahieren -home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF zu PDF/A konvertieren -home.pdfToPDFA.desc=PDF zu PDF/A für Langzeitarchivierung konvertieren -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF zu Word -home.PDFToWord.desc=PDF in Word-Formate konvertieren (DOC, DOCX und ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF zu Präsentation -home.PDFToPresentation.desc=PDF in Präsentationsformate konvertieren (PPT, PPTX und ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF in Text/RTF -home.PDFToText.desc=PDF in Text- oder RTF-Format konvertieren -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF in HTML -home.PDFToHTML.desc=PDF in HTML-Format konvertieren -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF in XML -home.PDFToXML.desc=PDF in XML-Format konvertieren -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Gescannte Fotos erkennen/aufteilen -home.ScannerImageSplit.desc=Teilt mehrere Fotos innerhalb eines Fotos/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Signieren -home.sign.desc=Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Abflachen -home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Reparatur -home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Leere Seiten entfernen -home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Vergleichen -home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Mit Zertifikat signieren -home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Mehrseitiges Layout -home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Seitengröße/Skalierung anpassen -home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Fortgeschritten) -home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch einen Pipeline Skript -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Seitenzahlen hinzufügen -home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=PDF automatisch umbenennen -home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Farben/Kontrast anpassen -home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=PDF zuschneiden -home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=PDF automatisch teilen -home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=PDF Bereinigen -home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website zu PDF -home.URLToPDF.desc=Konvertiert jede http(s)URL zu PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML zu PDF -home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown zu PDF -home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Alle Informationen anzeigen -home.getPdfInfo.desc=Erfasst alle möglichen Informationen in einer PDF -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Seite(n) extrahieren -home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen -home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen -PdfToSinglePage.tags=single page - - -home.showJS.title=Javascript anzeigen -home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen -showJS.tags=JS - -home.autoRedact.title=Automatisch zensieren/schwärzen -home.autoRedact.desc=Automatisches zensiertes (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Anmelden -login.signin=Anmelden -login.rememberme=Angemeldet bleiben -login.invalid=Ungültiger Benutzername oder Passwort. -login.locked=Ihr Konto wurde gesperrt. -login.signinTitle=Bitte melden Sie sich an - - -#auto-redact -autoRedact.title=Automatisch zensieren/schwärzen -autoRedact.header=Automatisch zensieren/schwärzen -autoRedact.colorLabel=Farbe -autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile) -autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim -autoRedact.useRegexLabel=Regex verwenden -autoRedact.wholeWordSearchLabel=Ganzes Wort suchen -autoRedact.customPaddingLabel=Benutzerdefinierte Extra-Padding -autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten) -autoRedact.submitButton=zensieren - - -#showJS -showJS.title=Javascript anzeigen -showJS.header=Javascript anzeigen -showJS.downloadJS=Javascript herunterladen -showJS.submit=Anzeigen - - -#pdfToSinglePage -pdfToSinglePage.title=PDF zu einer Seite zusammenfassen -pdfToSinglePage.header=PDF zu einer Seite zusammenfassen -pdfToSinglePage.submit=Zusammenfassen - - -#pageExtracter -pageExtracter.title=Seiten extrahieren -pageExtracter.header=Seiten extrahieren -pageExtracter.submit=Extrahieren - - -#getPdfInfo -getPdfInfo.title=Alle Informationen anzeigen -getPdfInfo.header=Alle Informationen anzeigen -getPdfInfo.submit=Informationen anzeigen -getPdfInfo.downloadJson=Als JSON herunterladen - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown zu PDF -MarkdownToPDF.header=Markdown zu PDF -MarkdownToPDF.submit=Konvertieren -MarkdownToPDF.help=In Arbeit -MarkdownToPDF.credit=Verwendet WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL zu PDF -URLToPDF.header=URL zu PDF -URLToPDF.submit=Konvertieren -URLToPDF.credit=Verwendet WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML zu PDF -HTMLToPDF.header=HTML zu PDF -HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. -HTMLToPDF.submit=Konvertieren -HTMLToPDF.credit=Verwendet WeasyPrint - - -#sanitizePDF -sanitizePDF.title=PDF Bereinigen -sanitizePDF.header=PDF Bereinigen -sanitizePDF.selectText.1=Javascript-Aktionen entfernen -sanitizePDF.selectText.2=Eingebettete Dateien entfernen -sanitizePDF.selectText.3=Metadaten entfernen -sanitizePDF.selectText.4=Links entfernen -sanitizePDF.selectText.5=Schriftarten entfernen -sanitizePDF.submit=Bereinigen - - -#addPageNumbers -addPageNumbers.title=Seitenzahlen hinzufügen -addPageNumbers.header=Seitenzahlen hinzufügen -addPageNumbers.selectText.1=PDF-Datei auswählen: -addPageNumbers.selectText.2=Margin Größe -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Startnummer -addPageNumbers.selectText.5=Seiten zu nummerieren -addPageNumbers.selectText.6=Benutzerdefinierter Text -addPageNumbers.customTextDesc=Benutzerdefinierter Text -addPageNumbers.numberPagesDesc=Welche Seiten nummeriert werden sollen, Standardeinstellung 'alle' ('all'), akzeptiert auch 1-5 oder 2,5,9 usw. -addPageNumbers.customNumberDesc=Standardmäßig {n}, akzeptiert auch 'Seite {n} von {insgesamt}', 'Text-{n}', '{Dateiname}-{n} ('{filename}-{n}) -addPageNumbers.submit=Seitenzahlen hinzufügen - - -#auto-rename -auto-rename.title=PDF automatisch umbenennen -auto-rename.header=PDF automatisch umbenennen -auto-rename.submit=Automatisch umbenennen - - -#adjustContrast -adjustContrast.title=Kontrast anpassen -adjustContrast.header=Farben/Kontrast anpassen -adjustContrast.contrast=Kontrast: -adjustContrast.brightness=Helligkeit: -adjustContrast.saturation=Sättigung: -adjustContrast.download=Herunterladen - - -#crop -crop.title=Zuschneiden -crop.header=Bild zuschneiden -crop.submit=Abschicken - - -#autoSplitPDF -autoSplitPDF.title=PDF automatisch teilen -autoSplitPDF.header=PDF automatisch teilen -autoSplitPDF.description=Drucken Sie, fügen Sie ein, scannen Sie, laden Sie hoch, und lassen Sie uns Ihre Dokumente automatisch trennen. Kein manuelles Sortieren erforderlich. -autoSplitPDF.selectText.1=Drucken Sie einige Trennblätter aus (schwarz/weiß ist ausreichend). -autoSplitPDF.selectText.2=Scannen Sie alle Dokumente auf einmal, indem Sie das Trennblatt zwischen die Dokumente einlegen. -autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch und überlassen Sie Stirling PDF den Rest. -autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist. -autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen: -autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite) -autoSplitPDF.dividerDownload1=Herunterladen 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf' -autoSplitPDF.submit=Aufteilen - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Mehrseitiges Layout -pageLayout.header=Mehrseitiges Layout -pageLayout.pagesPerSheet=Seiten pro Blatt: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Abschicken - - -#scalePages -scalePages.title=Seitengröße anpassen -scalePages.header=Seitengröße anpassen -scalePages.pageSize=Format der Seiten des Dokuments. -scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite. -scalePages.submit=Abschicken - - -#certSign -certSign.title=Zertifikatsignierung -certSign.header=Signieren Sie ein PDF mit Ihrem Zertifikat (in Arbeit) -certSign.selectPDF=Wählen Sie eine PDF-Datei zum Signieren aus: -certSign.selectKey=Wählen Sie Ihre private Schlüsseldatei aus (PKCS#8-Format, könnte .pem oder .der sein): -certSign.selectCert=Wählen Sie Ihre Zertifikatsdatei aus (X.509-Format, könnte .pem oder .der sein): -certSign.selectP12=Wählen Sie Ihre PKCS#12-Keystore-Datei (.p12 oder .pfx) aus (optional, falls angegeben, sollte sie Ihren privaten Schlüssel und Ihr Zertifikat enthalten): -certSign.certType=Zertifikattyp -certSign.password=Geben Sie Ihr Keystore- oder Private-Key-Passwort ein (falls vorhanden): -certSign.showSig=Signatur anzeigen -certSign.reason=Grund -certSign.location=Standort -certSign.name=Name -certSign.submit=PDF signieren - - -#removeBlanks -removeBlanks.title=Leere Seiten entfernen -removeBlanks.header=Leere Seiten entfernen -removeBlanks.threshold=Schwellenwert: -removeBlanks.thresholdDesc=Schwellenwert zur Bestimmung, wie weiß ein weißer Pixel sein muss -removeBlanks.whitePercent=Weißprozentsatz (%): -removeBlanks.whitePercentDesc=Prozentsatz der Seite, die weiß sein muss, um entfernt zu werden -removeBlanks.submit=Leere Seiten entfernen - - -#compare -compare.title=Vergleichen -compare.header=PDFs vergleichen -compare.document.1=Dokument 1 -compare.document.2=Dokument 2 -compare.submit=Vergleichen - - -#sign -sign.title=Signieren -sign.header=PDFs signieren -sign.upload=Bild hochladen -sign.draw=Signatur zeichnen -sign.text=Texteingabe -sign.clear=Klar -sign.add=Signieren - - -#repair -repair.title=Reparieren -repair.header=PDFs reparieren -repair.submit=Reparieren - - -#flatten -flatten.title=Abflachen -flatten.header=PDFs reduzieren -flatten.submit=Abflachen - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Winkelschwelle: -ScannerImageSplit.selectText.2=Legt den minimalen absoluten Winkel fest, der erforderlich ist, damit das Bild gedreht werden kann (Standard: 10). -ScannerImageSplit.selectText.3=Toleranz: -ScannerImageSplit.selectText.4=Bestimmt den Bereich der Farbvariation um die geschätzte Hintergrundfarbe herum (Standard: 30). -ScannerImageSplit.selectText.5=Mindestbereich: -ScannerImageSplit.selectText.6=Legt den minimalen Bereichsschwellenwert für ein Foto fest (Standard: 10000). -ScannerImageSplit.selectText.7=Minimaler Konturbereich: -ScannerImageSplit.selectText.8=Legt den minimalen Konturbereichsschwellenwert für ein Foto fest -ScannerImageSplit.selectText.9=Randgröße: -ScannerImageSplit.selectText.10=Legt die Größe des hinzugefügten und entfernten Randes fest, um weiße Ränder in der Ausgabe zu verhindern (Standard: 1). - - -#OCR -ocr.title=OCR / Scan-Bereinigung -ocr.header=Scans bereinigen / OCR (Optical Character Recognition) -ocr.selectText.1=Sprachen auswählen, die im PDF erkannt werden sollen (die aufgelisteten sind die aktuell erkannten): -ocr.selectText.2=Textdatei erzeugen, die OCR-Text neben dem OCR-bearbeiteten PDF enthält -ocr.selectText.3=Korrekte Seiten wurden in einem schiefen Winkel gescannt, indem sie wieder an ihren Platz gedreht wurden -ocr.selectText.4=Seite säubern, daher ist es weniger wahrscheinlich, dass OCR Text im Hintergrundrauschen findet. (Keine Ausgangsänderung) -ocr.selectText.5=Seite säubern, sodass es weniger wahrscheinlich ist, dass OCR Text im Hintergrundrauschen findet, Bereinigung der Ausgabe wird beibehalten. -ocr.selectText.6=Ignoriert Seiten mit interaktivem Text, nur OCR-Seiten, die Bilder sind -ocr.selectText.7=OCR erzwingen, OCR wird jede Seite entfernen und alle ursprünglichen Textelemente entfernen -ocr.selectText.8=Normal (Fehler, wenn PDF Text enthält) -ocr.selectText.9=Zusätzliche Einstellungen -ocr.selectText.10=OCR-Modus -ocr.selectText.11=Bilder nach OCR entfernen (Entfernt ALLE Bilder, nur sinnvoll, wenn Teil des Konvertierungsschritts) -ocr.selectText.12=Rendertyp (Erweitert) -ocr.help=Bitte lesen Sie diese Dokumentation, um zu erfahren, wie Sie dies für andere Sprachen verwenden und/oder nicht in Docker verwenden können -ocr.credit=Dieser Dienst verwendet OCRmyPDF und Tesseract für OCR. -ocr.submit=PDF mit OCR verarbeiten - - -#extractImages -extractImages.title=Bilder extrahieren -extractImages.header=Bilder extrahieren -extractImages.selectText=Wählen Sie das Bildformat aus, in das extrahierte Bilder konvertiert werden sollen -extractImages.submit=Extrahieren - - -#File to PDF -fileToPDF.title=Datei in PDF -fileToPDF.header=Beliebige Dateien in PDF konvertieren -fileToPDF.credit=Dieser Dienst verwendet LibreOffice und Unoconv für die Dateikonvertierung. -fileToPDF.supportedFileTypes=Unterstützte Dateitypen sollten die folgenden enthalten, eine vollständige aktualisierte Liste der unterstützten Formate finden Sie jedoch in der LibreOffice-Dokumentation -fileToPDF.submit=In PDF konvertieren - - -#compress -compress.title=Komprimieren -compress.header=PDF komprimieren -compress.credit=Dieser Dienst verwendet Ghostscript für die PDF-Komprimierung/-Optimierung. -compress.selectText.1=Manueller Modus – Von 1 bis 4 -compress.selectText.2=Optimierungsstufe: -compress.selectText.3=4 (Schrecklich für Textbilder) -compress.selectText.4=Automatischer Modus – Passt die Qualität automatisch an, um das PDF auf die exakte Größe zu bringen -compress.selectText.5=Erwartete PDF-Größe (z. B. 25 MB, 10,8 MB, 25 KB) -compress.submit=Komprimieren - - -#Add image -addImage.title=Bild hinzufügen -addImage.header=Ein Bild einfügen -addImage.everyPage=Jede Seite? -addImage.upload=Bild hinzufügen -addImage.submit=Bild hinzufügen - - -#merge -merge.title=Zusammenführen -merge.header=Mehrere PDFs zusammenführen (2+) -merge.sortByName=Nach Namen sortieren -merge.sortByDate=Nach Datum sortieren -merge.submit=Zusammenführen - - -#pdfOrganiser -pdfOrganiser.title=Seiten anordnen -pdfOrganiser.header=PDF Seitenorganisation -pdfOrganiser.submit=Seiten anordnen - - -#multiTool -multiTool.title=PDF-Multitool -multiTool.header=PDF-Multitool - - -#pageRemover -pageRemover.title=Seiten entfernen -pageRemover.header=PDF Seiten entfernen -pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an): -pageRemover.submit=Seiten löschen - - -#rotate -rotate.title=PDF drehen -rotate.header=PDF drehen -rotate.selectAngle=Wählen Sie den Winkel (in Vielfachen von 90 Grad): -rotate.submit=Drehen - - -#merge -split.title=PDF aufteilen -split.header=PDF aufteilen -split.desc.1=Die Nummern, die Sie auswählen, sind die Seitenzahlen, an denen Sie aufteilen möchten. -split.desc.2=So würde die Auswahl von 1,3,7-8 ein 10-seitiges Dokument in 6 separate PDFs aufteilen, mit: -split.desc.3=Dokument #1: Seite 1 -split.desc.4=Dokument #2: Seite 2 und 3 -split.desc.5=Dokument #3: Seite 4, 5 und 6 -split.desc.6=Dokument #4: Seite 7 -split.desc.7=Dokument #5: Seite 8 -split.desc.8=Dokument #6: Seite 9 und 10 -split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll: -split.submit=Aufteilen - - -#merge -imageToPDF.title=Bild zu PDF -imageToPDF.header=Bild zu PDF -imageToPDF.submit=Umwandeln -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=PDF automatisch drehen -imageToPDF.selectText.3=Mehrere Dateien verarbeiten (nur aktiv, wenn Sie mit mehreren Bildern arbeiten) -imageToPDF.selectText.4=In ein einziges PDF zusammenführen -imageToPDF.selectText.5=In separate PDFs konvertieren - - -#pdfToImage -pdfToImage.title=PDF zu Bild -pdfToImage.header=PDF zu Bild -pdfToImage.selectText=Bildformat -pdfToImage.singleOrMultiple=Bildergebnistyp -pdfToImage.single=Einzelnes großes Bild -pdfToImage.multi=Mehrere Bilder -pdfToImage.colorType=Farbtyp -pdfToImage.color=Farbe -pdfToImage.grey=Graustufen -pdfToImage.blackwhite=Schwarzweiß (Datenverlust möglich!) -pdfToImage.submit=Umwandeln - - -#addPassword -addPassword.title=Passwort hinzufügen -addPassword.header=Passwort hinzufügen (Verschlüsseln) -addPassword.selectText.1=Das zu verschlüsselnde PDF auswählen -addPassword.selectText.2=Passwort -addPassword.selectText.3=Länge des Schlüssels -addPassword.selectText.4=Größere Werte sind stärker, aber niedrigere Werte sind besser kompatibel. -addPassword.selectText.5=Zu setzende Berechtigungen -addPassword.selectText.6=Das zusammensetzen des PDFs verhindern -addPassword.selectText.7=Inhaltsextrahierung verhindern -addPassword.selectText.8=Inhaltsextrahierung zur Barrierefreiheit verhindern -addPassword.selectText.9=Ausfüllen des Formulars verhindern -addPassword.selectText.10=Modifizierung verhindern -addPassword.selectText.11=Ändern von Kommentaren verhindern -addPassword.selectText.12=Drucken verhindern -addPassword.selectText.13=Drucken verschiedener Formate verhindern -addPassword.selectText.14=Passwort des Besitzers -addPassword.selectText.15=Schränkt ein, was mit dem Dokument gemacht werden kann, sobald es geöffnet ist (wird nicht von allen Leseprogrammen unterstützt) -addPassword.selectText.16=Schränkt das Öffnen des Dokuments selbst ein -addPassword.submit=Verschlüsseln - - -#watermark -watermark.title=Wasserzeichen hinzufügen -watermark.header=Wasserzeichen hinzufügen -watermark.selectText.1=PDF auswählen, dem ein Wasserzeichen hinzugefügt werden soll: -watermark.selectText.2=Wasserzeichen Text: -watermark.selectText.3=Schriftgröße: -watermark.selectText.4=Drehung (0-360): -watermark.selectText.5=breiteSpacer (horizontaler Abstand zwischen den einzelnen Wasserzeichen): -watermark.selectText.6=höheSpacer (vertikaler Abstand zwischen den einzelnen Wasserzeichen): -watermark.selectText.7=Deckkraft (0% - 100 %): -watermark.selectText.8=Wasserzeichen Typ: -watermark.selectText.9=Wasserzeichen-Bild: -watermark.submit=Wasserzeichen hinzufügen - - -#Change permissions -permissions.title=Berechtigungen ändern -permissions.header=Berechtigungen ändern -permissions.warning=Achtung: Damit diese Berechtigungen nicht geändert werden können, wird empfohlen, sie über die "Passwort hinzufügen"-Seite mit einem Passwort zu versehen -permissions.selectText.1=Das zu ändernde PDF auswählen -permissions.selectText.2=Zu setzende Berechtigungen -permissions.selectText.3=Das zusammensetzen des PDFs verhindern -permissions.selectText.4=Inhaltsextrahierung verhindern -permissions.selectText.5=Inhaltsextrahierung zur Barrierefreiheit verhindern -permissions.selectText.6=Ausfüllen des Formulars verhindern -permissions.selectText.7=Modifizierung verhindern -permissions.selectText.8=Ändern von Kommentaren verhindern -permissions.selectText.9=Drucken verhindern -permissions.selectText.10=Drucken verschiedener Formate verhindern -permissions.submit=Ändern - - -#remove password -removePassword.title=Passwort entfernen -removePassword.header=Passwort entfernen (Entschlüsseln) -removePassword.selectText.1=Das zu entschlüsselnde PDF auswählen -removePassword.selectText.2=Passwort -removePassword.submit=Entfernen - - -#changeMetadata -changeMetadata.title=Titel: -changeMetadata.header=Metadaten ändern -changeMetadata.selectText.1=Bitte bearbeiten Sie die Variablen, die Sie ändern möchten -changeMetadata.selectText.2=Alle Metadaten löschen -changeMetadata.selectText.3=Benutzerdefinierte Metadaten anzeigen: -changeMetadata.author=Autor: -changeMetadata.creationDate=Erstellungsdatum (jjjj/MM/tt HH:mm:ss): -changeMetadata.creator=Ersteller: -changeMetadata.keywords=Schlüsselwörter: -changeMetadata.modDate=Änderungsdatum (JJJJ/MM/TT HH:mm:ss): -changeMetadata.producer=Produzent: -changeMetadata.subject=Betreff: -changeMetadata.title=Titel: -changeMetadata.trapped=Gefangen: -changeMetadata.selectText.4=Andere Metadaten: -changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen -changeMetadata.submit=Ändern - - -#pdfToPDFA -pdfToPDFA.title=PDF zu PDF/A -pdfToPDFA.header=PDF zu PDF/A -pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung -pdfToPDFA.submit=Konvertieren - - -#PDFToWord -PDFToWord.title=PDF zu Word -PDFToWord.header=PDF zu Word -PDFToWord.selectText.1=Ausgabedateiformat -PDFToWord.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. -PDFToWord.submit=Konvertieren - - -#PDFToPresentation -PDFToPresentation.title=PDF zu Präsentation -PDFToPresentation.header=PDF zu Präsentation -PDFToPresentation.selectText.1=Ausgabedateiformat -PDFToPresentation.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. -PDFToPresentation.submit=Konvertieren - - -#PDFToText -PDFToText.title=PDF in Text/RTF -PDFToText.header=PDF in Text/RTF -PDFToText.selectText.1=Ausgabedateiformat -PDFToText.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. -PDFToText.submit=Konvertieren - - -#PDFToHTML -PDFToHTML.title=PDF in HTML -PDFToHTML.header=PDF in HTML -PDFToHTML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. -PDFToHTML.submit=Konvertieren - - -#PDFToXML -PDFToXML.title=PDF in XML -PDFToXML.header=PDF in XML -PDFToXML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung. -PDFToXML.submit=Konvertieren diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties deleted file mode 100644 index 715d63a1..00000000 --- a/src/main/resources/messages_el_GR.properties +++ /dev/null @@ -1,817 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr = left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDF(s) -multiPdfPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDFs (2+) -multiPdfDropPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE (\u03AE \u03C4\u03C1\u03AC\u03B2\u03B7\u03B3\u03BC\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03B1\u03C0\u03CC\u03B8\u03B5\u03C3\u03B7) \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD PDF \u03C0\u03BF\u03C5 \u03C7\u03C1\u03B5\u03B9\u03AC\u03B6\u03B5\u03C3\u03C4\u03B5 -imgPrompt=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2(\u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD) -genericSubmit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE -processTimeWarning=\u03A0\u03C1\u03BF\u03C3\u03BF\u03C7\u03AE: \u0391\u03C5\u03C4\u03AE \u03B7 \u03B4\u03B9\u03B1\u03B4\u03B9\u03BA\u03B1\u03C3\u03AF\u03B1 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C1\u03BA\u03AD\u03C3\u03B5\u03B9 \u03AD\u03C9\u03C2 \u03BA\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C0\u03C4\u03CC \u03B1\u03BD\u03AC\u03BB\u03BF\u03B3\u03B1 \u03BC\u03B5 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -pageOrderPrompt=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03B7 \u03A3\u03B5\u03B9\u03C1\u03AC \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 (\u03A0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C3\u03C4\u03B5 \u03BC\u03AF\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B5 \u03B1\u03C0\u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03B9\u03B4\u03CE\u03BD, \u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B5\u03C2 \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1 \u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2 \u03CC\u03C0\u03C9\u03C2 2n+1) : -goToPage=Go -true=\u0391\u03BB\u03B7\u03B8\u03AD\u03C2 -false=\u039B\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF -unknown=\u0386\u03B3\u03BD\u03C9\u03C3\u03C4\u03BF -save=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 -close=\u039A\u03BB\u03B5\u03AF\u03C3\u03B9\u03BC\u03BF -filesSelected=\u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03C7\u03B8\u03B7\u03BA\u03B1\u03BD -noFavourites=\u039A\u03B1\u03BD\u03AD\u03BD\u03B1 \u03B1\u03B3\u03B1\u03C0\u03AE\u03BC\u03B5\u03BD\u03BF \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B5\u03B8\u03B5\u03AF -bored=\u0392\u03B1\u03C1\u03B9\u03AD\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BC\u03AD\u03BD\u03B5\u03C4\u03B5; -alphabet=\u0391\u03BB\u03C6\u03AC\u03B2\u03B7\u03C4\u03BF -downloadPdf=\u039A\u03B1\u03C4\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF -text=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF -font=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC -selectFillter=-- \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE -- -pageNum=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -sizes.small=\u039C\u03B9\u03BA\u03C1\u03CC -sizes.medium=\u039C\u03B5\u03C3\u03B1\u03AF\u03BF -sizes.large=\u039C\u03B5\u03B3\u03AC\u03BB\u03BF -sizes.x-large=\u03A0\u03BF\u03BB\u03CD \u039C\u03B5\u03B3\u03AC\u03BB\u03BF -error.pdfPassword=\u03A4\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BA\u03BB\u03B5\u03B9\u03B4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03BA\u03B1\u03B9 \u03B5\u03AF\u03C4\u03B5 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03B9 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC, \u03B5\u03AF\u03C4\u03B5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 -delete=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE -username=\u038C\u03BD\u03BF\u03BC\u03B1 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -password=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 -welcome=\u039A\u03B1\u03BB\u03C9\u03C2 \u0389\u03BB\u03B8\u03B1\u03C4\u03B5 -property=Property -black=\u039C\u03B1\u03CD\u03C1\u03BF -white=\u0386\u03C3\u03C0\u03C1\u03BF -red=\u039A\u03CC\u03BA\u03BA\u03B9\u03BD\u03BF -green=\u03A0\u03C1\u03AC\u03C3\u03B9\u03BD\u03BF -blue=\u039C\u03C0\u03BB\u03AD -custom=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE... - -changedCredsMessage=\u03A4\u03B1 \u03B4\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03AE\u03C1\u03B9\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9! -notAuthenticatedMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C5\u03B8\u03B5\u03BD\u03C4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF. -userNotFoundMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5. -incorrectPasswordMessage=\u039F \u03C4\u03C1\u03AD\u03C7\u03C9\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B1\u03BD\u03B8\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2. -usernameExistsMessage=\u03A4\u03BF \u03BD\u03AD\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03AE\u03B4\u03B7. - - - -############# -# NAVBAR # -############# -navbar.convert=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -navbar.security=\u0391\u03C3\u03C6\u03AC\u03BB\u03B5\u03B9\u03B1 -navbar.other=\u0394\u03B9\u03AC\u03C6\u03BF\u03C1\u03B1 -navbar.darkmode=\u039C\u03B1\u03CD\u03C1\u03BF \u0398\u03AD\u03BC\u03B1 -navbar.pageOps=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B5\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -navbar.settings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 - -############# -# SETTINGS # -############# -settings.title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 -settings.update=\u03A5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9 \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B7 \u03B5\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 -settings.appVersion=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2: App Version: -settings.downloadOption.title=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03BB\u03AE\u03C8\u03B7\u03C2 (\u0393\u03B9\u03B1 \u03BB\u03AE\u03C8\u03B5\u03B9\u03C2 \u03BC\u03B5\u03BC\u03BF\u03BD\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03C7\u03C9\u03C1\u03AF\u03C2 zip): -settings.downloadOption.1=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03C4\u03BF \u03AF\u03B4\u03B9\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF -settings.downloadOption.2=\u0386\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF -settings.downloadOption.3=\u039B\u03AE\u03C8\u03B7 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -settings.zipThreshold=Zip \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03CC\u03C4\u03B1\u03BD \u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD \u03BB\u03B7\u03C6\u03B8\u03AD\u03BD\u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF\u03C2 -settings.signOut=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 -settings.accountSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD - - - -changeCreds.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03B7\u03C1\u03AF\u03C9\u03BD -changeCreds.header=\u0395\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03B5\u03C1\u03B5\u03B9\u03CE\u03BD \u03C4\u03BF\u03C5 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD \u03C3\u03B1\u03C2 -changeCreds.changeUserAndPassword=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B1 \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B1 \u03B4\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03AE\u03C1\u03B9\u03B1 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\u03C2. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BD\u03AD\u03BF \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 (\u03BA\u03B1\u03B9 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03B1\u03BD \u03C4\u03BF \u03B5\u03C0\u03B9\u03B8\u03C5\u03BC\u03B5\u03AF\u03C4\u03B5) -changeCreds.newUsername=\u039D\u03AD\u03BF \u038C\u03BD\u03BF\u03BC\u03B1 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -changeCreds.oldPassword=\u03A4\u03C1\u03AD\u03C7\u03C9\u03BD \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -changeCreds.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -changeCreds.confirmNewPassword=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039D\u03AD\u03BF\u03C5 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -changeCreds.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE \u0391\u03BB\u03BB\u03B1\u03B3\u03CE\u03BD - - - -account.title=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD -account.accountSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD -account.adminSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE - \u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03BA\u03B1\u03B9 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD -account.userControlSettings=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03A7\u03B5\u03B9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03A7\u03C1\u03B7\u03C3\u03C4\u03CE\u03BD -account.changeUsername=\u039D\u03AD\u03BF \u038C\u03BD\u03BF\u03BC\u03B1 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -account.changeUsername=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039F\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -account.password=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -account.oldPassword=\u03A0\u03B1\u03BB\u03B9\u03CC\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -account.newPassword=\u039D\u03AD\u03BF\u03C2 \u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -account.changePassword=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -account.confirmNewPassword=\u0395\u03C0\u03B9\u03B2\u03B5\u03B2\u03B1\u03AF\u03C9\u03C3\u03B7 \u039D\u03AD\u03BF\u03C5 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD -account.signOut=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 -account.yourApiKey=\u03A4\u03BF \u03BA\u03BB\u03B5\u03B9\u03B4\u03AF \u03C3\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03B4\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03CE\u03BD (API key) -account.syncTitle=\u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD \u03C1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD \u03C4\u03BF\u03C5 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC -account.settingsCompare=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03C9\u03BD: -account.property=Property -account.webBrowserSettings=\u03A1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 \u03C6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) -account.syncToBrowser=\u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD -> \u03A6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) -account.syncToAccount= \u03A3\u03C5\u03B3\u03C7\u03C1\u03BF\u03BD\u03B9\u03C3\u03BC\u03CC\u03C2 \u039B\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03BF\u03CD <- \u03A6\u03C5\u03BB\u03BB\u03BF\u03BC\u03B5\u03C4\u03C1\u03B7\u03C4\u03AE (Web Browser) - - -adminUserSettings.title= \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 -adminUserSettings.header=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03C5 \u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE -adminUserSettings.admin=\u0394\u03B9\u03B1\u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03AE\u03C2 -adminUserSettings.user=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 -adminUserSettings.addUser=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BD\u03AD\u03BF\u03C5 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -adminUserSettings.roles=\u03A1\u03CC\u03BB\u03BF\u03B9 -adminUserSettings.role=\u03A1\u03CC\u03BB\u03BF\u03C2 -adminUserSettings.actions=\u0395\u03BD\u03AD\u03C1\u03B3\u03B5\u03B9\u03B5\u03C2 -adminUserSettings.apiUser=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03B4\u03B9\u03B5\u03C0\u03B1\u03C6\u03AE \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03C6\u03B1\u03C1\u03BC\u03BF\u03B3\u03CE\u03BD (API User) -adminUserSettings.webOnlyUser=\u03A7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03BC\u03CC\u03BD\u03BF \u0399\u03C3\u03C4\u03BF\u03CD -adminUserSettings.forceChange = \u0391\u03BD\u03B1\u03B3\u03BA\u03AC\u03C3\u03C4\u03B5 \u03C4\u03BF\u03BD \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9 \u03C4\u03BF \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7/\u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 -adminUserSettings.submit=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 - -############# -# HOME-PAGE # -############# -home.desc= \u0397 \u03C4\u03BF\u03C0\u03B9\u03BA\u03AC \u03C6\u03B9\u03BB\u03BF\u03BE\u03B5\u03BD\u03BF\u03CD\u03BC\u03B5\u03BD\u03B7 one-stop-shop \u03C3\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03B1\u03BD\u03AC\u03B3\u03BA\u03B5\u03C2 \u03C3\u03B1\u03C2 \u03C3\u03B5 PDF. - - -home.multiTool.title=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF -home.multiTool.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7, \u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE, \u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03BA\u03B1\u03B9 \u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move - -home.merge.title=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 -home.merge.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD PDF \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03BC\u03B5 \u03B5\u03CD\u03BA\u03BF\u03BB\u03BF \u03C4\u03C1\u03CC\u03C0\u03BF. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 -home.split.desc=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C4\u03C9\u03BD PDF \u03C3\u03B5 \u03C0\u03BF\u03BB\u03BB\u03AC \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03B1. -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE -home.rotate.desc=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C4\u03C9\u03BD PDF \u03C3\u03B1\u03C2 \u03BC\u03B5 \u03B5\u03CD\u03BA\u03BF\u03BB\u03BF \u03C4\u03C1\u03CC\u03C0\u03BF. -rotate.tags=server side - - -home.imageToPdf.title=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF -home.imageToPdf.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 (PNG, JPEG, GIF) \u03C3\u03B5 PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 -home.pdfToImage.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=\u039F\u03C1\u03B3\u03AC\u03BD\u03C9\u03C3\u03B7 -home.pdfOrganiser.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7/\u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03BC\u03B5 \u03BF\u03C0\u03BF\u03B9\u03B1\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03C3\u03B5\u03B9\u03C1\u03AC -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -home.addImage.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BC\u03B9\u03B1\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B8\u03AD\u03C3\u03B7 \u03C3\u03C4\u03BF PDF -addImage.tags=img,jpg,picture,photo - -home.watermark.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 -home.watermark.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03BD\u03CC\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03CC PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD -home.permissions.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03C9\u03BD \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF -permissions.tags=read,write,edit,print - - -home.removePages.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 -home.removePages.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03AE \u03B5\u03C0\u03B9\u03B8\u03C5\u03BC\u03B7\u03C4\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03BF \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD -home.addPassword.desc=\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 - \u03BA\u03BB\u03B5\u03AF\u03B4\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BC\u03B5 \u03AD\u03BD\u03B1\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC. -addPassword.tags=secure,security - -home.removePassword.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD -home.removePassword.desc=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03AE\u03C3\u03B7 \u03C4\u03B7\u03C2 \u03C0\u03C1\u03BF\u03C3\u03C4\u03B1\u03C3\u03AF\u03B1\u03C2 \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03B1\u03C0\u03CC \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 -home.compressPdfs.desc=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD PDF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03BC\u03B5\u03AF\u03C9\u03C3\u03B7 \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039C\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -home.changeMetadata.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE/\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7/\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF PDF. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF -home.fileToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C7\u03B5\u03B4\u03CC\u03BD \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF (DOCX, PNG, XLS, PPT, TXT and more) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=\u03BF\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD (OCR) / \u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup -home.ocr.desc=\u03A4\u03BF Cleanup \u03C3\u03B1\u03C1\u03CE\u03BD\u03B5\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03BD\u03B9\u03C7\u03BD\u03B5\u03CD\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B1\u03C0\u03CC \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF \u03BA\u03B1\u03B9 \u03C4\u03BF \u03C0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C4\u03B5\u03B9 \u03BE\u03B1\u03BD\u03AC \u03C9\u03C2 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD -home.extractImages.desc=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03B1\u03C0\u03BF \u03AD\u03BD\u03B1 PDF \u03BA\u03B1\u03B9 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03B1\u03C5\u03C4\u03CE\u03BD \u03C3\u03B5 zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF \u03C3\u03B5 PDF/A -home.pdfToPDFA.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE PDF \u03C3\u03B5 PDF/A \u03B3\u03B9\u03B1 \u03BC\u03B1\u03BA\u03C1\u03BF\u03C7\u03C1\u03CC\u03BD\u03B9\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF \u03C3\u03B5 Word -home.PDFToWord.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 Word \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF (DOC, DOCX and ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF \u03C3\u03B5 Powerpoint -home.PDFToPresentation.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 Powerpoint \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) -home.PDFToText.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE RTF -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF \u03C3\u03B5 HTML -home.PDFToHTML.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE HTML -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF \u03C3\u03B5 XML -home.PDFToXML.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=\u0391\u03BD\u03AF\u03C7\u03BD\u03B5\u03C5\u03C3\u03B7/\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03B9\u03CE\u03BD -home.ScannerImageSplit.desc=\u0394\u03B9\u03B1\u03C7\u03C9\u03C1\u03AF\u03C3\u03BC\u03CC\u03C2 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03CE\u03BD \u03BC\u03AD\u03C3\u03B1 \u03B1\u03C0\u03CC \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE -home.sign.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C3\u03C4\u03BF PDF \u03BC\u03B5 \u03C3\u03C7\u03AD\u03B4\u03B9\u03BF, \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Flatten -home.flatten.desc=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B4\u03C1\u03B1\u03C3\u03C4\u03B9\u03BA\u03CE\u03BD \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03BA\u03B1\u03B9 \u03C6\u03BF\u03C1\u03BC\u03CE\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 -home.repair.desc=\u03A0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B1 \u03B5\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7\u03C2 \u03B5\u03BD\u03CC\u03C2 \u03BA\u03B1\u03C4\u03B5\u03C3\u03C4\u03C1\u03B1\u03BC\u03BC\u03AD\u03BD\u03BF\u03C5 PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03BD\u03CE\u03BD \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -home.removeBlanks.desc=\u0391\u03BD\u03AF\u03C7\u03B5\u03C5\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03BD\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 -home.compare.desc=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03CE\u03BD \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03B4\u03CD\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03BC\u03B5 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC -home.certSign.desc=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BC\u03B5 \u03AD\u03BD\u03B1 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC/\u039A\u03BB\u03B5\u03B9\u03B4\u03AF (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -home.pageLayout.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B5\u03BD\u03CC\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03BC\u03CC\u03BD\u03BF \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2/\u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -home.scalePages.desc=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03BF\u03C5 \u03BC\u03B5\u03B3\u03AD\u03B8\u03BF\u03C5\u03C2/\u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03BC\u03AF\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03BA\u03B1\u03B9/\u03B7 \u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C4\u03B7\u03C2. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (\u0393\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2) -home.pipeline.desc= \u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD \u03B5\u03BD\u03B5\u03C1\u03B3\u03B5\u03B9\u03CE\u03BD \u03C3\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF \u03BF\u03C1\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03C2 pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 -home.add-page-numbers.desc=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03C3\u03B5 \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BA\u03B1\u03B8\u03BF\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03B7 \u03B8\u03AD\u03C3\u03B7 -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF -home.auto-rename.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 \u03B5\u03BD\u03CC\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03B7\u03BD \u03BA\u03B5\u03C6\u03B1\u03BB\u03AF\u03B4\u03B1 \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B5\u03BD\u03C4\u03BF\u03C0\u03B9\u03C3\u03C4\u03B5\u03AF -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C7\u03C1\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD/\u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7 -home.adjust-contrast.desc=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u03B1\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2, \u03C4\u03BF\u03C5 \u03BA\u03BF\u03C1\u03B5\u03C3\u03BC\u03BF\u03CD \u03BA\u03B1\u03B9 \u03C4\u03B7\u03C2 \u03C6\u03C9\u03C4\u03B5\u03B9\u03BD\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 \u03B5\u03BD\u03CC\u03C2 PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=\u03A0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE PDF -home.crop.desc=\u03A0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE \u03B5\u03BD\u03CC\u03C2 PDF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BC\u03B5\u03B9\u03C9\u03B8\u03B5\u03AF \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03CC\u03C2 \u03C4\u03BF\u03C5 (\u03B4\u03B9\u03B1\u03C4\u03B7\u03C1\u03B5\u03AF \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -home.autoSplitPDF.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF\u03C5 PDF \u03BC\u03B5 \u03C6\u03C5\u03C3\u03B9\u03BA\u03CC \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 -home.sanitizePdf.desc=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03B5\u03BD\u03B1\u03C1\u03AF\u03C9\u03BD \u03BA\u03B1\u03B9 \u03AC\u03BB\u03BB\u03C9\u03BD \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03C9\u03BD \u03B1\u03C0\u03CC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/\u0399\u03C3\u03C4\u03CC\u03C4\u03BF\u03C0\u03BF\u03C2 \u03C3\u03B5 PDF -home.URLToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03B1\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7\u03C2 URL http(s) \u03C3\u03B5 PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML \u03C3\u03B5 PDF -home.HTMLToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 HTML \u03AE zip \u03C3\u03B5 PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown \u03C3\u03B5 PDF -home.MarkdownToPDF.desc=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 Markdown \u03C3\u03B5 PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=\u039B\u03AE\u03C8\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF -home.getPdfInfo.desc=\u039B\u03AE\u03C8\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C0\u03B9\u03B8\u03B1\u03BD\u03CE\u03BD \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -home.extractPage.desc=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03C4\u03C9\u03BD \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03C9\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B1\u03C0\u03CC \u03AD\u03BD\u03B1 PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 -home.PdfToSinglePage.desc=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD PDF \u03C3\u03B5 \u03BC\u03B9\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 -PdfToSinglePage.tags=single page - - -home.showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript -home.showJS.desc=\u0391\u03BD\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03B5\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1 Javascript \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03BD\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03BF \u03BC\u03AD\u03C3\u03B1 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF -showJS.tags=JS - -home.autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 -home.autoRedact.desc=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 (\u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1) \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF\u03C5 \u03C3\u03B5 PDF \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B5\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 -showJS.tags=Redact,Hide,black out,black,marker,hidden - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2 -login.signin=\u0395\u03AF\u03C3\u03BF\u03B4\u03BF\u03C2 -login.rememberme=\u039D\u03B1 \u039C\u03B5 \u0398\u03C5\u03BC\u03AC\u03C3\u03B1\u03B9 -login.invalid=\u039B\u03AC\u03B8\u03BF\u03C2 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 \u03AE \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2. -login.locked=\u039F \u03BB\u03BF\u03B3\u03B1\u03C1\u03B9\u03B1\u03C3\u03BC\u03CC\u03C2 \u03C3\u03B1\u03C2 \u03AD\u03C7\u03B5\u03B9 \u03BA\u03BB\u03B5\u03B9\u03B4\u03C9\u03B8\u03B5\u03AF. -login.signinTitle=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE, \u03C3\u03C5\u03BD\u03B4\u03B5\u03B8\u03B5\u03AF\u03C4\u03B5 - - -#auto-redact -autoRedact.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 -autoRedact.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03BF \u039C\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 -autoRedact.colorLabel=\u03A7\u03C1\u03CE\u03BC\u03B1 -autoRedact.textsToRedactLabel=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03B3\u03B9\u03B1 \u03BC\u03B1\u03CD\u03C1\u03B9\u03C3\u03BC\u03B1 (\u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF \u03C3\u03B5 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AD\u03C2) -autoRedact.textsToRedactPlaceholder=\u03C0.\u03C7. \n\u0395\u03BC\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03B9\u03BA\u03CC \n\u0391\u03BA\u03C1\u03CE\u03C2 \u03B1\u03C0\u03CC\u03C1\u03C1\u03B7\u03C4\u03BF -autoRedact.useRegexLabel=\u03A7\u03C1\u03AE\u03C3\u03B7 Regex -autoRedact.wholeWordSearchLabel=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03BF\u03BB\u03CC\u03BA\u03BB\u03B7\u03C1\u03B7\u03C2 \u03C4\u03B7\u03C2 \u03BB\u03AD\u03BE\u03B7\u03C2 -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE PDF \u03C3\u03B5 PDF-\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 (\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03AF\u03C3\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03C0\u03BB\u03B1\u03AF\u03C3\u03B9\u03BF) -autoRedact.submitButton=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE - - -#showJS -showJS.title=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript -showJS.header=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 Javascript -showJS.downloadJS=\u039B\u03AE\u03C8\u03B7 Javascript -showJS.submit=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 - - -#pdfToSinglePage -pdfToSinglePage.title=PDF \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 -pdfToSinglePage.header=PDF \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 -pdfToSinglePage.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u039C\u03BF\u03BD\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 - - -#pageExtracter -pageExtracter.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -pageExtracter.header=E\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -pageExtracter.submit=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE - - -#getPdfInfo -getPdfInfo.title=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF -getPdfInfo.header=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF PDF -getPdfInfo.submit=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03C0\u03BB\u03B7\u03C1\u03BF\u03C6\u03BF\u03C1\u03B9\u03CE\u03BD -getPdfInfo.downloadJson=\u039B\u03AE\u03C8\u03B7 JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown \u03C3\u03B5 PDF -MarkdownToPDF.header=Markdown \u03C3\u03B5 PDF -MarkdownToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -MarkdownToPDF.help=\u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7 -MarkdownToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL \u03C3\u03B5 PDF -URLToPDF.header=URL \u03C3\u03B5 PDF -URLToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -URLToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML \u03C3\u03B5 PDF -HTMLToPDF.header=HTML \u03C3\u03B5 PDF -HTMLToPDF.help=\u0394\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C4\u03CD\u03C0\u03BF\u03C5 HTML \u03BA\u03B1\u03B9 \u03C4\u03CD\u03C0\u03BF\u03C5 ZIP \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03BF\u03C5\u03BD html/css/\u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BA.\u03BB\u03C0. \u03C0\u03BF\u03C5 \u03B1\u03C0\u03B1\u03B9\u03C4\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 -HTMLToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -HTMLToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint - - -#sanitizePDF -sanitizePDF.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF -sanitizePDF.header=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 -sanitizePDF.selectText.1=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 JavaScript -sanitizePDF.selectText.2=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03B5\u03BC\u03C3\u03C9\u03BC\u03B1\u03C4\u03C9\u03BC\u03AD\u03BD\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD -sanitizePDF.selectText.3=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -sanitizePDF.selectText.4=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03C9\u03BD (links) -sanitizePDF.selectText.5=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03CE\u03BD -sanitizePDF.submit=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF - - -#addPageNumbers -addPageNumbers.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 -addPageNumbers.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 -addPageNumbers.selectText.1=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5: -addPageNumbers.selectText.2=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B8\u03C9\u03C1\u03AF\u03BF\u03C5 -addPageNumbers.selectText.3=\u0398\u03AD\u03C3\u03B7 -addPageNumbers.selectText.4=\u0391\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C0\u03BF\u03C5 \u03BE\u03B5\u03BA\u03B9\u03BD\u03AC \u03B7 \u03B1\u03C1\u03AF\u03B8\u03BC\u03B7\u03C3\u03B7 -addPageNumbers.selectText.5=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C3\u03B5 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC -addPageNumbers.selectText.6=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF -addPageNumbers.customTextDesc=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03BF \u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF -addPageNumbers.numberPagesDesc=\u03A0\u03BF\u03B9\u03AD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03BD\u03B1 \u03B1\u03C1\u03B9\u03B8\u03BC\u03B7\u03B8\u03BF\u03CD\u03BD, \u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE 'all' (\u03CC\u03BB\u03B5\u03C2), \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 \u03B4\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 1-5 \u03AE 2,5,9 \u03BA.\u03BB.\u03C0 -addPageNumbers.customNumberDesc=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03C3\u03B5 {n}, \u03B4\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03B5\u03C0\u03AF\u03C3\u03B7\u03C2 "\u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 {n} \u03B1\u03C0\u03CC {total}", "Text-{n}", "{filename}-{n} -addPageNumbers.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B1\u03C1\u03B9\u03B8\u03BC\u03CE\u03BD \u03C3\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 - - -#auto-rename -auto-rename.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 -auto-rename.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 PDF -auto-rename.submit=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03BC\u03B5\u03C4\u03BF\u03BD\u03BF\u03BC\u03B1\u03C3\u03AF\u03B1 - - -#adjustContrast -adjustContrast.title=\u03A0\u03C1\u03BF\u03C3\u03C0\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2 -adjustContrast.header=\u03A0\u03C1\u03BF\u03C3\u03C0\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C4\u03B7\u03C2 \u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7\u03C2 -adjustContrast.contrast=\u0391\u03BD\u03C4\u03AF\u03B8\u03B5\u03C3\u03B7: -adjustContrast.brightness=\u03A6\u03C9\u03C4\u03B5\u03B9\u03BD\u03CC\u03C4\u03B7\u03C4\u03B1: -adjustContrast.saturation=\u039A\u03BF\u03C1\u03B5\u03C3\u03BC\u03CC\u03C2: -adjustContrast.download=\u039B\u03AE\u03C8\u03B7 - - -#crop -crop.title=\u039A\u03BF\u03C0\u03AE -crop.header=\u039A\u03BF\u03C0\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -crop.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE - - -#autoSplitPDF -autoSplitPDF.title=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B4\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF -autoSplitPDF.header=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03B4\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF -autoSplitPDF.description=\u0395\u03BA\u03C4\u03C5\u03C0\u03CE\u03C3\u03C4\u03B5, \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5, \u03C3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5, \u03B1\u03BD\u03B5\u03B2\u03AC\u03C3\u03C4\u03B5 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03AE\u03C3\u03C4\u03B5 \u03BC\u03B1\u03C2 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03AF\u03C3\u03BF\u03C5\u03BC\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03AC \u03C3\u03B1\u03C2. \u0394\u03B5\u03BD \u03B1\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF\u03C4\u03B1\u03B9 \u03C7\u03B5\u03B9\u03C1\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03B7 \u03C4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7. -autoSplitPDF.selectText.1=\u0395\u03BA\u03C4\u03C5\u03C0\u03CE\u03C3\u03C4\u03B5 \u03BC\u03B5\u03C1\u03B9\u03BA\u03AC \u03C6\u03CD\u03BB\u03BB\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03B1\u03C0\u03CC \u03BA\u03AC\u03C4\u03C9 (\u03C4\u03BF \u03B1\u03C3\u03C0\u03C1\u03CC\u03BC\u03B1\u03C5\u03C1\u03BF \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BC\u03B9\u03B1 \u03C7\u03B1\u03C1\u03AC). -autoSplitPDF.selectText.2=\u03A3\u03B1\u03C1\u03CE\u03C3\u03C4\u03B5 \u03CC\u03BB\u03B1 \u03C4\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03AC \u03C3\u03B1\u03C2 \u03C4\u03B1\u03C5\u03C4\u03CC\u03C7\u03C1\u03BF\u03BD\u03B1, \u03BC\u03B5 \u03C4\u03BF \u03BD\u03B1 \u03B5\u03B9\u03C3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03C6\u03CD\u03BB\u03BB\u03BF \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03C4\u03BF\u03C5\u03C2. -autoSplitPDF.selectText.3=\u0391\u03BD\u03B5\u03B2\u03AC\u03C3\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03BF \u03C3\u03B1\u03C1\u03C9\u03BC\u03AD\u03BD\u03BF PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B1\u03B9 \u03B1\u03C6\u03AE\u03C3\u03C4\u03B5 \u03C4\u03BF Stirling PDF \u03BD\u03B1 \u03C7\u03B5\u03B9\u03C1\u03B9\u03C3\u03C4\u03B5\u03AF \u03C4\u03B1 \u03C5\u03C0\u03CC\u03BB\u03BF\u03B9\u03C0\u03B1 -autoSplitPDF.selectText.4=\u039F\u03B9 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03BF\u03CD \u03B5\u03BD\u03C4\u03BF\u03C0\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03B9\u03C1\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1, \u03B4\u03B9\u03B1\u03C3\u03C6\u03B1\u03BB\u03AF\u03B6\u03BF\u03BD\u03C4\u03B1\u03C2 \u03AD\u03BD\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B5\u03B3\u03BC\u03AD\u03BD\u03BF \u03C4\u03B5\u03BB\u03B9\u03BA\u03CC \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF. -autoSplitPDF.formPrompt=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE PDF \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03B4\u03B9\u03B1\u03B9\u03C1\u03AD\u03C4\u03B5\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD Stirling-PDF: -autoSplitPDF.duplexMode=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 \u03B4\u03B9\u03C0\u03BB\u03AE\u03C2 \u03CC\u03C8\u03B7\u03C2 (\u03A3\u03AC\u03C1\u03C9\u03C3\u03B7 \u03BC\u03C0\u03C1\u03BF\u03C3\u03C4\u03AC \u03BA\u03B1\u03B9 \u03C0\u03AF\u03C3\u03C9) -autoSplitPDF.dividerDownload1=\u039B\u03AE\u03C8\u03B7 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=\u039B\u03AE\u03C8\u03B7 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -pageLayout.header=\u0394\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -pageLayout.pagesPerSheet=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B1\u03BD\u03AC \u03C6\u03CD\u03BB\u03BB\u03BF: -pageLayout.addBorder=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03BC\u03BC\u03AC\u03C4\u03C9\u03BD -pageLayout.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE - - -#scalePages -scalePages.title=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -scalePages.header=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03BA\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -scalePages.pageSize=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03BC\u03B9\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C4\u03BF\u03C5 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5. -scalePages.scaleFactor=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u03B6\u03BF\u03C5\u03BC (\u03C0\u03B5\u03C1\u03B9\u03BA\u03BF\u03C0\u03AE) \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2. -scalePages.submit=\u03A5\u03C0\u03BF\u03B2\u03BF\u03BB\u03AE - - -#certSign -certSign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD -certSign.header=\u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03C8\u03C4\u03B5 \u03AD\u03BD\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF PDF \u03BC\u03B5 \u03C4\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2 (\u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 \u03C3\u03B5 \u03B5\u03BE\u03AD\u03BB\u03B9\u03BE\u03B7) -certSign.selectPDF=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 PDF \u03B3\u03B9\u03B1 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE: -certSign.selectKey=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C4\u03BF\u03C5 \u03B9\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03BF\u03CD \u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD \u03C3\u03B1\u03C2 (\u03BC\u03BF\u03C1\u03C6\u03AE PKCS#8, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 .pem \u03AE .der): -certSign.selectCert=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD \u03C3\u03B1\u03C2 (\u03BC\u03BF\u03C1\u03C6\u03AE X.509, \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 .pem \u03AE .der): -certSign.selectP12=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF PKCS#12 Keystore (.p12 \u03AE .pfx) (\u03A0\u03C1\u03BF\u03B1\u03B9\u03C1\u03B5\u03C4\u03B9\u03BA\u03CC, \u03B5\u03AC\u03BD \u03C0\u03B1\u03C1\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9, \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03C4\u03BF \u03B9\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03CC \u03BA\u03BB\u03B5\u03B9\u03B4\u03AF \u03BA\u03B1\u03B9 \u03C4\u03BF \u03C0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03CC \u03C3\u03B1\u03C2): -certSign.certType=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A0\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03C4\u03B9\u03BA\u03BF\u03CD -certSign.password=\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C4\u03BF\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C4\u03BF\u03C5 Keystore \u03AE \u03C4\u03BF\u03C5 \u0399\u03B4\u03B9\u03C9\u03C4\u03B9\u03BA\u03BF\u03CD \u039A\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD (\u03B5\u03AC\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03B5\u03B9): -certSign.showSig=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 -certSign.reason=\u0391\u03B9\u03C4\u03AF\u03B1 -certSign.location=\u03A4\u03BF\u03C0\u03BF\u03B8\u03B5\u03C3\u03AF\u03B1 -certSign.name=\u038C\u03BD\u03BF\u03BC\u03B1 -certSign.submit=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE PDF - - -#removeBlanks -removeBlanks.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD -removeBlanks.header=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -removeBlanks.threshold=\u038C\u03C1\u03B9\u03BF \u03BB\u03B5\u03C5\u03BA\u03CC\u03C4\u03B7\u03C4\u03B1\u03C2 pixel: -removeBlanks.thresholdDesc=\u038C\u03C1\u03B9\u03BF \u03B3\u03B9\u03B1 \u03C4\u03BF\u03BD \u03C0\u03C1\u03BF\u03C3\u03B4\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC \u03C4\u03BF\u03C5 \u03C0\u03CC\u03C3\u03BF \u03BB\u03B5\u03C5\u03BA\u03CC \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03BB\u03B5\u03C5\u03BA\u03CC \u03B5\u03B9\u03BA\u03BF\u03BD\u03BF\u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF (pixel) \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03C4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B7\u03B8\u03B5\u03AF \u03C9\u03C2 "\u039B\u03B5\u03C5\u03BA\u03CC". 0 = \u039C\u03B1\u03CD\u03C1\u03BF, 255 \u03BA\u03B1\u03B8\u03B1\u03C1\u03CC \u03BB\u03B5\u03C5\u03BA\u03CC. -removeBlanks.whitePercent=\u03A0\u03BF\u03C3\u03BF\u03C3\u03C4\u03CC \u039B\u03B5\u03C5\u03BA\u03BF\u03CD (%): -removeBlanks.whitePercentDesc=\u03A4\u03BF \u03C0\u03BF\u03C3\u03BF\u03C3\u03C4\u03CC \u03C4\u03B7\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 "\u03BB\u03B5\u03C5\u03BA\u03AC" pixel \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03B5\u03B8\u03B5\u03AF -removeBlanks.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03B5\u03BD\u03CE\u03BD - - -#compare -compare.title=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 -compare.header=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 PDFs -compare.document.1=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 1 -compare.document.2=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 2 -compare.submit=\u03A3\u03CD\u03B3\u03BA\u03C1\u03B9\u03C3\u03B7 - - -#sign -sign.title=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE -sign.header=\u03A5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE PDFs -sign.upload=\u0391\u03BD\u03AD\u03B2\u03B1\u03C3\u03BC\u03B1 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -sign.draw=\u03A3\u03C7\u03B5\u03B4\u03AF\u03B1\u03C3\u03B7 \u03C5\u03C0\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 -sign.text=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 -sign.clear=\u039A\u03B1\u03B8\u03AC\u03C1\u03B9\u03C3\u03BC\u03B1 -sign.add=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 - - -#repair -repair.title=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 -repair.header=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 PDFs -repair.submit=\u0395\u03C0\u03B9\u03B4\u03B9\u03CC\u03C1\u03B8\u03C9\u03C3\u03B7 - - -#flatten -flatten.title=Flatten -flatten.header=Flatten PDFs -flatten.submit=Flatten - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=\u038C\u03C1\u03B9\u03BF \u03B3\u03C9\u03BD\u03AF\u03B1\u03C2: -ScannerImageSplit.selectText.2=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03B7\u03BD \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B1\u03C0\u03CC\u03BB\u03C5\u03C4\u03B7 \u03B3\u03C9\u03BD\u03AF\u03B1 \u03C0\u03BF\u03C5 \u03B1\u03C0\u03B1\u03B9\u03C4\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C4\u03B7\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 10). -ScannerImageSplit.selectText.3=\u0391\u03BD\u03B5\u03BA\u03C4\u03B9\u03BA\u03CC\u03C4\u03B7\u03C4\u03B1 (Tolerance): -ScannerImageSplit.selectText.4=\u039A\u03B1\u03B8\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03CD\u03C1\u03BF\u03C2 \u03C4\u03B7\u03C2 \u03C7\u03C1\u03C9\u03BC\u03B1\u03C4\u03B9\u03BA\u03AE\u03C2 \u03B4\u03B9\u03B1\u03BA\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7\u03C2 \u03B3\u03CD\u03C1\u03C9 \u03B1\u03C0\u03CC \u03C4\u03BF \u03B5\u03BA\u03C4\u03B9\u03BC\u03CE\u03BC\u03B5\u03BD\u03BF \u03C7\u03C1\u03CE\u03BC\u03B1 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 30). -ScannerImageSplit.selectText.5=\u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03A0\u03B5\u03C1\u03B9\u03BF\u03C7\u03AE: -ScannerImageSplit.selectText.6=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1 (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 10000). -ScannerImageSplit.selectText.7=\u0395\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03B7 \u03B5\u03C0\u03B9\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: -ScannerImageSplit.selectText.8=\u03A1\u03C5\u03B8\u03BC\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03B5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF \u03CC\u03C1\u03B9\u03BF \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C6\u03C9\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AF\u03B1 -ScannerImageSplit.selectText.9=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2: -ScannerImageSplit.selectText.10=\u039F\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03BF\u03C3\u03C4\u03AF\u03B8\u03B5\u03C4\u03B1\u03B9 \u03BA\u03B1\u03B9 \u03B1\u03C6\u03B1\u03B9\u03C1\u03B5\u03AF\u03C4\u03B1\u03B9 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03C4\u03C1\u03AD\u03C0\u03BF\u03BD\u03C4\u03B1\u03B9 \u03BB\u03B5\u03C5\u03BA\u03AC \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C3\u03C4\u03B7\u03BD \u03AD\u03BE\u03BF\u03B4\u03BF (\u03C0\u03C1\u03BF\u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE: 1). - - -#OCR -ocr.title=\u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD (OCR) / \u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup -ocr.header=\u03A3\u03B1\u03C1\u03CE\u03C3\u03B5\u03B9\u03C2 Cleanup / OCR (Optical Character Recognition - \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD) -ocr.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03C0\u03C1\u03CC\u03BA\u03B5\u03B9\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03B5\u03BD\u03C4\u03BF\u03C0\u03B9\u03C3\u03C4\u03BF\u03CD\u03BD \u03C3\u03C4\u03BF PDF (\u039F\u03B9 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B1\u03C6\u03AD\u03C1\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B1\u03C5\u03C4\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03B1\u03BD\u03B9\u03C7\u03BD\u03B5\u03CD\u03BF\u03BD\u03C4\u03B1\u03B9 \u03B1\u03C5\u03C4\u03AE\u03BD \u03C4\u03B7 \u03C3\u03C4\u03B9\u03B3\u03BC\u03AE): -ocr.selectText.2=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF OCR \u03BC\u03B1\u03B6\u03AF \u03BC\u03B5 \u03C4\u03BF PDF \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03C5\u03C0\u03BF\u03B2\u03BB\u03B7\u03B8\u03B5\u03AF \u03C3\u03B5 OCR -ocr.selectText.3=\u039F\u03B9 \u03C3\u03C9\u03C3\u03C4\u03AD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C3\u03B1\u03C1\u03CE\u03B8\u03B7\u03BA\u03B1\u03BD \u03BC\u03B5 \u03BB\u03BF\u03BE\u03AE \u03B3\u03C9\u03BD\u03AF\u03B1 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03AD\u03C6\u03BF\u03BD\u03C4\u03AC\u03C2 \u03C4\u03B5\u03C2 \u03C3\u03C4\u03B7 \u03B8\u03AD\u03C3\u03B7 \u03C4\u03BF\u03C5\u03C2 -ocr.selectText.4=C\u039A\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1, \u03CE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B9\u03B3\u03CC\u03C4\u03B5\u03C1\u03BF \u03C0\u03B9\u03B8\u03B1\u03BD\u03CC \u03C4\u03BF OCR \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C3\u03C4\u03BF \u03B8\u03CC\u03C1\u03C5\u03B2\u03BF \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 (background noise). (\u039A\u03B1\u03BC\u03AF\u03B1 \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C3\u03C4\u03BF \u03B5\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF) -ocr.selectText.5=\u039A\u03B1\u03B8\u03B1\u03C1\u03AF\u03C3\u03C4\u03B5 \u03C4\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1, \u03CE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BB\u03B9\u03B3\u03CC\u03C4\u03B5\u03C1\u03BF \u03C0\u03B9\u03B8\u03B1\u03BD\u03CC \u03C4\u03BF OCR \u03BD\u03B1 \u03B2\u03C1\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C3\u03C4\u03BF \u03B8\u03CC\u03C1\u03C5\u03B2\u03BF \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5, \u03B4\u03B9\u03B1\u03C4\u03B7\u03C1\u03B5\u03AF \u03C4\u03B7\u03BD \u03B5\u03BA\u03BA\u03B1\u03B8\u03AC\u03C1\u03B9\u03C3\u03B7 \u03C3\u03C4\u03BF \u03C0\u03B1\u03C1\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF. -ocr.selectText.6=\u0391\u03B3\u03BD\u03BF\u03B5\u03AF \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C0\u03BF\u03C5 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B4\u03B9\u03B1\u03B4\u03C1\u03B1\u03C3\u03C4\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF, \u03BC\u03CC\u03BD\u03BF \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 OCR \u03C0\u03BF\u03C5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 -ocr.selectText.7=\u0395\u03C0\u03B9\u03B2\u03BF\u03BB\u03AE OCR, \u03B8\u03B1 \u03C0\u03C1\u03B1\u03B3\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03B5\u03B9 \u039F\u03C0\u03C4\u03B9\u03BA\u03AE \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C1\u03B9\u03C3\u03B7 \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03AE\u03C1\u03C9\u03BD \u03C3\u03B5 \u03BA\u03AC\u03B8\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03B1\u03C6\u03B1\u03B9\u03C1\u03CE\u03BD\u03C4\u03B1\u03C2 \u03CC\u03BB\u03BF \u03C4\u03B1 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B9\u03BA\u03BF\u03CD \u03BA\u03B5\u03AF\u03BC\u03AD\u03BD\u03BF\u03C5 -ocr.selectText.8=\u039A\u03B1\u03BD\u03BF\u03BD\u03B9\u03BA\u03CC (\u0398\u03B1 \u03C0\u03B1\u03C1\u03AC\u03BE\u03B5\u03B9 \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03B1\u03BD \u03C4\u03BF PDF \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03B5\u03B9 \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) -ocr.selectText.9=\u0395\u03C0\u03B9\u03C0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B5\u03C2 \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2 -ocr.selectText.10=\u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 OCR -ocr.selectText.11=\u039A\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03AC \u03C4\u03BF OCR (\u039A\u03B1\u03C4\u03B1\u03C1\u03B3\u03B5\u03AF \u039F\u039B\u0395\u03A3 \u03C4\u03B9\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2, \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C7\u03C1\u03AE\u03C3\u03B9\u03BC\u03BF \u03BC\u03CC\u03BD\u03BF \u03B1\u03BD \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03B5\u03AF \u03BC\u03AD\u03C1\u03BF\u03C2 \u03C4\u03BF\u03C5 \u03B2\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE\u03C2) -ocr.selectText.12=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C0\u03CC\u03B4\u03BF\u03C3\u03B7\u03C2 (\u0393\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C7\u03C9\u03C1\u03B7\u03BC\u03AD\u03BD\u03BF\u03C5\u03C2) -ocr.help=\u0394\u03B9\u03B1\u03B2\u03AC\u03C3\u03C4\u03B5 \u03B1\u03C5\u03C4\u03AE\u03BD \u03C4\u03B7\u03BD \u03C4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF\u03BD \u03C4\u03C1\u03CC\u03C0\u03BF \u03C7\u03C1\u03AE\u03C3\u03B7\u03C2 \u03B1\u03C5\u03C4\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03AC\u03BB\u03BB\u03B5\u03C2 \u03B3\u03BB\u03CE\u03C3\u03C3\u03B5\u03C2 \u03AE/\u03BA\u03B1\u03B9 \u03BC\u03B7 \u03C7\u03C1\u03AE\u03C3\u03B7\u03C2 \u03C3\u03B5 docker -ocr.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF OCRmyPDF \u03BA\u03B1\u03B9 Tesseract \u03B3\u03B9\u03B1 OCR. -ocr.submit=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1 PDF \u03BC\u03B5 OCR - - -#extractImages -extractImages.title=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD -extractImages.header=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE \u0395\u03B9\u03BA\u03CC\u03BD\u03C9\u03BD -extractImages.selectText=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03BC\u03BF\u03C1\u03C6\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03AD\u03C8\u03B5\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03B5\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03B5\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 -extractImages.submit=\u0395\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE - - -#File to PDF -fileToPDF.title=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03C3\u03B5 PDF -fileToPDF.header=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03BF\u03C0\u03BF\u03B9\u03BF\u03C5\u03B4\u03AE\u03C0\u03BF\u03C4\u03B5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03C3\u03B5 PDF -fileToPDF.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03BA\u03B1\u03B9 Unoconv \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -fileToPDF.supportedFileTypes=\u039F\u03B9 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03BF\u03B9 \u03C4\u03CD\u03C0\u03BF\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD \u03B8\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03C0\u03B5\u03C1\u03B9\u03BB\u03B1\u03BC\u03B2\u03AC\u03BD\u03BF\u03C5\u03BD \u03C4\u03B1 \u03C0\u03B1\u03C1\u03B1\u03BA\u03AC\u03C4\u03C9, \u03C9\u03C3\u03C4\u03CC\u03C3\u03BF, \u03B3\u03B9\u03B1 \u03BC\u03B9\u03B1 \u03C0\u03BB\u03AE\u03C1\u03B7 \u03B5\u03BD\u03B7\u03BC\u03B5\u03C1\u03C9\u03BC\u03AD\u03BD\u03B7 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03C4\u03B9\u03C2 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03B9\u03B6\u03CC\u03BC\u03B5\u03BD\u03B5\u03C2 \u03BC\u03BF\u03C1\u03C6\u03AD\u03C2, \u03B1\u03BD\u03B1\u03C4\u03C1\u03AD\u03BE\u03C4\u03B5 \u03C3\u03C4\u03B7\u03BD \u03C4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7 \u03C4\u03BF\u03C5 LibreOffice -fileToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 PDF - - -#compress -compress.title=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 -compress.header=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 PDF -compress.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF Ghostscript \u03B3\u03B9\u03B1 PDF \u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7/\u0392\u03B5\u03BB\u03C4\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7. -compress.selectText.1=\u03A7\u03B5\u03B9\u03C1\u03BF\u03BA\u03AF\u03BD\u03B7\u03C4\u03B7 \u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 - \u0391\u03C0\u03CC 1 \u03AD\u03C9\u03C2 4 -compress.selectText.2=\u0395\u03C0\u03AF\u03C0\u03B5\u03B4\u03BF \u0392\u03B5\u03BB\u03C4\u03B9\u03C3\u03C4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2: -compress.selectText.3=4 (\u03A0\u03BF\u03BB\u03CD \u03BA\u03B1\u03BA\u03CC \u03B3\u03B9\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5) -compress.selectText.4=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u039B\u03B5\u03B9\u03C4\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1 - Auto mode - \u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03CC\u03B6\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1 \u03C4\u03B7\u03BD \u03C0\u03BF\u03B9\u03CC\u03C4\u03B7\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03BB\u03AE\u03C8\u03B7 PDF \u03C3\u03C4\u03BF \u03B1\u03BA\u03C1\u03B9\u03B2\u03AD\u03C2 \u03BC\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 -compress.selectText.5=\u0391\u03BD\u03B1\u03BC\u03B5\u03BD\u03CC\u03BC\u03B5\u03BD\u03BF \u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 PDF (\u03C0.\u03C7 25MB, 10.8MB, 25KB) -compress.submit=\u03A3\u03C5\u03BC\u03C0\u03AF\u03B5\u03C3\u03B7 - - -#Add image -addImage.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -addImage.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 \u03C3\u03B5 PDF -addImage.everyPage=\u039A\u03AC\u03B8\u03B5 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1? -addImage.upload=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -addImage.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 - - -#merge -merge.title=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 -merge.header=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03CE\u03BD PDFs (2+) -merge.sortByName=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03BF \u038C\u03BD\u03BF\u03BC\u03B1 -merge.sortByDate=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03BC\u03B5 \u03B2\u03AC\u03C3\u03B7 \u03C4\u03B7\u03BD \u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 -merge.submit=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 - - -#pdfOrganiser -pdfOrganiser.title=\u0394\u03B9\u03BF\u03C1\u03B3\u03B1\u03BD\u03C9\u03C4\u03AE\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -pdfOrganiser.header=\u0394\u03B9\u03BF\u03C1\u03B3\u03B1\u03BD\u03C9\u03C4\u03AE\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 PDF -pdfOrganiser.submit=\u0391\u03BD\u03B1\u03B4\u03B9\u03AC\u03C4\u03B1\u03BE\u03B7 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD - - -#multiTool -multiTool.title=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF -multiTool.header=PDF \u03A0\u03BF\u03BB\u03C5\u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03BF - - -#pageRemover -pageRemover.title=\u0391\u03C6\u03B1\u03B9\u03C1\u03B5\u03C4\u03AE\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD -pageRemover.header=\u0391\u03C6\u03B1\u03B9\u03C1\u03B5\u03C4\u03AE\u03C2 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD PDF -pageRemover.pagesToDelete=\u03A3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03C0\u03C1\u03BF\u03C2 \u03B4\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE (\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03BC\u03B9\u03B1 \u03BB\u03AF\u03C3\u03C4\u03B1 \u03BC\u03B5 \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03CD\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5 \u03BA\u03CC\u03BC\u03BC\u03B1\u03C4\u03B1): -pageRemover.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03A3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD - - -#rotate -rotate.title=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF -rotate.header=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF -rotate.\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE \u03B3\u03C9\u03BD\u03AF\u03B1\u03C2 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE\u03C2 (\u03C3\u03B5 \u03C0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03AC\u03C3\u03B9\u03BF \u03C4\u03C9\u03BD 90 \u03BC\u03BF\u03B9\u03C1\u03CE\u03BD): -rotate.submit=Rotate - - -#merge -split.title=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF -split.header=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 PDF -split.desc.1=\u039F\u03B9 \u03B1\u03C1\u03B9\u03B8\u03BC\u03BF\u03AF \u03C0\u03BF\u03C5 \u03B5\u03C0\u03B9\u03BB\u03AD\u03B3\u03B5\u03C4\u03B5 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BF \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C3\u03C4\u03BF\u03BD \u03BF\u03C0\u03BF\u03AF\u03BF \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC -split.desc.2=\u03A9\u03C2 \u03B5\u03BA \u03C4\u03BF\u03CD\u03C4\u03BF\u03C5, \u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE 1,3,7-8 \u03B8\u03B1 \u03C7\u03C9\u03C1\u03AF\u03C3\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF 10 \u03C3\u03B5\u03BB\u03AF\u03B4\u03C9\u03BD \u03C3\u03B5 6 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF \u03BC\u03B5: -split.desc.3=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #1: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 1 -split.desc.4=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #2: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 2 \u03BA\u03B1\u03B9 3 -split.desc.5=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #3: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 4, 5 \u03BA\u03C3\u03B9 6 -split.desc.6=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #4: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 7 -split.desc.7=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #5: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 8 -split.desc.8=\u0388\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF #6: \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1 9 \u03BA\u03B1\u03B9 10 -split.splitPages=\u0395\u03B9\u03C3\u03B1\u03B3\u03AC\u03B3\u03B5\u03C4\u03B5 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 \u03B3\u03B9\u03B1 \u03B4\u03B9\u03B1\u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC: -split.submit=\u0394\u03B9\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 - - -#merge -imageToPDF.title=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF -imageToPDF.header=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C3\u03B5 PDF -imageToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -imageToPDF.selectLabel=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -imageToPDF.fillPage=\u0393\u03AD\u03BC\u03B9\u03C3\u03BC\u03B1 \u03A3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 -imageToPDF.fitDocumentToImage=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 -imageToPDF.maintainAspectRatio=\u0394\u03B9\u03B1\u03C4\u03AE\u03C1\u03B7\u03C3\u03B7 \u03B1\u03BD\u03B1\u03BB\u03BF\u03B3\u03B9\u03CE\u03BD \u03B4\u03B9\u03B1\u03C3\u03C4\u03AC\u03C3\u03B5\u03C9\u03BD -imageToPDF.selectText.2=\u0391\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B7 \u03C0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE PDF -imageToPDF.selectText.3=\u039B\u03BF\u03B3\u03B9\u03BA\u03AE \u03C0\u03BF\u03BB\u03BB\u03CE\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD (\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03CC\u03BD\u03BF \u03B5\u03AC\u03BD \u03B5\u03C1\u03B3\u03AC\u03B6\u03B5\u03C3\u03C4\u03B5 \u03BC\u03B5 \u03C0\u03BF\u03BB\u03BB\u03AD\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2) -imageToPDF.selectText.4=\u03A3\u03C5\u03B3\u03C7\u03CE\u03BD\u03B5\u03C5\u03C3\u03B7 \u03C3\u03B5 \u03AD\u03BD\u03B1 PDF -imageToPDF.selectText.5=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03BE\u03B5\u03C7\u03C9\u03C1\u03B9\u03C3\u03C4\u03AC \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 PDF - - -#pdfToImage -pdfToImage.title=PDF \u03C3\u03B5 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 -pdfToImage.header=PDF \u03C3\u03B5 \u0395\u03B9\u03BA\u03CC\u03BD\u03B1 -pdfToImage.selectText=\u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2 -pdfToImage.singleOrMultiple=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03B1\u03C0\u03BF\u03C4\u03B5\u03BB\u03AD\u03C3\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B1\u03C0\u03CC \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 \u03C3\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 -pdfToImage.single=\u0395\u03BD\u03B9\u03B1\u03AF\u03B1 \u03BC\u03B5\u03B3\u03AC\u03BB\u03B7 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03C0\u03BF\u03C5 \u03C3\u03C5\u03BD\u03B4\u03C5\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B5\u03C2 -pdfToImage.multi=\u03A0\u03BF\u03BB\u03BB\u03B1\u03C0\u03BB\u03AD\u03C2 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2, \u03BC\u03AF\u03B1 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1 \u03B1\u03BD\u03AC \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1 -pdfToImage.colorType=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A7\u03C1\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 -pdfToImage.color=\u03A7\u03C1\u03CE\u03BC\u03B1 -pdfToImage.grey=\u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03C4\u03BF\u03C5 \u03B3\u03BA\u03C1\u03B9 -pdfToImage.blackwhite=\u0391\u03C3\u03C0\u03C1\u03CC\u03BC\u03B1\u03C5\u03C1\u03BF (\u039C\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C7\u03B1\u03B8\u03BF\u03CD\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1!) -pdfToImage.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#addPassword -addPassword.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD -addPassword.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD (\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7) -addPassword.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 -addPassword.selectText.2=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03A7\u03C1\u03AE\u03C3\u03C4\u03B7 -addPassword.selectText.3=\u039C\u03AE\u03BA\u03BF\u03C2 \u039A\u03BB\u03B5\u03B9\u03B4\u03B9\u03BF\u03CD \u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7\u03C2 -addPassword.selectText.4=\u039F\u03B9 \u03C5\u03C8\u03B7\u03BB\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B9\u03C3\u03C7\u03C5\u03C1\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2, \u03B1\u03BB\u03BB\u03AC \u03BF\u03B9 \u03C7\u03B1\u03BC\u03B7\u03BB\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03C4\u03B9\u03BC\u03AD\u03C2 \u03AD\u03C7\u03BF\u03C5\u03BD \u03BA\u03B1\u03BB\u03CD\u03C4\u03B5\u03C1\u03B7 \u03C3\u03C5\u03BC\u03B2\u03B1\u03C4\u03CC\u03C4\u03B7\u03C4\u03B1. -addPassword.selectText.5=\u0394\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 (\u03A3\u03C5\u03BD\u03B9\u03C3\u03C4\u03AC\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B1\u03B9 \u03BC\u03B1\u03B6\u03AF \u03BC\u03B5 \u03C4\u03BF\u03BD \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03CC\u03C7\u03BF\u03C5 (Owner password) -addPassword.selectText.6=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03BC\u03BF\u03BB\u03CC\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 -addPassword.selectText.7=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 -addPassword.selectText.8=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B2\u03B1\u03C3\u03B9\u03BC\u03CC\u03C4\u03B7\u03C4\u03B1 -addPassword.selectText.9=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7\u03C2 \u03C6\u03CC\u03C1\u03BC\u03B1\u03C2 -addPassword.selectText.10=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 -addPassword.selectText.11=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 annotation -addPassword.selectText.12=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 -addPassword.selectText.13=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD -addPassword.selectText.14=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BA\u03B1\u03C4\u03CC\u03C7\u03BF\u03C5 -addPassword.selectText.15=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03CC,\u03C4\u03B9 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03B3\u03AF\u03BD\u03B5\u03B9 \u03BC\u03B5 \u03C4\u03BF \u03AD\u03B3\u03B3\u03C1\u03B1\u03C6\u03BF \u03BC\u03B5\u03C4\u03AC \u03C4\u03BF \u03AC\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 (\u0394\u03B5\u03BD \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C0\u03CC \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03BD\u03B1\u03B3\u03BD\u03CE\u03C3\u03C4\u03B5\u03C2 PDF) -addPassword.selectText.16=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03AF\u03B6\u03B5\u03B9 \u03C4\u03BF \u03AC\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03AF\u03B4\u03B9\u03BF\u03C5 \u03C4\u03BF\u03C5 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 -addPassword.submit=\u039A\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 - - -#watermark -watermark.title=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 -watermark.header=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 -watermark.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C4\u03BF\u03C5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: -watermark.selectText.2=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: -watermark.selectText.3=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u039A\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5: -watermark.selectText.4=\u03A0\u03B5\u03C1\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE (0-360): -watermark.selectText.5=widthSpacer (\u039A\u03B5\u03BD\u03CC \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03BA\u03AC\u03B8\u03B5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BF\u03C1\u03B9\u03B6\u03CC\u03BD\u03C4\u03B9\u03B1): -watermark.selectText.6=heightSpacer (\u039A\u03B5\u03BD\u03CC \u03BC\u03B5\u03C4\u03B1\u03BE\u03CD \u03BA\u03AC\u03B8\u03B5 \u03C5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03AC\u03B8\u03B5\u03C4\u03B1): -watermark.selectText.7=\u0391\u03B4\u03B9\u03B1\u03C6\u03AC\u03BD\u03B5\u03B9\u03B1 (Opacity) (0% - 100%): -watermark.selectText.8=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: -watermark.selectText.9=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2: -watermark.submit=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03A5\u03B4\u03B1\u03C4\u03BF\u03B3\u03C1\u03B1\u03C6\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 - - -#Change permissions -permissions.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD -permissions.header=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u0394\u03B9\u03BA\u03B1\u03B9\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD -permissions.warning=\u03A0\u03C1\u03BF\u03B5\u03B9\u03B4\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7 \u03CC\u03C4\u03B9 \u03B1\u03C5\u03C4\u03AC \u03C4\u03B1 \u03B4\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B4\u03B5\u03BD \u03B1\u03BB\u03BB\u03AC\u03B6\u03BF\u03C5\u03BD, \u03C3\u03C5\u03BD\u03B9\u03C3\u03C4\u03AC\u03C4\u03B1\u03B9 \u03BD\u03B1 \u03C4\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 \u03BC\u03AD\u03C3\u03C9 \u03C4\u03B7\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7\u03C2 \u03BA\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7\u03C2 -permissions.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 \u03C4\u03B1 \u03B4\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 -permissions.selectText.2=\u0394\u03B9\u03BA\u03B1\u03B9\u03CE\u03BC\u03B1\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03C1\u03CD\u03B8\u03BC\u03B9\u03C3\u03B7 -permissions.selectText.3=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BD\u03B1\u03C1\u03BC\u03BF\u03BB\u03CC\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B5\u03B3\u03B3\u03C1\u03AC\u03C6\u03BF\u03C5 -permissions.selectText.4=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03C0\u03B5\u03C1\u03B9\u03B5\u03C7\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 -permissions.selectText.5=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BE\u03B1\u03B3\u03C9\u03B3\u03AE\u03C2 \u03B3\u03B9\u03B1 \u03C0\u03C1\u03BF\u03C3\u03B2\u03B1\u03C3\u03B9\u03BC\u03CC\u03C4\u03B7\u03C4\u03B1 -permissions.selectText.6=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BC\u03C0\u03BB\u03AE\u03C1\u03C9\u03C3\u03B7\u03C2 \u03C6\u03CC\u03C1\u03BC\u03B1\u03C2 -permissions.selectText.7=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 -permissions.selectText.8=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 annotation -permissions.selectText.9=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 -permissions.selectText.10=\u0391\u03C0\u03BF\u03C4\u03C1\u03BF\u03C0\u03AE \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 \u03C3\u03B5 \u03B4\u03B9\u03B1\u03C6\u03BF\u03C1\u03B5\u03C4\u03B9\u03BA\u03BF\u03CD\u03C2 \u03C4\u03CD\u03C0\u03BF\u03C5\u03C2 \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD -permissions.submit=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE - - -#remove password -removePassword.title=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD -removePassword.header=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u039A\u03C9\u03B4\u03B9\u03BA\u03BF\u03CD (\u0391\u03C0\u03BF\u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7) -removePassword.selectText.1=\u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 PDF \u03B3\u03B9\u03B1 \u03B1\u03C0\u03BF\u03BA\u03C1\u03C5\u03C0\u03C4\u03BF\u03B3\u03C1\u03AC\u03C6\u03B7\u03C3\u03B7 -removePassword.selectText.2=\u039A\u03C9\u03B4\u03B9\u03BA\u03CC\u03C2 -removePassword.submit=\u0391\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 - - -#changeMetadata -changeMetadata.title=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039C\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -changeMetadata.header=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u039C\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -changeMetadata.selectText.1=\u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03BF\u03CD\u03BC\u03B5 \u03B5\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u03C3\u03C4\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03BC\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03C0\u03BF\u03C5 \u03B8\u03AD\u03BB\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03C4\u03B5 -changeMetadata.selectText.2=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -changeMetadata.selectText.3=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD: -changeMetadata.author=\u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B7\u03C2: -changeMetadata.creationDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AF\u03B1\u03C2 (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=\u0394\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03CC\u03C2: -changeMetadata.keywords=\u039B\u03AD\u03BE\u03B5\u03B9\u03C2-\u03BA\u03BB\u03B5\u03B9\u03B4\u03B9\u03AC: -changeMetadata.modDate=\u0397\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03A4\u03C1\u03BF\u03C0\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7\u03C2 (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=\u03A0\u03B1\u03C1\u03B1\u03B3\u03C9\u03B3\u03CC\u03C2: -changeMetadata.subject=\u0398\u03AD\u03BC\u03B1: -changeMetadata.title=\u03A4\u03AF\u03C4\u03BB\u03BF\u03C2: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=\u0386\u03BB\u03BB\u03B1 \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03B1: -changeMetadata.selectText.5=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03C3\u03BC\u03AD\u03BD\u03C9\u03BD \u03BC\u03B5\u03C4\u03B1\u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD -changeMetadata.submit=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE - - -#pdfToPDFA -pdfToPDFA.title=PDF \u03C3\u03B5 PDF/A -pdfToPDFA.header=PDF \u03C3\u03B5 PDF/A -pdfToPDFA.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF OCRmyPDF \u03B3\u03B9\u03B1 PDF/A \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE -pdfToPDFA.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#PDFToWord -PDFToWord.title=PDF \u03C3\u03B5 Word -PDFToWord.header=PDF \u03C3\u03B5 Word -PDFToWord.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 -PDFToWord.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -PDFToWord.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#PDFToPresentation -PDFToPresentation.title=PDF \u03C3\u03B5 Powerpoint -PDFToPresentation.header=PDF \u03C3\u03B5 Powerpoint -PDFToPresentation.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 -PDFToPresentation.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -PDFToPresentation.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#PDFToText -PDFToText.title=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) -PDFToText.header=PDF \u03C3\u03B5 RTF (\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF) -PDFToText.selectText.1=\u03A4\u03CD\u03C0\u03BF\u03C2 \u0391\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u0395\u03BE\u03B1\u03B3\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5 -PDFToText.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -PDFToText.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#PDFToHTML -PDFToHTML.title=PDF \u03C3\u03B5 HTML -PDFToHTML.header=PDF \u03C3\u03B5 HTML -PDFToHTML.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -PDFToHTML.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE - - -#PDFToXML -PDFToXML.title=PDF \u03C3\u03B5 XML -PDFToXML.header=PDF \u03C3\u03B5 XML -PDFToXML.credit=\u0391\u03C5\u03C4\u03AE \u03B7 \u03C5\u03C0\u03B7\u03C1\u03B5\u03C3\u03AF\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF LibreOffice \u03B3\u03B9\u03B1 \u03C4\u03B7 \u03BC\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C4\u03C9\u03BD \u03B1\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD. -PDFToXML.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \ No newline at end of file diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties deleted file mode 100644 index cc7978c4..00000000 --- a/src/main/resources/messages_en_GB.properties +++ /dev/null @@ -1,817 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr = left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Select PDF(s) -multiPdfPrompt=Select PDFs (2+) -multiPdfDropPrompt=Select (or drag & drop) all PDFs you require -imgPrompt=Select Image(s) -genericSubmit=Submit -processTimeWarning=Warning: This process can take up to a minute depending on file-size -pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) : -goToPage=Go -true=True -false=False -unknown=Unknown -save=Save -close=Close -filesSelected=files selected -noFavourites=No favourites added -bored=Bored Waiting? -alphabet=Alphabet -downloadPdf=Download PDF -text=Text -font=Font -selectFillter=-- Select -- -pageNum=Page Number -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Convert -navbar.security=Security -navbar.other=Miscellaneous -navbar.darkmode=Dark Mode -navbar.pageOps=Page Operations -navbar.settings=Settings - -############# -# SETTINGS # -############# -settings.title=Settings -settings.update=Update available -settings.appVersion=App Version: -settings.downloadOption.title=Choose download option (For single file non zip downloads): -settings.downloadOption.1=Open in same window -settings.downloadOption.2=Open in new window -settings.downloadOption.3=Download file -settings.zipThreshold=Zip files when the number of downloaded files exceeds -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=New Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange = Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Your locally hosted one-stop-shop for all your PDF needs. - - -home.multiTool.title=PDF Multi Tool -home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move - -home.merge.title=Merge -home.merge.desc=Easily merge multiple PDFs into one. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Split -home.split.desc=Split PDFs into multiple documents -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Rotate -home.rotate.desc=Easily rotate your PDFs. -rotate.tags=server side - - -home.imageToPdf.title=Image to PDF -home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF to Image -home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Organise -home.pdfOrganiser.desc=Remove/Rearrange pages in any order -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Add image -home.addImage.desc=Adds a image onto a set location on the PDF -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Add Watermark -home.watermark.desc=Add a custom watermark to your PDF document. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Change Permissions -home.permissions.desc=Change the permissions of your PDF document -permissions.tags=read,write,edit,print - - -home.removePages.title=Remove -home.removePages.desc=Delete unwanted pages from your PDF document. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Add Password -home.addPassword.desc=Encrypt your PDF document with a password. -addPassword.tags=secure,security - -home.removePassword.title=Remove Password -home.removePassword.desc=Remove password protection from your PDF document. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Compress -home.compressPdfs.desc=Compress PDFs to reduce their file size. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Change Metadata -home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Convert file to PDF -home.fileToPDF.desc=Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Cleanup scans -home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Extract Images -home.extractImages.desc=Extracts all images from a PDF and saves them to zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF to PDF/A -home.pdfToPDFA.desc=Convert PDF to PDF/A for long-term storage -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF to Word -home.PDFToWord.desc=Convert PDF to Word formats (DOC, DOCX and ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF to Presentation -home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF to RTF (Text) -home.PDFToText.desc=Convert PDF to Text or RTF format -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF to HTML -home.PDFToHTML.desc=Convert PDF to HTML format -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF to XML -home.PDFToXML.desc=Convert PDF to XML format -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detect/Split Scanned photos -home.ScannerImageSplit.desc=Splits multiple photos from within a photo/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Sign -home.sign.desc=Adds signature to PDF by drawing, text or image -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Flatten -home.flatten.desc=Remove all interactive elements and forms from a PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Repair -home.repair.desc=Tries to repair a corrupt/broken PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Remove Blank pages -home.removeBlanks.desc=Detects and removes blank pages from a document -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Compare -home.compare.desc=Compares and shows the differences between 2 PDF Documents -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of a page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=Redact,Hide,black out,black,marker,hidden - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=Certificate Signing -certSign.header=Sign a PDF with your certificate (Work in progress) -certSign.selectPDF=Select a PDF File for Signing: -certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der): -certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der): -certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate): -certSign.certType=Certificate Type -certSign.password=Enter Your Keystore or Private Key Password (If Any): -certSign.showSig=Show Signature -certSign.reason=Reason -certSign.location=Location -certSign.name=Name -certSign.submit=Sign PDF - - -#removeBlanks -removeBlanks.title=Remove Blanks -removeBlanks.header=Remove Blank Pages -removeBlanks.threshold=Pixel Whiteness Threshold: -removeBlanks.thresholdDesc=Threshold for determining how white a white pixel must be to be classed as 'White'. 0 = Black, 255 pure white. -removeBlanks.whitePercent=White Percent (%): -removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removed -removeBlanks.submit=Remove Blanks - - -#compare -compare.title=Compare -compare.header=Compare PDFs -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Compare - - -#sign -sign.title=Sign -sign.header=Sign PDFs -sign.upload=Upload Image -sign.draw=Draw Signature -sign.text=Text Input -sign.clear=Clear -sign.add=Add - - -#repair -repair.title=Repair -repair.header=Repair PDFs -repair.submit=Repair - - -#flatten -flatten.title=Flatten -flatten.header=Flatten PDFs -flatten.submit=Flatten - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Angle Threshold: -ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10). -ScannerImageSplit.selectText.3=Tolerance: -ScannerImageSplit.selectText.4=Determines the range of color variation around the estimated background color (default: 30). -ScannerImageSplit.selectText.5=Minimum Area: -ScannerImageSplit.selectText.6=Sets the minimum area threshold for a photo (default: 10000). -ScannerImageSplit.selectText.7=Minimum Contour Area: -ScannerImageSplit.selectText.8=Sets the minimum contour area threshold for a photo -ScannerImageSplit.selectText.9=Border Size: -ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1). - - -#OCR -ocr.title=OCR / Scan Cleanup -ocr.header=Cleanup Scans / OCR (Optical Character Recognition) -ocr.selectText.1=Select languages that are to be detected within the PDF (Ones listed are the ones currently detected): -ocr.selectText.2=Produce text file containing OCR text alongside the OCR'ed PDF -ocr.selectText.3=Correct pages were scanned at a skewed angle by rotating them back into place -ocr.selectText.4=Clean page so its less likely that OCR will find text in background noise. (No output change) -ocr.selectText.5=Clean page so its less likely that OCR will find text in background noise, maintains cleanup in output. -ocr.selectText.6=Ignores pages that have interactive text on them, only OCRs pages that are images -ocr.selectText.7=Force OCR, will OCR Every page removing all original text elements -ocr.selectText.8=Normal (Will error if PDF contains text) -ocr.selectText.9=Additional Settings -ocr.selectText.10=OCR Mode -ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step) -ocr.selectText.12=Render Type (Advanced) -ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker -ocr.credit=This service uses OCRmyPDF and Tesseract for OCR. -ocr.submit=Process PDF with OCR - - -#extractImages -extractImages.title=Extract Images -extractImages.header=Extract Images -extractImages.selectText=Select image format to convert extracted images to -extractImages.submit=Extract - - -#File to PDF -fileToPDF.title=File to PDF -fileToPDF.header=Convert any file to PDF -fileToPDF.credit=This service uses LibreOffice and Unoconv for file conversion. -fileToPDF.supportedFileTypes=Supported file types should include the below however for a full updated list of supported formats, please refer to the LibreOffice documentation -fileToPDF.submit=Convert to PDF - - -#compress -compress.title=Compress -compress.header=Compress PDF -compress.credit=This service uses Ghostscript for PDF Compress/Optimisation. -compress.selectText.1=Manual Mode - From 1 to 4 -compress.selectText.2=Optimization level: -compress.selectText.3=4 (Terrible for text images) -compress.selectText.4=Auto mode - Auto adjusts quality to get PDF to exact size -compress.selectText.5=Expected PDF Size (e.g. 25MB, 10.8MB, 25KB) -compress.submit=Compress - - -#Add image -addImage.title=Add Image -addImage.header=Add image to PDF -addImage.everyPage=Every Page? -addImage.upload=Add image -addImage.submit=Add image - - -#merge -merge.title=Merge -merge.header=Merge multiple PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Merge - - -#pdfOrganiser -pdfOrganiser.title=Page Organiser -pdfOrganiser.header=PDF Page Organiser -pdfOrganiser.submit=Rearrange Pages - - -#multiTool -multiTool.title=PDF Multi Tool -multiTool.header=PDF Multi Tool - - -#pageRemover -pageRemover.title=Page Remover -pageRemover.header=PDF Page remover -pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : -pageRemover.submit=Delete Pages - - -#rotate -rotate.title=Rotate PDF -rotate.header=Rotate PDF -rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): -rotate.submit=Rotate - - -#merge -split.title=Split PDF -split.header=Split PDF -split.desc.1=The numbers you select are the page number you wish to do a split on -split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: -split.desc.3=Document #1: Page 1 -split.desc.4=Document #2: Page 2 and 3 -split.desc.5=Document #3: Page 4, 5 and 6 -split.desc.6=Document #4: Page 7 -split.desc.7=Document #5: Page 8 -split.desc.8=Document #6: Page 9 and 10 -split.splitPages=Enter pages to split on: -split.submit=Split - - -#merge -imageToPDF.title=Image to PDF -imageToPDF.header=Image to PDF -imageToPDF.submit=Convert -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Auto rotate PDF -imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images) -imageToPDF.selectText.4=Merge into single PDF -imageToPDF.selectText.5=Convert to separate PDFs - - -#pdfToImage -pdfToImage.title=PDF to Image -pdfToImage.header=PDF to Image -pdfToImage.selectText=Image Format -pdfToImage.singleOrMultiple=Page to Image result type -pdfToImage.single=Single Big Image Combing all pages -pdfToImage.multi=Multiple Images, one image per page -pdfToImage.colorType=Colour type -pdfToImage.color=Colour -pdfToImage.grey=Greyscale -pdfToImage.blackwhite=Black and White (May lose data!) -pdfToImage.submit=Convert - - -#addPassword -addPassword.title=Add Password -addPassword.header=Add password (Encrypt) -addPassword.selectText.1=Select PDF to encrypt -addPassword.selectText.2=User Password -addPassword.selectText.3=Encryption Key Length -addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. -addPassword.selectText.5=Permissions to set (Recommended to be used along with Owner password) -addPassword.selectText.6=Prevent assembly of document -addPassword.selectText.7=Prevent content extraction -addPassword.selectText.8=Prevent extraction for accessibility -addPassword.selectText.9=Prevent filling in form -addPassword.selectText.10=Prevent modification -addPassword.selectText.11=Prevent annotation modification -addPassword.selectText.12=Prevent printing -addPassword.selectText.13=Prevent printing different formats -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Encrypt - - -#watermark -watermark.title=Add Watermark -watermark.header=Add Watermark -watermark.selectText.1=Select PDF to add watermark to: -watermark.selectText.2=Watermark Text: -watermark.selectText.3=Font Size: -watermark.selectText.4=Rotation (0-360): -watermark.selectText.5=widthSpacer (Space between each watermark horizontally): -watermark.selectText.6=heightSpacer (Space between each watermark vertically): -watermark.selectText.7=Opacity (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Add Watermark - - -#Change permissions -permissions.title=Change Permissions -permissions.header=Change Permissions -permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page -permissions.selectText.1=Select PDF to change permissions -permissions.selectText.2=Permissions to set -permissions.selectText.3=Prevent assembly of document -permissions.selectText.4=Prevent content extraction -permissions.selectText.5=Prevent extraction for accessibility -permissions.selectText.6=Prevent filling in form -permissions.selectText.7=Prevent modification -permissions.selectText.8=Prevent annotation modification -permissions.selectText.9=Prevent printing -permissions.selectText.10=Prevent printing different formats -permissions.submit=Change - - -#remove password -removePassword.title=Remove password -removePassword.header=Remove password (Decrypt) -removePassword.selectText.1=Select PDF to Decrypt -removePassword.selectText.2=Password -removePassword.submit=Remove - - -#changeMetadata -changeMetadata.title=Change Metadata -changeMetadata.header=Change Metadata -changeMetadata.selectText.1=Please edit the variables you wish to change -changeMetadata.selectText.2=Delete all metadata -changeMetadata.selectText.3=Show Custom Metadata: -changeMetadata.author=Author: -changeMetadata.creationDate=Creation Date (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Creator: -changeMetadata.keywords=Keywords: -changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Producer: -changeMetadata.subject=Subject: -changeMetadata.title=Title: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Other Metadata: -changeMetadata.selectText.5=Add Custom Metadata Entry -changeMetadata.submit=Change - - -#pdfToPDFA -pdfToPDFA.title=PDF To PDF/A -pdfToPDFA.header=PDF To PDF/A -pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion -pdfToPDFA.submit=Convert - - -#PDFToWord -PDFToWord.title=PDF to Word -PDFToWord.header=PDF to Word -PDFToWord.selectText.1=Output file format -PDFToWord.credit=This service uses LibreOffice for file conversion. -PDFToWord.submit=Convert - - -#PDFToPresentation -PDFToPresentation.title=PDF to Presentation -PDFToPresentation.header=PDF to Presentation -PDFToPresentation.selectText.1=Output file format -PDFToPresentation.credit=This service uses LibreOffice for file conversion. -PDFToPresentation.submit=Convert - - -#PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=PDF to RTF (Text) -PDFToText.selectText.1=Output file format -PDFToText.credit=This service uses LibreOffice for file conversion. -PDFToText.submit=Convert - - -#PDFToHTML -PDFToHTML.title=PDF to HTML -PDFToHTML.header=PDF to HTML -PDFToHTML.credit=This service uses LibreOffice for file conversion. -PDFToHTML.submit=Convert - - -#PDFToXML -PDFToXML.title=PDF to XML -PDFToXML.header=PDF to XML -PDFToXML.credit=This service uses LibreOffice for file conversion. -PDFToXML.submit=Convert \ No newline at end of file diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties deleted file mode 100644 index bc712951..00000000 --- a/src/main/resources/messages_en_US.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Select PDF(s) -multiPdfPrompt=Select PDFs (2+) -multiPdfDropPrompt=Select (or drag & drop) all PDFs you require -imgPrompt=Select Image(s) -genericSubmit=Submit -processTimeWarning=Warning: This process can take up to a minute depending on file-size -pageOrderPrompt=Custom Page Order (Enter a comma-separated list of page numbers or Functions like 2n+1) : -goToPage=Go -true=True -false=False -unknown=Unknown -save=Save -close=Close -filesSelected=files selected -noFavourites=No favorites added -bored=Bored Waiting? -alphabet=Alphabet -downloadPdf=Download PDF -text=Text -font=Font -selectFillter=-- Select -- -pageNum=Page Number -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Convert -navbar.security=Security -navbar.other=Miscellaneous -navbar.darkmode=Dark Mode -navbar.pageOps=Page Operations -navbar.settings=Settings - -############# -# SETTINGS # -############# -settings.title=Settings -settings.update=Update available -settings.appVersion=App Version: -settings.downloadOption.title=Choose download option (For single file non zip downloads): -settings.downloadOption.1=Open in same window -settings.downloadOption.2=Open in new window -settings.downloadOption.3=Download file -settings.zipThreshold=Zip files when the number of downloaded files exceeds -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Your locally hosted one-stop-shop for all your PDF needs. - - -home.multiTool.title=PDF Multi Tool -home.multiTool.desc=Merge, Rotate, Rearrange, and Remove pages -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move - -home.merge.title=Merge -home.merge.desc=Easily merge multiple PDFs into one. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Split -home.split.desc=Split PDFs into multiple documents -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Rotate -home.rotate.desc=Easily rotate your PDFs. -rotate.tags=server side - - -home.imageToPdf.title=Image to PDF -home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF to Image -home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Organize -home.pdfOrganiser.desc=Remove/Rearrange pages in any order -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Add image -home.addImage.desc=Adds a image onto a set location on the PDF -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Add Watermark -home.watermark.desc=Add a custom watermark to your PDF document. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Change Permissions -home.permissions.desc=Change the permissions of your PDF document -permissions.tags=read,write,edit,print - - -home.removePages.title=Remove -home.removePages.desc=Delete unwanted pages from your PDF document. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Add Password -home.addPassword.desc=Encrypt your PDF document with a password. -addPassword.tags=secure,security - -home.removePassword.title=Remove Password -home.removePassword.desc=Remove password protection from your PDF document. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Compress -home.compressPdfs.desc=Compress PDFs to reduce their file size. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Change Metadata -home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Convert file to PDF -home.fileToPDF.desc=Convert nearly any file to PDF (DOCX, PNG, XLS, PPT, TXT and more) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Cleanup scans -home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Extract Images -home.extractImages.desc=Extracts all images from a PDF and saves them to zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF to PDF/A -home.pdfToPDFA.desc=Convert PDF to PDF/A for long-term storage -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF to Word -home.PDFToWord.desc=Convert PDF to Word formats (DOC, DOCX and ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF to Presentation -home.PDFToPresentation.desc=Convert PDF to Presentation formats (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF to RTF (Text) -home.PDFToText.desc=Convert PDF to Text or RTF format -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF to HTML -home.PDFToHTML.desc=Convert PDF to HTML format -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF to XML -home.PDFToXML.desc=Convert PDF to XML format -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detect/Split Scanned photos -home.ScannerImageSplit.desc=Splits multiple photos from within a photo/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Sign -home.sign.desc=Adds signature to PDF by drawing, text or image -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Flatten -home.flatten.desc=Remove all interactive elements and forms from a PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Repair -home.repair.desc=Tries to repair a corrupt/broken PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Remove Blank pages -home.removeBlanks.desc=Detects and removes blank pages from a document -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Compare -home.compare.desc=Compares and shows the differences between 2 PDF Documents -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of a page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Color -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=Certificate Signing -certSign.header=Sign a PDF with your certificate (Work in progress) -certSign.selectPDF=Select a PDF File for Signing: -certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der): -certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der): -certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate): -certSign.certType=Certificate Type -certSign.password=Enter Your Keystore or Private Key Password (If Any): -certSign.showSig=Show Signature -certSign.reason=Reason -certSign.location=Location -certSign.name=Name -certSign.submit=Sign PDF - - -#removeBlanks -removeBlanks.title=Remove Blanks -removeBlanks.header=Remove Blank Pages -removeBlanks.threshold=Pixel Whiteness Threshold: -removeBlanks.thresholdDesc=Threshold for determining how white a white pixel must be to be classed as 'White'. 0 = Black, 255 pure white. -removeBlanks.whitePercent=White Percent (%): -removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removed -removeBlanks.submit=Remove Blanks - - -#compare -compare.title=Compare -compare.header=Compare PDFs -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Compare - - -#sign -sign.title=Sign -sign.header=Sign PDFs -sign.upload=Upload Image -sign.draw=Draw Signature -sign.text=Text Input -sign.clear=Clear -sign.add=Add - - -#repair -repair.title=Repair -repair.header=Repair PDFs -repair.submit=Repair - - -#flatten -flatten.title=Flatten -flatten.header=Flatten PDFs -flatten.submit=Flatten - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Angle Threshold: -ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10). -ScannerImageSplit.selectText.3=Tolerance: -ScannerImageSplit.selectText.4=Determines the range of color variation around the estimated background color (default: 30). -ScannerImageSplit.selectText.5=Minimum Area: -ScannerImageSplit.selectText.6=Sets the minimum area threshold for a photo (default: 10000). -ScannerImageSplit.selectText.7=Minimum Contour Area: -ScannerImageSplit.selectText.8=Sets the minimum contour area threshold for a photo -ScannerImageSplit.selectText.9=Border Size: -ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1). - - -#OCR -ocr.title=OCR / Scan Cleanup -ocr.header=Cleanup Scans / OCR (Optical Character Recognition) -ocr.selectText.1=Select languages that are to be detected within the PDF (Ones listed are the ones currently detected): -ocr.selectText.2=Produce text file containing OCR text alongside the OCR'ed PDF -ocr.selectText.3=Correct pages were scanned at a skewed angle by rotating them back into place -ocr.selectText.4=Clean page so its less likely that OCR will find text in background noise. (No output change) -ocr.selectText.5=Clean page so its less likely that OCR will find text in background noise, maintains cleanup in output. -ocr.selectText.6=Ignores pages that have interactive text on them, only OCRs pages that are images -ocr.selectText.7=Force OCR, will OCR Every page removing all original text elements -ocr.selectText.8=Normal (Will error if PDF contains text) -ocr.selectText.9=Additional Settings -ocr.selectText.10=OCR Mode -ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step) -ocr.selectText.12=Render Type (Advanced) -ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker -ocr.credit=This service uses OCRmyPDF and Tesseract for OCR. -ocr.submit=Process PDF with OCR - - -#extractImages -extractImages.title=Extract Images -extractImages.header=Extract Images -extractImages.selectText=Select image format to convert extracted images to -extractImages.submit=Extract - - -#File to PDF -fileToPDF.title=File to PDF -fileToPDF.header=Convert any file to PDF -fileToPDF.credit=This service uses LibreOffice and Unoconv for file conversion. -fileToPDF.supportedFileTypes=Supported file types should include the below however for a full updated list of supported formats, please refer to the LibreOffice documentation -fileToPDF.submit=Convert to PDF - - -#compress -compress.title=Compress -compress.header=Compress PDF -compress.credit=This service uses Ghostscript for PDF Compress/Optimisation. -compress.selectText.1=Manual Mode - From 1 to 4 -compress.selectText.2=Optimization level: -compress.selectText.3=4 (Terrible for text images) -compress.selectText.4=Auto mode - Auto adjusts quality to get PDF to exact size -compress.selectText.5=Expected PDF Size (e.g. 25MB, 10.8MB, 25KB) -compress.submit=Compress - - -#Add image -addImage.title=Add Image -addImage.header=Add image to PDF -addImage.everyPage=Every Page? -addImage.upload=Add image -addImage.submit=Add image - - -#merge -merge.title=Merge -merge.header=Merge multiple PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Merge - - -#pdfOrganiser -pdfOrganiser.title=Page Organizer -pdfOrganiser.header=PDF Page Organizer -pdfOrganiser.submit=Rearrange Pages - - -#multiTool -multiTool.title=PDF Multi Tool -multiTool.header=PDF Multi Tool - - -#pageRemover -pageRemover.title=Page Remover -pageRemover.header=PDF Page remover -pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : -pageRemover.submit=Delete Pages - - -#rotate -rotate.title=Rotate PDF -rotate.header=Rotate PDF -rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): -rotate.submit=Rotate - - -#merge -split.title=Split PDF -split.header=Split PDF -split.desc.1=The numbers you select are the page number you wish to do a split on -split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: -split.desc.3=Document #1: Page 1 -split.desc.4=Document #2: Page 2 and 3 -split.desc.5=Document #3: Page 4, 5 and 6 -split.desc.6=Document #4: Page 7 -split.desc.7=Document #5: Page 8 -split.desc.8=Document #6: Page 9 and 10 -split.splitPages=Enter pages to split on: -split.submit=Split - - -#merge -imageToPDF.title=Image to PDF -imageToPDF.header=Image to PDF -imageToPDF.submit=Convert -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Auto rotate PDF -imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images) -imageToPDF.selectText.4=Merge into single PDF -imageToPDF.selectText.5=Convert to separate PDFs - - -#pdfToImage -pdfToImage.title=PDF to Image -pdfToImage.header=PDF to Image -pdfToImage.selectText=Image Format -pdfToImage.singleOrMultiple=Image result type -pdfToImage.single=Single Big Image -pdfToImage.multi=Multiple Images -pdfToImage.colorType=Color type -pdfToImage.color=Color -pdfToImage.grey=Grayscale -pdfToImage.blackwhite=Black and White (May lose data!) -pdfToImage.submit=Convert - - -#addPassword -addPassword.title=Add Password -addPassword.header=Add password (Encrypt) -addPassword.selectText.1=Select PDF to encrypt -addPassword.selectText.2=User Password -addPassword.selectText.3=Encryption Key Length -addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. -addPassword.selectText.5=Permissions to set (Recommended to be used along with Owner password) -addPassword.selectText.6=Prevent assembly of document -addPassword.selectText.7=Prevent content extraction -addPassword.selectText.8=Prevent extraction for accessibility -addPassword.selectText.9=Prevent filling in form -addPassword.selectText.10=Prevent modification -addPassword.selectText.11=Prevent annotation modification -addPassword.selectText.12=Prevent printing -addPassword.selectText.13=Prevent printing different formats -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Encrypt - - -#watermark -watermark.title=Add Watermark -watermark.header=Add Watermark -watermark.selectText.1=Select PDF to add watermark to: -watermark.selectText.2=Watermark Text: -watermark.selectText.3=Font Size: -watermark.selectText.4=Rotation (0-360): -watermark.selectText.5=widthSpacer (Space between each watermark horizontally): -watermark.selectText.6=heightSpacer (Space between each watermark vertically): -watermark.selectText.7=Opacity (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Add Watermark - - -#Change permissions -permissions.title=Change Permissions -permissions.header=Change Permissions -permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page -permissions.selectText.1=Select PDF to change permissions -permissions.selectText.2=Permissions to set -permissions.selectText.3=Prevent assembly of document -permissions.selectText.4=Prevent content extraction -permissions.selectText.5=Prevent extraction for accessibility -permissions.selectText.6=Prevent filling in form -permissions.selectText.7=Prevent modification -permissions.selectText.8=Prevent annotation modification -permissions.selectText.9=Prevent printing -permissions.selectText.10=Prevent printing different formats -permissions.submit=Change - - -#remove password -removePassword.title=Remove password -removePassword.header=Remove password (Decrypt) -removePassword.selectText.1=Select PDF to Decrypt -removePassword.selectText.2=Password -removePassword.submit=Remove - - -#changeMetadata -changeMetadata.title=Title: -changeMetadata.header=Change Metadata -changeMetadata.selectText.1=Please edit the variables you wish to change -changeMetadata.selectText.2=Delete all metadata -changeMetadata.selectText.3=Show Custom Metadata: -changeMetadata.author=Author: -changeMetadata.creationDate=Creation Date (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Creator: -changeMetadata.keywords=Keywords: -changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Producer: -changeMetadata.subject=Subject: -changeMetadata.title=Title: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Other Metadata: -changeMetadata.selectText.5=Add Custom Metadata Entry -changeMetadata.submit=Change - - -#pdfToPDFA -pdfToPDFA.title=PDF To PDF/A -pdfToPDFA.header=PDF To PDF/A -pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion -pdfToPDFA.submit=Convert - - -#PDFToWord -PDFToWord.title=PDF to Word -PDFToWord.header=PDF to Word -PDFToWord.selectText.1=Output file format -PDFToWord.credit=This service uses LibreOffice for file conversion. -PDFToWord.submit=Convert - - -#PDFToPresentation -PDFToPresentation.title=PDF to Presentation -PDFToPresentation.header=PDF to Presentation -PDFToPresentation.selectText.1=Output file format -PDFToPresentation.credit=This service uses LibreOffice for file conversion. -PDFToPresentation.submit=Convert - - -#PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=PDF to RTF (Text) -PDFToText.selectText.1=Output file format -PDFToText.credit=This service uses LibreOffice for file conversion. -PDFToText.submit=Convert - - -#PDFToHTML -PDFToHTML.title=PDF to HTML -PDFToHTML.header=PDF to HTML -PDFToHTML.credit=This service uses LibreOffice for file conversion. -PDFToHTML.submit=Convert - - -#PDFToXML -PDFToXML.title=PDF to XML -PDFToXML.header=PDF to XML -PDFToXML.credit=This service uses LibreOffice for file conversion. -PDFToXML.submit=Convert diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties deleted file mode 100644 index 26e993c8..00000000 --- a/src/main/resources/messages_es_ES.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Seleccionar PDF(s) -multiPdfPrompt=Seleccionar PDFs (2+) -multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera -imgPrompt=Seleccionar Imagen(es) -genericSubmit=Enviar -processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo -pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma): -goToPage=Ir a -true=Verdadero -false=Falso -unknown=Desconocido -save=Guardar -close=Cerrar -filesSelected=archivos seleccionados -noFavourites=No se agregaron favoritos -bored=¿Cansado de esperar? -alphabet=Alfabeto -downloadPdf=Descargar PDF -text=Texto -font=Fuente -selectFillter=-- Seleccionar -- -pageNum=Número de página -sizes.small=Paqueño -sizes.medium=Mediano -sizes.large=Grande -sizes.x-large=Extra grande -error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta -delete=Borrar -username=Nombre de usuario -password=Contraseña -welcome=Bienvenido -property=Propietario -black=Negro -white=Blanco -red=Rojo -green=Verde -blue=Azul -custom=Personalizado... - -changedCredsMessage=Se cambiaron las credenciales! -notAuthenticatedMessage=Usuario njo autentificado. -userNotFoundMessage=Usuario no encontrado. -incorrectPasswordMessage=La contraseña actual no es correcta. -usernameExistsMessage=El nuevo nombre de usuario está en uso. - - - -############# -# NAVBAR # -############# -navbar.convert=Convertir -navbar.security=Seguridad -navbar.other=Otro -navbar.darkmode=Modo oscuro -navbar.pageOps=Operaciones de página -navbar.settings=Configuración - -############# -# SETTINGS # -############# -settings.title=Configuración -settings.update=Actualización disponible -settings.appVersion=Versión de la aplicación: -settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP): -settings.downloadOption.1=Abrir en la misma ventana -settings.downloadOption.2=Abrir en una nueva ventana -settings.downloadOption.3=Descargar el fichero -settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descargados -settings.signOut=Desconectar -settings.accountSettings=Configuración de la cuenta - - - -changeCreds.title=Cambiar Credenciales -changeCreds.header=Actualice los detalles de su cuenta -changeCreds.changeUserAndPassword=Está usando las credenciales por defecto. Por favor, introduzca una nueva contraseña (y usuario si lo desea) -changeCreds.newUsername=Nuevo usuario -changeCreds.oldPassword=Contraseña actual -changeCreds.newPassword=Nueva contraseña -changeCreds.confirmNewPassword=Confirme la nueva contraseña -changeCreds.submit=Enviar cambios - - - -account.title=Configuración de la cuenta -account.accountSettings=Configuración de la cuenta -account.adminSettings=Configuración de Administrador - Ver y Añadir Usuarios -account.userControlSettings=Configuración de control de usuario -account.changeUsername=Cambiar nombre de usuario -account.changeUsername=Cambiar nombre de usuario -account.password=Confirmar contraseña -account.oldPassword=Contraseña anterior -account.newPassword=Nueva Contraseña -account.changePassword=Cambiar Contraseña -account.confirmNewPassword=Confirmar Nueva Contraseña -account.signOut=Cerrar sesión -account.yourApiKey=Su clave API -account.syncTitle=Sincronizar la configuración del navegador con la cuenta -account.settingsCompare=Comparación de configuraciones: -account.property=Propiedad -account.webBrowserSettings=Configuración del navegador -account.syncToBrowser=Sincronizar cuenta -> Navegador -account.syncToAccount=Sincronizar cuenta <- Navegador - - -adminUserSettings.title=Configuración de control de usuario -adminUserSettings.header=Configuración de control de usuario administrador -adminUserSettings.admin=Administrador -adminUserSettings.user=Usuario -adminUserSettings.addUser=Añadir Nuevo Usuario -adminUserSettings.roles=Roles -adminUserSettings.role=Rol -adminUserSettings.actions=Acciones -adminUserSettings.apiUser=Usuario limitado de API -adminUserSettings.webOnlyUser=Usuario solo web -adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el acceso -adminUserSettings.submit=Guardar Usuario - -############# -# HOME-PAGE # -############# -home.desc=Su ventanilla única autohospedada para todas tus necesidades PDF - - -home.multiTool.title=Multi-herramienta PDF -home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas -multiTool.tags=Multi-herramienta,Multi-operación,Interfaz de usuario,Arrastrar con un click,front end,lado del cliente - -home.merge.title=Unir -home.merge.desc=Unir fácilmente múltiples PDFs en uno -merge.tags=Unir,Operaciones de página,Back end,lado del servidor - -home.split.title=Dividir -home.split.desc=Dividir PDFs en múltiples documentos -split.tags=Operaciones de página,dividir,Multi-página,cortar,lado del servidor - -home.rotate.title=Rotar -home.rotate.desc=Rotar fácilmente sus PDFs -rotate.tags=lado del servidor - - -home.imageToPdf.title=Imagen a PDF -home.imageToPdf.desc=Convertir una imagen (PNG, JPEG, GIF) a PDF -imageToPdf.tags=conversión,img,jpg,imagen,fotografía - -home.pdfToImage.title=PDF a Imagen -home.pdfToImage.desc=Convertir un PDF a una imagen (PNG, JPEG, GIF) -pdfToImage.tags=conversión,img,jpg,imagen,fotografía - -home.pdfOrganiser.title=Organizador -home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden -pdfOrganiser.tags=doble cara,pares,impares,ordenar,mover - - -home.addImage.title=Agregar imagen al PDF -home.addImage.desc=Agregar una imagen en una ubicación establecida en el PDF (en desarrollo) -addImage.tags=img,jpg,imagen,fotografía - -home.watermark.title=Añadir marca de agua -home.watermark.desc=Añadir una marca de agua predefinida al documento PDF -watermark.tags=Texto,repetir,etiquetar,propietario,copyight,marca comercial,img,jpg,imagen,fotografía - -home.permissions.title=Cambiar permisos -home.permissions.desc=Cambiar los permisos del documento PDF -permissions.tags=leer,escribir,editar,imprimir - - -home.removePages.title=Eliminar -home.removePages.desc=Eliminar páginas no deseadas del documento PDF -removePages.tags=Borrar páginas,eliminar páginas - -home.addPassword.title=Añadir contraseña -home.addPassword.desc=Encriptar el documento PDF con una contraseña -addPassword.tags=seguro,seguridad - -home.removePassword.title=Eliminar contraseña -home.removePassword.desc=Eliminar la contraseña del documento PDF -removePassword.tags=seguro,Desencriptar,seguridad,quitar contraseña,eliminar contraseña - -home.compressPdfs.title=Comprimir -home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del fichero -compressPdfs.tags=aplastar,pequeño,diminuto - - -home.changeMetadata.title=Cambiar metadatos -home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF -changeMetadata.tags==Título,autor,fecha,creación,hora,editorial,productor,estadísticas - -home.fileToPDF.title=Convertir fichero a PDF -home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más) -fileToPDF.tags=transformación,formato,documento,imagen,diapositiva,texto,conversión,office,docs,word,excel,powerpoint - -home.ocr.title=Ejecutar OCR en PDF y/o tareas de limpieza -home.ocr.desc=Tareas de limpieza y detectar texto en imágenes dentro de un PDF y volver a incrustarlo como texto -ocr.tags=reconocimiento,texto,imagen,escanear,leer,identificar,detección,editable - - -home.extractImages.title=Extraer imágenes -home.extractImages.desc=Extraer todas las imágenes de un PDF y guardarlas en ZIP -extractImages.tags=imagen,fotografía,guardar,archivo,zip,capturar,coger - -home.pdfToPDFA.title=Convertir PDF a PDF/A -home.pdfToPDFA.desc=Convertir PDF a PDF/A para almacenamiento a largo plazo -pdfToPDFA.tags=archivo,largo plazo,estándar,conversión,almacewnamiento,conservación - -home.PDFToWord.title=PDF a Word -home.PDFToWord.desc=Convertir formatos PDF a Word (DOC, DOCX y ODT) -PDFToWord.tags=doc,docx,odt,word,transformación,formato,conversión,office,microsoft,archivo del documento - -home.PDFToPresentation.title=PDF a presentación -home.PDFToPresentation.desc=Convertir PDF a formatos de presentación (PPT, PPTX y ODP) -PDFToPresentation.tags=diapositivas,mostrar,office,microsoft - -home.PDFToText.title=PDF a TXT o RTF -home.PDFToText.desc=Convertir PDF a formato TXT o RTF -PDFToText.tags=formato enriquecido,formato de texto enriquecido,formato de texto enriquecido - -home.PDFToHTML.title=PDF a HTML -home.PDFToHTML.desc=Convertir PDF a formato HTML -PDFToHTML.tags=contenido web,amigable para navegador - - -home.PDFToXML.title=PDF a XML -home.PDFToXML.desc=Convertir PDF a formato XML -PDFToXML.tags=extracción de datos,contenido estructurado,interopersabilidad,transformación,convertir - -home.ScannerImageSplit.title=Detectar/Dividir fotos escaneadas -home.ScannerImageSplit.desc=Dividir varias fotos dentro de una foto/PDF -ScannerImageSplit.tags=separar,auto-detectar,escaneos,multi-foto,organizar - -home.sign.title=Firmar -home.sign.desc=Añadir firma a PDF mediante dibujo, texto o imagen -sign.tags=autorizar,iniciales,firma manuscrita,texto de firma,imagen de firma - -home.flatten.title=Aplanar -home.flatten.desc=Eliminar todos los elementos y formularios interactivos de un PDF -flatten.tags=estática,desactivar,no interactiva,etiqueta dinámica - -home.repair.title=Reparar -home.repair.desc=Intentar reparar un PDF corrupto/roto -repair.tags=reparar,restaurar,corregir,recuperar - -home.removeBlanks.title=Eliminar páginas en blanco -home.removeBlanks.desc=Detectar y eliminar páginas en blanco de un documento -removeBlanks.tags=limpieza,dinámica,sin contenido,organizar - -home.compare.title=Comparar -home.compare.desc=Comparar y mostrar las diferencias entre 2 documentos PDF -compare.tags=diferenciar,contrastar,cambios,análisis - -home.certSign.title=Firmar con certificado -home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12) -certSign.tags=autentificar,PEM,P12,oficial,encriptar - -home.pageLayout.title=Diseño de varias páginas -home.pageLayout.desc=Unir varias páginas de un documento PDF en una sola página -pageLayout.tags=unir,compuesto,vista única,organizar - -home.scalePages.title=Escalar/ajustar tamaño de página -home.scalePages.desc=Escalar/cambiar el tamaño de una pagina y/o su contenido -scalePages.tags=cambiar tamaño,modificar,dimensionar,adaptar - -home.pipeline.title=Secuencia (Avanzado) -home.pipeline.desc=Ejecutar varias tareas a PDFs definiendo una secuencia de comandos -pipeline.tags=automatizar,secuencia,con script,proceso por lotes - -home.add-page-numbers.title=Añadir números de página -home.add-page-numbers.desc=Añadir números de página en un documento en una ubicación concreta -add-page-numbers.tags=paginar,etiquetar,organizar,indexar - -home.auto-rename.title=Auto renombrar archivo PDF -home.auto-rename.desc=Auto renombrar un archivo PDF según el encabezamiento detectado -auto-rename.tags=auto-detectar,basado en el encabezamiento,organizar,re-etiquetar - -home.adjust-contrast.title=Ajustar Color/Contraste -home.adjust-contrast.desc=Ajustar Contraste, Saturación y Brillo de un PDF -adjust-contrast.tags=corrección de color,sintonizar color,modificar,mejorar - -home.crop.title=Recortar PDF -home.crop.desc=Recortar un PDF para reducir su tamaño (¡conservando el texto!) -crop.tags=recortar,contraer,editar,forma - -home.autoSplitPDF.title=Auto Dividir Páginas -home.autoSplitPDF.desc=Auto Dividir PDF escaneado con código QR divsor de página escaneada físicamente -autoSplitPDF.tags=Marcado por QR,separar,segmento de escaneo,organizar - -home.sanitizePdf.title=Desinfectar -home.sanitizePdf.desc=Eliminar scripts y otros elementos de los archivos PDF -sanitizePdf.tags=limpiar,asegurar,seguro,quitar amenazas - -home.URLToPDF.title=URL/Página web a PDF -home.URLToPDF.desc=Convierte cualquier dirección http(s) a PDF -URLToPDF.tags=captura web,guardar página,web-a-doc,archivo - -home.HTMLToPDF.title=HTML a PDF -home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF -HTMLToPDF.tags=margen,contenido web,transformación,convertir - - -home.MarkdownToPDF.title=Markdown a PDF -home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF -MarkdownToPDF.tags=margen,contenido web,transformación,convertir - - -home.getPdfInfo.title=Obtener toda la información en PDF -home.getPdfInfo.desc=Obtiene toda la información posible de archivos PDF -getPdfInfo.tags=información,datos,stats,estadísticas - - -home.extractPage.title=Extraer página(s) -home.extractPage.desc=Extraer las páginas seleccionadas del PDF -extractPage.tags=extraer - - -home.PdfToSinglePage.title=PDF a una sola página -home.PdfToSinglePage.desc=Unir todas las páginas del PDF en una sola página -PdfToSinglePage.tags=página única - - -home.showJS.title=Mostrar Javascript -home.showJS.desc=Busca y muestra cualquier JS contenido en un PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redactar -home.autoRedact.desc=Redactar automáticamente (ocultar) texto en un PDF según el texto introducido -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Iniciar sesión -login.signin=Iniciar sesión -login.rememberme=Recordarme -login.invalid=Nombre de usuario o contraseña erróneos. -login.locked=Su cuenta se ha bloqueado. -login.signinTitle=Por favor, inicie sesión - - -#auto-redact -autoRedact.title=Auto Redactar -autoRedact.header=Auto Redactar -autoRedact.colorLabel=Color -autoRedact.textsToRedactLabel=Texto para Redactar (separado por líneas) -autoRedact.textsToRedactPlaceholder=por ej. \nConfidencial \nAlto-Secreto -autoRedact.useRegexLabel=Usar Regex -autoRedact.wholeWordSearchLabel=Búsqueda por palabra completa -autoRedact.customPaddingLabel=Extra Padding personalizado -autoRedact.convertPDFToImageLabel=Convertir PDF a imagen-PDF (Utilizado para quitar el texto detrás del cajetín) -autoRedact.submitButton=Enviar - - -#showJS -showJS.title=Mostrar Javascript -showJS.header=Mostrar Javascript -showJS.downloadJS=Descargar Javascript -showJS.submit=Mostrar - - -#pdfToSinglePage -pdfToSinglePage.title=PDF a página única -pdfToSinglePage.header=PDF a página única -pdfToSinglePage.submit=Convertir a página única - - -#pageExtracter -pageExtracter.title=Extraer Páginas -pageExtracter.header=Extraer Páginas -pageExtracter.submit=Extraer - - -#getPdfInfo -getPdfInfo.title=Obtener Información del PDF -getPdfInfo.header=Obtener Información del PDF -getPdfInfo.submit=Obtener Información -getPdfInfo.downloadJson=Descargar JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown a PDF -MarkdownToPDF.header=Markdown a PDF -MarkdownToPDF.submit=Convertir -MarkdownToPDF.help=Tarea en proceso -MarkdownToPDF.credit=Usa WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL a PDF -URLToPDF.header=URL a PDF -URLToPDF.submit=Convertir -URLToPDF.credit=Utiliza WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML a PDF -HTMLToPDF.header=HTML a PDF -HTMLToPDF.help=Acepta archivos HTML y ZIPs conteniendo los html/css/imágenes etc requeridas -HTMLToPDF.submit=Convertir -HTMLToPDF.credit=Utiliza WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Desinfectar archivo PDF -sanitizePDF.header=Desinfectar un archivo PDF -sanitizePDF.selectText.1=Eliminar acciones JavaScript -sanitizePDF.selectText.2=Eliminar archivos incrustados -sanitizePDF.selectText.3=Eliminar metadatos -sanitizePDF.selectText.4=Eliminar enlaces -sanitizePDF.selectText.5=Eliminar fuentes -sanitizePDF.submit=Desinfectar PDF - - -#addPageNumbers -addPageNumbers.title=Añadir Números de Página -addPageNumbers.header=Añadir Números de Página -addPageNumbers.selectText.1=Seleccionar archivo PDF: -addPageNumbers.selectText.2=Tamaño del margen -addPageNumbers.selectText.3=Posición -addPageNumbers.selectText.4=Número de inicio -addPageNumbers.selectText.5=Páginas a numerar -addPageNumbers.selectText.6=Texto personalizado -addPageNumbers.customTextDesc=Texto personalizado -addPageNumbers.numberPagesDesc=Qué páginas numerar, por defecto 'todas', también acepta 1-5 o 2,5,9 etc -addPageNumbers.customNumberDesc=Por defecto a {n}, también acepta 'Página {n} de {total}', 'Texto-{n}', '{nombre de archivo}-{n} -addPageNumbers.submit=Añadir Números de Página - - -#auto-rename -auto-rename.title=Auto Renombrar -auto-rename.header=Auto Renombrar PDF -auto-rename.submit=Auto Renombrar - - -#adjustContrast -adjustContrast.title=Ajustar Contraste -adjustContrast.header=Ajustar Contraste -adjustContrast.contrast=Contraste: -adjustContrast.brightness=Brillo: -adjustContrast.saturation=Saturación: -adjustContrast.download=Descargar - - -#crop -crop.title=Recortar -crop.header=Recortar Imagen -crop.submit=Entregar - - -#autoSplitPDF -autoSplitPDF.title=Auto Dividir PDF -autoSplitPDF.header=Auto Dividir PDF -autoSplitPDF.description=Imprimir, Insertar, Escanear, cargar, y déjenos sepsrar automáticamente sus documentos. No se necesita clasificación manual. -autoSplitPDF.selectText.1=Imprimir algunas hojas divisorias desde la parte inferior (Blanco y negro está bien). -autoSplitPDF.selectText.2=Escanee todos sus documentos a la vez insertando la hoja divisoria entre ellos. -autoSplitPDF.selectText.3=Cargue un único archivo PDF escaneado de gran tamaño y deje que Stirling PDF se encargue del resto. -autoSplitPDF.selectText.4=Las páginas divisorias son automáticamente detectadas y eliminadas, garantizando un buen documento final. -autoSplitPDF.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF: -autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras) -autoSplitPDF.dividerDownload1=Descargar 'Auto Splitter Divider (mínima).pdf' -autoSplitPDF.dividerDownload2=Descargar 'Auto Splitter Divider (con instrucciones).pdf' -autoSplitPDF.submit=Entregar - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Diseño de varias páginas -pageLayout.header=Diseño de varias páginas -pageLayout.pagesPerSheet=Páginas por hoja: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Entregar - - -#scalePages -scalePages.title=Ajustar escala de la página -scalePages.header=Adjustar escala de la página -scalePages.pageSize=Tamaño de la página del documento -scalePages.scaleFactor=Nivel de zoom (recorte) de la página -scalePages.submit=Entregar - - -#certSign -certSign.title=Firma de certificado -certSign.header=Firmar un PDF con su certificado (en desarrollo) -certSign.selectPDF=Seleccione un archivo PDF para firmar: -certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der): -certSign.selectCert=Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der): -certSign.selectP12=Seleccione su archivo de almacén de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado): -certSign.certType=Tipo de certificado -certSign.password=Introduzca su almacén de claves o contraseña de clave privada (si corresponde): -certSign.showSig=Mostrar firma -certSign.reason=Razón -certSign.location=Ubicación -certSign.name=Nombre -certSign.submit=Firmar PDF - - -#removeBlanks -removeBlanks.title=Eliminar espacios en blanco -removeBlanks.header=Eliminar páginas en blanco -removeBlanks.threshold=Umbral: -removeBlanks.thresholdDesc=Umbral para determinar cuán blanco debe ser un píxel blanco -removeBlanks.whitePercent=Porcentaje de blanco (%): -removeBlanks.whitePercentDesc=Porcentaje de página que debe ser blanca para ser eliminada -removeBlanks.submit=Eliminar espacios en blanco - - -#compare -compare.title=Comparar -compare.header=Comparar archivos PDF -compare.document.1=Documento 1 -compare.document.2=Documento 2 -compare.submit=Comparar - - -#sign -sign.title=Firmar -sign.header=Firmar archivos PDF -sign.upload=Subir imagen -sign.draw=Dibujar firma -sign.text=Entrada de texto -sign.clear=Borrar -sign.add=Agregar - - -#repair -repair.title=Reparar -repair.header=Reparar archivos PDF -repair.submit=Reparar - - -#flatten -flatten.title=Aplanar -flatten.header=Acoplar archivos PDF -flatten.submit=Aplanar - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Umbral de ángulo: -ScannerImageSplit.selectText.2=Establecer el ángulo absoluto mínimo requerido para rotar la imagen (predeterminado: 10). -ScannerImageSplit.selectText.3=Tolerancia: -ScannerImageSplit.selectText.4=Determinar el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30). -ScannerImageSplit.selectText.5=Área mínima: -ScannerImageSplit.selectText.6=Establecer el umbral mínimo de área para una foto (predeterminado: 10000). -ScannerImageSplit.selectText.7=Área de contorno mínima: -ScannerImageSplit.selectText.8=Establecer el umbral mínimo del área de contorno para una foto -ScannerImageSplit.selectText.9=Tamaño del borde: -ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1). - - -#OCR -ocr.title=OCR / Escaneo de limpieza -ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres) -ocr.selectText.1=Seleccionar los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente): -ocr.selectText.2=Producir un archivo de texto que contenga texto OCR junto con el PDF editado con OCR -ocr.selectText.3=Corregir las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar -ocr.selectText.4=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo (Sin cambio de salida) -ocr.selectText.5=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida. -ocr.selectText.6=Ignorar las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes -ocr.selectText.7=Forzar OCR, OCR eliminará en cada página todo el texto original -ocr.selectText.8=Normal (se producirá un error si el PDF contiene texto) -ocr.selectText.9=Ajustes adicionales -ocr.selectText.10=Modo OCR -ocr.selectText.11=Eliminar imágenes después de OCR (Elimina TODAS las imágenes, solo es útil si es parte del paso de conversión) -ocr.selectText.12=Tipo de procesamiento (avanzado) -ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en Docker -ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR -ocr.submit=Procesar PDF con OCR - - -#extractImages -extractImages.title=Extraer imágenes -extractImages.header=Extraer imágenes -extractImages.selectText=Seleccionar el formato de imagen para convertir las imágenes extraídas -extractImages.submit=Extraer - - -#File to PDF -fileToPDF.title=Archivo a PDF -fileToPDF.header=Convertir cualquier archivo a PDF -fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros -fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice -fileToPDF.submit=Convertir a PDF - - -#compress -compress.title=Comprimir -compress.header=Comprimir PDF -compress.credit=Este servicio utiliza Ghostscript para compresión/optimización de PDF -compress.selectText.1=Modo manual - De 1 a 4 -compress.selectText.2=Nivel de optimización: -compress.selectText.3=4 (Terrible para imágenes de texto) -compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto -compress.selectText.5=Tamaño esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB) -compress.submit=Comprimir - - -#Add image -addImage.title=Añadir imagen -addImage.header=Añadir imagen de PDF -addImage.everyPage=¿Todas las páginas? -addImage.upload=Añadir imagen -addImage.submit=Añadir imagen - - -#merge -merge.title=Unir -merge.header=Unir múltiples PDFs (2+) -merge.sortByName=Ordenar por nombre -merge.sortByDate=Ordenar por fecha -merge.submit=Unir - - -#pdfOrganiser -pdfOrganiser.title=Organizador de páginas -pdfOrganiser.header=Organizador de páginas PDF -pdfOrganiser.submit=Organizar páginas - - -#multiTool -multiTool.title=Multi-herramienta PDF -multiTool.header=Multi-herramienta PDF - - -#pageRemover -pageRemover.title=Eliminador de páginas -pageRemover.header=Eliminador de páginas PDF -pageRemover.pagesToDelete=Páginas a eliminar (introducir una lista de números de página separados por coma): -pageRemover.submit=Eliminar Páginas - - -#rotate -rotate.title=Rotar PDF -rotate.header=Rotar PDF -rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados): -rotate.submit=Rotar - - -#merge -split.title=Dividir PDF -split.header=Dividir PDF -split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división -split.desc.2=Como tal, seleccionar 1,3,7-8 dividiría un documento de 10 páginas en 6 archivos PDF separados con: -split.desc.3=Documento #1: Página 1 -split.desc.4=Documento #2: Páginas 2 y 3 -split.desc.5=Documento #3: Páginas 4, 5 y 6 -split.desc.6=Documento #4: Página 7 -split.desc.7=Documento #5: Página 8 -split.desc.8=Documento #6: Páginas 9 y 10 -split.splitPages=Introducir las páginas para dividir: -split.submit=Dividir - - -#merge -imageToPDF.title=Imagen a PDF -imageToPDF.header=Imagen a PDF -imageToPDF.submit=Convertir -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Rotación automática del PDF -imageToPDF.selectText.3=Lógica de archivos múltiples (únicamente activado si funciona con multiples imágenes) -imageToPDF.selectText.4=Unir en un único archivo PDF -imageToPDF.selectText.5=Convertir a PDFs separados - - -#pdfToImage -pdfToImage.title=PDF a Imagen -pdfToImage.header=PDF a Imagen -pdfToImage.selectText=Formato de Imagen -pdfToImage.singleOrMultiple=Tipo resultante de imagen -pdfToImage.single=Una única imagen grande -pdfToImage.multi=Múltiples imágenes -pdfToImage.colorType=Tipo de color -pdfToImage.color=Color -pdfToImage.grey=Escala de grises -pdfToImage.blackwhite=Blanco y Negro (¡Puede perder datos!) -pdfToImage.submit=Convertir - - -#addPassword -addPassword.title=Añadir contraseña -addPassword.header=Añadir contraseña (encriptar) -addPassword.selectText.1=Seleccionar PDF para encriptar -addPassword.selectText.2=Contraseña -addPassword.selectText.3=Longitud de la clave de cifrado -addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad -addPassword.selectText.5=Permisos para establecer -addPassword.selectText.6=Impedir el ensamblaje del documento -addPassword.selectText.7=Impedir la extracción de contenido -addPassword.selectText.8=Impedir la extracción para la accesibilidad -addPassword.selectText.9=Impedir rellenar formulario -addPassword.selectText.10=Impedir modificación -addPassword.selectText.11=Impedir modificación de anotaciones -addPassword.selectText.12=Impedir imprimir -addPassword.selectText.13=Impedir imprimir diferentes formatos -addPassword.selectText.14=Contraseña -addPassword.selectText.15=Restringe qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores) -addPassword.selectText.16=Restringe la apertura del propio documento -addPassword.submit=Encriptar - - -#watermark -watermark.title=Añadir marca de agua -watermark.header=Añadir marca de agua -watermark.selectText.1=Seleccionar PDF para añadir marca de agua: -watermark.selectText.2=Texto de la marca de agua: -watermark.selectText.3=Tamaño de la Fuente: -watermark.selectText.4=Rotación (0-360): -watermark.selectText.5=Ancho (Espacio entre cada marca de agua horizontalmente): -watermark.selectText.6=Alto (Espacio entre cada marca de agua verticalmente): -watermark.selectText.7=Opacidad (0% - 100%): -watermark.selectText.8=Tipo de marca de agua: -watermark.selectText.9=Imagen de marca de agua: -watermark.submit=Añadir marca de agua - - -#Change permissions -permissions.title=Cambiar permisos -permissions.header=Cambiar permisos -permissions.warning=Advertencia: para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña -permissions.selectText.1=Seleccionar PDF para cambiar los permisos -permissions.selectText.2=Permisos a establecer -permissions.selectText.3=Impedir el ensamblaje del documento -permissions.selectText.4=Impedir la extracción de contenido -permissions.selectText.5=Impedir la extracción para la accesibilidad -permissions.selectText.6=Impedir rellenar formulario -permissions.selectText.7=Impedir modificación -permissions.selectText.8=Impedir modificación de anotaciones -permissions.selectText.9=Impedir imprimir -permissions.selectText.10=Impedir imprimir diferentes formatos -permissions.submit=Cambiar - - -#remove password -removePassword.title=Eliminar contraseña -removePassword.header=Eliminar contraseña (desencriptar) -removePassword.selectText.1=Seleccionar PDF para desencriptar -removePassword.selectText.2=Contraseña -removePassword.submit=Eliminar - - -#changeMetadata -changeMetadata.title=Título: -changeMetadata.header=Cambiar metadatos -changeMetadata.selectText.1=Editar las variables que desea cambiar -changeMetadata.selectText.2=Eliminar todos los metadatos -changeMetadata.selectText.3=Mostrar metadatos personalizados: -changeMetadata.author=Autor: -changeMetadata.creationDate=Fecha de creación (aaaa/MM/dd HH:mm:ss): -changeMetadata.creator=Creador: -changeMetadata.keywords=Palabras clave: -changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss): -changeMetadata.producer=Productor: -changeMetadata.subject=Asunto: -changeMetadata.title=Título: -changeMetadata.trapped=Capturado: -changeMetadata.selectText.4=Otros Metadatos: -changeMetadata.selectText.5=Agregar entrada de metadatos personalizados -changeMetadata.submit=Cambiar - - -#pdfToPDFA -pdfToPDFA.title=PDF a PDF/A -pdfToPDFA.header=PDF a PDF/A -pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A -pdfToPDFA.submit=Convertir - - -#PDFToWord -PDFToWord.title=PDF a Word -PDFToWord.header=PDF a Word -PDFToWord.selectText.1=Formato de archivo de salida -PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos -PDFToWord.submit=Convertir - - -#PDFToPresentation -PDFToPresentation.title=PDF a presentación -PDFToPresentation.header=PDF a presentación -PDFToPresentation.selectText.1=Formato de archivo de salida -PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos -PDFToPresentation.submit=Convertir - - -#PDFToText -PDFToText.title=PDF a TXT/RTF -PDFToText.header=PDF a TXT/RTF -PDFToText.selectText.1=Formato de archivo de salida -PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos -PDFToText.submit=Convertir - - -#PDFToHTML -PDFToHTML.title=PDF a HTML -PDFToHTML.header=PDF a HTML -PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos -PDFToHTML.submit=Convertir - - -#PDFToXML -PDFToXML.title=PDF a XML -PDFToXML.header=PDF a XML -PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos -PDFToXML.submit=Convertir diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties deleted file mode 100644 index e0dc8e5a..00000000 --- a/src/main/resources/messages_eu_ES.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Hautatu PDFa(k) -multiPdfPrompt=Hautatu PDFak (2+) -multiPdfDropPrompt=Hautatu (edo arrastatu eta jaregin) nahi dituzun PDFak -imgPrompt=Hautatu Irudia(k) -genericSubmit=Bidali -processTimeWarning=Oharra: prozesu honetarako minutu bat ere beharko da fitxategiaren tamaiaren arabera -pageOrderPrompt=Orrialdeen ordena (sartu komaz bereizitako orrialde-zenbakien zerrenda) -goToPage=Joan -true=Egiazkoa -false=Faltsua -unknown=Ezezaguna -save=Gorde -close=Itxi -filesSelected=Hautatutako fitxategiak -noFavourites=Ez dira gogokoak gehitu -bored=Itxaroten aspertuta? -alphabet=Alfabetoa -downloadPdf=PDFa deskargatu -text=Testua -font=Letra-tipoa -selectFillter=-- Aukeratu filtroa -- -pageNum=Orrialde-zenbakia -sizes.small=Txikia -sizes.medium=Erdikoa -sizes.large=Handia -sizes.x-large=Oso handia -error.pdfPassword=PDF dokumentua pasahitzarekin babestuta dago eta pasahitza ez da sartu edo okerra da -delete=ezabatu -username=Erabiltzaile izena -password=Pasahitza -welcome=Ongi etorria -property=Propietate -black=Beltza -white=Txuria -red=Gorria -green=Berdea -blue=Urdina -custom=Pertsonalizatu... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Bihurtu -navbar.security=Segurtasuna -navbar.other=Beste bat -navbar.darkmode=Modu iluna -navbar.pageOps=Orrialde-eragiketak -navbar.settings=Ezarpenak - -############# -# SETTINGS # -############# -settings.title=Ezarpenak -settings.update=Eguneratze eskuragarria -settings.appVersion=Aplikazioaren bertsioa: -settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe): -settings.downloadOption.1=Ireki leiho berean -settings.downloadOption.2=Ireki leiho berrian -settings.downloadOption.3=Deskargatu fitxategia -settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean -settings.signOut=Saioa itxi -settings.accountSettings=Kontuaren ezarpenak - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Kontuaren ezarpenak -account.accountSettings=Kontuaren ezarpenak -account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak -account.userControlSettings=Erabiltzaile ezarpen kontrolak -account.changeUsername=Aldatu erabiltzaile izena -account.changeUsername=Aldatu erabiltzaile izena -account.password=Konfirmatu pasahitza -account.oldPassword=Pasahitz zaharra -account.newPassword=Pasahitz berria -account.changePassword=Aldatu pasahitza -account.confirmNewPassword=Konfirmatu pasahitz berria -account.signOut=Saioa itxi -account.yourApiKey=Zure API Key -account.syncTitle=Sinkronizatu nabigatzailearen ezarpenak zure kontuarekin -account.settingsCompare=Ezarpenen konparaketa: -account.property=Propietatea -account.webBrowserSettings=Web nabigatzailearen ezarpenak -account.syncToBrowser=Sync Kontua -> Nabigatzailea -account.syncToAccount=Sync Kontua <- Nabigatzailea - - -adminUserSettings.title=Erabiltzailearen Ezarpenen Kontrolak -adminUserSettings.header=Admin Erabiltzailearen Ezarpenen Kontrolak -adminUserSettings.admin=Admin -adminUserSettings.user=Erabiltzaile -adminUserSettings.addUser=Erabiltzaile berria -adminUserSettings.roles=Rolak -adminUserSettings.role=Rol -adminUserSettings.actions=Ekintzak -adminUserSettings.apiUser=APIren erabiltzaile mugatua -adminUserSettings.webOnlyUser=Web-erabiltzailea bakarrik -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Gorde Erabiltzailea - -############# -# HOME-PAGE # -############# -home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako - - -home.multiTool.title=Erabilera anitzeko tresna PDF -home.multiTool.desc=Orriak konbinatu, biratu, berrantolatu eta ezabatu -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Elkartu -home.merge.desc=Elkartu zenbait PDF dokumentu bakar batean modu errazean -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Zatitu -home.split.desc=Zatitu PDFak zenbait dokumentutan -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Biratu -home.rotate.desc=Biratu PDFak modu errazean -rotate.tags=server side - - -home.imageToPdf.title=Irudia PDF bihurtu -home.imageToPdf.desc=Irudi bat(PNG, JPEG, GIF)PDF bihurtu -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDFa irudi bihurtu -home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Antolatzailea -home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Gehitu irudia PDFari -home.addImage.desc=Gehitu irudi bat PDFan ezarritako kokaleku batean (lanean) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Gehitu ur-marka -home.watermark.desc=Gehitu aurrez zehaztutako ur-marka bat PFD dokumentuari -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Aldatu baimenak -home.permissions.desc=Aldatu PDF dokumentuaren baimenak -permissions.tags=read,write,edit,print - - -home.removePages.title=Ezabatu -home.removePages.desc=Ezabatu nahi ez dituzun orrialdeak PDF dokumentutik -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Gehitu pasahitza -home.addPassword.desc=Enkriptatu PDF dokumentua pasahitz batekin -addPassword.tags=secure,security - -home.removePassword.title=Ezabatu pasahitza -home.removePassword.desc=Ezabatu pasahitza PDF dokumentutik -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Konprimatu -home.compressPdfs.desc=Konprimatu PDFak fitxategiaren tamaina murrizteko -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Aldatu metadatuak -home.changeMetadata.desc=Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Fitxategia PDF bihurtu -home.fileToPDF.desc=PDF bihurtu ia edozein fitxategi (DOCX, PNG, XLS, PPT, TXT eta gehiago) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak -home.ocr.desc=Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Atera irudiak -home.extractImages.desc=Atera irudi guztiak PDF batetik eta ZIPen gorde -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDFa PDF/A bihurtu -home.pdfToPDFA.desc=PDFa PDF/A bihurtu luzaro biltegiratzeko -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDFa Word Bihurtu -home.PDFToWord.desc=PDF formatuak Word bihurtu (DOC, DOCX y ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDFa aurkezpen bihurtu -home.PDFToPresentation.desc=PDFa aurkezpen formatu bihurtu (PPT, PPTX y ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDFa TXT edo RTF bihurtu -home.PDFToText.desc=PDFa TXT edo RTF formatu bihurtu -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDFa HTML bihurtu -home.PDFToHTML.desc=PDFa HTML formatu bihurtu -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDFa XML bihurtu -home.PDFToXML.desc=PDFa XML formatu bihurtu -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detektatu/Zatitu argazki eskaneatuak -home.ScannerImageSplit.desc=Hainbat argazki zatitu argazki/PDF baten barruan -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Sinatu -home.sign.desc=Gehitu sinadura PDFari marrazki, testu edo irudi bidez -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Lautu -home.flatten.desc=PDF batetik elementu eta inprimaki interaktibo guztiak ezabatu -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Konpondu -home.repair.desc=Saiatu PDF hondatu/kaltetu bat konpontzen -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Ezabatu orrialde zuriak -home.removeBlanks.desc=Detektatu orrialde zuriak eta dokumentutik ezabatu -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Konparatu -home.compare.desc=Konparatu eta erakutsi 2 PDF dokumenturen aldeak -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Sinatu ziurtagiriarekin -home.certSign.desc=Sinatu PDF bat Ziurtagiri/Gako batekin (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Zenbait orrialderen diseinua -home.pageLayout.desc=Elkartu orri bakar batean PDF dokumentu baten zenbait orrialde -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Eskalatu/Doitu orrialdearen tamaina -home.scalePages.desc=Eskalatu/Aldatu orrialde baten tamaina eta/edo edukia -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Hodia (Aurreratua) -home.pipeline.desc=Egin hainbat ekintza PDFn, hodi-script-ak definituz -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Gehitu orrialde-zenbakiak -home.add-page-numbers.desc=Gehitu orrialde-zenbakiak dokumentu batean, kokapen jakin batean -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Aldatu PDF fitxategiaren izena -home.auto-rename.desc=Automatikoki izena ematen dio detektatutako goiburuan oinarritutako PDF fitxategi bati -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Koloreak/kontrastea doitu -home.adjust-contrast.desc=PDF baten kontrastea, saturazioa eta distira doitzea -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Moztu PDF -home.crop.desc=Egin klik PDFn tamaina txikitzeko (textua mantentzen du!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Orriak automatikoki banandu -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Desinfektatu -home.sanitizePdf.desc=Ezabatu script-ak eta PDF fitxategietako beste elementu batzuk -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website PDF pdf bihurtu -home.URLToPDF.desc=Bihurtu edozein URL PDF fitxategian -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML PDF-ra -home.HTMLToPDF.desc=Bihurtu edozein HTML edo zip fitxategi PDFra -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown PDF-ra -home.MarkdownToPDF.desc=Bihurtu Markdown fitxategi guztiak PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Lortu informazio guztia PDF-tik -home.getPdfInfo.desc=Eskuratu PDF fitxategiko Informazio guztia -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Orria(k) atera -home.extractPage.desc=Aukeratutako orriak PDF fitxategitik atera -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF fitxategia, orrialde handi bakar batera -home.PdfToSinglePage.desc=PDF orri guztiak orri handi bakar batean konbinatzen ditu -PdfToSinglePage.tags=single page - - -home.showJS.title=Javascript erakutsi -home.showJS.desc=Bilatu eta erakutsi PDF batean injektatutako edozein JS -showJS.tags=JS - -home.autoRedact.title=Auto Idatzi -home.autoRedact.desc=Auto Idatzi testua pdf fitxategian sarrerako testuan oinarritua -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Saioa hasi -login.signin=Saioa hasi -login.rememberme=Oroitu nazazu -login.invalid=Okerreko erabiltzaile izena edo pasahitza. -login.locked=Zure kontua blokeatu egin da. -login.signinTitle=Mesedez, hasi saioa - - -#auto-redact -autoRedact.title=Auto Idatzi -autoRedact.header=Auto Idatzi -autoRedact.colorLabel=Kolorea -autoRedact.textsToRedactLabel=Idazteko testua (lerro bidez bereizia) -autoRedact.textsToRedactPlaceholder=adib. \nKonfidentziala \nTop-Secret -autoRedact.useRegexLabel=Regex erabili -autoRedact.wholeWordSearchLabel=Hitz osoen bilaketa -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Bihurtu PDF fitxategi bat PDF-Irudi-ra (kaxaren atzean testua ezabatzeko erabilia) -autoRedact.submitButton=Bidali - - -#showJS -showJS.title=Javascript erakutsi -showJS.header=Javascript erakutsi -showJS.downloadJS=Javascript deskargatu -showJS.submit=Erakutsi - - -#pdfToSinglePage -pdfToSinglePage.title=PDF Orrialde bakarrera -pdfToSinglePage.header=PDF Orrialde bakarrera -pdfToSinglePage.submit=Orrialde bakarrera bihurtu - - -#pageExtracter -pageExtracter.title=Atera orriak -pageExtracter.header=Atera orriak -pageExtracter.submit=Atera - - -#getPdfInfo -getPdfInfo.title=Lortu informazioa PDFn -getPdfInfo.header=Lortu informazioa PDFn -getPdfInfo.submit=Lortu informazioa -getPdfInfo.downloadJson=Deskargatu JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown PDFra -MarkdownToPDF.header=Markdown PDFra -MarkdownToPDF.submit=Bihurtu -MarkdownToPDF.help=Lanean -MarkdownToPDF.credit=WeasyPrint darabil - - - -#url-to-pdf -URLToPDF.title=URL bat PDF-ra -URLToPDF.header=URL bat PDF-ra -URLToPDF.submit=Bihurty -URLToPDF.credit=WeasyPrint darabil - - -#html-to-pdf -HTMLToPDF.title=HTML bat PDF-ra -HTMLToPDF.header=HTML bat PDF-ra -HTMLToPDF.help=Html/css/images etab dituen HTML eta Zip fitxategiak onartzen ditu -HTMLToPDF.submit=Bihurtu -HTMLToPDF.credit=WeasyPrint darabil - - -#sanitizePDF -sanitizePDF.title=PDF-a desinfektatu -sanitizePDF.header=PDF fitxategi bat desinfektatu -sanitizePDF.selectText.1=Ezabatu JavaScript akzioak -sanitizePDF.selectText.2=Ezabatu embedded fitxategiak -sanitizePDF.selectText.3=Ezabatu metadata -sanitizePDF.selectText.4=Ezabatu esketak -sanitizePDF.selectText.5=Ezabatu iturri letrak -sanitizePDF.submit=Desinfektatu PDF - - -#addPageNumbers -addPageNumbers.title=Gehitu orrialde-zenbakiak -addPageNumbers.header=Gehitu orrialde-zenbakiak -addPageNumbers.selectText.1=Aukeratu PDF fitxategia: -addPageNumbers.selectText.2=Marjinaren tamaina -addPageNumbers.selectText.3=Posizioa -addPageNumbers.selectText.4=Hasiera-zenbakia -addPageNumbers.selectText.5=Orrialde kopurua -addPageNumbers.selectText.6=Testu pertsonalizatua -addPageNumbers.customTextDesc=Testu pertsonalizatua -addPageNumbers.numberPagesDesc=Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu -addPageNumbers.customNumberDesc=Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du -addPageNumbers.submit=Gehitu orrialde-zenbakiak - - -#auto-rename -auto-rename.title=Aldatu izena -auto-rename.header=PDF Aldatu izena -auto-rename.submit=Aldatu izena - - -#adjustContrast -adjustContrast.title=Doitu kontrastea -adjustContrast.header=Doitu kontrastea -adjustContrast.contrast=Kontrastea: -adjustContrast.brightness=Distira: -adjustContrast.saturation=Asetasuna: -adjustContrast.download=Distira - - -#crop -crop.title=Moztu -crop.header=Irudia Moztu -crop.submit=Bidali - - -#autoSplitPDF -autoSplitPDF.title=Auto Zatitu PDFa -autoSplitPDF.header=Auto Zatitu PDFa -autoSplitPDF.description=Inprimatu, txertatu, eskaneatu, igo eta utzi guri automatikoki bereizten zure dokumentuak. Ez da laneko eskuzko hautaketarik behar. -autoSplitPDF.selectText.1=Inprimatu beheko zatitze-orri batzuk (beltza eta zuria ondo dago). -autoSplitPDF.selectText.2=Eskaneatu dokumentu guztiak batera, eta sartu banalerroa haien artean. -autoSplitPDF.selectText.3=Igo eskaneatutako PDF artxibo handia, eta utzi Stirling PDFri gainerakoak maneiatzen. -autoSplitPDF.selectText.4=Orrialde zatitzaileak automatikoki detektatu eta kentzen dira, eta azken dokumentu ordenatua bermatzen da. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)Duplex modua (aurreko eta atzeko azterketa) -autoSplitPDF.dividerDownload1=Deskargatu 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Deskargatu 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Bidali - - -#pipeline -pipeline.title=Hodia - - -#pageLayout -pageLayout.title=Hainbat orrialderen diseinua -pageLayout.header=Hainbat orrialderen diseinua -pageLayout.pagesPerSheet=Orrialdeak orriko: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Entregatu - - -#scalePages -scalePages.title=Doitu orrialdearen eskala -scalePages.header=Doitu orrialdearen eskala -scalePages.pageSize=Dokumentuaren orrialdearen tamaina -scalePages.scaleFactor=Orriaren zoom maila (moztea) -scalePages.submit=Entregatu - - -#certSign -certSign.title=Ziurtagiriaren sinadura -certSign.header=Sinatu PDF bat haren ziurtagiriarekin (lanean) -certSign.selectPDF=Hautatu PDF fitxategi bat sinatzeko: -certSign.selectKey=Hautatu gako pribatuko fitxategia (PKCS#8 formatua, .pem edo .der izan liteke): -certSign.selectCert=Hautatu ziurtagiridun fitxategia (X.509 formatua, .pem edo .der izan liteke): -certSign.selectP12=Hautatu gakoak gordetzeko fitxategia PKCS#12 (.p12 o .pfx) (Aukerakoa, ematen bada, gako pribatua eta ziurtagiria izan beharko ditu): -certSign.certType=Ziurtagiri-mota -certSign.password=Sartu zure gakoen biltegia edo gako pribatuko pasahitza (hala badagokio): -certSign.showSig=Erakutsi sinadura -certSign.reason=Arrazoia -certSign.location=Kokalekua -certSign.name=Izena -certSign.submit=Sinatu PDFa - - -#removeBlanks -removeBlanks.title=Ezabatu zuriuneak -removeBlanks.header=Ezabatu orrialde zuriak -removeBlanks.threshold=Gutxieneko balioa: -removeBlanks.thresholdDesc=Pixel bat zeinen zuri izan behar den ezartzeko gutxieneko balioa -removeBlanks.whitePercent=Zuriaren protzentajea (%): -removeBlanks.whitePercentDesc=Zuria izan behar den orriaren ehunekoa ezabatua izan dadin -removeBlanks.submit=Ezabatu zuriuneak - - -#compare -compare.title=Konparatu -compare.header=Konparatu PDF fitxategiak -compare.document.1=1. dokumentua -compare.document.2=2. dokumentua -compare.submit=Konparatu - - -#sign -sign.title=Sinatu -sign.header=Sinatu PDF fitxategiak -sign.upload=Igo irudia -sign.draw=Marraztu sinadura -sign.text=Testua sartzea -sign.clear=Garbitu -sign.add=Gehitu - - -#repair -repair.title=Konpondu -repair.header=Konpondu PDF fitxategiak -repair.submit=Konpondu - - -#flatten -flatten.title=Lautu -flatten.header=Akoplatu PDF fitxategiak -flatten.submit=Lautu - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Angeluaren gutxieneko balioa: -ScannerImageSplit.selectText.2=Ezarri eskatutako gutxieneko angelu absolutua irudia biratzeko (lehenetsia: 10). -ScannerImageSplit.selectText.3=Tolerantzia: -ScannerImageSplit.selectText.4=Ezarri kalkulatutako atzeko kolorearen inguruko kolorearen aldakuntza tartea (lehenetsia: 30). -ScannerImageSplit.selectText.5=Gutxieneko area: -ScannerImageSplit.selectText.6=Ezarri arearen gutxieneko balioa argazki batentzat (lehenetsia: 10000). -ScannerImageSplit.selectText.7=Inguruko area gutxienekoa: -ScannerImageSplit.selectText.8=Ezarri inguruko arearen gutxieneko balioa argazki batentzat -ScannerImageSplit.selectText.9=Ertzaren tamaina: -ScannerImageSplit.selectText.10=Ezarri gehitutako eta ezabatutako ertzaren tamaina irteeran ertz zuriak saihesteko (lehenetsia: 1). - - -#OCR -ocr.title=OCR / Garbiketa-eskaneatzea -ocr.header=Garbiketa-eskaneatzea / OCR (Karaktere-ezagutze optikoa) -ocr.selectText.1=Hautatu PDFan detektatuko diren hizkuntzak (zerrendatutakoak gaur egun detektatzen dituenak dira): -ocr.selectText.2=Sortu OCR testua duen testu-fitxategi bat OCR-ren bidez editatutako PDFarekin batera -ocr.selectText.3=Zuzendu angelu okertu batean eskaneatu ziren orrialdeak berriro beren lekura biratuta -ocr.selectText.4=Garbitu orrialdea OCRk hondoko zaratan testua aurkitzeko probabilitate txikiagoa izan dezan (Irteeran aldatu gabe) -ocr.selectText.5=Garbitu orrialdea OCRk hondoko zaratan testua aurkitzeko probabilitate txikiagoa izan dezan, irteeran garbi mantentzen du. -ocr.selectText.6=Alde batera utzi testu interaktiboa duten orrialdeak, bakarrik irudi diren OCR orrialdeak -ocr.selectText.7=OCR behartu, OCRk orrialde bakoitzean jatorrizko testu guztia ezabatuko du -ocr.selectText.8=Normala (Errorea gertatuko da PDFak testua baldin badu) -ocr.selectText.9=Ezarpen gehigarriak -ocr.selectText.10=OCR modua -ocr.selectText.11=Irudiak ezabatu OCR-ren ondoren (Irudi GUZTIAK ezabatzen ditu, bakarrik da erabilgarri bihurketa urratsaren parte baldin bada) -ocr.selectText.12=Prozesaketa-mota (aurreratua) -ocr.help=Irakurri honen erabilerari buruzko dokumentazioa beste hizkuntza batzuetarako eta/edo ez erabili Docker-en -ocr.credit=Zerbitzu honek OCRmyPDF eta OCR-rako Tesseract erabiltzen ditu -ocr.submit=PDF prozesatu OCR-rekin - - -#extractImages -extractImages.title=Atera irudiak -extractImages.header=Atera irudiak -extractImages.selectText=Hautatu irudi-formatua ateratako irudiak bihurtzeko -extractImages.submit=Atera - - -#File to PDF -fileToPDF.title=Fitxategia PDF bihurtu -fileToPDF.header=Edozein fitxategi PDF bihurtu -fileToPDF.credit=Zerbitzu honek LibreOffice eta Unoconv erabiltzen ditu fitxategiak bihurtzeko -fileToPDF.supportedFileTypes=Jasandako fitxategi-motek behekoak barne hartu behar dituzte; hala ere, jasandako formatuen zerrenda osoa eta eguneratua izateko, kontsultatu, mesedez, LibreOffice-en dokumentazioa -fileToPDF.submit=PDF bihurtu - - -#compress -compress.title=Konprimatu -compress.header=PDFa konprimatu -compress.credit=Zerbitzu honek Ghostscript erabiltzen du PDFak komprimatzeko/optimizatzeko -compress.selectText.1=Eskuz 1etik 4ra -compress.selectText.2=Optimizazio maila: -compress.selectText.3=4 (Izugarria testu-irudietarako) -compress.selectText.4=Automatikoa: automatikoki egokitzen du kalitatea PDFak tamaina doi-doia izan dezan -compress.selectText.5=PDFaren espero den tamaina (adibidez, 25 MB, 10.8 MB, 25 KB) -compress.submit=Konprimatu - - -#Add image -addImage.title=Gehitu irudia -addImage.header=Gehitu PDF-irudia -addImage.everyPage=Orrialde guztiak? -addImage.upload=Gehitu irudia -addImage.submit=Gehitu irudia - - -#merge -merge.title=Elkartu -merge.header=Elkartu zenbait PDF (2+) -merge.sortByName=Sort by nameOrdenatu izenaren arabera -merge.sortByDate=Ordenatu dataren arabera -merge.submit=Elkartu - - -#pdfOrganiser -pdfOrganiser.title=Orrialdeen antolatzailea -pdfOrganiser.header=PDF orrialdeen antolatzailea -pdfOrganiser.submit=Antolatu orrialdeak - - -#multiTool -multiTool.title=PDF erabilera anitzeko tresna -multiTool.header=PDF erabilera anitzeko tresna - - -#pageRemover -pageRemover.title=Orrialdeen ezabatzailea -pageRemover.header=PDF orrialdeen ezabatzailea -pageRemover.pagesToDelete=Ezabatu beharreko orrialdeak (sartu komaz bereizitako orrialde-zenbakien zerrenda): -pageRemover.submit=Ezabatu orrialdeak - - -#rotate -rotate.title=Biratu PDFa -rotate.header=Biratu PDFa -rotate.selectAngle=Hautatu errotazio-angelua (90 graduko multiploetan): -rotate.submit=Biratu - - -#merge -split.title=Zatitu PDFa -split.header=Zatitu PDFa -split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira -split.desc.2=Beraz, 1,3,7-8 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan -split.desc.3=#1 Dokumentua: 1. orrialdea -split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak -split.desc.5=#3 Dokumentua: 4., 5. eta 6. orrialdeak -split.desc.6=#4 Dokumentua: 7. orrialdea -split.desc.7=#5 Dokumentua: 8. orrialdea -split.desc.8=#6 Dokumentua: 9. eta 10. orrialdeak -split.splitPages=Sartu orrialdeak zatitzeko: -split.submit=Zatitu - - -#merge -imageToPDF.title=Irudia PDF bihurtu -imageToPDF.header=Irudia PDF bihurtu -imageToPDF.submit=Bihurtu -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=PDFaren errotazio automatikoa -imageToPDF.selectText.3=Fitxategi askoren logika (gaituta bakarrik zenbait irudirekin ari denean) -imageToPDF.selectText.4=Elkartu PDF bakar batean -imageToPDF.selectText.5=Bihurtu eta PDF bereizituak sortu - - -#pdfToImage -pdfToImage.title=PDFa irudi bihurtu -pdfToImage.header=PDFa irudi bihurtu -pdfToImage.selectText=Irudi-formatua -pdfToImage.singleOrMultiple=Ondoriozko irudi-mota -pdfToImage.single=Irudi handi bakarra -pdfToImage.multi=Zenbait irudi -pdfToImage.colorType=Kolore-mota -pdfToImage.color=Kolorea -pdfToImage.grey=Gris-eskala -pdfToImage.blackwhite=Zuria eta Beltza (Datuak galdu ditzake!) -pdfToImage.submit=Bihurtu - - -#addPassword -addPassword.title=Gehitu pasahitza -addPassword.header=Gehitu pasahitza (enkriptatu) -addPassword.selectText.1=Hautatu PDFa enkriptatzeko -addPassword.selectText.2=Pasahitza -addPassword.selectText.3=Gakoaren luzera -addPassword.selectText.4=Balio altuak sendoagoak dira, baina balio baxuek bateragarritasun hobea dute -addPassword.selectText.5=Ezartzeko baimenak -addPassword.selectText.6=Galarazi dokumentuaren mihiztaketa -addPassword.selectText.7=Galarazi edukia ateratzea -addPassword.selectText.8=Galarazi ateratzea irisgarritasunerako -addPassword.selectText.9=Galarazi inprimakia betetzea -addPassword.selectText.10=Galarazi aldaketak egitea -addPassword.selectText.11=Galarazi oharrak aldatzea -addPassword.selectText.12=Galarazi inprimatzea -addPassword.selectText.13=Galarazi zenbait formatu inprimatzea -addPassword.selectText.14=Pasahitza -addPassword.selectText.15=Mugatu zer egin daitekeen dokumentuarekin behin zabalduta (Irakurle guztiek onartu gabe) -addPassword.selectText.16=Mugatu dokumentu bera zabaltzeko aukera -addPassword.submit=Enkriptatu - - -#watermark -watermark.title=Gehitu ur-marka -watermark.header=Gehitu ur-marka -watermark.selectText.1=Hautatu PDFa ur-marka gehitzeko: -watermark.selectText.2=Ur-markaren testua: -watermark.selectText.3=Letra-tipoaren tamaina: -watermark.selectText.4=Errotazioa (0-360): -watermark.selectText.5=Zabalera (ur-marka bakoitzaren arteko espazioa horizontalean): -watermark.selectText.6=Altuera (ur-marka bakoitzaren arteko espazioa bertikalean): -watermark.selectText.7=Opakutasuna (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Gehitu ur-marka - - -#Change permissions -permissions.title=Aldatu baimenak -permissions.header=Aldatu baimenak -permissions.warning=Oharra: baimen hauek aldatzea ezinezkoa izan dadin, gomendatzen da pasahitz batekin konfiguratzea pasahitza aldatzeko orriaren bitartez -permissions.selectText.1=Hautatu PDFa baimenak aldatzeko -permissions.selectText.2=Baimenak, ezarri beharrekoak -permissions.selectText.3=Galarazi dokumentuaren mihiztaketa -permissions.selectText.4=Galarazi edukia ateratzea -permissions.selectText.5=Galarazi ateratzea irisgarritasunerako -permissions.selectText.6=Galarazi inprimakia betetzea -permissions.selectText.7=Galarazi aldaketak egitea -permissions.selectText.8=Galarazi oharrak aldatzea -permissions.selectText.9=Galarazi inprimatzea -permissions.selectText.10=Galarazi zenbait formatu inprimatzea -permissions.submit=Aldatu - - -#remove password -removePassword.title=Ezabatu pasahitza -removePassword.header=Ezabatu pasahitza (desenkriptatu) -removePassword.selectText.1=Hautatu PDFa desenkriptatzeko -removePassword.selectText.2=Pasahitza -removePassword.submit=Ezabatu - - -#changeMetadata -changeMetadata.title=Izenburua: -changeMetadata.header=Aldatu metadatuak -changeMetadata.selectText.1=Editatu aldatu nahi dituzun aldagaiak -changeMetadata.selectText.2=Ezabatu metadatu guztiak -changeMetadata.selectText.3=Erakutsi metadatu pertsonalizatuak: -changeMetadata.author=Egilea: -changeMetadata.creationDate=Sortze-data (aaaa/MM/dd HH:mm:ss): -changeMetadata.creator=Sortzailea: -changeMetadata.keywords=Gako-hitzak: -changeMetadata.modDate=Aldatze-data (aaaa/MM/dd HH:mm:ss): -changeMetadata.producer=Ekoizlea: -changeMetadata.subject=Gaia: -changeMetadata.title=Izenburua: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Beste metadatu batzuk: -changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera -changeMetadata.submit=Aldatu - - -#pdfToPDFA -pdfToPDFA.title=PDFa PDF/A bihurtu -pdfToPDFA.header=PDFa PDF/A bihurtu -pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko -pdfToPDFA.submit=Bihurtu - - -#PDFToWord -PDFToWord.title=PDFa Word bihurtu -PDFToWord.header=PDFa Word bihurtu -PDFToWord.selectText.1=Irteerako fitxategiaren formatua -PDFToWord.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko -PDFToWord.submit=Bihurtu - - -#PDFToPresentation -PDFToPresentation.title=PDFa aurkezpen bihurtu -PDFToPresentation.header=PDFa aurkezpen bihurtu -PDFToPresentation.selectText.1=Irteerako fitxategiaren formatua -PDFToPresentation.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko -PDFToPresentation.submit=Bihurtu - - -#PDFToText -PDFToText.title=PDFa TXT/RTF bihurtu -PDFToText.header=PDFa TXT/RTF bihurtu -PDFToText.selectText.1=Irteerako fitxategiaren formatua -PDFToText.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko -PDFToText.submit=Bihurtu - - -#PDFToHTML -PDFToHTML.title=PDFa HTML bihurtu -PDFToHTML.header=PDFa HTML bihurtu -PDFToHTML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko -PDFToHTML.submit=Bihurtu - - -#PDFToXML -PDFToXML.title=PDFa XML bihurtu -PDFToXML.header=PDFa XML bihurtu -PDFToXML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko -PDFToXML.submit=Bihurtu diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties deleted file mode 100644 index b1e5f222..00000000 --- a/src/main/resources/messages_fr_FR.properties +++ /dev/null @@ -1,817 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr = left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Sélectionnez le(s) PDF -multiPdfPrompt=Sélectionnez les PDF -multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin -imgPrompt=Choisir une image -genericSubmit=Envoyer -processTimeWarning=Attention, ce processus peut prendre jusqu\u2019à une minute en fonction de la taille du fichier. -pageOrderPrompt=Ordre des pages (entrez une liste de numéros de page séparés par des virgules ou des fonctions telles que 2n+1)\u00a0: -goToPage=Aller -true=Vrai -false=Faux -unknown=Inconnu -save=Enregistrer -close=Fermer -filesSelected=fichiers sélectionnés -noFavourites=Aucun favori ajouté -bored=Ennuyé d\u2019attendre\u00a0? -alphabet=Alphabet -downloadPdf=Télécharger le PDF -text=Texte -font=Police -selectFillter=-- Sélectionnez -- -pageNum=numéro de page -sizes.small=Petit -sizes.medium=Moyen -sizes.large=Grand -sizes.x-large=Très grand -error.pdfPassword=Le document PDF est protégé par un mot de passe et le mot de passe n\u2019a pas été fourni ou était incorrect -delete=Supprimer -username=Nom d\u2019utilisateur -password=Mot de passe -welcome=Bienvenue -property=Propriété -black=Noir -white=Blanc -red=Rouge -green=Vert -blue=Bleu -custom=Personnalisé\u2026 - -changedCredsMessage=Les identifiants ont été mis à jour\u00a0! -notAuthenticatedMessage=Utilisateur non authentifié. -userNotFoundMessage=Utilisateur non trouvé. -incorrectPasswordMessage=Le mot de passe actuel est incorrect. -usernameExistsMessage=Le nouveau nom d\u2019utilisateur existe déjà. - - - -############# -# NAVBAR # -############# -navbar.convert=Convertir -navbar.security=Sécurité -navbar.other=Autre -navbar.darkmode=Mode sombre -navbar.pageOps=Opérations sur les pages -navbar.settings=Paramètres - -############# -# SETTINGS # -############# -settings.title=Paramètres -settings.update=Mise à jour disponible -settings.appVersion=Version de l\u2019application\u00a0: -settings.downloadOption.title=Choisissez l\u2019option de téléchargement (pour les téléchargements à fichier unique non ZIP)\u00a0: -settings.downloadOption.1=Ouvrir dans la même fenêtre -settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre -settings.downloadOption.3=Télécharger le fichier -settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse -settings.signOut=Déconnexion -settings.accountSettings=Paramètres du compte - - - -changeCreds.title=Modifiez vos identifiants -changeCreds.header=Mettez à jour vos identifiants de connexion -changeCreds.changeUserAndPassword=Vous utilisez les identifiants de connexion par défaut. Veuillez entrer un nouveau mot de passe (et nom d\u2019utilisateur si vous le souhaitez) -changeCreds.newUsername=Nouveau nom d\u2019utilisateur -changeCreds.oldPassword=Mot de passe actuel -changeCreds.newPassword=Nouveau mot de passe -changeCreds.confirmNewPassword=Confirmer le nouveau mot de passe -changeCreds.submit=Soumettre les modifications - - - -account.title=Paramètres du compte -account.accountSettings=Paramètres du compte -account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs -account.userControlSettings=Contrôle des paramètres des utilisateurs -account.changeUsername=Modifier le nom d\u2019utilisateur -account.changeUsername=Modifier le nom d\u2019utilisateur -account.password=Mot de passe de confirmation -account.oldPassword=Ancien mot de passe -account.newPassword=Nouveau mot de passe -account.changePassword=Modifier le mot de passe -account.confirmNewPassword=Confirmer votre nouveau mot de passe -account.signOut=Déconnexion -account.yourApiKey=Votre clé API -account.syncTitle=Synchroniser les paramètres du navigateur avec le compte -account.settingsCompare=Comparaison des paramètres -account.property=Propriété -account.webBrowserSettings=Paramètres du navigateur -account.syncToBrowser=Synchroniser\u00a0: Compte → Navigateur -account.syncToAccount=Synchroniser\u00a0: Compte ← Navigateur - - -adminUserSettings.title=Administration des paramètres des utilisateurs -adminUserSettings.header=Administration des paramètres des utilisateurs -adminUserSettings.admin=Administateur -adminUserSettings.user=Utilisateur -adminUserSettings.addUser=Ajouter un utilisateur -adminUserSettings.roles=Rôles -adminUserSettings.role=Rôle -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Utilisateur API limité -adminUserSettings.webOnlyUser=Utilisateur Web uniquement -adminUserSettings.forceChange=Forcer l\u2019utilisateur à changer son nom d\u2019utilisateur/mot de passe lors de la connexion -adminUserSettings.submit=Ajouter - -############# -# HOME-PAGE # -############# -home.desc=Votre application Web hébergée localement pour répondre à tous vos besoins PDF. - - -home.multiTool.title=Outil multifonction PDF -home.multiTool.desc=Fusionnez, faites pivoter, réorganisez et supprimez des pages. -multiTool.tags=outil multifonction,opération multifonction,interface utilisateur,glisser déposer,front-end,client side,interactif,intransigeant,déplacer,multi tool - -home.merge.title=Fusionner -home.merge.desc=Fusionnez facilement plusieurs PDF en un seul. -merge.tags=fusionner,opérations sur les pages,backeend,server side,merge - -home.split.title=Diviser -home.split.desc=Divisez un PDF en plusieurs documents. -split.tags=opérations sur les pages,diviser,plusieurs pages,cut,server side,divide - -home.rotate.title=Pivoter -home.rotate.desc=Faites pivoter facilement vos PDF. -rotate.tags=pivoter,server side,rotate - - -home.imageToPdf.title=Image en PDF -home.imageToPdf.desc=Convertissez une image (PNG, JPEG, GIF) en PDF. -imageToPdf.tags=pdf,conversion,img,jpg,image,photo - -home.pdfToImage.title=PDF en image -home.pdfToImage.desc=Convertissez un PDF en image (PNG, JPEG, GIF). -pdfToImage.tags=conversion,img,jpg,image,photo - -home.pdfOrganiser.title=Organiser -home.pdfOrganiser.desc=Supprimez ou réorganisez les pages dans n\u2019importe quel ordre. -pdfOrganiser.tags=organiser,recto-verso,duplex,even,odd,sort,move - - -home.addImage.title=Ajouter une image -home.addImage.desc=Ajoutez une image à un emplacement défini sur un PDF. -addImage.tags=img,jpg,image,photo - -home.watermark.title=Ajouter un filigrane -home.watermark.desc=Ajoutez un filigrane personnalisé à votre PDF. -watermark.tags=texte,filigrane,label,propriété,droit d\u2019auteur,marque déposée,img,jpg,image,photo,copyright,trademark - -home.permissions.title=Modifier les permissions -home.permissions.desc=Modifiez les permissions de votre PDF. -permissions.tags=permissions,lire,écrire,modifier,imprimer,read,write,edit,print - - -home.removePages.title=Supprimer -home.removePages.desc=Supprimez les pages inutiles de votre PDF. -removePages.tags=supprimer,remove,delete - -home.addPassword.title=Ajouter un mot de passe -home.addPassword.desc=Chiffrez votre PDF avec un mot de passe. -addPassword.tags=ajouter,sécurité,mot de passe,secure,security - -home.removePassword.title=Supprimer le mot de passe -home.removePassword.desc=Supprimez la protection par mot de passe de votre PDF. -removePassword.tags=supprimer,sécurité,mot de passe,secure,decrypt,security,unpassword,delete password - -home.compressPdfs.title=Compresser -home.compressPdfs.desc=Compressez les PDF pour réduire leur tailles. -compressPdfs.tags=compresser,réduire,taille,squish,small,tiny - - -home.changeMetadata.title=Modifier les métadonnées -home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un PDF. -changeMetadata.tags=métadonnées,titre,auteur,date,création,heure,éditeur,statistiques,title,author,date,creation,time,publisher,producer,stats,metadata - -home.fileToPDF.title=Fichier en PDF -home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichiers en PDF (DOCX, PNG, XLS, PPT, TXT et plus). -fileToPDF.tags=convertion,transformation,format,document,image,slide,texte,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Nettoyage des numérisations -home.ocr.desc=Utilisez l\u2019OCR pour analyser et détecter le texte des images d\u2019un PDF et le rajouter en temps que tel. -ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable - - -home.extractImages.title=Extraire les images -home.extractImages.desc=Extrayez toutes les images d\u2019un PDF et enregistrez-les dans un ZIP. -extractImages.tags=image,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF en PDF/A -home.pdfToPDFA.desc=Convertir un PDF en PDF/A pour un stockage à long terme. -pdfToPDFA.tags=convertion,archive,long-term,standard,conversion,storage,préservation,preservation - -home.PDFToWord.title=PDF en Word -home.PDFToWord.desc=Convertissez un PDF en Word (DOC, DOCX et ODT). -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF en formats de présentation -home.PDFToPresentation.desc=Convertissez un PDF en format de présentation (PPT, PPTX et ODP). -PDFToPresentation.tags=présentation,slides,show,office,microsoft - -home.PDFToText.title=PDF en RTF (texte) -home.PDFToText.desc=Convertissez un PDF au format RTF (texte). -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF en HTML -home.PDFToHTML.desc=Convertissez un PDF au format HTML. -PDFToHTML.tags=html,web content,browser friendly - - -home.PDFToXML.title=PDF en XML -home.PDFToXML.desc=Convertissez un PDF au format XML. -PDFToXML.tags=xml,extraction de données,contenu structuré,interopérabilité,data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Diviser les photos numérisées -home.ScannerImageSplit.desc=Divisez plusieurs photos à partir d\u2019une photo ou d\u2019un PDF. -ScannerImageSplit.tags=diviser,détecter automatiquement,numériser,separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Signer -home.sign.desc=Ajoutez une signature au PDF avec un dessin, du texte ou une image. -sign.tags=signer,authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Rendre inerte -home.flatten.desc=Supprimez tous les éléments et formulaires interactifs d\u2019un PDF. -flatten.tags=inerte,static,deactivate,non-interactive,streamline - -home.repair.title=Réparer -home.repair.desc=Essayez de réparer un PDF corrompu ou cassé. -repair.tags=réparer,restaurer,corriger,récupérer,fix,restore,correction,recover - -home.removeBlanks.title=Supprimer les pages vierges -home.removeBlanks.desc=Détectez et supprimez les pages vierges d\u2019un PDF. -removeBlanks.tags=pages vierges,supprimer,nettoyer,cleanup,streamline,non-content,organize - -home.compare.title=Comparer -home.compare.desc=Comparez et visualisez les différences entre deux PDF. -compare.tags=comparer,analyser,differentiate,contrast,changes,analysis - -home.certSign.title=Signer avec un certificat -home.certSign.desc=Signez un PDF avec un certificat ou une clé (PEM/P12). -certSign.tags=signer,chiffrer,certificat,authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Fusionner des pages -home.pageLayout.desc=Fusionnez plusieurs pages d\u2019un PDF en une seule. -pageLayout.tags=fusionner,merge,composite,single-view,organize - -home.scalePages.title=Ajuster l\u2019échelle ou la taille -home.scalePages.desc=Modifiez la taille ou l\u2019échelle d\u2019une page et/ou de son contenu. -scalePages.tags=ajuster,redimensionner,resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (avancé) -home.pipeline.desc=Exécutez plusieurs actions sur les PDF en définissant des scripts de pipeline. -pipeline.tags=automatiser,séquencer,automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Ajouter des numéros de page -home.add-page-numbers.desc=Ajoutez des numéros de page dans un PDF à un emplacement défini. -add-page-numbers.tags=paginer,numéros,étiqueter,paginate,label,organize,index - -home.auto-rename.title=Renommer automatiquement -home.auto-rename.desc=Renommez automatiquement un fichier PDF en fonction de son en-tête détecté. -auto-rename.tags=renommer,détection automatique,réétiqueter,auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Ajuster les couleurs -home.adjust-contrast.desc=Ajustez le contraste, la saturation et la luminosité d\u2019un PDF. -adjust-contrast.tags=ajuster,couleurs,amélioration,color-correction,tune,modify,enhance - -home.crop.title=Redimensionner -home.crop.desc=Redimmensionnez un PDF pour réduire sa taille (en conservant le texte\u00a0!). -crop.tags=redimensionner,trim,shrink,edit,shape - -home.autoSplitPDF.title=Séparer automatiquement les pages -home.autoSplitPDF.desc=Séparez automatiquement le PDF numérisé avec le code QR du diviseur de page numérisé. -autoSplitPDF.tags=séparer,QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Assainir -home.sanitizePdf.desc=Supprimez les scripts et autres éléments des PDF. -sanitizePdf.tags=assainir,sécurisé,clean,secure,safe,remove-threats - -home.URLToPDF.title=URL en PDF -home.URLToPDF.desc=Convertissez n\u2019importe quelle URL http(s) en PDF. -URLToPDF.tags=pdf,contenu Web,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML en PDF -home.HTMLToPDF.desc=Convertissez n\u2019importe quel fichier HTML ou ZIP en PDF. -HTMLToPDF.tags=html,markup,contenu Web,transformation,convert - - -home.MarkdownToPDF.title=Markdown en PDF -home.MarkdownToPDF.desc=Convertissez n\u2019importe quel fichier Markdown en PDF. -MarkdownToPDF.tags=markdown,markup,contenu Web,transformation,convert - - -home.getPdfInfo.title=Récupérer les informations -home.getPdfInfo.desc=Récupérez toutes les informations possibles sur un PDF. -getPdfInfo.tags=récupérer,infomation,data,stats,statistics - - -home.extractPage.title=Extraire des pages -home.extractPage.desc=Extrayez certaines pages du PDF. -extractPage.tags=extraire,extract - - -home.PdfToSinglePage.title=Fusionner en une seule page -home.PdfToSinglePage.desc=Fusionnez toutes les pages PDF en une seule grande page. -PdfToSinglePage.tags=fusionner,merge,une seule page,single page - - -home.showJS.title=Afficher le JavaScript -home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. -showJS.tags=caviarder,redact,auto - -home.autoRedact.title=Caviarder automatiquement -home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF. -showJS.tags=caviarder,redact,auto - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Connexion -login.signin=Connexion -login.rememberme=Se souvenir de moi -login.invalid=Nom d\u2019utilisateur ou mot de passe invalide. -login.locked=Votre compte a été verrouillé. -login.signinTitle=Veuillez vous connecter - - -#auto-redact -autoRedact.title=Caviarder automatiquement -autoRedact.header=Caviarder automatiquement -autoRedact.colorLabel=Couleur -autoRedact.textsToRedactLabel=Texte à caviarder (séparé par des lignes) -autoRedact.textsToRedactPlaceholder=ex. \nConfidentiel \nTop secret -autoRedact.useRegexLabel=Utiliser une Regex -autoRedact.wholeWordSearchLabel=Recherche de mots entiers -autoRedact.customPaddingLabel=Marge intérieure supplémentaire -autoRedact.convertPDFToImageLabel=Convertir un PDF en PDF-Image (utilisé pour supprimer le texte en arrière-plan) -autoRedact.submitButton=Caviarder - - -#showJS -showJS.title=Afficher le JavaScript -showJS.header=Afficher le JavaScript -showJS.downloadJS=Télécharger le JavaScript -showJS.submit=Afficher - - -#pdfToSinglePage -pdfToSinglePage.title=Fusionner des pages -pdfToSinglePage.header=Fusionner des pages -pdfToSinglePage.submit=Convertir en une seule page - - -#pageExtracter -pageExtracter.title=Extraire des pages -pageExtracter.header=Extraire des pages -pageExtracter.submit=Extraire - - -#getPdfInfo -getPdfInfo.title=Récupérer les informations -getPdfInfo.header=Récupérer les informations -getPdfInfo.submit=Récupérer les informations -getPdfInfo.downloadJson=Télécharger le JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown en PDF -MarkdownToPDF.header=Markdown en PDF -MarkdownToPDF.submit=Convertir -MarkdownToPDF.help=(Travail en cours). -MarkdownToPDF.credit=Utilise WeasyPrint. - - - -#url-to-pdf -URLToPDF.title=URL en PDF -URLToPDF.header=URL en PDF -URLToPDF.submit=Convertir -URLToPDF.credit=Utilise WeasyPrint. - - -#html-to-pdf -HTMLToPDF.title=HTML en PDF -HTMLToPDF.header=HTML en PDF -HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis). -HTMLToPDF.submit=Convertir -HTMLToPDF.credit=Utilise WeasyPrint. - - -#sanitizePDF -sanitizePDF.title=Assainir -sanitizePDF.header=Assainir -sanitizePDF.selectText.1=Supprimer les actions JavaScript -sanitizePDF.selectText.2=Supprimer les fichiers intégrés -sanitizePDF.selectText.3=Supprimer les métadonnées -sanitizePDF.selectText.4=Supprimer les liens -sanitizePDF.selectText.5=Supprimer les polices -sanitizePDF.submit=Assainir - - -#addPageNumbers -addPageNumbers.title=Ajouter des numéros de page -addPageNumbers.header=Ajouter des numéros de page -addPageNumbers.selectText.1=Sélectionnez le fichier PDF -addPageNumbers.selectText.2=Taille de la marge -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Numéro de départ -addPageNumbers.selectText.5=Pages à numéroter -addPageNumbers.selectText.6=Texte personnalisé -addPageNumbers.customTextDesc=Texte personnalisé -addPageNumbers.numberPagesDesc=Quelles pages numéroter, par défaut 'all' (toutes les pages), accepte également 1-5 ou 2,5,9, etc. -addPageNumbers.customNumberDesc=La valeur par défaut est '{n}', accepte également 'Page {n} sur {total}', 'Texte-{n}', '{filename}-{n} -addPageNumbers.submit=Ajouter les numéros de page - - -#auto-rename -auto-rename.title=Renommer automatiquement -auto-rename.header=Renommer automatiquement -auto-rename.submit=Renommer automatiquement - - -#adjustContrast -adjustContrast.title=Ajuster les couleurs -adjustContrast.header=Ajuster les couleurs -adjustContrast.contrast=Contraste -adjustContrast.brightness=Luminosité -adjustContrast.saturation=Saturation -adjustContrast.download=Télécharger - - -#crop -crop.title=Redimensionner -crop.header=Redimensionner -crop.submit=Envoyer - - -#autoSplitPDF -autoSplitPDF.title=Séparer automatiquement les pages -autoSplitPDF.header=Séparer automatiquement les pages -autoSplitPDF.description=Imprimez, insérez, numérisez, téléchargez et laissez-nous séparer automatiquement vos documents. Aucun travail de tri manuel nécessaire. -autoSplitPDF.selectText.1=Imprimez des feuilles de séparation ci-dessous (le mode noir et blanc convient). -autoSplitPDF.selectText.2=Numérisez tous vos documents en une seule fois en insérant les feuilles intercalaires entre eux. -autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Stirling PDF s\u2019occuper du reste. -autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné. -autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF\u00a0: -autoSplitPDF.duplexMode=Mode recto-verso -autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf -autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf -autoSplitPDF.submit=Séparer - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Fusionner des pages -pageLayout.header=Fusionner des pages -pageLayout.pagesPerSheet=Pages par feuille -pageLayout.addBorder=Ajouter des bordures -pageLayout.submit=Fusionner - - -#scalePages -scalePages.title=Ajuster la taille ou l\u2019échelle -scalePages.header=Ajuster la taille ou l\u2019échelle -scalePages.pageSize=Taille d\u2019une page du document -scalePages.scaleFactor=Niveau de zoom (recadrage) d\u2019une page -scalePages.submit=Ajuster - - -#certSign -certSign.title=Signer avec un certificat -certSign.header=Signer avec un certificat (Travail en cours) -certSign.selectPDF=PDF à signer -certSign.selectKey=Fichier de clé privée (format PKCS#8, peut être .pem ou .der) -certSign.selectCert=Fichier de certificat (format X.509, peut être .pem ou .der) -certSign.selectP12=Fichier keystore de clés PKCS#12 (.p12 ou .pfx) (facultatif, s\u2019il n\u2019est fourni, il doit contenir votre clé privée et votre certificat) -certSign.certType=Type de certificat -certSign.password=Mot de passe keystore ou clé privée le cas échéant -certSign.showSig=Afficher la signature -certSign.reason=Raison -certSign.location=Emplacement -certSign.name=Nom -certSign.submit=Signer - - -#removeBlanks -removeBlanks.title=Supprimer les pages vierges -removeBlanks.header=Supprimer les pages vierges -removeBlanks.threshold=Seuil de blancheur des pixels -removeBlanks.thresholdDesc=Seuil pour déterminer à quel point un pixel blanc doit être blanc pour être classé comme «\u00a0blanc\u00a0» (0 = noir, 255 = blanc pur). -removeBlanks.whitePercent=Pourcentage de blanc -removeBlanks.whitePercentDesc=Pourcentage de la page qui doit contenir des pixels « blancs » à supprimer. -removeBlanks.submit=Supprimer les pages vierges - - -#compare -compare.title=Comparer -compare.header=Comparer -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Comparer - - -#sign -sign.title=Signer -sign.header=Signer -sign.upload=Télécharger une image -sign.draw=Dessiner une signature -sign.text=Saisir de texte -sign.clear=Effacer -sign.add=Ajouter - - -#repair -repair.title=Réparer -repair.header=Réparer -repair.submit=Réparer - - -#flatten -flatten.title=Rendre inerte -flatten.header=Rendre inerte -flatten.submit=Rendre inerte - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Seuil de rotation -ScannerImageSplit.selectText.2=Définit l\u2019angle absolu minimum requis pour la rotation de l\u2019image (par défaut\u00a0: 10). -ScannerImageSplit.selectText.3=Tolérance -ScannerImageSplit.selectText.4=Détermine la plage de variation de couleur autour de la couleur d\u2019arrière-plan estimée (par défaut\u00a0: 20). -ScannerImageSplit.selectText.5=Surface minimale -ScannerImageSplit.selectText.6=Définit la surface minimale pour une photo (par défaut\u00a0: 8\u202f000). -ScannerImageSplit.selectText.7=Surface de contour minimale -ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une photo (par défaut\u00a0: 500). -ScannerImageSplit.selectText.9=Taille de la bordure -ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut\u00a0: 1). - - -#OCR -ocr.title=OCR / Nettoyage des numérisations -ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisations -ocr.selectText.1=Langues à détecter dans le PDF (celles listées sont celles actuellement détectées) -ocr.selectText.2=Produire un fichier texte contenant le texte détecté à côté du PDF -ocr.selectText.3=Corriger les pages qui ont été numérisées à un angle oblique en les remettant en place -ocr.selectText.4=Nettoyer la page afin qu\u2019il soit moins probable que l\u2019OCR trouve du texte dans le bruit de fond, sans modifier la sortie -ocr.selectText.5=Nettoyer la page afin qu\u2019il soit moins probable que l\u2019OCR trouve du texte dans le bruit de fond, en modifiant la sortie -ocr.selectText.6=Ignorer les pages contenant du texte interactif, n\u2019analyser que les pages qui sont des images -ocr.selectText.7=Forcer l\u2019OCR, analyser chaque page et supprimer tous les éléments de texte d\u2019origine -ocr.selectText.8=Normal (génère une erreur si le PDF contient du texte) -ocr.selectText.9=Paramètres additionnels -ocr.selectText.10=Mode OCR -ocr.selectText.11=Supprimer les images après l\u2019OCR (Supprime TOUTES les images, utile uniquement si elles font partie de l\u2019étape de conversion) -ocr.selectText.12=Type de rendu (avancé) -ocr.help=Veuillez lire cette documentation pour savoir comment utiliser l\u2019OCR pour d\u2019autres langues ou une utilisation hors Docker\u00a0: -ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l\u2019OCR. -ocr.submit=Traiter - - -#extractImages -extractImages.title=Extraire les images -extractImages.header=Extraire les images -extractImages.selectText=Format d\u2019image dans lequel convertir les images extraites -extractImages.submit=Extraire - - -#File to PDF -fileToPDF.title=Fichier en PDF -fileToPDF.header=Convertir un fichier en PDF -fileToPDF.credit=Ce service utilise LibreOffice et Unoconv pour la conversion de fichiers. -fileToPDF.supportedFileTypes=Les types de fichiers pris en charge doivent inclure les éléments ci-dessous, mais pour une liste complète et mise à jour des formats pris en charge, veuillez vous reporter à la documentation de LibreOffice. -fileToPDF.submit=Convertir - - -#compress -compress.title=Compresser -compress.header=Compresser -compress.credit=Ce service utilise Ghostscript pour la compression et l\u2019optimisation des PDF. -compress.selectText.1=Mode manuel \u2013 de 1 à 4 -compress.selectText.2=Niveau d\u2019optimisation -compress.selectText.3=4 (terrible pour les images textuelles) -compress.selectText.4=Mode automatique \u2013 ajuste automatiquement la qualité pour obtenir le PDF à la taille exacte -compress.selectText.5=Taille PDF attendue (par exemple, 25\u202fMo, 10,8\u202fMo, 25\u202fKo) -compress.submit=Compresser - - -#Add image -addImage.title=Ajouter une image -addImage.header=Ajouter une image -addImage.everyPage=Toutes les pages\u00a0? -addImage.upload=Télécharger une image -addImage.submit=Ajouter une image - - -#merge -merge.title=Fusionner -merge.header=Fusionner plusieurs PDF -merge.sortByName=Trier par nom -merge.sortByDate=Trier par date -merge.submit=Fusionner - - -#pdfOrganiser -pdfOrganiser.title=Organiser -pdfOrganiser.header=Organiser les pages -pdfOrganiser.submit=Organiser - - -#multiTool -multiTool.title=Outil multifonction PDF -multiTool.header=Outil multifonction PDF - - -#pageRemover -pageRemover.title=Supprimer des pages -pageRemover.header=Supprimer des pages -pageRemover.pagesToDelete=Pages à supprimer (entrez une liste de numéros de pages séparés par des virgules)\u00a0: -pageRemover.submit=Supprimer les pages - - -#rotate -rotate.title=Pivoter -rotate.header=Pivoter -rotate.selectAngle=Angle de rotation (par multiples de 90\u202fdegrés) -rotate.submit=Pivoter - - -#merge -split.title=Diviser -split.header=Diviser -split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division -split.desc.2=Ainsi, la sélection de 1,3,7-8 diviserait un document de 10 pages en 6 PDF distincts avec\u00a0: -split.desc.3=Document #1: Page 1 -split.desc.4=Document #2: Page 2 et 3 -split.desc.5=Document #3: Page 4, 5 et 6 -split.desc.6=Document #4: Page 7 -split.desc.7=Document #5: Page 8 -split.desc.8=Document #6: Page 9 et 10 -split.splitPages=Pages sur lesquelles diviser -split.submit=Diviser - - -#merge -imageToPDF.title=Image en PDF -imageToPDF.header=Image en PDF -imageToPDF.submit=Convertir -imageToPDF.selectLabel=Options d\u2019ajustement de l\u2019image -imageToPDF.fillPage=Remplir la page -imageToPDF.fitDocumentToImage=Ajuster la page à l\u2019image -imageToPDF.maintainAspectRatio=Maintenir les proportions -imageToPDF.selectText.2=Rotation automatique du PDF -imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images) -imageToPDF.selectText.4=Fusionner en un seul PDF -imageToPDF.selectText.5=Convertir en PDF séparés - - -#pdfToImage -pdfToImage.title=Image en PDF -pdfToImage.header=Image en PDF -pdfToImage.selectText=Format d\u2019image -pdfToImage.singleOrMultiple=Type de résultat -pdfToImage.single=Une seule grande image -pdfToImage.multi=Plusieurs images -pdfToImage.colorType=Type d\u2019impression -pdfToImage.color=Couleur -pdfToImage.grey=Niveaux de gris -pdfToImage.blackwhite=Noir et blanc (peut engendre une perde de données\u00a0!) -pdfToImage.submit=Convertir - - -#addPassword -addPassword.title=Ajouter un mot de passe -addPassword.header=Ajouter un mot de passe -addPassword.selectText.1=PDF à chiffrer -addPassword.selectText.2=Mot de passe de l\u2019utilisateur -addPassword.selectText.3=Longueur de la clé de chiffrement -addPassword.selectText.4=Les valeurs plus élevées sont plus fortes, mais les valeurs plus faibles ont une meilleure compatibilité. -addPassword.selectText.5=Autorisations à définir (utilisation recommandée avec le mot de passe du propriétaire) -addPassword.selectText.6=Empêcher l\u2019assemblage du document -addPassword.selectText.7=Empêcher l\u2019extraction de contenu -addPassword.selectText.8=Empêcher l\u2019extraction pour l\u2019accessibilité -addPassword.selectText.9=Empêcher de remplir les formulaires -addPassword.selectText.10=Empêcher la modification -addPassword.selectText.11=Empêcher la modification des annotations -addPassword.selectText.12=Empêcher l\u2019impression -addPassword.selectText.13=Empêcher l\u2019impression des différents formats -addPassword.selectText.14=Mot de passe du propriétaire -addPassword.selectText.15=Restreint ce qui peut être fait avec le document une fois qu\u2019il est ouvert (non pris en charge par tous les lecteurs). -addPassword.selectText.16=Restreint l\u2019ouverture du document lui-même. -addPassword.submit=Chiffrer - - -#watermark -watermark.title=Ajouter un filigrane -watermark.header=Ajouter un filigrane -watermark.selectText.1=PDF auquel ajouter un filigrane -watermark.selectText.2=Texte du filigrane -watermark.selectText.3=Taille de police -watermark.selectText.4=Rotation (de 0 à 360 degrés) -watermark.selectText.5=widthSpacer (espace entre chaque filigrane horizontalement) -watermark.selectText.6=heightSpacer (espace entre chaque filigrane verticalement) -watermark.selectText.7=Opacité (de 0% à 100%) -watermark.selectText.8=Type de filigrane -watermark.selectText.9=Image du filigrane -watermark.submit=Ajouter un filigrane - - -#Change permissions -permissions.title=Modifier les permissions -permissions.header=Modifier les permissions -permissions.warning=Attention, pour que ces permissions soient immuables il est recommandé de les paramétrer avec un mot de passe via la page Ajouter un mot de passe. -permissions.selectText.1=Sélectionnez le PDF -permissions.selectText.2=Permissions à définir -permissions.selectText.3=Empêcher l\u2019assemblage du document -permissions.selectText.4=Empêcher l\u2019extraction de contenu -permissions.selectText.5=Empêcher l\u2019extraction pour l\u2019accessibilité -permissions.selectText.6=Empêcher de remplir les formulaires -permissions.selectText.7=Empêcher la modification -permissions.selectText.8=Empêcher la modification des annotations -permissions.selectText.9=Empêcher l\u2019impression -permissions.selectText.10=Empêcher l\u2019impression des différents formats -permissions.submit=Modifier - - -#remove password -removePassword.title=Supprimer le mot de passe -removePassword.header=Supprimer le mot de passe -removePassword.selectText.1=Sélectionnez le PDF -removePassword.selectText.2=Mot de passe -removePassword.submit=Supprimer - - -#changeMetadata -changeMetadata.title=Titre -changeMetadata.header=Modifier les métadonnées -changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier. -changeMetadata.selectText.2=Supprimer toutes les métadonnées -changeMetadata.selectText.3=Afficher des métadonnées personnalisées -changeMetadata.author=Auteur -changeMetadata.creationDate=Date de création (yyyy/MM/dd HH:mm:ss) -changeMetadata.creator=Créateur -changeMetadata.keywords=Mots clés -changeMetadata.modDate=Date de modification (yyyy/MM/dd HH:mm:ss) -changeMetadata.producer=Producteur -changeMetadata.subject=Sujet -changeMetadata.title=Titre -changeMetadata.trapped=Défoncé (technique d’impression) -changeMetadata.selectText.4=Autres métadonnées -changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée -changeMetadata.submit=Modifier - - -#pdfToPDFA -pdfToPDFA.title=PDF en PDF/A -pdfToPDFA.header=PDF en PDF/A -pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. -pdfToPDFA.submit=Convertir - - -#PDFToWord -PDFToWord.title=PDF en Word -PDFToWord.header=PDF en Word -PDFToWord.selectText.1=Format du fichier de sortie -PDFToWord.credit=Ce service utilise LibreOffice pour la conversion de fichiers. -PDFToWord.submit=Convertir - - -#PDFToPresentation -PDFToPresentation.title=PDF en formats de présentation -PDFToPresentation.header=PDF en formats de présentation -PDFToPresentation.selectText.1=Format du fichier de sortie -PDFToPresentation.credit=Ce service utilise LibreOffice pour la conversion de fichiers. -PDFToPresentation.submit=Convertir - - -#PDFToText -PDFToText.title=PDF en RTF (texte) -PDFToText.header=PDF en RTF (texte) -PDFToText.selectText.1=Format du fichier de sortie -PDFToText.credit=Ce service utilise LibreOffice pour la conversion de fichiers. -PDFToText.submit=Convertir - - -#PDFToHTML -PDFToHTML.title=PDF en HTML -PDFToHTML.header=PDF en HTML -PDFToHTML.credit=Ce service utilise LibreOffice pour la conversion de fichiers. -PDFToHTML.submit=Convertir - - -#PDFToXML -PDFToXML.title=PDF en XML -PDFToXML.header=PDF en XML -PDFToXML.credit=Ce service utilise LibreOffice pour la conversion de fichiers. -PDFToXML.submit=Convertir diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties deleted file mode 100644 index 08a34c63..00000000 --- a/src/main/resources/messages_it_IT.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Scegli PDF -multiPdfPrompt=Scegli 2 o più PDF -multiPdfDropPrompt=Scegli (o trascina e rilascia) uno o più PDF -imgPrompt=Scegli immagine/i -genericSubmit=Invia -processTimeWarning=Nota: Questo processo potrebbe richiedere fino a un minuto in base alla dimensione dei file -pageOrderPrompt=Ordine delle pagine (inserisci una lista di numeri separati da virgola): -goToPage=Vai -true=Vero -false=Falso -unknown=Sconosciuto -save=Salva -close=Chiudi -filesSelected=file selezionati -noFavourites=Nessun preferito -bored=Stanco di aspettare? -alphabet=Alfabeto -downloadPdf=Scarica PDF -text=Testo -font=Font -selectFillter=-- Seleziona -- -pageNum=Numero pagina -sizes.small=Piccolo -sizes.medium=Medio -sizes.large=Largo -sizes.x-large=Extra-Large -error.pdfPassword=Il documento PDF è protetto da password e la password non è stata fornita oppure non era corretta -delete=Elimina -username=Username -password=Password -welcome=Benvenuto -property=Proprietà -black=Nero -white=Bianco -red=Rosso -green=Verde -blue=Blu -custom=Personalizzato - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Converti -navbar.security=Sicurezza -navbar.other=Altro -navbar.darkmode=Modalità Scura -navbar.pageOps=Modifica pagine -navbar.settings=Impostazioni - -############# -# SETTINGS # -############# -settings.title=Impostazioni -settings.update=Aggiornamento disponibile -settings.appVersion=Versione App: -settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi): -settings.downloadOption.1=Apri in questa finestra -settings.downloadOption.2=Apri in una nuova finestra -settings.downloadOption.3=Scarica file -settings.zipThreshold=Comprimi file in .zip quando il numero di download supera -settings.signOut=Logout -settings.accountSettings=Impostazioni Account - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Impostazioni Account -account.accountSettings=Impostazioni Account -account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti -account.userControlSettings=Impostazioni Utente -account.changeUsername=Cambia Username -account.changeUsername=Cambia Username -account.password=Conferma Password -account.oldPassword=Vecchia Password -account.newPassword=Nuova Password -account.changePassword=Cambia Password -account.confirmNewPassword=Conferma Nuova Password -account.signOut=Logout -account.yourApiKey=La tua API Key -account.syncTitle=Sincronizza le impostazioni del browser con l'account -account.settingsCompare=Confronto delle impostazioni: -account.property=Proprietà -account.webBrowserSettings=Impostazione del browser web -account.syncToBrowser=Sincronizza account -> Browser -account.syncToAccount=Sincronizza account <- Browser - - -adminUserSettings.title=Impostazioni di controllo utente -adminUserSettings.header=Impostazioni di controllo utente amministratore -adminUserSettings.admin=Amministratore -adminUserSettings.user=Utente -adminUserSettings.addUser=Aggiungi un nuovo Utente -adminUserSettings.roles=Ruoli -adminUserSettings.role=Ruolo -adminUserSettings.actions=Azioni -adminUserSettings.apiUser=Utente API limitato -adminUserSettings.webOnlyUser=Utente solo Web -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Salva utente - -############# -# HOME-PAGE # -############# -home.desc=La tua pagina self-hostata per gestire qualsiasi PDF. - - -home.multiTool.title=Multifunzione PDF -home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine -multiTool.tags=Strumento multiplo, operazione multipla, interfaccia utente, trascinamento clic, front-end, lato client - -home.merge.title=Unisci -home.merge.desc=Unisci facilmente più PDF in uno. -merge.tags=unione, operazioni sulla pagina, back end, lato server - -home.split.title=Dividi -home.split.desc=Dividi un singolo PDF in più documenti. -split.tags=Operazioni sulla pagina, divisione, multi pagina, taglio, lato server - -home.rotate.title=Ruota -home.rotate.desc=Ruota un PDF. -rotate.tags=lato server - - -home.imageToPdf.title=Da immagine a PDF -home.imageToPdf.desc=Converti un'immagine (PNG, JPEG, GIF) in PDF. -imageToPdf.tags=conversione,img,jpg,immagine,foto - -home.pdfToImage.title=Da PDF a immagine -home.pdfToImage.desc=Converti un PDF in un'immagine. (PNG, JPEG, GIF) -pdfToImage.tags=conversione,img,jpg,immagine,foto - -home.pdfOrganiser.title=Organizza -home.pdfOrganiser.desc=Rimuovi/Riordina le pagine in qualsiasi ordine. -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Aggiungi Immagine -home.addImage.desc=Aggiungi un'immagine in un punto specifico del PDF (Work in progress) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Aggiungi Filigrana -home.watermark.desc=Aggiungi una filigrana al tuo PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Cambia Permessi -home.permissions.desc=Cambia i permessi del tuo PDF. -permissions.tags=read,write,edit,print - - -home.removePages.title=Rimuovi -home.removePages.desc=Elimina alcune pagine dal PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Aggiungi Password -home.addPassword.desc=Crittografa il tuo PDF con una password. -addPassword.tags=secure,security - -home.removePassword.title=Rimuovi Password -home.removePassword.desc=Rimuovi la password dal tuo PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Comprimi -home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Modifica Proprietà -home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Converti file in PDF -home.fileToPDF.desc=Converti quasi ogni file in PDF (DOCX, PNG, XLS, PPT, TXT e altro) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Pulisci scansioni -home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Estrai immagini -home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip. -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=Converti in PDF/A -home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=Da PDF a Word -home.PDFToWord.desc=Converti un PDF nei formati Word (DOC, DOCX e ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=Da PDF a presentazioni -home.PDFToPresentation.desc=Converti un PDF in presentazioni (PPT, PPTX and ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=Da PDF a testo/RTF -home.PDFToText.desc=Converti un PDF in testo o RTF. -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=Da PDF ad HTML -home.PDFToHTML.desc=Converti un PDF in HTML. -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=Da PDF a XML -home.PDFToXML.desc=Converti un PDF in XML. -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Trova/Dividi foto scansionate -home.ScannerImageSplit.desc=Estrai più foto da una singola foto o PDF. -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Firma -home.sign.desc=Aggiungi una firma al PDF da disegno, testo o immagine. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Appiattisci -home.flatten.desc=Rimuovi tutti gli elementi interattivi e moduli da un PDF. -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Ripara -home.repair.desc=Prova a riparare un PDF corrotto. -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Rimuovi pagine vuote -home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF. -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Compara -home.compare.desc=Vedi e compara le differenze tra due PDF. -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Firma con certificato -home.certSign.desc=Firma un PDF con un certificato/chiave (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Layout multipagina -home.pageLayout.desc=Unisci più pagine di un documento PDF in un'unica pagina -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Regola le dimensioni/scala della pagina -home.scalePages.desc=Modificare le dimensioni/scala della pagina e/o dei suoi contenuti. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (avanzato) -home.pipeline.desc=Esegui più azioni sui PDF definendo script di pipeline -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Aggiungi numeri di pagina -home.add-page-numbers.desc=Aggiungi numeri di pagina in tutto un documento in una posizione prestabilita -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Rinomina automaticamente il file PDF -home.auto-rename.desc=Rinomina automaticamente un file PDF in base all'intestazione rilevata -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Regola colori/contrasto -home.adjust-contrast.desc=Regola contrasto, saturazione e luminosità di un PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Ritaglia PDF -home.crop.desc=Ritaglia un PDF per ridurne le dimensioni (mantiene il testo!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Pagine divise automaticamente -home.autoSplitPDF.desc=Dividi automaticamente il PDF scansionato con il codice QR dello divisore di pagina fisico scansionato -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Igienizzare -home.sanitizePdf.desc=Rimuovi script e altri elementi dai file PDF -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/sito Web in PDF -home.URLToPDF.desc=Converte qualsiasi URL http(s) in PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=Da HTML a PDF -home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown in PDF -home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Ottieni TUTTE le informazioni in PDF -home.getPdfInfo.desc=Raccogli tutte le informazioni possibili sui PDF -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Estrai pagina/e -home.extractPage.desc=Estrae le pagine selezionate dal PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF in un'unica pagina di grandi dimensioni -home.PdfToSinglePage.desc=Unisce tutte le pagine PDF in un'unica grande pagina -PdfToSinglePage.tags=single page - - -home.showJS.title=Mostra Javascript -home.showJS.desc=Cerca e visualizza qualsiasi JS inserito in un PDF -showJS.tags=JS - -home.autoRedact.title=Redazione automatica -home.autoRedact.desc=Redige automaticamente (oscura) il testo in un PDF in base al testo immesso -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Accedi -login.signin=Accedi -login.rememberme=Ricordami -login.invalid=Nome utente o password errati. -login.locked=Il tuo account è stato bloccato. -login.signinTitle=Per favore accedi - - -#auto-redact -autoRedact.title=Redazione automatica -autoRedact.header=Redazione automatica -autoRedact.colorLabel=Colore -autoRedact.textsToRedactLabel=Testo da oscurare (separato da righe) -autoRedact.textsToRedactPlaceholder=per esempio. \nConfidenziale \nTop-Secret -autoRedact.useRegexLabel=Usa Regex -autoRedact.wholeWordSearchLabel=Ricerca di parole intere -autoRedact.customPaddingLabel=Padding extra personalizzato -autoRedact.convertPDFToImageLabel=Converti PDF in immagine PDF (utilizzato per rimuovere il testo dietro la casella) -autoRedact.submitButton=Invia - - -#showJS -showJS.title=Mostra Javascript -showJS.header=Mostra Javascript -showJS.downloadJS=Scarica Javascript -showJS.submit=Mostra - - -#pdfToSinglePage -pdfToSinglePage.title=PDF a pagina singola -pdfToSinglePage.header=PDF a pagina singola -pdfToSinglePage.submit=Converti in pagina singola - - -#pageExtracter -pageExtracter.title=Estrai pagine -pageExtracter.header=Estrai pagine -pageExtracter.submit=Estrai - - -#getPdfInfo -getPdfInfo.title=Ottieni informazioni in PDF -getPdfInfo.header=Ottieni informazioni in PDF -getPdfInfo.submit=Ottieni informazioni -getPdfInfo.downloadJson=Scarica JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown in PDF -MarkdownToPDF.header=Markdown in PDF -MarkdownToPDF.submit=Converti -MarkdownToPDF.help=Conversione in corso -MarkdownToPDF.credit=Utilizza WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL a PDF -URLToPDF.header=URL a PDF -URLToPDF.submit=Converti -URLToPDF.credit=Utilizza WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML a PDF -HTMLToPDF.header=HTML a PDF -HTMLToPDF.help=Accetta file HTML e ZIP contenenti html/css/immagini ecc. richiesti -HTMLToPDF.submit=Converti -HTMLToPDF.credit=Utilizza WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Disinfetta PDF -sanitizePDF.header=Disinfettare un file PDF -sanitizePDF.selectText.1=Rimuovi le azioni JavaScript -sanitizePDF.selectText.2=Rimuovi i file incorporati -sanitizePDF.selectText.3=Rimuovi i metadati -sanitizePDF.selectText.4=Rimuovi collegamenti -sanitizePDF.selectText.5=Rimuovi i fonts -sanitizePDF.submit=Disinfetta PDF - - -#addPageNumbers -addPageNumbers.title=Aggiungi numeri di pagina -addPageNumbers.header=Aggiungi numeri di pagina -addPageNumbers.selectText.1=Seleziona il file PDF: -addPageNumbers.selectText.2=Dimensione margine -addPageNumbers.selectText.3=Posizione -addPageNumbers.selectText.4=Numero di partenza -addPageNumbers.selectText.5=Pagine da numerare -addPageNumbers.selectText.6=Testo personalizzato -addPageNumbers.customTextDesc=Testo personalizzato -addPageNumbers.numberPagesDesc=Quali pagine numerare, impostazione predefinita "tutte", accetta anche 1-5 o 2,5,9 ecc -addPageNumbers.customNumberDesc=Il valore predefinito è {n}, accetta anche 'Pagina {n} di {totale}', 'Testo-{n}', '{nomefile}-{n} -addPageNumbers.submit=Aggiungi numeri di pagina - - -#auto-rename -auto-rename.title=Rinomina automatica -auto-rename.header=Rinomina automatica PDF -auto-rename.submit=Rinomina automatica - - -#adjustContrast -adjustContrast.title=Regola il contrasto -adjustContrast.header=Regola il contrasto -adjustContrast.contrast=Contrasto: -adjustContrast.brightness=Luminosità: -adjustContrast.saturation=Saturazione: -adjustContrast.download=Download - - -#crop -crop.title=Ritaglia -crop.header=Ritaglia l'immagine -crop.submit=Invia - - -#autoSplitPDF -autoSplitPDF.title=PDF diviso automaticamente -autoSplitPDF.header=PDF diviso automaticamente -autoSplitPDF.description=Stampa, inserisci, scansiona, carica e lasciaci separare automaticamente i tuoi documenti. Non è necessario alcuno smistamento manuale. -autoSplitPDF.selectText.1=Stampa alcuni fogli divisori dal basso (il bianco e nero va bene). -autoSplitPDF.selectText.2=Scansiona tutti i tuoi documenti contemporaneamente inserendo il foglio divisorio tra di loro. -autoSplitPDF.selectText.3=Carica il singolo file PDF scansionato di grandi dimensioni e lascia che Stirling PDF gestisca il resto. -autoSplitPDF.selectText.4=Le pagine divisorie vengono rilevate e rimosse automaticamente, garantendo un documento finale ordinato. -autoSplitPDF.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF: -autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro) -autoSplitPDF.dividerDownload1=Scarica 'Divisore automatico (minimo).pdf' -autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf' -autoSplitPDF.submit=Invia - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Layout multipagina -pageLayout.header=Layout multipagina -pageLayout.pagesPerSheet=Pagine per foglio: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Invia - - -#scalePages -scalePages.title=Regola la scala della pagina -scalePages.header=Regola la scala della pagina -scalePages.pageSize=Dimensione di una pagina del documento. -scalePages.scaleFactor=Livello di zoom (ritaglio) di una pagina. -scalePages.submit=Invia - - -#certSign -certSign.title=Firma del certificato -certSign.header=Firma un PDF con il tuo certificato (Lavoro in corso) -certSign.selectPDF=Seleziona un file PDF per la firma: -certSign.selectKey=Seleziona il file della tua chiave privata (formato PKCS#8, potrebbe essere .pem o .der): -certSign.selectCert=Seleziona il tuo file di certificato (formato X.509, potrebbe essere .pem o .der): -certSign.selectP12=Selezionare il file keystore PKCS#12 (.p12 o .pfx) (facoltativo, se fornito, dovrebbe contenere la chiave privata e il certificato): -certSign.certType=Tipo di certificato -certSign.password=Inserisci la tua password dell'archivio chiavi o della chiave privata (se presente): -certSign.showSig=Mostra firma -certSign.reason=Motivo -certSign.location=Posizione -certSign.name=Nome -certSign.submit=Firma PDF - - -#removeBlanks -removeBlanks.title=Rimuovi spazi vuoti -removeBlanks.header=Rimuovi pagine vuote -removeBlanks.threshold=Soglia: -removeBlanks.thresholdDesc=Soglia che determina un pixel 'bianco' -removeBlanks.whitePercent=Percentuale di bianco (%): -removeBlanks.whitePercentDesc=Percentuale della pagina che deve essere bianca per venire rimossa -removeBlanks.submit=Rimuovi - - -#compare -compare.title=Compara -compare.header=Compara PDF -compare.document.1=Documento 1 -compare.document.2=Documento 2 -compare.submit=Compara - - -#sign -sign.title=Firma -sign.header=Firma PDF -sign.upload=Carica immagine -sign.draw=Disegna Firma -sign.text=Testo -sign.clear=Cancella -sign.add=Aggiungi - - -#repair -repair.title=Ripara -repair.header=Ripara PDF -repair.submit=Ripara - - -#flatten -flatten.title=Appiattisci -flatten.header=Appiattisci PDF -flatten.submit=Appiattisci - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Soglia angolo: -ScannerImageSplit.selectText.2=Imposta il minimo angolo richiesto perché l'immagine venga ruotata (default: 10). -ScannerImageSplit.selectText.3=Tolleranza: -ScannerImageSplit.selectText.4=Imposta lo spettro di colori attorno al colore di sfondo stimato (default: 30). -ScannerImageSplit.selectText.5=Area minima: -ScannerImageSplit.selectText.6=Imposta l'area minima di una foto (default: 10000). -ScannerImageSplit.selectText.7=Area di contorno minima: -ScannerImageSplit.selectText.8=Imposta l'area minima del contorno di una foto -ScannerImageSplit.selectText.9=Spessore bordo: -ScannerImageSplit.selectText.10=Imposta lo spessore del bordo aggiunto o rimosso per prevenire bordi bianchi nel risultato (default: 1). - - -#OCR -ocr.title=OCR / Pulisci scansioni -ocr.header=Pulisci scansioni / OCR (riconoscimento testo) -ocr.selectText.1=Scegli lingue da usare per il riconoscimento testo (L'elenco contiene quelle attualmente disponibili): -ocr.selectText.2=Crea file di testo contenente il testo estratto oltre al PDF originale -ocr.selectText.3=Sistema le pagine che sono state scansionate storte ruotandole in posizione corretta. -ocr.selectText.4=Pulisci il foglio in modo da evitare errori nella lettura. (non cambia il risultato) -ocr.selectText.5=Pulisci il foglio in modo da evitare errori nella lettura. (cambia il risultato) -ocr.selectText.6=Ignora pagine che contengono testo interattivo, scansiona solo pagine che contengono immagini -ocr.selectText.7=Forza scansione, scansiona ogni pagina rimuovendo gli elementi originali -ocr.selectText.8=Normale (Darà errore se il PDF contiene testo) -ocr.selectText.9=Impostazioni extra -ocr.selectText.10=Modalità OCR -ocr.selectText.11=Rimuovi immagini dopo la scansione (Rimuove TUTTE le immagini, utile solo come parte del processo di conversione) -ocr.selectText.12=Modalità di rendering (avanzato) -ocr.help=Per favore leggi la documentazione su come usare il programma per altri linguaggi e/o uso non in Docker -ocr.credit=Questo servizio utilizza OCRmyPDF e Tesseract per l'OCR. -ocr.submit=Scansiona testo nel PDF con OCR - - -#extractImages -extractImages.title=Estrai immagini -extractImages.header=Estrai immagini -extractImages.selectText=Seleziona il formato in cui salvare le immagini estratte -extractImages.submit=Estrai - - -#File to PDF -fileToPDF.title=Converti file in PDF -fileToPDF.header=Converti qualsiasi file in PDF -fileToPDF.credit=Questo servizio utilizza LibreOffice e Unoconv per la conversione dei file. -fileToPDF.supportedFileTypes=I formati file supportati dovrebbero includere quelli sottostanti. Tuttavia, per una lista aggiornata controlla la documentazione di LibreOffice -fileToPDF.submit=Converti in PDF - - -#compress -compress.title=Comprimi -compress.header=Comprimi PDF -compress.credit=Questo servizio utilizza Ghostscript per la compressione/ottimizzazione dei PDF. -compress.selectText.1=Modalità manuale - Da 1 a 4 -compress.selectText.2=Livello di ottimizzazione: -compress.selectText.3=4 (Terribile per le immagini di testo) -compress.selectText.4=Modalità automatica - Regola automaticamente la qualità per ottenere le dimensioni esatte del PDF -compress.selectText.5=Dimensioni PDF previste (ad es. 25 MB, 10,8 MB, 25 KB) -compress.submit=Comprimi - - -#Add image -addImage.title=Aggiungi Immagine -addImage.header=Aggiungi un'immagine ad un PDF -addImage.everyPage=Ogni pagina? -addImage.upload=Aggiungi immagine -addImage.submit=Aggiungi immagine - - -#merge -merge.title=Unisci -merge.header=Unisci 2 o più PDF -merge.sortByName=Ordina per nome -merge.sortByDate=Ordina per data -merge.submit=Unisci - - -#pdfOrganiser -pdfOrganiser.title=Organizza pagine -pdfOrganiser.header=Organizza le pagine di un PDF -pdfOrganiser.submit=Riordina pagine - - -#multiTool -multiTool.title=Multifunzione PDF -multiTool.header=Multifunzione PDF - - -#pageRemover -pageRemover.title=Rimuovi pagine -pageRemover.header=Rimuovi pagine da un PDF -pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola): -pageRemover.submit=Rimuovi pagine - - -#rotate -rotate.title=Ruota PDF -rotate.header=Ruota PDF -rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi): -rotate.submit=Ruota - - -#merge -split.title=Dividi PDF -split.header=Dividi PDF -split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento -split.desc.2=Per esempio inserendo 1,3,7-8 separeresti un documento di 10 pagine in 6 diversi PDF con: -split.desc.3=Documento #1: Pagina 1 -split.desc.4=Documento #2: Pagine 2 e 3 -split.desc.5=Documento #3: Pagine 4, 5 e 6 -split.desc.6=Documento #4: Pagina 7 -split.desc.7=Documento #5: Pagina 8 -split.desc.8=Documento #6: Pagine 9 e 10 -split.splitPages=Inserisci pagine a cui dividere: -split.submit=Dividi - - -#merge -imageToPDF.title=Immagine a PDF -imageToPDF.header=Immagine a PDF -imageToPDF.submit=Converti -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Ruota automaticamente PDF -imageToPDF.selectText.3=Logica multi-file (funziona solo se ci sono più immagini) -imageToPDF.selectText.4=Unisci in un unico PDF -imageToPDF.selectText.5=Converti in PDF separati - - -#pdfToImage -pdfToImage.title=PDF a immagine -pdfToImage.header=PDF a immagine -pdfToImage.selectText=Formato immagini -pdfToImage.singleOrMultiple=Tipo di immagine -pdfToImage.single=Unica immagine larga -pdfToImage.multi=Più immagini -pdfToImage.colorType=Tipo di colore -pdfToImage.color=A colori -pdfToImage.grey=Scala di grigi -pdfToImage.blackwhite=Bianco e Nero (potresti perdere dettagli!) -pdfToImage.submit=Converti - - -#addPassword -addPassword.title=Aggiungi Password -addPassword.header=Aggiungi password (crittografa) -addPassword.selectText.1=Seleziona PDF da crittografare -addPassword.selectText.2=Password -addPassword.selectText.3=Lunghezza chiave -addPassword.selectText.4=Valori più grandi sono più sicuri, ma valori più piccoli offrono una compatibilità maggiore. -addPassword.selectText.5=Permessi -addPassword.selectText.6=Previeni assemblaggio del documento -addPassword.selectText.7=Previeni estrazione del contenuto -addPassword.selectText.8=Previeni estrazione per accessibilità -addPassword.selectText.9=Previeni compilazione dei moduli -addPassword.selectText.10=Previeni modifiche -addPassword.selectText.11=Previeni annotazioni -addPassword.selectText.12=Previeni stampa -addPassword.selectText.13=Previeni stampa in diversi formati -addPassword.selectText.14=Password del proprietario -addPassword.selectText.15=Limita le operazioni eseguibili con il documento una volta aperto (non supportato da tutti i lettori) -addPassword.selectText.16=Limita l'apertura del documento stesso -addPassword.submit=Crittografa - - -#watermark -watermark.title=Aggiungi Filigrana -watermark.header=Aggiungi filigrana -watermark.selectText.1=Seleziona PDF a cui aggiungere la filigrana: -watermark.selectText.2=Testo: -watermark.selectText.3=Dimensione carattere: -watermark.selectText.4=Rotazione (0-360): -watermark.selectText.5=spazio orizzontale (tra ogni filigrana): -watermark.selectText.6=spazio verticale (tra ogni filigrana): -watermark.selectText.7=Opacità (0% - 100%): -watermark.selectText.8=Tipo di filigrana: -watermark.selectText.9=Immagine filigrana: -watermark.submit=Aggiungi Filigrana - - -#Change permissions -permissions.title=Cambia Permessi -permissions.header=Cambia permessi -permissions.warning=Attenzione: per avere questi permessi non modificabili è raccomandabile impostarli attraverso una password -permissions.selectText.1=Seleziona PDF a cui cambiare permessi -permissions.selectText.2=Permessi da impostare -permissions.selectText.3=Previeni assemblaggio del documento -permissions.selectText.4=Previeni estrazione del contenuto -permissions.selectText.5=Previeni estrazione per accessibilità -permissions.selectText.6=Previeni compilazione dei moduli -permissions.selectText.7=Previeni modifiche -permissions.selectText.8=Previeni annotazioni -permissions.selectText.9=Previeni stampa -permissions.selectText.10=Previeni stampa in diversi formati -permissions.submit=Cambia Permessi - - -#remove password -removePassword.title=Rimuovi Password -removePassword.header=Rimuovi password (de-crittografa) -removePassword.selectText.1=Seleziona PDF da decrittare -removePassword.selectText.2=Password -removePassword.submit=Rimuovi Password - - -#changeMetadata -changeMetadata.title=Titolo: -changeMetadata.header=Cambia Proprietà -changeMetadata.selectText.1=Imposta i dati che vuoi cambiare -changeMetadata.selectText.2=Cancella tutte le proprietà -changeMetadata.selectText.3=Visualizza proprietà custom: -changeMetadata.author=Autore: -changeMetadata.creationDate=Data di creazione (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Creatore: -changeMetadata.keywords=Parole chiave: -changeMetadata.modDate=Data di modifica (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Produttore: -changeMetadata.subject=Oggetto: -changeMetadata.title=Titolo: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Altre proprietà: -changeMetadata.selectText.5=Aggiungi proprietà personalizzata: -changeMetadata.submit=Cambia Proprietà - - -#pdfToPDFA -pdfToPDFA.title=Da PDF a PDF/A -pdfToPDFA.header=Da PDF a PDF/A -pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. -pdfToPDFA.submit=Converti - - -#PDFToWord -PDFToWord.title=Da PDF a Word -PDFToWord.header=Da PDF a Word -PDFToWord.selectText.1=Formato file di output -PDFToWord.credit=Questo servizio utilizza LibreOffice per la conversione. -PDFToWord.submit=Converti - - -#PDFToPresentation -PDFToPresentation.title=Da PDF a presentazione -PDFToPresentation.header=Da PDF a presentazione -PDFToPresentation.selectText.1=Formato file di output -PDFToPresentation.credit=Questo servizio utilizza LibreOffice per la conversione. -PDFToPresentation.submit=Converti - - -#PDFToText -PDFToText.title=Da PDF a testo/RTF -PDFToText.header=Da PDF a testo/RTF -PDFToText.selectText.1=Formato file di output -PDFToText.credit=Questo servizio utilizza LibreOffice per la conversione. -PDFToText.submit=Converti - - -#PDFToHTML -PDFToHTML.title=Da PDF a HTML -PDFToHTML.header=Da PDF a HTML -PDFToHTML.credit=Questo servizio utilizza LibreOffice per la conversione. -PDFToHTML.submit=Converti - - -#PDFToXML -PDFToXML.title=Da PDF a XML -PDFToXML.header=Da PDF a XML -PDFToXML.credit=Questo servizio utilizza LibreOffice per la conversione. -PDFToXML.submit=Converti diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties deleted file mode 100644 index 2251484f..00000000 --- a/src/main/resources/messages_ja_JP.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=PDFを選択 -multiPdfPrompt=PDFを選択 (2つ以上) -multiPdfDropPrompt=PDFを選択 (又はドラッグ&ドロップ) -imgPrompt=画像を選択 -genericSubmit=送信 -processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります -pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力): -goToPage=移動 -true=True -false=False -unknown=不明 -save=保存 -close=閉じる -filesSelected=選択されたファイル -noFavourites=お気に入りはありません -bored=待ち時間が退屈 -alphabet=\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8 -downloadPdf=PDFをダウンロード -text=テキスト -font=フォント -selectFillter=-- 選択 -- -pageNum=ページ番号 -sizes.small=小 -sizes.medium=中 -sizes.large=大 -sizes.x-large=特大 -error.pdfPassword=PDFにパスワードが設定されてますが、パスワードが入力されてないか間違ってます。 -delete=削除 -username=ユーザー名 -password=パスワード -welcome=ようこそ -property=プロパティ -black=黒 -white=白 -red=赤 -green=緑 -blue=青 -custom=カスタム... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=変換 -navbar.security=セキュリティ -navbar.other=その他 -navbar.darkmode=ダークモード -navbar.pageOps=ページ操作 -navbar.settings=設定 - -############# -# SETTINGS # -############# -settings.title=設定 -settings.update=利用可能なアップデート -settings.appVersion=Appバージョン: -settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル): -settings.downloadOption.1=同じウィンドウで開く -settings.downloadOption.2=新しいウィンドウで開く -settings.downloadOption.3=ファイルをダウンロード -settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する -settings.signOut=サインアウト -settings.accountSettings=アカウント設定 - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=アカウント設定 -account.accountSettings=アカウント設定 -account.adminSettings=管理者設定 - ユーザーの表示と追加 -account.userControlSettings=ユーザー制御設定 -account.changeUsername=ユーザー名を変更 -account.changeUsername=ユーザー名を変更 -account.password=確認用パスワード -account.oldPassword=旧パスワード -account.newPassword=新パスワード -account.changePassword=パスワードの変更 -account.confirmNewPassword=新パスワードの確認 -account.signOut=サインアウト -account.yourApiKey=あなたのAPIキー -account.syncTitle=ブラウザ設定をアカウントと同期する -account.settingsCompare=設定比較: -account.property=プロパティ -account.webBrowserSettings=Webブラウザ設定 -account.syncToBrowser=アカウントの同期 -> ブラウザ -account.syncToAccount=アカウントの同期 <- ブラウザ - - -adminUserSettings.title=ユーザー制御設定 -adminUserSettings.header=管理者ユーザー制御設定 -adminUserSettings.admin=管理者 -adminUserSettings.user=ユーザー -adminUserSettings.addUser=新しいユーザを追加 -adminUserSettings.roles=役割 -adminUserSettings.role=役割 -adminUserSettings.actions=アクション -adminUserSettings.apiUser=限定されたAPIユーザー -adminUserSettings.webOnlyUser=ウェブ専用ユーザー -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=ユーザーの保存 - -############# -# HOME-PAGE # -############# -home.desc=PDFのあらゆるニーズに対応するローカルホスティングされた総合窓口です。 - - -home.multiTool.title=PDFマルチツール -home.multiTool.desc=ページの結合、回転、並べ替え、削除します。 -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move - -home.merge.title=結合 -home.merge.desc=複数のPDFを1つに結合します。 -merge.tags=merge,Page operations,Back end,server side - -home.split.title=分割 -home.split.desc=PDFを複数のドキュメントに分割します。 -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=回転 -home.rotate.desc=PDFを回転します。 -rotate.tags=server side - - -home.imageToPdf.title=画像をPDFに変換 -home.imageToPdf.desc=画像 (PNG, JPEG, GIF) をPDFに変換します。 -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDFを画像に変換 -home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。 -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=整理 -home.pdfOrganiser.desc=ページの削除/並べ替えします。 -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=画像の追加 -home.addImage.desc=PDF上の任意の場所に画像を追加します。 -addImage.tags=img,jpg,picture,photo - -home.watermark.title=透かしの追加 -home.watermark.desc=PDFに独自の透かしを追加します。 -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=権限の変更 -home.permissions.desc=PDFの権限を変更します。 -permissions.tags=read,write,edit,print - - -home.removePages.title=削除 -home.removePages.desc=PDFから不要なページを削除します。 -removePages.tags=Remove pages,delete pages - -home.addPassword.title=パスワードの追加 -home.addPassword.desc=PDFをパスワードで暗号化します。 -addPassword.tags=secure,security - -home.removePassword.title=パスワードの削除 -home.removePassword.desc=PDFからパスワードの削除します。 -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=圧縮 -home.compressPdfs.desc=PDFを圧縮してファイルサイズを小さくします。 -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=メタデータの変更 -home.changeMetadata.desc=PDFのメタデータを変更/削除/追加します。 -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=ファイルをPDFに変換 -home.fileToPDF.desc=ほぼすべてのファイルをPDFに変換します。 (DOCX, PNG, XLS, PPT, TXTなど) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / クリーンアップ -home.ocr.desc=クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。 -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=画像の抽出 -home.extractImages.desc=PDFからすべての画像を抽出してzipで保存します。 -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDFをPDF/Aに変換 -home.pdfToPDFA.desc=長期保存のためにPDFをPDF/Aに変換。 -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDFをWordに変換 -home.PDFToWord.desc=PDFをWord形式に変換します。 (DOC, DOCX および ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDFをプレゼンテーションに変換 -home.PDFToPresentation.desc=PDFをプレゼンテーション形式に変換します。 (PPT, PPTX および ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDFをText/RTFに変換 -home.PDFToText.desc=PDFをTextまたはRTF形式に変換します。 -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDFをHTMLに変換 -home.PDFToHTML.desc=PDFをHTML形式に変換します。 -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDFをXMLに変換 -home.PDFToXML.desc=PDFをXML形式に変換します。 -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=スキャンされた画像の検出/分割 -home.ScannerImageSplit.desc=1枚の画像/PDFから複数の写真を分割します。 -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=署名 -home.sign.desc=手書き、テキストまたは画像によってPDFに署名を追加します。 -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=平坦化 -home.flatten.desc=PDFからインタラクティブな要素とフォームをすべて削除します。 -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=修復 -home.repair.desc=破損したPDFの修復を試みます。 -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=空白ページの削除 -home.removeBlanks.desc=ドキュメントから空白ページを検出して削除します。 -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=比較 -home.compare.desc=2つのPDFを比較して表示します。 -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=証明書による署名 -home.certSign.desc=証明書/キーを使用してPDFに署名します。 (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=マルチページレイアウト -home.pageLayout.desc=PDFの複数のページを1ページに結合します。 -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=ページの縮尺の調整 -home.scalePages.desc=ページやコンテンツの縮尺を変更します。 -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=パイプライン (高度) -home.pipeline.desc=パイプラインスクリプトを定義してPDF上で複数のアクションを実行します。 -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=ページ番号の追加 -home.add-page-numbers.desc=ドキュメント全体の設定された場所にページ番号を追加します。 -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=PDFファイル名の自動変更 -home.auto-rename.desc=検出されたヘッダーに基づいてPDFファイルの名前を自動的に変更します。 -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=色/コントラストの調整 -home.adjust-contrast.desc=PDFのコントラスト、彩度、明るさを調整します。 -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=PDFのトリミング -home.crop.desc=PDFをトリミングしてサイズを縮小します (テキストは維持します!)。 -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=ページの自動分割 -home.autoSplitPDF.desc=ページ分割用QRコードを使用したスキャンしたPDFを自動分割します。 -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=サニタイズ -home.sanitizePdf.desc=PDFファイルからスクリプトやその他の要素を削除します。 -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/WebサイトをPDFに変換 -home.URLToPDF.desc=あらゆるhttp(s)URLをPDFに変換します。 -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTMLをPDFに変換 -home.HTMLToPDF.desc=HTMLファイルまたはzipをPDFに変換します。 -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=MarkdownをPDFに変換 -home.MarkdownToPDF.desc=あらゆるMarkdownファイルをPDFに変換します。 -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=PDFのすべての情報を入手 -home.getPdfInfo.desc=PDFのあらゆる情報を取得します。 -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=ページの抽出 -home.extractPage.desc=PDFから選択したページを抽出します。 -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDFを単一の大きなページに変換 -home.PdfToSinglePage.desc=PDFのすべてのページを1つの大きな単一ページに結合します -PdfToSinglePage.tags=single page - - -home.showJS.title=JavaScriptを表示 -home.showJS.desc=PDFに挿入されたJavaScriptを検索して表示します。 -showJS.tags=JS - -home.autoRedact.title=自動塗りつぶし -home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。 -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=サインイン -login.signin=サインイン -login.rememberme=サインイン状態を記憶する -login.invalid=ユーザー名かパスワードが無効です。 -login.locked=あなたのアカウントはロックされています。 -login.signinTitle=サインインしてください - - -#auto-redact -autoRedact.title=自動塗りつぶし -autoRedact.header=自動塗りつぶし -autoRedact.colorLabel=カラー -autoRedact.textsToRedactLabel=編集するテキスト (line-separated) -autoRedact.textsToRedactPlaceholder=例 \n機密 \n極秘 -autoRedact.useRegexLabel=正規表現を使用する -autoRedact.wholeWordSearchLabel=単語単位の検索 -autoRedact.customPaddingLabel=追加の余白 -autoRedact.convertPDFToImageLabel=PDFをPDF画像に変換 (塗りつぶしの後ろのテキストを削除するために使用) -autoRedact.submitButton=送信 - - -#showJS -showJS.title=JavaScriptを表示 -showJS.header=JavaScriptを表示 -showJS.downloadJS=Javascriptをダウンロード -showJS.submit=表示 - - -#pdfToSinglePage -pdfToSinglePage.title=PDFを単一ページに変換 -pdfToSinglePage.header=PDFを単一ページに変換 -pdfToSinglePage.submit=単一ページに変換 - - -#pageExtracter -pageExtracter.title=ページの抽出 -pageExtracter.header=ページの抽出 -pageExtracter.submit=抽出 - - -#getPdfInfo -getPdfInfo.title=PDFの情報を入手 -getPdfInfo.header=PDFの情報を入手 -getPdfInfo.submit=情報を入手 -getPdfInfo.downloadJson=JSONでダウンロード - - -#markdown-to-pdf -MarkdownToPDF.title=MarkdownをPDFに変換 -MarkdownToPDF.header=MarkdownをPDFに変換 -MarkdownToPDF.submit=変換 -MarkdownToPDF.help=処理中 -MarkdownToPDF.credit=WeasyPrintを使用 - - - -#url-to-pdf -URLToPDF.title=URLをPDFに変換 -URLToPDF.header=URLをPDFに変換 -URLToPDF.submit=変換 -URLToPDF.credit=WeasyPrintを使用 - - -#html-to-pdf -HTMLToPDF.title=HTMLをPDFに変換 -HTMLToPDF.header=HTMLをPDFに変換 -HTMLToPDF.help=HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます -HTMLToPDF.submit=変換 -HTMLToPDF.credit=WeasyPrintを使用 - - -#sanitizePDF -sanitizePDF.title=PDFをサニタイズ -sanitizePDF.header=PDFファイルをサニタイズ -sanitizePDF.selectText.1=JavaScriptアクションを削除 -sanitizePDF.selectText.2=埋め込みファイルを削除 -sanitizePDF.selectText.3=メタデータを削除 -sanitizePDF.selectText.4=リンクを削除 -sanitizePDF.selectText.5=フォントを削除 -sanitizePDF.submit=PDFをサニタイズする - - -#addPageNumbers -addPageNumbers.title=ページ番号の追加 -addPageNumbers.header=ページ番号の追加 -addPageNumbers.selectText.1=PDFファイルを選択: -addPageNumbers.selectText.2=余白サイズ -addPageNumbers.selectText.3=位置 -addPageNumbers.selectText.4=開始番号 -addPageNumbers.selectText.5=番号をつけるページ -addPageNumbers.selectText.6=カスタムテキスト -addPageNumbers.customTextDesc=カスタムテキスト -addPageNumbers.numberPagesDesc=番号をつけるページ、デフォルトは'all'、 1-5 や 2,5,9 など -addPageNumbers.customNumberDesc=デフォルトは{n}、'{n} / {total} ページ'、'テキスト-{n}'、'{filename}-{n}など -addPageNumbers.submit=ページ番号の追加 - - -#auto-rename -auto-rename.title=ファイル名の自動変更 -auto-rename.header=PDF名の自動変更 -auto-rename.submit=自動リネーム - - -#adjustContrast -adjustContrast.title=コントラストの調整 -adjustContrast.header=コントラストの調整 -adjustContrast.contrast=コントラスト: -adjustContrast.brightness=明度: -adjustContrast.saturation=彩度: -adjustContrast.download=ダウンロード - - -#crop -crop.title=切り抜き -crop.header=画像の切り抜き -crop.submit=送信 - - -#autoSplitPDF -autoSplitPDF.title=PDFの自動分割 -autoSplitPDF.header=PDFの自動分割 -autoSplitPDF.description=印刷、挿入、スキャン、アップロード、およびドキュメントを自動分離します。手動での仕分けの必要ありません。 -autoSplitPDF.selectText.1=下から仕切り用紙を印刷します(白黒で問題ありません)。 -autoSplitPDF.selectText.2=原稿の間に仕切り用紙を挿入し、すべての原稿をまとめてスキャンします。 -autoSplitPDF.selectText.3=スキャンしたPDFファイルをアップロードしStirling PDFに任せます。 -autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。 -autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信: -autoSplitPDF.duplexMode=両面モード (表裏スキャン) -autoSplitPDF.dividerDownload1=ダウンロード '自動仕切り用紙 (最小).pdf' -autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf' -autoSplitPDF.submit=送信 - - -#pipeline -pipeline.title=パイプライン - - -#pageLayout -pageLayout.title=マルチページレイアウト -pageLayout.header=マルチページレイアウト -pageLayout.pagesPerSheet=1枚あたりのページ数: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=送信 - - -#scalePages -scalePages.title=ページの縮尺の調整 -scalePages.header=ページの縮尺の調整 -scalePages.pageSize=1ページのサイズ -scalePages.scaleFactor=1ページの拡大レベル (トリミング)。 -scalePages.submit=送信 - - -#certSign -certSign.title=証明書による署名 -certSign.header=証明書を使用してPDFに署名します。 (進行中) -certSign.selectPDF=署名するPDFファイルを選択: -certSign.selectKey=秘密キーファイルを選択 (PKCS#8形式、.pemまたは.der) : -certSign.selectCert=証明書ファイルを選択 (X.509形式、.pemまたは.der) : -certSign.selectP12=PKCS#12キーストアファイルを選択 (.p12または.pfx) (オプション。指定する場合は秘密キーと証明書が含まれている必要があります。): -certSign.certType=証明書の種類 -certSign.password=キーストアまたは秘密キーのパスワードを入力 (ある場合) : -certSign.showSig=署名を表示 -certSign.reason=理由 -certSign.location=場所 -certSign.name=名前 -certSign.submit=PDFに署名 - - -#removeBlanks -removeBlanks.title=空白の削除 -removeBlanks.header=空白ページの削除 -removeBlanks.threshold=しきい値 : -removeBlanks.thresholdDesc=白色ピクセルの白さを決めるためのしきい値 -removeBlanks.whitePercent=白比率 -removeBlanks.whitePercentDesc=削除するページの白の割合 -removeBlanks.submit=空白ページの削除 - - -#compare -compare.title=比較 -compare.header=PDFの比較 -compare.document.1=ドキュメント 1 -compare.document.2=ドキュメント 2 -compare.submit=比較 - - -#sign -sign.title=署名 -sign.header=PDFに署名 -sign.upload=画像をアップロード -sign.draw=署名を書く -sign.text=テキスト入力 -sign.clear=クリア -sign.add=追加 - - -#repair -repair.title=修復 -repair.header=PDFを修復 -repair.submit=修復 - - -#flatten -flatten.title=平坦化 -flatten.header=PDFを平坦化する -flatten.submit=平坦化 - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=角度のしきい値: -ScannerImageSplit.selectText.2=画像を回転させるために必要な絶対角度の最小値を設定 (初期値:10)。 -ScannerImageSplit.selectText.3=許容範囲: -ScannerImageSplit.selectText.4=推定された背景色周辺のカラーバリエーションの範囲を決定 (初期値:30)。 -ScannerImageSplit.selectText.5=最小面積: -ScannerImageSplit.selectText.6=画像の最小面積のしきい値を設定 (初期値:10000)。 -ScannerImageSplit.selectText.7=最小輪郭面積: -ScannerImageSplit.selectText.8=画像の最小の輪郭面積のしきい値を設定。 -ScannerImageSplit.selectText.9=境界線サイズ: -ScannerImageSplit.selectText.10=出力に白い縁取りが出ないように追加・削除される境界線の大きさを設定 (初期値:1)。 - - -#OCR -ocr.title=OCR / クリーンアップ -ocr.header=クリーンアップ / OCR (光学式文字認識) -ocr.selectText.1=PDF内で検出される言語を選択 (リストされているものは現在検出されているものです): -ocr.selectText.2=OCR処理されたPDFと一緒に、OCRしたテキストを含むテキストファイルを作成する -ocr.selectText.3=斜めにスキャンされたページを回転させて修正する -ocr.selectText.4=ページをきれいにして背景ノイズの中からテキストを検出しにくくする。(出力は変わりません) -ocr.selectText.5=ページをきれいにして背景ノイズの中からテキストを検出しにくくし、出力はクリーンアップを維持する。 -ocr.selectText.6=インタラクティブなテキストを含むページを無視し、画像ページのみをOCRする -ocr.selectText.7=強制OCR、全てのページで元のテキスト要素を全て削除してOCRする -ocr.selectText.8=Normal (PDFにテキストが含まれている場合はエラーになります。) -ocr.selectText.9=追加設定 -ocr.selectText.10=OCRモード -ocr.selectText.11=OCR後に画像を削除する (すべての画像を削除します。変換ステップの一部である場合にのみ有効です)。 -ocr.selectText.12=レンダリングタイプ (高度) -ocr.help=他の言語でこれを使用する方法やDocker以外で使用する方法についてはこのドキュメントをお読みください。 -ocr.credit=本サービスにはOCRにOCRmyPDFとTesseractを使用しています。 -ocr.submit=OCRでPDFを処理する - - -#extractImages -extractImages.title=画像の抽出 -extractImages.header=画像の抽出 -extractImages.selectText=抽出した画像のフォーマットを選択 -extractImages.submit=抽出 - - -#File to PDF -fileToPDF.title=ファイルをPDFに変換 -fileToPDF.header=あらゆるファイルをPDFに変換 -fileToPDF.credit=本サービスはファイル変換にLibreOfficeとUnoconvを使用しています。 -fileToPDF.supportedFileTypes=サポートされるファイル形式には以下が含まれますが、完全な更新リストについてはLibreOfficeのドキュメントを参照してください。 -fileToPDF.submit=PDFを変換 - - -#compress -compress.title=圧縮 -compress.header=PDFを圧縮 -compress.credit=本サービスはPDFの圧縮/最適化にGhostscriptを使用しています。 -compress.selectText.1=手動モード - 1 から 4 -compress.selectText.2=品質レベル: -compress.selectText.3=4 (テキスト画像は最悪) -compress.selectText.4=自動モード - PDFを正確なサイズにするために品質を自動調整する。 -compress.selectText.5=PDFサイズ (例 25MB, 10.8MB, 25KB) -compress.submit=圧縮 - - -#Add image -addImage.title=画像の追加 -addImage.header=PDFに画像を追加 -addImage.everyPage=全ページ? -addImage.upload=画像の追加 -addImage.submit=画像の追加 - - -#merge -merge.title=結合 -merge.header=複数のPDFを結合 (2ファイル以上) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=結合 - - -#pdfOrganiser -pdfOrganiser.title=整理 -pdfOrganiser.header=PDFページの整理 -pdfOrganiser.submit=ページの整理 - - -#multiTool -multiTool.title=PDFマルチツール -multiTool.header=PDFマルチツール - - -#pageRemover -pageRemover.title=ページ削除 -pageRemover.header=PDFページ削除 -pageRemover.pagesToDelete=削除するページ (ページ番号のカンマ区切りリストを入力してください): -pageRemover.submit=ページ削除 - - -#rotate -rotate.title=PDFの回転 -rotate.header=PDFの回転 -rotate.selectAngle=回転角度を選択 (90度の倍数): -rotate.submit=回転 - - -#merge -split.title=PDFの分割 -split.header=PDFの分割 -split.desc.1=選択する番号は分割するページ番号です。 -split.desc.2=したがって、1,3,7-8を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。 -split.desc.3=ドキュメント #1: ページ 1 -split.desc.4=ドキュメント #2: ページ 2, 3 -split.desc.5=ドキュメント #3: ページ 4, 5, 6 -split.desc.6=ドキュメント #4: ページ 7 -split.desc.7=ドキュメント #5: ページ 8 -split.desc.8=ドキュメント #6: ページ 9, 10 -split.splitPages=分割するページ番号を入力: -split.submit=分割 - - -#merge -imageToPDF.title=画像をPDFに変換 -imageToPDF.header=画像をPDFに変換 -imageToPDF.submit=変換 -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=PDFの自動回転 -imageToPDF.selectText.3=マルチファイルの処理 (複数の画像を操作する場合に有効になります) -imageToPDF.selectText.4=1つのPDFに結合 -imageToPDF.selectText.5=個別のPDFに変換 - - -#pdfToImage -pdfToImage.title=PDFを画像に変換 -pdfToImage.header=PDFを画像に変換 -pdfToImage.selectText=画像の形式 -pdfToImage.singleOrMultiple=画像出力タイプ -pdfToImage.single=単一の大きな画像 -pdfToImage.multi=複数の画像 -pdfToImage.colorType=カラーモード -pdfToImage.color=カラー -pdfToImage.grey=グレースケール -pdfToImage.blackwhite=白黒 (データが失われる可能性があります!) -pdfToImage.submit=変換 - - -#addPassword -addPassword.title=パスワードの追加 -addPassword.header=パスワードの追加 (暗号化) -addPassword.selectText.1=暗号化するPDFを選択 -addPassword.selectText.2=ユーザーパスワード -addPassword.selectText.3=暗号化キーの長さ -addPassword.selectText.4=値が大きいほど強力ですが、値が小さいほど互換性が高くなります。 -addPassword.selectText.5=権限の設定 (所有者パスワードとの併用をおすすめします) -addPassword.selectText.6=ドキュメントの組立を禁止 -addPassword.selectText.7=コンテンツの抽出を禁止 -addPassword.selectText.8=アクセシビリティのための抽出を禁止 -addPassword.selectText.9=フォームへの入力を禁止 -addPassword.selectText.10=変更を禁止 -addPassword.selectText.11=注釈の変更を禁止 -addPassword.selectText.12=印刷を禁止 -addPassword.selectText.13=異なる形式の印刷を禁止 -addPassword.selectText.14=所有者パスワード -addPassword.selectText.15=ドキュメントを開いた後に実行できる操作を制限します (すべてのリーダーでサポートされているわけではありません) -addPassword.selectText.16=ドキュメントを開くことを制限します -addPassword.submit=暗号化 - - -#watermark -watermark.title=透かしの追加 -watermark.header=透かしの追加 -watermark.selectText.1=透かしを追加するPDFを選択: -watermark.selectText.2=透かしのテキスト: -watermark.selectText.3=文字サイズ: -watermark.selectText.4=回転 (0-360): -watermark.selectText.5=幅スペース (各透かし間の水平方向のスペース): -watermark.selectText.6=高さスペース (各透かし間の垂直方向のスペース): -watermark.selectText.7=不透明度 (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=透かしを追加 - - -#Change permissions -permissions.title=権限の変更 -permissions.header=権限の変更 -permissions.warning=警告、これらの権限を変更できないようにするため、パスワードの追加ページでパスワードを設定することを推奨します。 -permissions.selectText.1=権限を変更するPDFを選択 -permissions.selectText.2=権限の設定 -permissions.selectText.3=ドキュメントの組立を禁止 -permissions.selectText.4=コンテンツの抽出を禁止 -permissions.selectText.5=アクセシビリティのための抽出を禁止 -permissions.selectText.6=フォームへの入力を禁止 -permissions.selectText.7=変更を禁止 -permissions.selectText.8=注釈の変更を禁止 -permissions.selectText.9=印刷を禁止 -permissions.selectText.10=異なる形式の印刷を禁止 -permissions.submit=変更 - - -#remove password -removePassword.title=パスワードの削除 -removePassword.header=パスワードの削除 (復号化) -removePassword.selectText.1=復号化するPDFを選択 -removePassword.selectText.2=パスワード -removePassword.submit=削除 - - -#changeMetadata -changeMetadata.title=タイトル: -changeMetadata.header=メタデータの変更 -changeMetadata.selectText.1=変更したい変数を編集してください -changeMetadata.selectText.2=すべてのメタデータを削除 -changeMetadata.selectText.3=カスタムメタデータを表示 -changeMetadata.author=著者: -changeMetadata.creationDate=作成日 (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=作成者: -changeMetadata.keywords=キーワード: -changeMetadata.modDate=変更日 (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=プロデューサー: -changeMetadata.subject=主題: -changeMetadata.title=タイトル: -changeMetadata.trapped=トラッピング: -changeMetadata.selectText.4=その他のメタデータ: -changeMetadata.selectText.5=カスタムメタデータの追加 -changeMetadata.submit=変更 - - -#pdfToPDFA -pdfToPDFA.title=PDFをPDF/Aに変換 -pdfToPDFA.header=PDFをPDF/Aに変換 -pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。 -pdfToPDFA.submit=変換 - - -#PDFToWord -PDFToWord.title=PDFをWordに変換 -PDFToWord.header=PDFをWordに変換 -PDFToWord.selectText.1=出力ファイル形式 -PDFToWord.credit=本サービスはファイル変換にLibreOfficeを使用しています。 -PDFToWord.submit=変換 - - -#PDFToPresentation -PDFToPresentation.title=PDFをプレゼンテーションに変換 -PDFToPresentation.header=PDFをプレゼンテーションに変換 -PDFToPresentation.selectText.1=出力ファイル形式 -PDFToPresentation.credit=本サービスはファイル変換にLibreOfficeを使用しています。 -PDFToPresentation.submit=変換 - - -#PDFToText -PDFToText.title=PDFをText/RTFに変換 -PDFToText.header=PDFをText/RTFに変換 -PDFToText.selectText.1=出力ファイル形式 -PDFToText.credit=本サービスはファイル変換にLibreOfficeを使用しています。 -PDFToText.submit=変換 - - -#PDFToHTML -PDFToHTML.title=PDFをHTMLに変換 -PDFToHTML.header=PDFをHTMLに変換 -PDFToHTML.credit=本サービスはファイル変換にLibreOfficeを使用しています。 -PDFToHTML.submit=変換 - - -#PDFToXML -PDFToXML.title=PDFをXMLに変換 -PDFToXML.header=PDFをXMLに変換 -PDFToXML.credit=本サービスはファイル変換にLibreOfficeを使用しています。 -PDFToXML.submit=変換 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties deleted file mode 100644 index b4c2fa36..00000000 --- a/src/main/resources/messages_ko_KR.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=PDF 선택 -multiPdfPrompt=PDF 선택(2개 이상) -multiPdfDropPrompt=사용할 모든 PDF를 선택(또는 드래그 앤 드롭)하세요 -imgPrompt=이미지 선택 -genericSubmit=제출 -processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다 -pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력): -goToPage=이동 -true=참 -false=거짓 -unknown=알 수 없음 -save=저장 -close=닫기 -filesSelected=개 파일 선택됨 -noFavourites=즐겨찾기 없음 -bored=기다리는 게 지루하신가요? -alphabet=\uC54C\uD30C\uBCB3 -downloadPdf=PDF 다운로드 -text=텍스트 -font=폰트 -selectFillter=-- 선택 -- -pageNum=페이지 번호 -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=변환 -navbar.security=보안 -navbar.other=기타 -navbar.darkmode=다크 모드 -navbar.pageOps=Page Operations -navbar.settings=설정 - -############# -# SETTINGS # -############# -settings.title=설정 -settings.update=업데이트 가능 -settings.appVersion=앱 버전: -settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시): -settings.downloadOption.1=현재 창에서 열기 -settings.downloadOption.2=새 창에서 열기 -settings.downloadOption.3=다운로드 -settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=당신의 PDF에 필요한 모든 것이 있는 로컬 호스팅된 원스톱 숍입니다. - - -home.multiTool.title=PDF 멀티 툴 -home.multiTool.desc=페이지를 병합, 회전, 재배열, 제거하세요. -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=병합 -home.merge.desc=여러 개의 PDF를 쉽게 하나로 합치세요. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=분할 -home.split.desc=PDF를 여러 개의 문서로 분할하세요. -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=회전 -home.rotate.desc=PDF를 쉽게 회전하세요. -rotate.tags=server side - - -home.imageToPdf.title=Image to PDF -home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF로 변환하세요. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF to Image -home.pdfToImage.desc=PDF를 이미지(PNG, JPEG, GIF)로 변환하세요. -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=정렬 -home.pdfOrganiser.desc=페이지를 원하는 순서대로 제거/재배열하세요. -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=사진 추가 -home.addImage.desc=PDF의 설정된 위치에 이미지를 추가하세요.(개발 중) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=워터마크 추가 -home.watermark.desc=PDF 문서에 사용자 지정 워터마크를 추가하세요. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=권한 변경 -home.permissions.desc=PDF 문서의 권한을 변경하세요. -permissions.tags=read,write,edit,print - - -home.removePages.title=제거 -home.removePages.desc=PDF 문서에서 원치 않는 페이지를 제거하세요. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=비밀번호 추가 -home.addPassword.desc=PDF 문서를 비밀번호로 암호화하세요. -addPassword.tags=secure,security - -home.removePassword.title=비밀번호 제거 -home.removePassword.desc=PDF 문서에서 비밀번호를 제거하세요. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=압축 -home.compressPdfs.desc=파일 크기를 줄이기 위해 PDF 문서를 압축하세요. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=메타데이터 변경 -home.changeMetadata.desc=PDF 문서의 메타데이터를 수정/제거/추가하세요. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=파일을 PDF로 변환 -home.fileToPDF.desc=거의 모든 파일을 PDF로 변환하세요(DOCX, PNG, XLS, PPT, TXT 등) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / 깔끔하게 스캔 -home.ocr.desc=깔끔하게 스캔하고 PDF 내의 이미지에서 텍스트를 감지하여 텍스트로 다시 추가합니다. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=이미지 추출 -home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다. -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF to PDF/A -home.pdfToPDFA.desc=장기 보관을 위해 PDF를 PDF/A 문서로 변환하세요. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF to Word -home.PDFToWord.desc=PDF를 Word 형식으로 변환하세요. (DOC, DOCX, ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF to 프리젠테이션 -home.PDFToPresentation.desc=PDF를 프리젠테이션 형식으로 변환하세요. (PPT, PPTX, ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF to 텍스트/RTF -home.PDFToText.desc=PDF를 텍스트 또는 RTF 형식으로 변환하세요. -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF to HTML -home.PDFToHTML.desc=PDF를 HTML 형식으로 변환하세요. -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF to XML -home.PDFToXML.desc=PDF를 XML 형식으로 변환하세요. -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=스캔한 사진 감지/분할 -home.ScannerImageSplit.desc=사진/PDF 내에서 여러 장의 사진을 분할합니다. -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=서명 -home.sign.desc=PDF에 그림, 텍스트, 이미지로 서명을 추가합니다. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=합치기 -home.flatten.desc=PDF에서 모든 인터랙션 요소와 양식을 제거하세요. -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=복구 -home.repair.desc=손상된 PDF의 복구를 시도합니다. -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=빈 페이지 제거 -home.removeBlanks.desc=문서에서 빈 페이지를 감지하고 제거합니다. -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=비교 -home.compare.desc=2개의 PDF 문서를 비교하고 차이를 표시합니다. -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=인증서로 서명 -home.certSign.desc=PDF에 인증서/키로 서명합니다. (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=인증서로 서명 -certSign.header=PDF에 당신의 인증서로 서명하세요 (개발 중) -certSign.selectPDF=서명할 PDF를 선택하세요: -certSign.selectKey=개인 키 파일을 선택하세요 (PKCS#8 형식, .pem 또는 .der): -certSign.selectCert=인증서 파일을 선택하세요 (X.509 형식, .pem 또는 .der): -certSign.selectP12=PKCS#12 키 저장소 파일을 선택하세요 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다): -certSign.certType=인증서 유형 -certSign.password=키 저장소 또는 개인 키 비밀번호를 입력하세요 (있는 경우): -certSign.showSig=서명 보기 -certSign.reason=이유 -certSign.location=위치 -certSign.name=이름 -certSign.submit=PDF 서명 - - -#removeBlanks -removeBlanks.title=빈 페이지 제거 -removeBlanks.header=빈 페이지 제거 -removeBlanks.threshold=임계값: -removeBlanks.thresholdDesc=흰색 픽셀이 얼마나 흰색이어야 하는지를 결정하는 임계값 -removeBlanks.whitePercent=흰색 비율 (%): -removeBlanks.whitePercentDesc=제거될 페이지의 흰색 픽셀 비율 -removeBlanks.submit=빈 페이지 제거 - - -#compare -compare.title=비교 -compare.header=PDF 비교 -compare.document.1=문서 1 -compare.document.2=문서 2 -compare.submit=비교 - - -#sign -sign.title=서명 -sign.header=PDF에 서명 -sign.upload=이미지 업로드 -sign.draw=서명 그리기 -sign.text=텍스트 입력 -sign.clear=초기화 -sign.add=추가 - - -#repair -repair.title=복구 -repair.header=PDF 복구 -repair.submit=복구 - - -#flatten -flatten.title=합치기 -flatten.header=PDF 합치기 -flatten.submit=합치기 - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=각도 임계값: -ScannerImageSplit.selectText.2=이미지를 회전하는 데 필요한 최소 절대 각도를 설정합니다(기본값: 10). -ScannerImageSplit.selectText.3=오차 범위: -ScannerImageSplit.selectText.4=예상 배경색 주변의 색상 변화 범위를 결정합니다(기본값: 30). -ScannerImageSplit.selectText.5=최소 면적: -ScannerImageSplit.selectText.6=사진의 최소 면적 임계값을 설정합니다 (기본값: 10000). -ScannerImageSplit.selectText.7=최소 윤곽 영역: -ScannerImageSplit.selectText.8=사진의 최소 윤곽선 영역 임계값을 설정합니다. -ScannerImageSplit.selectText.9=테두리 크기: -ScannerImageSplit.selectText.10=출력에서 흰색 테두리를 방지하기 위해 추가 및 제거되는 테두리의 크기를 설정합니다(기본값: 1). - - -#OCR -ocr.title=OCR / 깔끔하게 스캔 -ocr.header=깔끔하게 스캔 / OCR (광학 문자 인식) -ocr.selectText.1=PDF에서 감지할 언어를 선택하십시오 (현재 감지된 언어 목록): -ocr.selectText.2=OCR 텍스트가 포함된 텍스트 파일을 OCR 처리된 PDF와 함께 생성 -ocr.selectText.3=비뚤어진 각도로 스캔한 페이지를 다시 제자리로 돌려 올바른 페이지로 스캔 -ocr.selectText.4=페이지를 깨끗하게 정리하여 OCR이 배경의 이물질에서 텍스트를 찾을 가능성 줄이기 (출력 변경 없음) -ocr.selectText.5=페이지를 깨끗하게 정리하여 OCR이 배경의 이물질에서 텍스트를 찾을 가능성 줄이기 (출력 변경) -ocr.selectText.6=인터랙티브 텍스트가 있는 페이지는 건너뛰고 이미지만 OCR -ocr.selectText.7=OCR 강제(모든 페이지에서 원본 텍스트 제거하고 OCR로 대체) -ocr.selectText.8=일반 (PDF에 텍스트가 포함된 경우 오류 발생) -ocr.selectText.9=추가 설정 -ocr.selectText.10=OCR 모드 -ocr.selectText.11=OCR 후 이미지 제거(모든 이미지 제거, 변환 단계의 일부인 경우에만 유용) -ocr.selectText.12=렌더 유형(고급) -ocr.help=다른 언어 또는 Docker에 포함되지 않은 언어에 대해 사용하는 방법에 대해서는 이 문서를 참조하세요. -ocr.credit=이 서비스는 OCR에 OCRmyPDF와 Tesseract를 사용합니다. -ocr.submit=OCR로 PDF 처리 - - -#extractImages -extractImages.title=이미지 추출 -extractImages.header=이미지 추출 -extractImages.selectText=추출된 이미지를 변환할 이미지 형식을 선택하세요. -extractImages.submit=추출 - - -#File to PDF -fileToPDF.title=File to PDF -fileToPDF.header=모든 파일을 PDF로 변환 -fileToPDF.credit=이 서비스는 파일 변환에 LibreOffice와 Unoconv를 사용합니다. -fileToPDF.supportedFileTypes=지원되는 파일 형식은 아래와 같지만, 지원되는 형식의 전체 업데이트 목록은 LibreOffice 설명서를 참조하세요. -fileToPDF.submit=PDF로 변환 - - -#compress -compress.title=압축 -compress.header=PDF 압축 -compress.credit=이 서비스는 PDF 압축/최적화를 위해 Ghostscript를 사용합니다. -compress.selectText.1=수동 모드 - 1에서 4 -compress.selectText.2=최적화 수준: -compress.selectText.3=4 (텍스트 이미지에 적합하지 않음) -compress.selectText.4=자동 - 정확한 크기의 PDF를 얻기 위해 품질 자동 조정 -compress.selectText.5=예상 PDF 크기 (예: 25MB, 10.8MB, 25KB) -compress.submit=압축 - - -#Add image -addImage.title=이미지 추가 -addImage.header=PDF에 이미지 추가 -addImage.everyPage=모든 페이지에 적용 -addImage.upload=이미지 추가 -addImage.submit=이미지 추가 - - -#merge -merge.title=병합 -merge.header=여러 개의 PDF 병합 (2개 이상) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=병합 - - -#pdfOrganiser -pdfOrganiser.title=페이지 정렬 도구 -pdfOrganiser.header=PDF 페이지 정렬 -pdfOrganiser.submit=페이지 재정렬 - - -#multiTool -multiTool.title=PDF 멀티 툴 -multiTool.header=PDF 멀티 툴 - - -#pageRemover -pageRemover.title=페이지 제거 도구 -pageRemover.header=PDF 페이지 제거 도구 -pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력): -pageRemover.submit=페이지 제거 - - -#rotate -rotate.title=PDF 회전 -rotate.header=PDF 회전 -rotate.selectAngle=회전 각도 선택 (90도의 배수로): -rotate.submit=회전 - - -#merge -split.title=PDF 분할 -split.header=PDF 분할 -split.desc.1=선택한 번호는 분할할 페이지 번호입니다. -split.desc.2=예를 들어, 1,3,7-8을 선택하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF로 분할하게 됩니다. -split.desc.3=문서 #1: 페이지 1 -split.desc.4=문서 #2: 페이지 2, 3 -split.desc.5=문서 #3: 페이지 4, 5, 6 -split.desc.6=문서 #4: 페이지 7 -split.desc.7=문서 #5: 페이지 8 -split.desc.8=문서 #6: 페이지 9, 10 -split.splitPages=분할할 페이지 입력: -split.submit=분할 - - -#merge -imageToPDF.title=이미지를 PDF로 변환 -imageToPDF.header=이미지를 PDF로 변환 -imageToPDF.submit=변환하기 -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=PDF 자동 회전 -imageToPDF.selectText.3=다중 파일 로직 (여러 이미지로 작업하는 경우에만 활성화됨) -imageToPDF.selectText.4=단일 PDF로 병합 -imageToPDF.selectText.5=별도의 PDF로 변환 - - -#pdfToImage -pdfToImage.title=PDF를 이미지로 변환 -pdfToImage.header=PDF를 이미지로 변환 -pdfToImage.selectText=이미지 형식 -pdfToImage.singleOrMultiple=이미지 결과 유형 -pdfToImage.single=단일 큰 이미지 -pdfToImage.multi=여러 이미지 -pdfToImage.colorType=색상 유형 -pdfToImage.color=컬러 -pdfToImage.grey=그레이스케일 -pdfToImage.blackwhite=흑백 (데이터 손실 가능성 있음!) -pdfToImage.submit=변환하기 - - -#addPassword -addPassword.title=암호 추가 -addPassword.header=암호 추가 (암호화) -addPassword.selectText.1=암호화할 PDF 선택 -addPassword.selectText.2=암호 -addPassword.selectText.3=암호화 키 길이 -addPassword.selectText.4=값이 높을수록 강력하지만, 값이 낮을수록 호환성이 더 좋습니다. -addPassword.selectText.5=설정할 권한 -addPassword.selectText.6=문서 조립 방지 -addPassword.selectText.7=콘텐츠 추출 방지 -addPassword.selectText.8=접근성을 위한 추출 방지 -addPassword.selectText.9=양식 작성 방지 -addPassword.selectText.10=수정 방지 -addPassword.selectText.11=주석 수정 방지 -addPassword.selectText.12=인쇄 방지 -addPassword.selectText.13=다른 형식으로 인쇄 방� -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself� -addPassword.submit=암호화 - - -#watermark -watermark.title=워터마크 추가 -watermark.header=워터마크 추가 -watermark.selectText.1=워터마크를 추가할 PDF 선택: -watermark.selectText.2=워터마크 텍스트: -watermark.selectText.3=폰트 크기: -watermark.selectText.4=회전 각도 (0-360): -watermark.selectText.5=가로 간격 (각 워터마크 사이의 가로 공간): -watermark.selectText.6=세로 간격 (각 워터마크 사이의 세로 공간): -watermark.selectText.7=투명도 (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=워터마크 추가 - - -#Change permissions -permissions.title=권한 변경 -permissions.header=권한 변경 -permissions.warning=이 권한을 변경할 수 없도록 하기 위해서는 암호를 사용하여 비밀번호 추가 페이지에서 설정하는 것이 좋습니다. -permissions.selectText.1=권한을 변경할 PDF 선택 -permissions.selectText.2=설정할 권한 -permissions.selectText.3=문서 조립 방지 -permissions.selectText.4=콘텐츠 추출 방지 -permissions.selectText.5=접근성을 위한 추출 방지 -permissions.selectText.6=양식 작성 방지 -permissions.selectText.7=수정 방지 -permissions.selectText.8=주석 수정 방지 -permissions.selectText.9=인쇄 방지 -permissions.selectText.10=다른 형식으로 인쇄 방지 -permissions.submit=변경 - - -#remove password -removePassword.title=암호 제거 -removePassword.header=암호 제거 (복호화) -removePassword.selectText.1=복호화할 PDF 선택 -removePassword.selectText.2=암호 -removePassword.submit=제거 - - -#changeMetadata -changeMetadata.title=제목: -changeMetadata.header=메타데이터 변경 -changeMetadata.selectText.1=변경하려는 변수를 편집해주세요 -changeMetadata.selectText.2=모든 메타데이터 삭제 -changeMetadata.selectText.3=사용자 정의 메타데이터 표시: -changeMetadata.author=저자: -changeMetadata.creationDate=작성일 (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=제작자: -changeMetadata.keywords=키워드: -changeMetadata.modDate=수정일 (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=생성자: -changeMetadata.subject=주제: -changeMetadata.title=제목: -changeMetadata.trapped=잠긴 상태: -changeMetadata.selectText.4=기타 메타데이터: -changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가 -changeMetadata.submit=변경 - - -#pdfToPDFA -pdfToPDFA.title=PDF To PDF/A -pdfToPDFA.header=PDF를 PDF/A로 변환 -pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF를 사용합니다. -pdfToPDFA.submit=변환 - - -#PDFToWord -PDFToWord.title=PDF to Word -PDFToWord.header=PDF를 Word로 변환 -PDFToWord.selectText.1=출력 파일 형식 -PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. -PDFToWord.submit=변환 - - -#PDFToPresentation -PDFToPresentation.title=PDF to Presentation -PDFToPresentation.header=PDF를 프레젠테이션으로 변환 -PDFToPresentation.selectText.1=출력 파일 형식 -PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. -PDFToPresentation.submit=변환 - - -#PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=PDF를 텍스트/RTF로 변환 -PDFToText.selectText.1=출력 파일 형식 -PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. -PDFToText.submit=변환 - - -#PDFToHTML -PDFToHTML.title=PDF to HTML -PDFToHTML.header=PDF를 HTML로 변환 -PDFToHTML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. -PDFToHTML.submit=변환 - - -#PDFToXML -PDFToXML.title=PDF to XML -PDFToXML.header=PDF를 XML로 변환 -PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다. -PDFToXML.submit=변환 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties deleted file mode 100644 index a13c9071..00000000 --- a/src/main/resources/messages_nl_NL.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Selecteer PDF(s) -multiPdfPrompt=Selecteer PDFs (2+) -multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDFs die je nodig hebt -imgPrompt=Selecteer afbeelding(en) -genericSubmit=Indienen -processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte -pageOrderPrompt=Aangepaste pagina volgorde (Voer een komma-gescheiden lijst van paginanummers of functies in, zoals 2n+1) : -goToPage=Ga -true=Waar -false=Onwaar -unknown=Onbekend -save=Opslaan -close=Sluiten -filesSelected=Bestanden geselecteerd -noFavourites=Geen favorieten toegevoegd -bored=Verveeld met wachten? -alphabet=Alfabet -downloadPdf=Download PDF -text=Tekst -font=Lettertype -selectFillter=-- Selecteer -- -pageNum=Paginanummer -sizes.small=Klein -sizes.medium=Medium -sizes.large=Groot -sizes.x-large=Extra Groot -error.pdfPassword=Het PDF document is beveiligd met een wachtwoord en het wachtwoord is niet ingevoerd of was onjuist -delete=Verwijderen -username=Gebruikersnaam -password=Wachtwoord -welcome=Welkom -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Converteren -navbar.security=Beveiliging -navbar.other=Overige -navbar.darkmode=Donkere modus -navbar.pageOps=Pagina operaties -navbar.settings=Instellingen - -############# -# SETTINGS # -############# -settings.title=Instellingen -settings.update=Update beschikbaar -settings.appVersion=App versie: -settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip): -settings.downloadOption.1=Open in hetzelfde venster -settings.downloadOption.2=Open in nieuw venster -settings.downloadOption.3=Download bestand -settings.zipThreshold=Zip bestanden wanneer het aantal gedownloade bestanden overschrijdt -settings.signOut=Uitloggen -settings.accountSettings=Account instellingen - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account instellingen -account.accountSettings=Account instellingen -account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen -account.userControlSettings=Gebruikerscontrole instellingen -account.changeUsername=Wijzig gebruikersnaam -account.changeUsername=Wijzig gebruikersnaam -account.password=Bevestigingswachtwoord -account.oldPassword=Oud wachtwoord -account.newPassword=Nieuw wachtwoord -account.changePassword=Wijzig wachtwoord -account.confirmNewPassword=Bevestig nieuw wachtwoord -account.signOut=Uitloggen -account.yourApiKey=Jouw API sleutel -account.syncTitle=Synchroniseer browserinstellingen met account -account.settingsCompare=Instellingen vergelijking: -account.property=Eigenschap -account.webBrowserSettings=Web Browser instelling -account.syncToBrowser=Synchroniseer account -> browser -account.syncToAccount=Synchroniseer account <- browser - - -adminUserSettings.title=Gebruikerscontrole instellingen -adminUserSettings.header=Beheer Gebruikerscontrole instellingen -adminUserSettings.admin=Beheerder -adminUserSettings.user=Gebruiker -adminUserSettings.addUser=Voeg nieuwe gebruiker toe -adminUserSettings.roles=Rollen -adminUserSettings.role=Rol -adminUserSettings.actions=Acties -adminUserSettings.apiUser=Beperkte API gebruiker -adminUserSettings.webOnlyUser=Alleen web gebruiker -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Sla gebruiker op - -############# -# HOME-PAGE # -############# -home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften. - - -home.multiTool.title=PDF Multitool -home.multiTool.desc=Samenvoegen, draaien, herschikken en pagina''s verwijderen -multiTool.tags=Multitool,Multi bewerking,UI,klik sleep,voorkant,clientzijde,interactief,beweegbaar,verplaats - -home.merge.title=Samenvoegen -home.merge.desc=Voeg eenvoudig meerdere PDF''s samen tot één. -merge.tags=samenvoegen,Pagina operaties,Serverkant - -home.split.title=Splitsen -home.split.desc=Splits PDF''s in meerdere documenten -split.tags=Pagina operaties,verdelen,meerdere pagina''s,knippen,serverzijde - -home.rotate.title=Roteren -home.rotate.desc=Roteer eenvoudig je PDF''s. -rotate.tags=serverzijde - - -home.imageToPdf.title=Afbeelding naar PDF -home.imageToPdf.desc=Converteer een afbeelding (PNG, JPEG, GIF) naar PDF. -imageToPdf.tags=conversie,img,jpg,foto - -home.pdfToImage.title=PDF naar Afbeelding -home.pdfToImage.desc=Converteer een PDF naar een afbeelding. (PNG, JPEG, GIF) -pdfToImage.tags=conversie,img,jpg,foto - -home.pdfOrganiser.title=Organiseren -home.pdfOrganiser.desc=Verwijder/Herschik pagina''s in een volgorde naar keus -pdfOrganiser.tags=duplex,even oneven,sorteren,verplaatsen - - -home.addImage.title=Afbeelding toevoegen -home.addImage.desc=Voegt een afbeelding toe op een specifieke locatie in de PDF -addImage.tags=img,jpg,foto - -home.watermark.title=Watermerk toevoegen -home.watermark.desc=Voeg een aangepast watermerk toe aan je PDF-document. -watermark.tags=Tekst,herhalend,label,eigen,copyright,handelsmerk,img,jpg,foto - -home.permissions.title=Permissies wijzigen -home.permissions.desc=Wijzig de permissies van je PDF-document -permissions.tags=lezen,schrijven,bewerken,printen - - -home.removePages.title=Verwijderen -home.removePages.desc=Verwijder ongewenste pagina''s uit je PDF-document. -removePages.tags=Pagina''s verwijderen - -home.addPassword.title=Wachtwoord toevoegen -home.addPassword.desc=Versleutel je PDF-document met een wachtwoord. -addPassword.tags=veilig,beveiliging - -home.removePassword.title=Wachtwoord verwijderen -home.removePassword.desc=Verwijder wachtwoordbeveiliging van je PDF-document. -removePassword.tags=veilig,Decrypteren,beveiliging,wachtwoord verwijderen - -home.compressPdfs.title=Comprimeren -home.compressPdfs.desc=Comprimeer PDFs om hun bestandsgrootte te verkleinen. -compressPdfs.tags=comprimeren,klein - - -home.changeMetadata.title=Metadata wijzigen -home.changeMetadata.desc=Wijzig/Verwijder/Voeg metadata toe van een PDF-document -changeMetadata.tags=Titel,auteur,datum,creatie,tijd,uitgever,producent,statistieken - -home.fileToPDF.title=Bestand naar PDF converteren -home.fileToPDF.desc=Converteer bijna ieder bestand naar PDF (DOCX, PNG, XLS, PPT, TXT en meer) -fileToPDF.tags=transformatie,formaat,document,foto,slide,tekst,conversie,kantoor,docs,word,excel,powerpoint - -home.ocr.title=OCR / Scans opruimen -home.ocr.desc=Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst. -ocr.tags=herkenning,tekst,afbeelding,scan,lezen,identificeren,detectie,bewerkbaar - - -home.extractImages.title=Afbeeldingen extraheren -home.extractImages.desc=Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip -extractImages.tags=foto,opslaan,archief,zip,vastleggen,plukken - -home.pdfToPDFA.title=PDF naar PDF/A -home.pdfToPDFA.desc=Converteer PDF naar PDF/A voor langdurige opslag -pdfToPDFA.tags=archief,langdurig,standaard,conversie,opslag,bewaring - -home.PDFToWord.title=PDF naar Word -home.PDFToWord.desc=Converteer PDF naar Word-formaten (DOC, DOCX en ODT) -PDFToWord.tags=doc,docx,odt,word,transformatie,formaat,conversie,kantoor,microsoft,docfile - -home.PDFToPresentation.title=PDF naar Presentatie -home.PDFToPresentation.desc=Converteer PDF naar Presentatie formaten (PPT, PPTX en ODP) -PDFToPresentation.tags=slides,show,kantoor,microsoft - -home.PDFToText.title=PDF naar RTF (Tekst) -home.PDFToText.desc=Converteer PDF naar Tekst of RTF formaat -PDFToText.tags=rijkformaat - -home.PDFToHTML.title=PDF naar HTML -home.PDFToHTML.desc=Converteer PDF naar HTML formaat -PDFToHTML.tags=webinhoud,browser vriendelijk - - -home.PDFToXML.title=PDF naar XML -home.PDFToXML.desc=Converteer PDF naar XML formaat -PDFToXML.tags=data-extractie,gestructureerd,code - -home.ScannerImageSplit.title=Detecteer/Split gescande foto''s -home.ScannerImageSplit.desc=Splits meerdere foto''s van binnen een foto/PDF -ScannerImageSplit.tags=scheiden,auto-detecteren,scans,meer-foto,organiseren - -home.sign.title=Ondertekenen -home.sign.desc=Voegt handtekening toe aan PDF via tekenen, tekst of afbeelding -sign.tags=autoriseren,initialen,getekende-handtekening,tekst-handtekening,afbeelding-handtekening - -home.flatten.title=Platdrukken -home.flatten.desc=Verwijder alle interactieve elementen en formulieren uit een PDF -flatten.tags=statisch,deactiveren,niet-interactief,stroomlijnen - -home.repair.title=Repareren -home.repair.desc=Probeert een corrupt/beschadigd PDF te herstellen -repair.tags=repareren,herstellen,correctie,terughalen - -home.removeBlanks.title=Verwijder lege pagina''s -home.removeBlanks.desc=Detecteert en verwijdert lege pagina''s uit een document -removeBlanks.tags=opruimen,stroomlijnen,geen-inhoud,organiseren - -home.compare.title=Vergelijken -home.compare.desc=Vergelijkt en toont de verschillen tussen 2 PDF-documenten -compare.tags=onderscheiden,contrasteren,veranderingen,analyse - -home.certSign.title=Ondertekenen met certificaat -home.certSign.desc=Ondertekent een PDF met een certificaat/sleutel (PEM/P12) -certSign.tags=authenticeren,PEM,P12,officieel,versleutelen - -home.pageLayout.title=Multi-pagina indeling -home.pageLayout.desc=Voeg meerdere pagina''s van een PDF-document samen op één pagina -pageLayout.tags=samenvoegen,composiet,enkel-zicht,organiseren - -home.scalePages.title=Aanpassen paginaformaat/schaal -home.scalePages.desc=Wijzig de grootte/schaal van een pagina en/of de inhoud ervan. -scalePages.tags=resize,aanpassen,dimensie,aanpassen - -home.pipeline.title=Pijplijn (Geavanceerd) -home.pipeline.desc=Voer meerdere acties uit op PDF''s door pipelinescripts te definiëren -pipeline.tags=automatiseren,volgorde,gescrript,batch-verwerking - -home.add-page-numbers.title=Paginanummers toevoegen -home.add-page-numbers.desc=Voeg paginanummers toe binnen het volledige document op een vastgestelde locatie -add-page-numbers.tags=pagineren,labelen,organiseren,indexeren - -home.auto-rename.title=Automatisch hernoemen PDF-bestand -home.auto-rename.desc=Hernoemt automatisch een PDF-bestand op basis van de gedetecteerde header -auto-rename.tags=auto-detecteren,op-header-gebaseerd,organiseren,herlabelen - -home.adjust-contrast.title=Kleuren/Contrast aanpassen -home.adjust-contrast.desc=Pas Contrast, Verzadiging en Helderheid van een PDF aan -adjust-contrast.tags=kleur-correctie,afstemmen,aanpassen,verbeteren - -home.crop.title=PDF bijsnijden -home.crop.desc=Snijd een PDF bij om de grootte te verkleinen (behoudt tekst!) -crop.tags=trimmen,verkleinen,bewerken,vorm - -home.autoSplitPDF.title=Automatisch splitsen pagina''s -home.autoSplitPDF.desc=Automatisch splitsen van gescande PDF met fysieke gescande paginasplitter QR-code -autoSplitPDF.tags=QR-gebaseerd,scheiden,scan-segment,organiseren - -home.sanitizePdf.title=Opschonen -home.sanitizePdf.desc=Verwijder scripts en andere elementen uit PDF-bestanden -sanitizePdf.tags=schoonmaken,veilig,veilig,bedreigingen verwijderen - -home.URLToPDF.title=URL/Website naar PDF -home.URLToPDF.desc=Zet http(s)URL om naar PDF -URLToPDF.tags=web-capture,pagina opslaan,web-naar-doc,archief - -home.HTMLToPDF.title=HTML naar PDF -home.HTMLToPDF.desc=Zet HTML-bestand of zip om naar PDF -HTMLToPDF.tags=markup,web-inhoud,transformatie,omzetten - - -home.MarkdownToPDF.title=Markdown naar PDF -home.MarkdownToPDF.desc=Zet Markdown-bestand om naar PDF -MarkdownToPDF.tags=markup,web-inhoud,transformatie,omzetten - - -home.getPdfInfo.title=Haal ALLE informatie op over PDF -home.getPdfInfo.desc=Haalt alle mogelijke informatie op van PDF''s -getPdfInfo.tags=informatie,data,statistieken - - -home.extractPage.title=Pagina(''s) extraheren -home.extractPage.desc=Extraheert geselecteerde pagina''s uit PDF -extractPage.tags=extraheren - - -home.PdfToSinglePage.title=PDF naar één grote pagina -home.PdfToSinglePage.desc=Voegt alle PDF-pagina''s samen tot één grote pagina -PdfToSinglePage.tags=één pagina - - -home.showJS.title=Toon Javascript -home.showJS.desc=Zoekt en toont ieder script dat in een PDF is geïnjecteerd -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Toon Javascript -showJS.header=Toon Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Toon - - -#pdfToSinglePage -pdfToSinglePage.title=PDF naar enkele pagina -pdfToSinglePage.header=PDF naar enkele pagina -pdfToSinglePage.submit=Converteren naar enkele pagina - - -#pageExtracter -pageExtracter.title=Pagina''s extraheren -pageExtracter.header=Pagina''s extraheren -pageExtracter.submit=Extraheren - - -#getPdfInfo -getPdfInfo.title=Informatie over PDF ophalen -getPdfInfo.header=Informatie over PDF ophalen -getPdfInfo.submit=Haal informatie op -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown naar PDF -MarkdownToPDF.header=Markdown naar PDF -MarkdownToPDF.submit=Converteren -MarkdownToPDF.help=in ontwikkeling -MarkdownToPDF.credit=Gebruikt WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL naar PDF -URLToPDF.header=URL naar PDF -URLToPDF.submit=Converteren -URLToPDF.credit=Gebruikt WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML naar PDF -HTMLToPDF.header=HTML naar PDF -HTMLToPDF.help=Accepteert HTML-bestanden en ZIP''s die html/css/afbeeldingen etc. bevatten -HTMLToPDF.submit=Converteren -HTMLToPDF.credit=Gebruikt WeasyPrint - - -#sanitizePDF -sanitizePDF.title=PDF opschonen -sanitizePDF.header=Een PDF-bestand opschonen -sanitizePDF.selectText.1=Verwijder Javascript-acties -sanitizePDF.selectText.2=Verwijder ingebedde bestanden -sanitizePDF.selectText.3=Verwijder metadata -sanitizePDF.selectText.4=Verwijder links -sanitizePDF.selectText.5=Verwijder lettertypen -sanitizePDF.submit=PDF opschonen - - -#addPageNumbers -addPageNumbers.title=Paginanummers toevoegen -addPageNumbers.header=Paginanummers toevoegen -addPageNumbers.selectText.1=Selecteer PDF-bestand: -addPageNumbers.selectText.2=Margegrootte -addPageNumbers.selectText.3=Positie -addPageNumbers.selectText.4=Startnummer -addPageNumbers.selectText.5=Pagina''s om te nummeren -addPageNumbers.selectText.6=Aangepaste tekst -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Paginanummers toevoegen - - -#auto-rename -auto-rename.title=Automatisch hernoemen -auto-rename.header=PDF automatisch hernoemen -auto-rename.submit=Automatisch hernoemen - - -#adjustContrast -adjustContrast.title=Contrast aanpassen -adjustContrast.header=Contrast aanpassen -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Helderheid: -adjustContrast.saturation=Verzadiging: -adjustContrast.download=Downloaden - - -#crop -crop.title=Bijwerken -crop.header=Afbeelding bijwerken -crop.submit=Indienen - - -#autoSplitPDF -autoSplitPDF.title=PDF automatisch splitsen -autoSplitPDF.header=PDF automatisch splitsen -autoSplitPDF.description=Print, Voeg in, Scan, upload, en laat ons je documenten automatisch scheiden. Geen handmatig sorteerwerk nodig. -autoSplitPDF.selectText.1=Print enkele scheidingsbladen van hieronder (Zwart-wit is prima). -autoSplitPDF.selectText.2=Scan al je documenten tegelijk door het scheidingsblad ertussen te plaatsen. -autoSplitPDF.selectText.3=Upload het enkele grote gescande PDF-bestand en laat Stirling PDF de rest afhandelen. -autoSplitPDF.selectText.4=Scheidingspagina''s worden automatisch gedetecteerd en verwijderd, wat een net einddocument garandeert. -autoSplitPDF.formPrompt=Dien PDF in met Stirling-PDF Pagina-scheiders: -autoSplitPDF.duplexMode=Duplex Modus (voor- en achterkant scannen) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Indienen - - -#pipeline -pipeline.title=Pijplijn - - -#pageLayout -pageLayout.title=Meerdere pagina indeling -pageLayout.header=Meerdere pagina indeling -pageLayout.pagesPerSheet=Pagina''s per vel: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Indienen - - -#scalePages -scalePages.title=Pagina-schaal aanpassen -scalePages.header=Pagina-schaal aanpassen -scalePages.pageSize=Grootte van een pagina van het document. -scalePages.scaleFactor=Zoomniveau (uitsnede) van een pagina. -scalePages.submit=Indienen - - -#certSign -certSign.title=Certificaat ondertekening -certSign.header=Onderteken een PDF met je certificaat (in ontwikkeling) -certSign.selectPDF=Selecteer een PDF-bestand voor ondertekening: -certSign.selectKey=Selecteer je privésleutelbestand (PKCS#8 formaat, kan .pem of .der zijn): -certSign.selectCert=Selecteer je certificaatbestand (X.509 formaat, kan .pem of .der zijn): -certSign.selectP12=Selecteer je PKCS#12 Sleutelopslagbestand (.p12 of .pfx) (Optioneel, indien verstrekt, moet het je privésleutel en certificaat bevatten): -certSign.certType=Certificaattype -certSign.password=Voer je sleutelopslag of privésleutel wachtwoord in (indien van toepassing): -certSign.showSig=Toon handtekening -certSign.reason=Reden -certSign.location=Locatie -certSign.name=Naam -certSign.submit=PDF ondertekenen - - -#removeBlanks -removeBlanks.title=Verwijder blanco''s -removeBlanks.header=Verwijder lege pagina''s -removeBlanks.threshold=Pixel witheid drempel: -removeBlanks.thresholdDesc=Drempel voor het bepalen hoe wit een witte pixel moet zijn om als ''Wit'' te worden geclassificeerd. 0 = Zwart, 255 zuiver wit. -removeBlanks.whitePercent=Wit percentage (%): -removeBlanks.whitePercentDesc=Percentage van de pagina dat ''witte'' pixels moet zijn om verwijderd te worden -removeBlanks.submit=Blanco''s verwijderen - - -#compare -compare.title=Vergelijken -compare.header=PDF''s vergelijken -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Vergelijken - - -#sign -sign.title=Ondertekenen -sign.header=PDF''s ondertekenen -sign.upload=Upload afbeelding -sign.draw=Handtekening tekenen -sign.text=Tekstinvoer -sign.clear=Wissen -sign.add=Toevoegen - - -#repair -repair.title=Repareren -repair.header=PDF''s repareren -repair.submit=Repareren - - -#flatten -flatten.title=Afvlakken -flatten.header=PDF''s afvlakken -flatten.submit=Afvlakken - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Hoek drempel: -ScannerImageSplit.selectText.2=Stelt de minimale absolute hoek in die nodig is om de afbeelding te roteren (standaard: 10). -ScannerImageSplit.selectText.3=Tolerantie: -ScannerImageSplit.selectText.4=Bepaalt het bereik van kleurvariatie rond de geschatte achtergrondkleur (standaard: 30). -ScannerImageSplit.selectText.5=Minimum oppervlakte: -ScannerImageSplit.selectText.6=Stelt de minimale oppervlakte drempel in voor een foto (standaard: 10000). -ScannerImageSplit.selectText.7=Minimum contour oppervlakte: -ScannerImageSplit.selectText.8=Stelt de minimale contour oppervlakte drempel in voor een foto -ScannerImageSplit.selectText.9=Randgrootte: -ScannerImageSplit.selectText.10=Stelt de grootte van de toegevoegde en verwijderde rand in om witte randen in de uitvoer te voorkomen (standaard: 1). - - -#OCR -ocr.title=OCR / Scan opruimen -ocr.header=Scans opruimen / OCR (Optical Character Recognition) -ocr.selectText.1=Selecteer talen die binnen de PDF gedetecteerd moeten worden (De vermelde zijn de momenteel gedetecteerde): -ocr.selectText.2=Produceer tekstbestand met OCR-tekst naast de OCR''d PDF -ocr.selectText.3=Corrigeer pagina''s die onder een scheve hoek zijn gescand door ze terug te draaien -ocr.selectText.4=Maak de pagina schoon, zodat het minder waarschijnlijk is dat OCR tekst in achtergrondruis vindt. (Geen uitvoerverandering) -ocr.selectText.5=Maak de pagina schoon zodat OCR waarschijnlijk geen tekst in achtergrondruis vindt, behoudt opruiming in uitvoer. -ocr.selectText.6=Negeert pagina''s met interactieve tekst, OCR''s alleen pagina''s die afbeeldingen zijn -ocr.selectText.7=Forceer OCR, zal elke pagina OCR''en en alle originele tekstelementen verwijderen -ocr.selectText.8=Normaal (Zal een fout geven als de PDF tekst bevat) -ocr.selectText.9=Aanvullende instellingen -ocr.selectText.10=OCR-modus -ocr.selectText.11=Verwijder afbeeldingen na OCR (Verwijdert ALLE afbeeldingen, alleen nuttig als onderdeel van conversiestap) -ocr.selectText.12=Render Type (Geavanceerd) -ocr.help=Lees deze documentatie over hoe dit te gebruiken voor andere talen en/of gebruik buiten docker -ocr.credit=Deze dienst maakt gebruik van OCRmyPDF en Tesseract voor OCR. -ocr.submit=Verwerk PDF met OCR - - -#extractImages -extractImages.title=Afbeeldingen extraheren -extractImages.header=Afbeeldingen extraheren -extractImages.selectText=Selecteer het beeldformaat voor geëxtraheerde afbeeldingen -extractImages.submit=Extraheer - - -#File to PDF -fileToPDF.title=Bestand naar PDF -fileToPDF.header=Zet elk bestand om naar PDF -fileToPDF.credit=Deze service gebruikt LibreOffice en Unoconv voor bestandsconversie. -fileToPDF.supportedFileTypes=Ondersteunde bestandstypen zijn hieronder opgenomen, maar raadpleeg voor een volledige lijst met ondersteunde formaten de LibreOffice-documentatie -fileToPDF.submit=Omzetten naar PDF - - -#compress -compress.title=Comprimeren -compress.header=PDF comprimeren -compress.credit=Deze functie gebruikt Ghostscript voor PDF Compressie/Optimalisatie. -compress.selectText.1=Handmatige modus - Van 1 tot 4 -compress.selectText.2=Optimalisatieniveau: -compress.selectText.3=4 (Verschrikkelijk voor tekstafbeeldingen) -compress.selectText.4=Automatische modus - Past kwaliteit automatisch aan om PDF naar exacte grootte te krijgen -compress.selectText.5=Verwachte PDF-grootte (bijv. 25MB, 10.8MB, 25KB) -compress.submit=Comprimeren - - -#Add image -addImage.title=Afbeelding toevoegen -addImage.header=Afbeelding aan PDF toevoegen -addImage.everyPage=Elke pagina? -addImage.upload=Afbeelding toevoegen -addImage.submit=Afbeelding toevoegen - - -#merge -merge.title=Samenvoegen -merge.header=Meerdere PDF''s samenvoegen (2+) -merge.sortByName=Sorteer op naam -merge.sortByDate=Sorteer op datum -merge.submit=Samenvoegen - - -#pdfOrganiser -pdfOrganiser.title=Pagina organisator -pdfOrganiser.header=PDF pagina organisator -pdfOrganiser.submit=Pagina''s herschikken - - -#multiTool -multiTool.title=PDF Multitool -multiTool.header=PDF Multitool - - -#pageRemover -pageRemover.title=Pagina verwijderaar -pageRemover.header=PDF pagina verwijderaar -pageRemover.pagesToDelete=Te verwijderen pagina''s (Voer een door komma''s gescheiden lijst met paginanummers in): -pageRemover.submit=Pagina''s verwijderen - - -#rotate -rotate.title=PDF roteren -rotate.header=PDF roteren -rotate.selectAngle=Selecteer rotatiehoek (in veelvouden van 90 graden): -rotate.submit=Roteren - - -#merge -split.title=PDF splitsen -split.header=PDF splitsen -split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren -split.desc.2=Als zodanig selecteren van 1,3,7-8 zou een 10 pagina''s tellend document splitsen in 6 aparte PDF''s met: -split.desc.3=Document #1: Pagina 1 -split.desc.4=Document #2: Pagina 2 en 3 -split.desc.5=Document #3: Pagina 4, 5 en 6 -split.desc.6=Document #4: Pagina 7 -split.desc.7=Document #5: Pagina 8 -split.desc.8=Document #6: Pagina 9 en 10 -split.splitPages=Voer pagina''s in om op te splitsen: -split.submit=Splitsen - - -#merge -imageToPDF.title=Afbeelding naar PDF -imageToPDF.header=Afbeelding naar PDF -imageToPDF.submit=Omzetten -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=PDF automatisch draaien -imageToPDF.selectText.3=Meervoudige bestandslogica (Alleen ingeschakeld bij werken met meerdere afbeeldingen) -imageToPDF.selectText.4=Voeg samen in één PDF -imageToPDF.selectText.5=Zet om naar afzonderlijke PDF''s - - -#pdfToImage -pdfToImage.title=PDF naar afbeelding -pdfToImage.header=PDF naar afbeelding -pdfToImage.selectText=Afbeeldingsformaat -pdfToImage.singleOrMultiple=Resultaattype van pagina naar afbeelding -pdfToImage.single=Eén grote afbeelding die alle pagina''s combineert -pdfToImage.multi=Meerdere afbeeldingen, één afbeelding per pagina -pdfToImage.colorType=Kleurtype -pdfToImage.color=Kleur -pdfToImage.grey=Grijstinten -pdfToImage.blackwhite=Zwart en wit (kan data verliezen!) -pdfToImage.submit=Omzetten - - -#addPassword -addPassword.title=Wachtwoord toevoegen -addPassword.header=Wachtwoord toevoegen (Versleutelen) -addPassword.selectText.1=Selecteer PDF om te versleutelen -addPassword.selectText.2=Gebruikerswachtwoord -addPassword.selectText.3=Versleutelingssleutellengte -addPassword.selectText.4=Hogere waarden zijn sterker, maar lagere waarden hebben een betere compatibiliteit. -addPassword.selectText.5=In te stellen rechten (Aanbevolen om te gebruiken samen met eigenaarswachtwoord) -addPassword.selectText.6=Voorkomen van documentassemblage -addPassword.selectText.7=Voorkomen van inhoudsextractie -addPassword.selectText.8=Voorkomen van extractie voor toegankelijkheid -addPassword.selectText.9=Voorkomen van invullen van formulier -addPassword.selectText.10=Voorkomen van wijziging -addPassword.selectText.11=Voorkomen van annotatiewijziging -addPassword.selectText.12=Voorkomen van afdrukken -addPassword.selectText.13=Voorkomen van afdrukken in verschillende formaten -addPassword.selectText.14=Eigenaarswachtwoord -addPassword.selectText.15=Beperkt wat gedaan kan worden met het document nadat het is geopend (Niet ondersteund door alle lezers) -addPassword.selectText.16=Beperkt het openen van het document zelf -addPassword.submit=Versleutelen - - -#watermark -watermark.title=Watermerk toevoegen -watermark.header=Watermerk toevoegen -watermark.selectText.1=Selecteer PDF om watermerk toe te voegen: -watermark.selectText.2=Watermerk tekst: -watermark.selectText.3=Tekengrootte: -watermark.selectText.4=Rotatie (0-360): -watermark.selectText.5=breedteSpacer (Ruimte tussen elk watermerk horizontaal): -watermark.selectText.6=hoogteSpacer (Ruimte tussen elk watermerk verticaal): -watermark.selectText.7=Transparantie (0% - 100%): -watermark.selectText.8=Type watermerk: -watermark.selectText.9=Watermerk afbeelding: -watermark.submit=Watermerk toevoegen - - -#Change permissions -permissions.title=Rechten wijzigen -permissions.header=Rechten wijzigen -permissions.warning=Let op: om deze rechten onveranderlijk te maken, wordt aanbevolen om ze met een wachtwoord in te stellen via de add-password pagina. -permissions.selectText.1=Selecteer PDF om rechten te wijzigen -permissions.selectText.2=In te stellen rechten -permissions.selectText.3=Voorkom samenvoegen van document -permissions.selectText.4=Voorkom inhoudsextractie -permissions.selectText.5=Voorkom extractie voor toegankelijkheid -permissions.selectText.6=Voorkom invullen van formulier -permissions.selectText.7=Voorkom wijziging -permissions.selectText.8=Voorkom annotatie wijziging -permissions.selectText.9=Voorkom afdrukken -permissions.selectText.10=Voorkom afdrukken in verschillende formaten -permissions.submit=Wijzigen - - -#remove password -removePassword.title=Wachtwoord verwijderen -removePassword.header=Wachtwoord verwijderen (Decrypteren) -removePassword.selectText.1=Selecteer PDF om te decrypteren -removePassword.selectText.2=Wachtwoord -removePassword.submit=Verwijderen - - -#changeMetadata -changeMetadata.title=Titel: -changeMetadata.header=Metadata wijzigen -changeMetadata.selectText.1=Pas de variabelen aan die je wilt wijzigen -changeMetadata.selectText.2=Verwijder alle metadata -changeMetadata.selectText.3=Toon aangepaste metadata: -changeMetadata.author=Auteur: -changeMetadata.creationDate=Aanmaakdatum (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Maker: -changeMetadata.keywords=Trefwoorden: -changeMetadata.modDate=Wijzigingsdatum (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Producent: -changeMetadata.subject=Onderwerp: -changeMetadata.title=Titel: -changeMetadata.trapped=Vastgezet: -changeMetadata.selectText.4=Overige metadata: -changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe -changeMetadata.submit=Wijzigen - - -#pdfToPDFA -pdfToPDFA.title=PDF naar PDF/A -pdfToPDFA.header=PDF naar PDF/A -pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie -pdfToPDFA.submit=Converteren - - -#PDFToWord -PDFToWord.title=PDF naar Word -PDFToWord.header=PDF naar Word -PDFToWord.selectText.1=Uitvoerbestandsformaat -PDFToWord.credit=Deze service gebruikt LibreOffice voor bestandsconversie. -PDFToWord.submit=Converteren - - -#PDFToPresentation -PDFToPresentation.title=PDF naar Presentatie -PDFToPresentation.header=PDF naar Presentatie -PDFToPresentation.selectText.1=Uitvoerbestandsformaat -PDFToPresentation.credit=Deze service gebruikt LibreOffice voor bestandsconversie. -PDFToPresentation.submit=Converteren - - -#PDFToText -PDFToText.title=PDF naar RTF (Tekst) -PDFToText.header=PDF naar RTF (Tekst) -PDFToText.selectText.1=Uitvoerbestandsformaat -PDFToText.credit=Deze service gebruikt LibreOffice voor bestandsconversie. -PDFToText.submit=Converteren - - -#PDFToHTML -PDFToHTML.title=PDF naar HTML -PDFToHTML.header=PDF naar HTML -PDFToHTML.credit=Deze service gebruikt LibreOffice voor bestandsconversie. -PDFToHTML.submit=Converteren - - -#PDFToXML -PDFToXML.title=PDF naar XML -PDFToXML.header=PDF naar XML -PDFToXML.credit=Deze service gebruikt LibreOffice voor bestandsconversie. -PDFToXML.submit=Converteren diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties deleted file mode 100644 index a2c06fc1..00000000 --- a/src/main/resources/messages_pl_PL.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Wybierz PDF -multiPdfPrompt=Wybierz PDF (2+) -multiPdfDropPrompt=Wybierz (lub przeciągnij i puść) wszystkie dokumenty PDF -imgPrompt=Wybierz obraz(y) -genericSubmit=Wyślij -processTimeWarning=Ostrzeżenie: Ten proces może potrwać do minuty, w zależności od rozmiaru pliku -pageOrderPrompt=Kolejność stron (wprowadź listę numerów stron oddzielonych przecinkami) : -goToPage=Idź -true=Tak -false=Nie -unknown=Nieznany -save=Zapisz -close=Zamknij -filesSelected=wybrane pliki -noFavourites=Nie dodano ulubionych -bored=Znudzony czekaniem? -alphabet=Alfabet -downloadPdf=Pobierz PDF -text=Tekst -font=Czcionka -selectFillter=-- Wybierz -- -pageNum=Numer strony -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=Dokument PDF jest zabezpieczony hasłem, musisz podać prawidłowe hasło. -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Konwertuj -navbar.security=Bezpieczeństwo -navbar.other=Inne -navbar.darkmode=Tryb nocny -navbar.pageOps=Strony -navbar.settings=Ustawienia - -############# -# SETTINGS # -############# -settings.title=Ustawienia -settings.update=Dostępna aktualizacja -settings.appVersion=Wersia aplikacji: -settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP): -settings.downloadOption.1=Otwórz w tym samym oknie -settings.downloadOption.2=Otwórz w nowym oknie -settings.downloadOption.3=Pobierz plik -settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związanych z dokumentami PDF. - - -home.multiTool.title=Multi narzędzie PDF -home.multiTool.desc=Łącz, dziel, obracaj, zmieniaj kolejność i usuwaj strony -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Połącz -home.merge.desc=Łatwe łączenie wielu dokumentów PDF w jeden. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Podziel -home.split.desc=Podziel dokument PDF na wiele dokumentów -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Obróć -home.rotate.desc=Łatwo obracaj dokumenty PDF. -rotate.tags=server side - - -home.imageToPdf.title=Obraz na PDF -home.imageToPdf.desc=Konwertuj obraz (PNG, JPEG, GIF) do dokumentu PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF na Obraz -home.pdfToImage.desc=Konwertuj plik PDF na obraz (PNG, JPEG, GIF). -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Uporządkuj -home.pdfOrganiser.desc=Usuń/Zmień kolejność stron w dowolnej kolejności -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Dodaj obraz -home.addImage.desc=Dodaje obraz w wybranym miejscu w dokumencie PDF (moduł w budowie) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Dodaj znak wodny -home.watermark.desc=Dodaj niestandardowy znak wodny do dokumentu PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Zmień uprawnienia -home.permissions.desc=Zmień uprawnienia dokumentu PDF -permissions.tags=read,write,edit,print - - -home.removePages.title=Usuń -home.removePages.desc=Usuń niechciane strony z dokumentu PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Dodaj hasło -home.addPassword.desc=Zaszyfruj dokument PDF za pomocą hasła. -addPassword.tags=secure,security - -home.removePassword.title=Usuń hasło -home.removePassword.desc=Usuń ochronę hasłem z dokumentu PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Kompresuj -home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Zmień metadane -home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Konwertuj plik do PDF -home.fileToPDF.desc=Konwertuj dowolny plik do dokumentu PDF (DOCX, PNG, XLS, PPT, TXT i więcej) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Zamiana na tekst -home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Wyodrębnij obrazy -home.extractImages.desc=Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF na PDF/A -home.pdfToPDFA.desc=Konwertuj dokument PDF na PDF/A w celu długoterminowego przechowywania -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF na Word -home.PDFToWord.desc=Konwertuj dokument PDF na formaty Word (DOC, DOCX i ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF na Prezentację -home.PDFToPresentation.desc=Konwertuj dokument PDF na formaty prezentacji (PPT, PPTX i ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF na Tekst/RTF -home.PDFToText.desc=Konwertuj dokument PDF na tekst lub format RTF -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF na HTML -home.PDFToHTML.desc=Konwertuj dokument PDF na format HTML -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF na XML -home.PDFToXML.desc=Konwertuj dokument PDF na format XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Wykryj/Podziel zeskanowane zdjęcia -home.ScannerImageSplit.desc=Podziel na wiele zdjęć z jednego zdjęcia/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Podpis -home.sign.desc=Dodaje podpis do dokument PDF za pomocą rysunku, tekstu lub obrazu -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Spłaszcz -home.flatten.desc=Usuń wszystkie interaktywne elementy i formularze z dokumentu PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Napraw -home.repair.desc=Spróbuj naprawić uszkodzony dokument PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Usuń puste strony -home.removeBlanks.desc=Wykrywa i usuwa puste strony z dokumentu PDF -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Porównaj -home.compare.desc=Porównuje i pokazuje różnice między dwoma dokumentami PDF -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Podpisz certyfikatem -home.certSign.desc=Podpisz dokument PDF za pomocą certyfikatu/klucza prywatnego (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Układ wielu stron -home.pageLayout.desc=Scal wiele stron dokumentu PDF w jedną stronę -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Dopasuj rozmiar stron -home.scalePages.desc=Dopasuj rozmiar stron wybranego dokumentu PDF -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Układ wielu stron -pageLayout.header=Układ wielu stron -pageLayout.pagesPerSheet=Stron na jednym arkuszu: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Wykonaj - - -#scalePages -scalePages.title=Dopasuj rozmiar stron -scalePages.header=Dopasuj rozmiar stron -scalePages.pageSize=Rozmiar stron dokumentu: -scalePages.scaleFactor=Poziom powiększenia (przycięcia) stron: -scalePages.submit=Wykonaj - - -#certSign -certSign.title=Podpisywanie certyfikatem -certSign.header=Podpisz dokument PDF certyfikatem prywatnym (moduł w budowie) -certSign.selectPDF=Wybierz dokument PDF do podpisania: -certSign.selectKey=Wybierz plik klucza prywatnego (format PKCS#8, może to być .pem lub .der): -certSign.selectCert=Wybierz plik certyfikatu (format X.509, może to być .pem lub .der): -certSign.selectP12=Wybierz plik magazynu kluczy PKCS#12 (.p12 lub .pfx) (opcjonalnie, jeśli jest podany, powinien zawierać klucz prywatny i certyfikat): -certSign.certType=Typ certyfikatu -certSign.password=Wprowadź hasło do magazynu kluczy lub klucza prywatnego (jeśli istnieje): -certSign.showSig=Wyświetl podpis -certSign.reason=Organizacja -certSign.location=Lokalizacja -certSign.name=Nazwa -certSign.submit=Podpisz PDF - - -#removeBlanks -removeBlanks.title=Usuń puste -removeBlanks.header=Usuń puste strony -removeBlanks.threshold=Próg: -removeBlanks.thresholdDesc=Próg określający, jak biały musi być biały piksel -removeBlanks.whitePercent=Procent białego (%): -removeBlanks.whitePercentDesc=Procent strony, która musi być biała, aby została usunięta -removeBlanks.submit=Usuń puste - - -#compare -compare.title=Porównaj -compare.header=Porównaj PDF(y) -compare.document.1=Dokument 1 -compare.document.2=Dokument 2 -compare.submit=Porównaj - - -#sign -sign.title=Podpis -sign.header=Dodaj podpis do dokumentu PDF -sign.upload=Wczytaj opbraz -sign.draw=Narysuj podpis -sign.text=Wprowadź tekst -sign.clear=Wyczyść -sign.add=Dodaj - - -#repair -repair.title=Napraw -repair.header=Napraw dokument(y) PDF -repair.submit=Napraw - - -#flatten -flatten.title=Spłaszcz -flatten.header=Spłaszcz dokument(y) PDF -flatten.submit=Spłaszcz - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Próg kąta: -ScannerImageSplit.selectText.2=Ustawia minimalny kąt bezwzględny wymagany do obrócenia obrazu (domyślnie: 10). -ScannerImageSplit.selectText.3=Tolerancja: -ScannerImageSplit.selectText.4=Określa zakres zmienności kolorów wokół szacowanego koloru tła (domyślnie: 30). -ScannerImageSplit.selectText.5=Minimalna powierzchnia: -ScannerImageSplit.selectText.6=Ustawia próg minimalnego obszaru dla zdjęcia (domyślnie: 10000). -ScannerImageSplit.selectText.7=Minimalny obszar konturu: -ScannerImageSplit.selectText.8=Ustawia próg minimalnego obszaru konturu dla zdjęcia -ScannerImageSplit.selectText.9=Rozmiar obramowania: -ScannerImageSplit.selectText.10=Ustawia rozmiar dodawanego i usuwanego obramowania, aby uniknąć białych obramowań na wyjściu (domyślnie: 1). - - -#OCR -ocr.title=OCR / Zamiana na tekst -ocr.header=OCR / Zamiana na tekst (optyczne rozpoznawanie znaków) -ocr.selectText.1=Wybierz języki, które mają zostać wykryte w dokumencie PDF (te z listy to języki, które są obecnie wykrywane): -ocr.selectText.2=Utwórz plik tekstowy zawierający tekst OCR oraz dokument PDF z OCR -ocr.selectText.3=Prawidłowe strony zostały zeskanowane pod przekrzywionym kątem przez obrócenie ich z powrotem na miejsce -ocr.selectText.4=Wyczyść stronę, więc jest mniej prawdopodobne że OCR znajdzie tekst w obrazie tła. (Brak zmiany wyjścia) -ocr.selectText.5=Wyczyść stronę, więc jest mniej prawdopodobne że OCR znajdzie tekst w obrazie tła, utrzymuje porządek na wyjściu. -ocr.selectText.6=Ignoruje strony zawierające interaktywny tekst, tylko strony OCR, które są obrazami -ocr.selectText.7=Wymuś OCR, każda strona usunie wszystkie oryginalne elementy tekstowe -ocr.selectText.8=Normalny (wystąpi błąd, jeśli plik PDF zawiera tekst) -ocr.selectText.9=Dodatkowe ustawienia -ocr.selectText.10=Tryb OCR -ocr.selectText.11=Usuń obrazy po OCR (usuwa wszystkie obrazy, przydatne tylko, jeśli jest częścią etapu konwersji) -ocr.selectText.12=Typ renderowania (zaawansowany) -ocr.help=Przeczytaj tę dokumentację, aby dowiedzieć się, jak używać tego w innych językach i/lub nie używać docker -ocr.credit=Ta usługa używa OCRmyPDF i Tesseract do OCR. -ocr.submit=Przetwarzaj PDF za pomocą OCR - - -#extractImages -extractImages.title=Wyodrębnij obrazy -extractImages.header=Wyodrębnij obrazy -extractImages.selectText=Wybierz format obrazu, na który chcesz przekonwertować wyodrębniony obraz. -extractImages.submit=Wyodrębnij - - -#File to PDF -fileToPDF.title=Plik na PDF -fileToPDF.header=Konwertuj dowolny plik na dokument PDF -fileToPDF.credit=Ta usługa używa LibreOffice i Unoconv do konwersji plików. -fileToPDF.supportedFileTypes=Obsługiwane typy plików powinny być zgodne z poniższymi, jednak pełną zaktualizowaną listę obsługiwanych formatów można znaleźć w dokumentacji LibreOffice -fileToPDF.submit=Konwertuj na PDF - - -#compress -compress.title=Kompresuj -compress.header=Kompresuj PDF -compress.credit=Ta usługa używa Ghostscript do kompresji/optymalizacji PDF. -compress.selectText.1=Tryb ręczny - Od 1 do 4 -compress.selectText.2=Poziom optymalizacji: -compress.selectText.3=4 (Straszne dla obrazów tekstowych) -compress.selectText.4=Tryb automatyczny - Automatycznie dostosowuje jakość, aby uzyskać dokładny rozmiar pliku PDF -compress.selectText.5=Oczekiwany rozmiar pliku PDF (np. 25 MB, 10,8 MB, 25 KB) -compress.submit=Kompresuj - - -#Add image -addImage.title=Dodaj obraz -addImage.header=Dodaj obraz do PDF -addImage.everyPage=Każda strona? -addImage.upload=Dodaj obraz -addImage.submit=Dodaj obraz - - -#merge -merge.title=Połącz -merge.header=Połącz wiele dokumentów PDF (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Połącz - - -#pdfOrganiser -pdfOrganiser.title=Kolejność stron -pdfOrganiser.header=Kolejność stron PDF -pdfOrganiser.submit=Zmień kolejność stron - - -#multiTool -multiTool.title=Multi narzędzie PDF -multiTool.header=Multi narzędzie PDF - - -#pageRemover -pageRemover.title=Narzędzie do usuwania stron -pageRemover.header=Narzędzie do usuwania stron w dokumentach PDF -pageRemover.pagesToDelete=Strony do usunięcia (wprowadź listę numerów stron oddzielonych przecinkami): -pageRemover.submit=Usuń strony - - -#rotate -rotate.title=Obróć dokument PDF -rotate.header=Obróć dokument PDF -rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni): -rotate.submit=Obróć - - -#merge -split.title=Podziel dokument PDF -split.header=Podziel dokument PDF -split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału -split.desc.2=Np. taki wybór 1,3,7-8 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z: -split.desc.3=Dokument #1: Strona 1 -split.desc.4=Dokument #2: Strona 2 i 3 -split.desc.5=Dokument #3: Strona 4, 5 i 6 -split.desc.6=Dokument #4: Strona 7 -split.desc.7=Dokument #5: Strona 8 -split.desc.8=Dokument #6: Strona 9 i 10 -split.splitPages=Wprowadź strony do podziału na: -split.submit=Podziel - - -#merge -imageToPDF.title=Obraz na PDF -imageToPDF.header=Obraz na PDF -imageToPDF.submit=Konwertuj -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Automatyczne obracanie PDF -imageToPDF.selectText.3=Logika wielu plików (dostępna tylko w przypadku pracy z wieloma obrazami) -imageToPDF.selectText.4=Połącz w jeden dokument PDF -imageToPDF.selectText.5=Konwertuj na osobne dokumenty PDF - - -#pdfToImage -pdfToImage.title=PDF na Obraz -pdfToImage.header=PDF na Obraz -pdfToImage.selectText=Format obrazu -pdfToImage.singleOrMultiple=Typ pliku obrazu -pdfToImage.single=Pojedynczy duży obraz -pdfToImage.multi=Wiele obrazów -pdfToImage.colorType=Rodzaj koloru -pdfToImage.color=Kolor -pdfToImage.grey=Odcień szarości -pdfToImage.blackwhite=Czarno-biały (może spowodować utratę danych!) -pdfToImage.submit=Konwertuj - - -#addPassword -addPassword.title=Dodaj hasło -addPassword.header=Dodaj hasło (zaszyfruj) -addPassword.selectText.1=Wybierz plik PDF do zaszyfrowania -addPassword.selectText.2=Hasło -addPassword.selectText.3=Długość hasła -addPassword.selectText.4=Wyższe wartości są silniejsze, ale niższe wartości zapewniają lepszą kompatybilność. -addPassword.selectText.5=Uprawnienia do zmian -addPassword.selectText.6=Zablokuj zmiany w dokumencie -addPassword.selectText.7=Zablokuj zmiany w treści -addPassword.selectText.8=Zablokuj zmiany w celu ułatwienia dostępu -addPassword.selectText.9=Zablokuj wypełnianie formularzy -addPassword.selectText.10=Zablokuj modyfikacje -addPassword.selectText.11=Zablokuj modyfikacje adnotacji -addPassword.selectText.12=Zablokuj drukowanie -addPassword.selectText.13=Zablokuj drukowanie różnych formatów -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Zablokuj - - -#watermark -watermark.title=Dodaj znak wodny -watermark.header=Dodaj znak wodny -watermark.selectText.1=Wybierz dokument PDF, do którego chcesz dodać znak wodny: -watermark.selectText.2=Treść znaku wodnego: -watermark.selectText.3=Rozmiar czcionki: -watermark.selectText.4=Obrót (0-360): -watermark.selectText.5=Odstęp w poziomie (odstęp między każdym znakiem wodnym w poziomie): -watermark.selectText.6=Odstęp w pionie (odstęp między każdym znakiem wodnym w pionie): -watermark.selectText.7=Nieprzezroczystość (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Dodaj znak wodny - - -#Change permissions -permissions.title=Zmień uprawnienia -permissions.header=Zmień uprawnienia -permissions.warning=Ostrzeżenie, aby te uprawnienia były zablokowane, zaleca się ustawienie hasła na stronie dodawania hasła -permissions.selectText.1=Wybierz dokument PDF, aby zmienić uprawnienia -permissions.selectText.2=Uprawnienia do zmian -permissions.selectText.3=Zablokuj zmiany w dokumencie -permissions.selectText.4=Zablokuj zmiany w treści -permissions.selectText.5=Zablokuj zmiany w celu ułatwienia dostępu -permissions.selectText.6=Zablokuj wypełnianie formularzy -permissions.selectText.7=Zablokuj modyfikacje -permissions.selectText.8=Zablokuj modyfikacje adnotacji -permissions.selectText.9=Zablokuj drukowanie -permissions.selectText.10=Zablokuj drukowanie różnych formatów -permissions.submit=Zmień - - -#remove password -removePassword.title=Usuń hasło -removePassword.header=Usuń hasło (odszyfruj) -removePassword.selectText.1=Wybierz dokument PDF do odszyfrowania -removePassword.selectText.2=Hasło -removePassword.submit=Usuń - - -#changeMetadata -changeMetadata.title=Tytuł: -changeMetadata.header=Zmień metadane -changeMetadata.selectText.1=Edytuj zmienne, które chcesz zmienić -changeMetadata.selectText.2=Usuń wszystkie metadane -changeMetadata.selectText.3=Pokaż niestandardowe metadane: -changeMetadata.author=Autor: -changeMetadata.creationDate=Data utworzenia (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Twórca: -changeMetadata.keywords=Słowa kluczowe: -changeMetadata.modDate=Data modyfikacji (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Producent: -changeMetadata.subject=Temat: -changeMetadata.title=Tytuł: -changeMetadata.trapped=Zablokowany: -changeMetadata.selectText.4=Inne metadane: -changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych -changeMetadata.submit=Zmień - - -#pdfToPDFA -pdfToPDFA.title=PDF na PDF/A -pdfToPDFA.header=PDF na PDF/A -pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A -pdfToPDFA.submit=Konwertuj - - -#PDFToWord -PDFToWord.title=PDF na Word -PDFToWord.header=PDF na Word -PDFToWord.selectText.1=Format pliku wyjściowego -PDFToWord.credit=Ta usługa używa LibreOffice do konwersji plików. -PDFToWord.submit=Konwertuj - - -#PDFToPresentation -PDFToPresentation.title=PDF na Prezentację -PDFToPresentation.header=PDF na Prezentację -PDFToPresentation.selectText.1=Format pliku wyjściowego -PDFToPresentation.credit=Ta usługa używa LibreOffice do konwersji plików. -PDFToPresentation.submit=Konwertuj - - -#PDFToText -PDFToText.title=PDF na Tekst/RTF -PDFToText.header=PDF na Tekst/RTF -PDFToText.selectText.1=Format pliku wyjściowego -PDFToText.credit=Ta usługa używa LibreOffice do konwersji plików. -PDFToText.submit=Konwertuj - - -#PDFToHTML -PDFToHTML.title=PDF na HTML -PDFToHTML.header=PDF na HTML -PDFToHTML.credit=Ta usługa używa LibreOffice do konwersji plików. -PDFToHTML.submit=Konwertuj - - -#PDFToXML -PDFToXML.title=PDF na XML -PDFToXML.header=PDF na XML -PDFToXML.credit=Ta usługa używa LibreOffice do konwersji plików. -PDFToXML.submit=Konwertuj diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties deleted file mode 100644 index 879f3715..00000000 --- a/src/main/resources/messages_pt_BR.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Selecione PDF(s) -multiPdfPrompt=Selecione PDFs (2+) -multiPdfDropPrompt=Selecione (ou arraste e solte) todos os PDFs necessários -imgPrompt=Selecione a(s) imagem(ns) -genericSubmit=Enviar -processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo -pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página): -goToPage=Ir -true=Verdadeiro -false=Falso -unknown=Desconhecido -save=Salvar -close=Fechar -filesSelected=arquivos selecionados -noFavourites=Nenhum favorito adicionado -bored=Entediado esperando? -alphabet=Alfabeto -downloadPdf=baixar PDF -text=Texto -font=Fonte -selectFillter=-- Selecione -- -pageNum=Número de página -sizes.small=Pequeno -sizes.medium=Médio -sizes.large=Grande -sizes.x-large=Muito grande -error.pdfPassword=O documento PDF está protegido por senha e a senha não foi fornecida ou está incorreta -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Converter -navbar.security=Segurança -navbar.other=Outro -navbar.darkmode=Modo Escuro -navbar.pageOps=Operações de página -navbar.settings=Configurações - -############# -# SETTINGS # -############# -settings.title=Configurações -settings.update=Atualização disponível -settings.appVersion=Versão do aplicativo: -settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): -settings.downloadOption.1=Abrir na mesma janela -settings.downloadOption.2=Abrir em nova janela -settings.downloadOption.3=⇬ Fazer download do arquivo -settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Seu melhor utilitário para suas necessidades de PDF. - - -home.multiTool.title=Multiferramenta de PDF -home.multiTool.desc=Mesclar, girar, reorganizar e remover páginas -multiTool.tags=Multi Ferramenta, Operação Múltipla, Interface do Usuário, Clique e Arraste, Front-end, Lado do Cliente - -home.merge.title=Mesclar -home.merge.desc=Mesclar facilmente vários PDFs em um só. -merge.tags=mesclar, Operações de Página, Lado do Servidor - -home.split.title=Dividir -home.split.desc=Dividir PDFs em vários documentos -split.tags=Operações de Página, dividir, Múltiplas Páginas, cortar, Lado do Servidor - -home.rotate.title=Girar -home.rotate.desc=Girar facilmente seus PDFs. -rotate.tags=Lado do Servidor - - -home.imageToPdf.title=Imagem para PDF -home.imageToPdf.desc=Converter uma imagem (PNG, JPEG, GIF) em PDF. -imageToPdf.tags=conversão, img, jpg, imagem, foto - -home.pdfToImage.title=PDF para Imagem -home.pdfToImage.desc=Converter um PDF em uma imagem. (PNG, JPG, GIF) -pdfToImage.tags=conversão, img, jpg, imagem, foto - -home.pdfOrganiser.title=Organizar -home.pdfOrganiser.desc=Remover/reorganizar as páginas em qualquer ordem. -pdfOrganiser.tags=duplex, par, ímpar, ordenar, mover - - -home.addImage.title=Adicionar Imagem -home.addImage.desc=Adicionar uma imagem em um local definido no PDF (trabalho em andamento) -addImage.tags=img, jpg, imagem, foto - -home.watermark.title=Adicionar Marca d'água -home.watermark.desc=Adicionar uma marca d'água personalizada ao seu documento PDF. -watermark.tags=Texto, repetindo, rótulo, próprio, direitos autorais, marca registrada, img, jpg, imagem, foto - -home.permissions.title=Alterar Permissões -home.permissions.desc=Alterar as permissões do seu documento PDF. -permissions.tags=leitura, escrita, edição, impressão - - -home.removePages.title=Remover -home.removePages.desc=Excluir as páginas indesejadas do seu documento PDF. -removePages.tags=Remover páginas, excluir páginas - -home.addPassword.title=Adicionar Senha -home.addPassword.desc=Criptografar seu documento PDF com uma senha. -addPassword.tags=seguro, segurança - -home.removePassword.title=Remover Senha -home.removePassword.desc=Remover a proteção por senha do seu documento PDF. -removePassword.tags=seguro, Descriptografar, segurança, remover senha - -home.compressPdfs.title=Comprimir -home.compressPdfs.desc=Comprimir PDFs para reduzir o tamanho do arquivo. -compressPdfs.tags=compactar, pequeno, mínimo - - -home.changeMetadata.title=Alterar Metadados -home.changeMetadata.desc=Alterar/remover/adicionar metadados de um documento PDF. -changeMetadata.tags=Título, autor, data, criação, hora, editor, produtor, estatísticas - -home.fileToPDF.title=Converter Arquivo para PDF -home.fileToPDF.desc=Converter praticamente qualquer arquivo em PDF (DOCX, PNG, XLS, PPT, TXT e mais) -fileToPDF.tags=transformação, formato, documento, imagem, slide, texto, conversão, escritório, documentos, word, excel, powerpoint - -home.ocr.title=OCR / Limpeza de Digitalizações -home.ocr.desc=A limpeza verifica e detecta texto em imagens de um PDF e o adiciona novamente como texto. -ocr.tags=reconhecimento, texto, imagem, digitalização, leitura, identificação, detecção, editável - - -home.extractImages.title=Extrair Imagens -home.extractImages.desc=Extrair todas as imagens de um PDF e salvá-las em um arquivo zip. -extractImages.tags=imagem, foto, salvar, arquivo, zip, captura, coleta - -home.pdfToPDFA.title=PDF para PDF/A -home.pdfToPDFA.desc=Converter PDF para o formato PDF/A para armazenamento a longo prazo. -pdfToPDFA.tags=arquivo, longo prazo, padrão, conversão, armazenamento, preservação - -home.PDFToWord.title=PDF para Word -home.PDFToWord.desc=Converter PDF para formatos Word (DOC, DOCX e ODT) -PDFToWord.tags=doc, docx, odt, word, transformação, formato, conversão, escritório, microsoft, arquivo doc - -home.PDFToPresentation.title=PDF para Apresentação -home.PDFToPresentation.desc=Converter PDF para formatos de apresentação (PPT, PPTX e ODP) -PDFToPresentation.tags=slides, apresentação, escritório, microsoft - -home.PDFToText.title=PDF para Texto/RTF -home.PDFToText.desc=Converter PDF em formato de texto ou RTF -PDFToText.tags=formato rico, formato de texto enriquecido, formato de texto rico - -home.PDFToHTML.title=PDF para HTML -home.PDFToHTML.desc=Converter PDF para o formato HTML -PDFToHTML.tags=conteúdo web, compatível com navegador - - -home.PDFToXML.title=PDF para XML -home.PDFToXML.desc=Converter PDF para o formato XML -PDFToXML.tags=extração-de-dados,conteúdo-estruturado,interoperabilidade,transformação,converter - -home.ScannerImageSplit.title=Detectar/Dividir Fotos Digitalizadas -home.ScannerImageSplit.desc=Divide várias fotos de dentro de uma imagem/PDF digitalizado -ScannerImageSplit.tags=separar,detecção-automática,digitalizações,foto-múltipla,organizar - -home.sign.title=Assinar -home.sign.desc=Adicionar assinatura ao PDF por desenho, texto ou imagem -sign.tags=autorizar,iniciais,assinatura-desenhada,assinatura-de-texto,assinatura-de-imagem - -home.flatten.title=Achatar -home.flatten.desc=Remover todos os elementos e formulários interativos de um PDF -flatten.tags=estático,desativar,não-interativo,otimizar - -home.repair.title=Reparar -home.repair.desc=Tentar reparar um PDF corrompido/quebrado -repair.tags=corrigir,restaurar,correção,recuperar - -home.removeBlanks.title=Remover Páginas em Branco -home.removeBlanks.desc=Detectar e remover páginas em branco de um documento -removeBlanks.tags=limpeza,otimização,sem-conteúdo,organizar - -home.compare.title=Comparar -home.compare.desc=Comparar e mostrar as diferenças entre 2 documentos PDF -compare.tags=diferenciar,contraste,mudanças,análise - -home.certSign.title=Assinar com Certificado -home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) -certSign.tags=autenticar,PEM,P12,oficial,criptografar - -home.pageLayout.title=Layout de Múltiplas Páginas -home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página -pageLayout.tags=mesclar,composto,vista-única,organizar - -home.scalePages.title=Ajustar Tamanho/Escala de Página -home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo. -scalePages.tags=redimensionar,modificar,dimensão,adaptar - -home.pipeline.title=Pipeline (Avançado) -home.pipeline.desc=Executar várias ações em PDFs definindo scripts de pipeline -pipeline.tags=automatizar,sequência,scriptado,processo-em-lote - -home.add-page-numbers.title=Adicionar Números de Página -home.add-page-numbers.desc=Adicionar números de página em todo o documento em um local definido -add-page-numbers.tags=paginar,rotular,organizar,índice - -home.auto-rename.title=Renomear Automaticamente o Arquivo PDF -home.auto-rename.desc=Renomeia automaticamente um arquivo PDF com base no cabeçalho detectado -auto-rename.tags=detecção-automática,baseado-em-cabeçalho,organizar,relabel - -home.adjust-contrast.title=Ajustar Cores/Contraste -home.adjust-contrast.desc=Ajustar Contraste, Saturação e Brilho de um PDF -adjust-contrast.tags=correção-de-cor,ajustar,modificar,realçar - -home.crop.title=Cortar PDF -home.crop.desc=Cortar um PDF para reduzir o tamanho (mantém o texto!) -crop.tags=aparar,encolher,editar,formato - -home.autoSplitPDF.title=Divisão Automática de Páginas -home.autoSplitPDF.desc=Dividir automaticamente um PDF digitalizado com separador de páginas físicas QR Code -autoSplitPDF.tags=baseado-em-QR,separar,segmento-de-digitalização,organizar - -home.sanitizePdf.title=Sanitizar -home.sanitizePdf.desc=Remover scripts e outros elementos de arquivos PDF -sanitizePdf.tags=limpar,seguro,protegido,remover-ameaças - -home.URLToPDF.title=Converter Site para PDF -home.URLToPDF.desc=Converte qualquer página da internet para um arquivo PDF -URLToPDF.tags=captura-de-web,salvar-página,web-para-doc,arquivar - -home.HTMLToPDF.title=HTML para PDF -home.HTMLToPDF.desc=Converte qualquer arquivo HTML ou zip para PDF -HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter - - -home.MarkdownToPDF.title=Markdown para PDF -home.MarkdownToPDF.desc=Converte qualquer arquivo Markdown para PDF -MarkdownToPDF.tags=marcação,conteúdo-web,transformação,converter - - -home.getPdfInfo.title=Obter TODAS as Informações de um PDF -home.getPdfInfo.desc=Obtém todas as informações possíveis de um PDF -getPdfInfo.tags=informações,dados,estatísticas - - -home.extractPage.title=Extrair Página(s) -home.extractPage.desc=Extrai páginas selecionadas de um PDF -extractPage.tags=extrair - - -home.PdfToSinglePage.title=PDF para Página Única Grande -home.PdfToSinglePage.desc=Combina todas as páginas de um PDF em uma única página grande -PdfToSinglePage.tags=página única - - -home.showJS.title=Mostrar Javascript -home.showJS.desc=Procura e exibe qualquer JavaScript injetado em um PDF -showJS.tags=JavaScript - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JavaScript - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Exibir JavaScript -showJS.header=Exibir JavaScript -showJS.downloadJS=Download do JavaScript -showJS.submit=Exibir - - -#pdfToSinglePage -pdfToSinglePage.title=PDF para Página Única -pdfToSinglePage.header=PDF para Página Única -pdfToSinglePage.submit=Converter para Página Única - - -#pageExtracter -pageExtracter.title=Extrair Páginas -pageExtracter.header=Extrair Páginas -pageExtracter.submit=Extrair - - -#getPdfInfo -getPdfInfo.title=Obter Informações do PDF -getPdfInfo.header=Obter Informações do PDF -getPdfInfo.submit=Obter Informações -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown para PDF -MarkdownToPDF.header=Markdown para PDF -MarkdownToPDF.submit=Converter -MarkdownToPDF.help=Trabalho em andamento -MarkdownToPDF.credit=Usa o WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL para PDF -URLToPDF.header=URL para PDF -URLToPDF.submit=Converter -URLToPDF.credit=Usa o WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML para PDF -HTMLToPDF.header=HTML para PDF -HTMLToPDF.help=Aceita arquivos HTML e ZIPs contendo html/css/imagens etc necessários -HTMLToPDF.submit=Converter -HTMLToPDF.credit=Usa o WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitizar PDF -sanitizePDF.header=Sanitizar um arquivo PDF -sanitizePDF.selectText.1=Remover ações de JavaScript -sanitizePDF.selectText.2=Remover arquivos embutidos -sanitizePDF.selectText.3=Remover metadados -sanitizePDF.selectText.4=Remover links -sanitizePDF.selectText.5=Remover fontes -sanitizePDF.submit=Sanitizar PDF - - -#addPageNumbers -addPageNumbers.title=Adicionar Números de Página -addPageNumbers.header=Adicionar Números de Página -addPageNumbers.selectText.1=Selecionar arquivo PDF: -addPageNumbers.selectText.2=Tamanho da Margem -addPageNumbers.selectText.3=Posição -addPageNumbers.selectText.4=Número Inicial -addPageNumbers.selectText.5=Páginas a Numerar -addPageNumbers.selectText.6=Texto Personalizado -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Adicionar Números de Página - - -#auto-rename -auto-rename.title=Rename Automático -auto-rename.header=Rename Automático de PDF -auto-rename.submit=Rename Automático - - -#adjustContrast -adjustContrast.title=Ajustar Contraste -adjustContrast.header=Ajustar Contraste -adjustContrast.contrast=Contraste: -adjustContrast.brightness=Brilho: -adjustContrast.saturation=Saturação: -adjustContrast.download=Download - - -#crop -crop.title=Cortar -crop.header=Cortar Imagem -crop.submit=Enviar - - -#autoSplitPDF -autoSplitPDF.title=Divisão Automática de PDF -autoSplitPDF.header=Divisão Automática de PDF -autoSplitPDF.description=Imprima, insira, digitalize, faça o upload e deixe que a gente divida seus documentos automaticamente. Nenhuma classificação manual necessária. -autoSplitPDF.selectText.1=Imprima algumas folhas divisórias abaixo (preto e branco está bom). -autoSplitPDF.selectText.2=Digitalize todos os seus documentos de uma vez, inserindo a folha divisória entre eles. -autoSplitPDF.selectText.3=Faça o upload do único arquivo PDF grande digitalizado e deixe o Stirling PDF cuidar do resto. -autoSplitPDF.selectText.4=As páginas divisórias são detectadas e removidas automaticamente, garantindo um documento final organizado. -autoSplitPDF.formPrompt=Enviar PDF contendo folhas divisórias Stirling-PDF: -autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso) -autoSplitPDF.dividerDownload1=Download 'Folha Divisória Automática (mínima).pdf' -autoSplitPDF.dividerDownload2=Download 'Folha Divisória Automática (com instruções).pdf' -autoSplitPDF.submit=Enviar - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Layout de Múltiplas Páginas -pageLayout.header=Layout de Múltiplas Páginas -pageLayout.pagesPerSheet=Páginas por folha: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Enviar - - -#scalePages -scalePages.title=Ajustar Tamanho/Escala da Página -scalePages.header=Ajustar Tamanho/Escala da Página -scalePages.pageSize=Tamanho de uma página do documento. -scalePages.scaleFactor=Fator de zoom (corte) de uma página. -scalePages.submit=Enviar - - -#certSign -certSign.title=Assinatura com Certificado -certSign.header=Assine um PDF com o seu certificado (Em desenvolvimento) -certSign.selectPDF=Selecione um arquivo PDF para assinatura: -certSign.selectKey=Selecione o seu arquivo de chave privada (formato PKCS#8, pode ser .pem ou .der): -certSign.selectCert=Selecione o seu arquivo de certificado (formato X.509, pode ser .pem ou .der): -certSign.selectP12=Selecione o seu arquivo de armazenamento de chave PKCS#12 (.p12 ou .pfx) (opcional, se fornecido, deve conter a sua chave privada e certificado): -certSign.certType=Tipo de Certificado -certSign.password=Digite a senha do seu armazenamento de chave ou chave privada (se aplicável): -certSign.showSig=Mostrar Assinatura -certSign.reason=Razão -certSign.location=Localização -certSign.name=Nome -certSign.submit=Assinar PDF - - -#removeBlanks -removeBlanks.title=Remover Páginas em Branco -removeBlanks.header=Remover Páginas em Branco -removeBlanks.threshold=Limiar: -removeBlanks.thresholdDesc=Limiar para determinar o quão branco um pixel branco deve ser -removeBlanks.whitePercent=Porcentagem de Branco (%): -removeBlanks.whitePercentDesc=Porcentagem da página que deve ser branca para ser removida -removeBlanks.submit=Remover Páginas em Branco - - -#compare -compare.title=Comparar -compare.header=Comparar PDFs -compare.document.1=Documento 1 -compare.document.2=Documento 2 -compare.submit=Comparar - - -#sign -sign.title=Assinar -sign.header=Assinar PDFs -sign.upload=Enviar Imagem -sign.draw=Desenhar Assinatura -sign.text=Inserir Texto -sign.clear=Limpar -sign.add=Adicionar - - -#repair -repair.title=Reparar -repair.header=Reparar PDFs -repair.submit=Reparar - - -#flatten -flatten.title=Achatar -flatten.header=Achatar PDFs -flatten.submit=Achatar - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Limite de Ângulo: -ScannerImageSplit.selectText.2=Define o ângulo absoluto mínimo necessário para que a imagem seja girada (padrão: 10). -ScannerImageSplit.selectText.3=Tolerância: -ScannerImageSplit.selectText.4=Determina o intervalo de variação de cor em torno da cor de fundo estimada (padrão: 30). -ScannerImageSplit.selectText.5=Área Mínima: -ScannerImageSplit.selectText.6=Define o limite mínimo de área para uma foto (padrão: 10000). -ScannerImageSplit.selectText.7=Área mínima de contorno: -ScannerImageSplit.selectText.8=Define o limite mínimo da área de contorno para uma foto -ScannerImageSplit.selectText.9=Tamanho da Borda: -ScannerImageSplit.selectText.10=Define o tamanho da borda adicionada e removida para evitar bordas brancas na saída (padrão: 1). - - -#OCR -ocr.title=OCR / Limpeza de Digitalização -ocr.header=OCR / Limpeza de Digitalização (Reconhecimento Óptico de Caracteres) -ocr.selectText.1=Selecione os idiomas a serem detectados no PDF (os listados são os atualmente detectados): -ocr.selectText.2=Criar um arquivo de texto contendo o texto OCR ao lado do PDF com OCR -ocr.selectText.3=Páginas corretamente digitalizadas em um ângulo inclinado, gire-as de volta à posição original -ocr.selectText.4=Limpar a página para reduzir a probabilidade de o OCR encontrar texto no ruído de fundo (sem alteração na saída) -ocr.selectText.5=Limpar a página para reduzir a probabilidade de o OCR encontrar texto no ruído de fundo, mantendo a limpeza na saída. -ocr.selectText.6=Ignorar páginas com texto interativo, processar apenas as páginas de OCR que são imagens -ocr.selectText.7=Forçar OCR, executar OCR em todas as páginas, removendo todos os elementos de texto originais -ocr.selectText.8=Normal (gerará um erro se o PDF já contiver texto) -ocr.selectText.9=Configurações adicionais -ocr.selectText.10=Modo OCR -ocr.selectText.11=Remover imagens após o OCR (remove TODAS as imagens, útil apenas como parte do processo de conversão) -ocr.selectText.12=Render Type (Advanced) -ocr.help=Por favor, leia a documentação sobre como usar isso para outros idiomas e/ou fora do ambiente Docker -ocr.credit=Este serviço usa OCRmyPDF e Tesseract para OCR. -ocr.submit=Processar PDF com OCR - - -#extractImages -extractImages.title=Extrair Imagens -extractImages.header=Extrair Imagens -extractImages.selectText=Selecione o formato de imagem para converter as imagens extraídas -extractImages.submit=Extrair - - -#File to PDF -fileToPDF.title=Arquivo para PDF -fileToPDF.header=Converter Qualquer Arquivo para PDF -fileToPDF.credit=Este serviço usa o LibreOffice e o Unoconv para conversão de arquivos. -fileToPDF.supportedFileTypes=Os tipos de arquivo suportados devem incluir os listados abaixo. No entanto, para obter uma lista atualizada completa dos formatos suportados, consulte a documentação do LibreOffice. -fileToPDF.submit=Converter para PDF - - -#compress -compress.title=Comprimir -compress.header=Comprimir PDF -compress.credit=Este serviço usa o Ghostscript para compressão/otimização de PDF. -compress.selectText.1=Modo Manual - De 1 a 4 -compress.selectText.2=Nível de Otimização: -compress.selectText.3=4 (Pior para imagens de texto) -compress.selectText.4=Modo Automático - Ajusta automaticamente a qualidade para atingir o tamanho exato do PDF -compress.selectText.5=Tamanho Esperado do PDF (por exemplo, 25 MB, 10,8 MB, 25 KB) -compress.submit=Comprimir - - -#Add image -addImage.title=Adicionar Imagem -addImage.header=Adicionar Imagem ao PDF -addImage.everyPage=Para cada página? -addImage.upload=Enviar Imagem -addImage.submit=Adicionar Imagem - - -#merge -merge.title=Mesclar -merge.header=Mesclar Vários PDFs (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Mesclar - - -#pdfOrganiser -pdfOrganiser.title=Organizador de Páginas -pdfOrganiser.header=Organizador de Páginas PDF -pdfOrganiser.submit=Reorganizar Páginas - - -#multiTool -multiTool.title=Multiferramenta de PDF -multiTool.header=Multiferramenta de PDF - - -#pageRemover -pageRemover.title=Remover Página -pageRemover.header=Remover Páginas do PDF -pageRemover.pagesToDelete=Páginas a serem excluídas (insira uma lista separada por vírgulas de números de página): -pageRemover.submit=Excluir Páginas - - -#rotate -rotate.title=Girar PDF -rotate.header=Girar PDF -rotate.selectAngle=Selecione o ângulo de rotação (múltiplos de 90 graus): -rotate.submit=Girar - - -#merge -split.title=Dividir PDF -split.header=Dividir PDF -split.desc.1=Os números selecionados correspondem às páginas onde você deseja fazer a divisão. -split.desc.2=Por exemplo, selecionar 1,3,7-8 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma: -split.desc.3=Documento Nº1: Página 1 -split.desc.4=Documento Nº2: Páginas 2 e 3 -split.desc.5=Documento Nº3: Páginas 4, 5 e 6 -split.desc.6=Documento Nº4: Página 7 -split.desc.7=Documento Nº5: Página 8 -split.desc.8=Documento Nº6: Páginas 9 e 10 -split.splitPages=Digite as páginas para a divisão: -split.submit=Dividir - - -#merge -imageToPDF.title=Imagem para PDF -imageToPDF.header=Converter Imagem para PDF -imageToPDF.submit=Converter -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Girar Automaticamente -imageToPDF.selectText.3=Lógica de Vários Arquivos (Ativada apenas ao trabalhar com várias imagens) -imageToPDF.selectText.4=Mesclar em um Único PDF -imageToPDF.selectText.5=Converter em PDFs Separados - - -#pdfToImage -pdfToImage.title=PDF para Imagem -pdfToImage.header=Converter PDF para Imagem -pdfToImage.selectText=Formato de Imagem -pdfToImage.singleOrMultiple=Tipo de Resultado de Imagem -pdfToImage.single=Única Imagem Grande -pdfToImage.multi=Múltiplas Imagens -pdfToImage.colorType=Tipo de Cor -pdfToImage.color=Colorida -pdfToImage.grey=Escala de Cinza -pdfToImage.blackwhite=Preto e Branco (pode resultar em perda de dados!) -pdfToImage.submit=Converter - - -#addPassword -addPassword.title=Adicionar Senha -addPassword.header=Adicionar Senha (Criptografar) -addPassword.selectText.1=Selecione o PDF para Criptografar -addPassword.selectText.2=Senha -addPassword.selectText.3=Tamanho da Chave de Criptografia -addPassword.selectText.4=Valores mais altos são mais seguros, mas valores mais baixos são mais compatíveis. -addPassword.selectText.5=Permissões para Definir -addPassword.selectText.6=Impedir Montagem do Documento -addPassword.selectText.7=Impedir Extração de Conteúdo -addPassword.selectText.8=Impedir Extração para Acessibilidade -addPassword.selectText.9=Impedir Preenchimento de Formulário -addPassword.selectText.10=Impedir Modificação -addPassword.selectText.11=Impedir Modificação de Anotação -addPassword.selectText.12=Impedir Impressão -addPassword.selectText.13=Impedir Impressão de Formatos Diferentes -addPassword.selectText.14=Senha do Proprietário -addPassword.selectText.15=Restringe o que pode ser feito com o documento após a abertura (nem todos os leitores dão suporte a isso) -addPassword.selectText.16=Restringe a abertura do próprio documento -addPassword.submit=Criptografar - - -#watermark -watermark.title=Adicionar Marca d'Água -watermark.header=Adicionar Marca d'Água -watermark.selectText.1=Selecione o PDF para Adicionar a Marca d'Água -watermark.selectText.2=Texto da Marca d'Água -watermark.selectText.3=Tamanho da Fonte -watermark.selectText.4=Rotação (0-360) -watermark.selectText.5=Espaçamento Horizontal (widthSpacer) -watermark.selectText.6=Espaçamento Vertical (heightSpacer) -watermark.selectText.7=Opacidade (0% - 100%) -watermark.selectText.8=Tipo de Marca d'Água -watermark.selectText.9=Imagem da Marca d'Água -watermark.submit=Adicionar Marca d'Água - - -#Change permissions -permissions.title=Alterar Permissões -permissions.header=Alterar Permissões -permissions.warning=Nota: Para tornar essas permissões inalteráveis, é recomendável defini-las com uma senha através da página "Adicionar Senha". -permissions.selectText.1=Selecione o PDF para Alterar as Permissões -permissions.selectText.2=Permissões para Definir -permissions.selectText.3=Impedir Montagem do Documento -permissions.selectText.4=Impedir Extração de Conteúdo -permissions.selectText.5=Impedir Extração para Acessibilidade -permissions.selectText.6=Impedir Preenchimento de Formulário -permissions.selectText.7=Impedir Modificações -permissions.selectText.8=Impedir Modificação de Anotação -permissions.selectText.9=Impedir Impressão -permissions.selectText.10=Impedir Impressão de Formatos Diferentes -permissions.submit=Mudar - - -#remove password -removePassword.title=Remover Senha -removePassword.header=Remover Senha (Descriptografar) -removePassword.selectText.1=Selecione o PDF para Descriptografar -removePassword.selectText.2=Senha -removePassword.submit=Remover - - -#changeMetadata -changeMetadata.title=Título: -changeMetadata.header=Alterar Metadados -changeMetadata.selectText.1=Edite as Variáveis que Deseja Alterar -changeMetadata.selectText.2=Excluir Todos os Metadados -changeMetadata.selectText.3=Mostrar Metadados Personalizados -changeMetadata.author=Autor: -changeMetadata.creationDate=Data de Criação (aaaa/MM/dd HH:mm:ss): -changeMetadata.creator=Criador: -changeMetadata.keywords=Palavras-chave: -changeMetadata.modDate=Data de Modificação (aaaa/MM/dd HH:mm:ss): -changeMetadata.producer=Produtor: -changeMetadata.subject=Assunto: -changeMetadata.title=Título: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Outros Metadados -changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizados -changeMetadata.submit=Mudar - - -#pdfToPDFA -pdfToPDFA.title=PDF para PDF/A -pdfToPDFA.header=PDF para PDF/A -pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A -pdfToPDFA.submit=Converter - - -#PDFToWord -PDFToWord.title=PDF para Word -PDFToWord.header=PDF para Word -PDFToWord.selectText.1=Formato do Arquivo de Saída -PDFToWord.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. -PDFToWord.submit=Converter - - -#PDFToPresentation -PDFToPresentation.title=PDF para Apresentação -PDFToPresentation.header=PDF para Apresentação -PDFToPresentation.selectText.1=Formato do Arquivo de Saída -PDFToPresentation.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. -PDFToPresentation.submit=Converter - - -#PDFToText -PDFToText.title=PDF para Texto/RTF -PDFToText.header=PDF para Texto/RTF -PDFToText.selectText.1=Formato do Arquivo de Saída -PDFToText.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. -PDFToText.submit=Converter - - -#PDFToHTML -PDFToHTML.title=PDF para HTML -PDFToHTML.header=PDF para HTML -PDFToHTML.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. -PDFToHTML.submit=Converter - - -#PDFToXML -PDFToXML.title=PDF para XML -PDFToXML.header=PDF para XML -PDFToXML.credit=Este serviço usa o LibreOffice para Conversão de Arquivos. -PDFToXML.submit=Converter diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties deleted file mode 100644 index 46dad1ba..00000000 --- a/src/main/resources/messages_ro_RO.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Selectează fișiere PDF -multiPdfPrompt=Selectează mai multe fișiere PDF (2+) -multiPdfDropPrompt=Selectează (sau trage și plasează) toate fișierele PDF de care ai nevoie -imgPrompt=Selectează imagini -genericSubmit=Trimite -processTimeWarning=Avertisment: Acest proces poate dura până la un minut în funcție de dimensiunea fișierului -pageOrderPrompt=Ordinea paginilor (Introdu o listă separată prin virgulă de numere de pagină): -goToPage=Mergi la pagină -true=Adevărat -false=Fals -unknown=Necunoscut -save=Salvează -close=Închide -filesSelected=fișiere selectate -noFavourites=Niciun favorit adăugat -bored=Plictisit așteptând? -alphabet=Alfabet -downloadPdf=Descarcă PDF -text=Text -font=Font -selectFillter=-- Selectează -- -pageNum=Numărul paginii -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Converteste -navbar.security=Securitate -navbar.other=Altele -navbar.darkmode=Mod întunecat -navbar.pageOps=Operații pe pagină -navbar.settings=Setări - -############# -# SETTINGS # -############# -settings.title=Setări -settings.update=Actualizare disponibilă -settings.appVersion=Versiune aplicație: -settings.downloadOption.title=Alege opțiunea de descărcare (pentru descărcarea unui singur fișier non-zip): -settings.downloadOption.1=Deschide în aceeași fereastră -settings.downloadOption.2=Deschide într-o fereastră nouă -settings.downloadOption.3=Descarcă fișierul -settings.zipThreshold=Împachetează fișierele când numărul de fișiere descărcate depășește -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Un singur punct de oprire găzduit local pentru toate nevoile tale legate de fișiere PDF. - - -home.multiTool.title=Instrument multiplu PDF -home.multiTool.desc=Unifică, rotește, rearanjează și elimină pagini -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Unifică -home.merge.desc=Unifică cu ușurință mai multe fișiere PDF într-unul singur. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Desparte -home.split.desc=Desparte fișierele PDF în mai multe documente. -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Rotește -home.rotate.desc=Rotește cu ușurință fișierele PDF. -rotate.tags=server side - - -home.imageToPdf.title=Imagine în PDF -home.imageToPdf.desc=Convertește o imagine (PNG, JPEG, GIF) în PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF în Imagine -home.pdfToImage.desc=Convertește un fișier PDF în imagine (PNG, JPEG, GIF). -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Organizează -home.pdfOrganiser.desc=Elimină/rearanjează pagini în orice ordine -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Adaugă imagine -home.addImage.desc=Adaugă o imagine într-o locație specifică pe PDF (în curs de dezvoltare) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Adaugă Filigran -home.watermark.desc=Adaugă un filigran personalizat la documentul PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Schimbă permisiuni -home.permissions.desc=Schimbă permisiunile documentului PDF -permissions.tags=read,write,edit,print - - -home.removePages.title=Elimină -home.removePages.desc=Șterge paginile nedorite din documentul PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Adaugă Parolă -home.addPassword.desc=Criptează documentul PDF cu o parolă. -addPassword.tags=secure,security - -home.removePassword.title=Elimină Parola -home.removePassword.desc=Elimină protecția cu parolă din documentul PDF. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Comprimă -home.compressPdfs.desc=Comprimă fișierele PDF pentru a reduce dimensiunea lor. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Schimbă Metadatele -home.changeMetadata.desc=Schimbă/Elimină/Adaugă metadate într-un document PDF. -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Convertește fișierul în PDF -home.fileToPDF.desc=Convertește aproape orice fișier în format PDF (DOCX, PNG, XLS, PPT, TXT și altele). -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Curățare scanări -home.ocr.desc=Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Extrage Imagini -home.extractImages.desc=Extrage toate imaginile dintr-un PDF și le salvează într-un fișier zip. -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF în PDF/A -home.pdfToPDFA.desc=Convertește un document PDF în format PDF/A pentru stocare pe termen lung. -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF în Word -home.PDFToWord.desc=Convertește un document PDF în formate Word (DOC, DOCX și ODT). -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF în Prezentare -home.PDFToPresentation.desc=Convertește un document PDF în formate de prezentare (PPT, PPTX și ODP). -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF în Text/RTF -home.PDFToText.desc=Convertește un document PDF în format Text sau RTF. -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF în HTML -home.PDFToHTML.desc=Convertește un document PDF în format HTML. -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF în XML -home.PDFToXML.desc=Convertește un document PDF în format XML. -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detectează/Împarte poze scanate -home.ScannerImageSplit.desc=Împarte mai multe poze dintr-o poză/PDF. -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Semnează -home.sign.desc=Adaugă o semnătură la documentul PDF prin desenare, text sau imagine. -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Nivelare -home.flatten.desc=Elimină toate elementele interactive și formularele dintr-un PDF. -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Repară -home.repair.desc=Încearcă să repare un document PDF corupt/defect. -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Elimină pagini goale -home.removeBlanks.desc=Detectează și elimină paginile goale dintr-un document. -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Compară -home.compare.desc=Compară și arată diferențele dintre 2 documente PDF. -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Semnare cu certificat -home.certSign.desc=Semnează un PDF cu un certificat/cheie (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=Semnare certificat -certSign.header=Semnează un fișier PDF cu certificatul tău (În curs de desfășurare) -certSign.selectPDF=Selectează un fișier PDF pentru semnare: -certSign.selectKey=Selectează fișierul cheie privată (format PKCS#8, poate fi .pem sau .der): -certSign.selectCert=Selectează fișierul de certificat (format X.509, poate fi .pem sau .der): -certSign.selectP12=Selectează fișierul de stocare cheie PKCS#12 (.p12 sau .pfx) (Opțional, dacă este furnizat, ar trebui să conțină cheia privată și certificatul tău): -certSign.certType=Tipul certificatului -certSign.password=Introdu parola pentru stocarea cheie sau cheia privată (dacă există): -certSign.showSig=Afișează semnătura -certSign.reason=Motivul -certSign.location=Locația -certSign.name=Numele -certSign.submit=Semnează PDF - - -#removeBlanks -removeBlanks.title=Elimină pagini goale -removeBlanks.header=Elimină pagini goale -removeBlanks.threshold=Prag: -removeBlanks.thresholdDesc=Prag pentru determinarea cât de alb trebuie să fie un pixel alb -removeBlanks.whitePercent=Procent alb (%): -removeBlanks.whitePercentDesc=Procentul paginii care trebuie să fie alb pentru a fi eliminată -removeBlanks.submit=Elimină pagini goale - - -#compare -compare.title=Compară -compare.header=Compară PDF-uri -compare.document.1=Document 1 -compare.document.2=Document 2 -compare.submit=Compară - - -#sign -sign.title=Semnează -sign.header=Semnează documente PDF -sign.upload=Încarcă Imaginea -sign.draw=Desenează Semnătura -sign.text=Introdu Textul -sign.clear=Curăță -sign.add=Adaugă - - -#repair -repair.title=Repară -repair.header=Repară documente PDF -repair.submit=Repară - - -#flatten -flatten.title=Nivelare -flatten.header=Nivelează documente PDF -flatten.submit=Nivelează - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Prag unghi: -ScannerImageSplit.selectText.2=Stabilește unghiul absolut minim necesar pentru ca imaginea să fie rotită (implicit: 5). -ScannerImageSplit.selectText.3=Toleranță: -ScannerImageSplit.selectText.4=Determină intervalul de variație a culorii în jurul culorii de fundal estimate (implicit: 20). -ScannerImageSplit.selectText.5=Arie minimă: -ScannerImageSplit.selectText.6=Stabilește pragul minim de arie pentru o fotografie (implicit: 8000). -ScannerImageSplit.selectText.7=Arie minimă a conturului: -ScannerImageSplit.selectText.8=Stabilește pragul minim de arie a conturului pentru o fotografie. -ScannerImageSplit.selectText.9=Mărimea marginii: -ScannerImageSplit.selectText.10=Stabilește mărimea marginii adăugate și eliminate pentru a evita marginile albe în rezultat (implicit: 1). - - -#OCR -ocr.title=OCR / Curățare scanare -ocr.header=Curățare scanări / OCR (Recunoaștere optică a caracterelor) -ocr.selectText.1=Selectați limbile care trebuie detectate în PDF (Cele listate sunt cele detectate în prezent): -ocr.selectText.2=Produceți un fișier text care conține textul OCR împreună cu PDF-ul OCR -ocr.selectText.3=Corectați paginile care au fost scanate în unghi înclinat prin rotirea lor în poziție corectă -ocr.selectText.4=Curățați pagina astfel încât să fie mai puțin probabil ca OCR-ul să găsească text în zgomotul de fundal. (Nu se schimbă rezultatul) -ocr.selectText.5=Curățați pagina astfel încât să fie mai puțin probabil ca OCR-ul să găsească text în zgomotul de fundal, menține curățarea în rezultat. -ocr.selectText.6=Ignorați paginile care conțin text interactiv, OCR-ul se aplică doar paginilor care sunt imagini -ocr.selectText.7=Forțează OCR-ul, va aplica OCR pe fiecare pagină, înlăturând toate elementele de text originale -ocr.selectText.8=Normal (Va genera eroare dacă PDF-ul conține text) -ocr.selectText.9=Setări suplimentare -ocr.selectText.10=Mod OCR -ocr.selectText.11=Elimină imaginile după OCR (Elimină TOATE imaginile, util doar în etapa de conversie) -ocr.selectText.12=Tip de redare (Avansat) -ocr.help=Citiți documentația pentru a afla cum să utilizați acest serviciu pentru alte limbi și/sau în afara mediului Docker -ocr.credit=Acest serviciu utilizează OCRmyPDF și Tesseract pentru OCR. -ocr.submit=Procesează PDF-ul cu OCR - - -#extractImages -extractImages.title=Extrage Imagini -extractImages.header=Extrage Imagini -extractImages.selectText=Selectați formatul imaginii în care să se convertească imaginile extrase -extractImages.submit=Extrage - - -#File to PDF -fileToPDF.title=Fișier în PDF -fileToPDF.header=Convertiți orice fișier în PDF -fileToPDF.credit=Acest serviciu utilizează LibreOffice și Unoconv pentru conversia fișierelor. -fileToPDF.supportedFileTypes=Tipurile de fișiere suportate ar trebui să includă cele de mai jos. Pentru o listă completă și actualizată a formatelor suportate, consultați documentația LibreOffice. -fileToPDF.submit=Convertiți în PDF - - -#compress -compress.title=Comprimare -compress.header=Comprimare PDF -compress.credit=Acest serviciu utilizează OCRmyPDF pentru comprimarea/optimalizarea PDF-urilor. -compress.selectText.1=Nivel de optimizare: -compress.selectText.2=0 (Fără optimizare) -compress.selectText.3=1 (Implicit, optimizare fără pierdere) -compress.selectText.4=2 (Optimizare cu pierdere) -compress.selectText.5=3 (Optimizare cu pierdere, mai agresivă) -compress.submit=Comprimare - - -#Add image -addImage.title=Adăugare imagine -addImage.header=Adăugare imagine în PDF -addImage.everyPage=Pe fiecare pagină? -addImage.upload=Adăugare imagine -addImage.submit=Adăugare imagine - - -#merge -merge.title=Unire -merge.header=Unirea mai multor PDF-uri (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Unire - - -#pdfOrganiser -pdfOrganiser.title=Organizator de pagini -pdfOrganiser.header=Organizator de pagini PDF -pdfOrganiser.submit=Rearanjați paginile - - -#multiTool -multiTool.title=Instrument PDF multiplu -multiTool.header=Instrument PDF multiplu - - -#pageRemover -pageRemover.title=Înlăturare pagini -pageRemover.header=Înlăturare pagini din PDF -pageRemover.pagesToDelete=Pagini de șters (Introduceți o listă de numere de pagini separate prin virgulă): -pageRemover.submit=Ștergere pagini - - -#rotate -rotate.title=Rotește PDF -rotate.header=Rotește PDF -rotate.selectAngle=Selectați un unghi de rotație (în multiplicate de 90 de grade): -rotate.submit=Rotește - - -#merge -split.title=Împarte PDF -split.header=Împarte PDF -split.desc.1=Numerele pe care le selectați reprezintă numărul paginii pe care doriți să o împărțiți -split.desc.2=Prin urmare, selectând 1,3,7-8, un document cu 10 pagini va fi împărțit în 6 PDF-uri separate, astfel: -split.desc.3=Documentul #1: Pagina 1 -split.desc.4=Documentul #2: Paginile 2 și 3 -split.desc.5=Documentul #3: Paginile 4, 5 și 6 -split.desc.6=Documentul #4: Pagina 7 -split.desc.7=Documentul #5: Pagina 8 -split.desc.8=Documentul #6: Paginile 9 și 10 -split.splitPages=Introduceți paginile pe care să le împărțiți: -split.submit=Împarte - - -#merge -imageToPDF.title=Imagine în PDF -imageToPDF.header=Imagine în PDF -imageToPDF.submit=Convertă -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Rotire automată a PDF-ului -imageToPDF.selectText.3=Logica pentru mai multe fișiere (activată numai dacă se lucrează cu mai multe imagini) -imageToPDF.selectText.4=Unifică într-un singur PDF -imageToPDF.selectText.5=Convertă în PDF-uri separate - - -#pdfToImage -pdfToImage.title=PDF în Imagine -pdfToImage.header=PDF în Imagine -pdfToImage.selectText=Format imagine -pdfToImage.singleOrMultiple=Tip rezultat imagine -pdfToImage.single=O singură imagine mare -pdfToImage.multi=Mai multe imagini -pdfToImage.colorType=Tip culoare -pdfToImage.color=Culoare -pdfToImage.grey=Scală de gri -pdfToImage.blackwhite=Alb și negru (Poate pierde date!) -pdfToImage.submit=Convertă - - -#addPassword -addPassword.title=Adăugați parolă -addPassword.header=Adăugați o parolă (Criptare) -addPassword.selectText.1=Selectați PDF-ul pentru criptare -addPassword.selectText.2=Parolă -addPassword.selectText.3=Lungime cheie de criptare -addPassword.selectText.4=Valori mai mari sunt mai puternice, dar valorile mai mici au o compatibilitate mai bună. -addPassword.selectText.5=Permisiuni de setare -addPassword.selectText.6=Preveniți asamblarea documentului -addPassword.selectText.7=Preveniți extragerea conținutului -addPassword.selectText.8=Preveniți extragerea pentru accesibilitate -addPassword.selectText.9=Preveniți completarea formularului -addPassword.selectText.10=Preveniți modificarea -addPassword.selectText.11=Preveniți modificarea adnotărilor -addPassword.selectText.12=Preveniți tipărirea -addPassword.selectText.13=Preveniți tipărirea în formate diferite -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Criptare - - -#watermark -watermark.title=Adăugați Filigran -watermark.header=Adăugați Filigran -watermark.selectText.1=Selectați PDF-ul la care să adăugați filigranul: -watermark.selectText.2=Textul Filigranului: -watermark.selectText.3=Mărimea fontului: -watermark.selectText.4=Rotire (0-360): -watermark.selectText.5=widthSpacer (Spațiu între fiecare filigran pe orizontală): -watermark.selectText.6=heightSpacer (Spațiu între fiecare filigran pe verticală): -watermark.selectText.7=Opacitate (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Adăugați Filigran - - -#Change permissions -permissions.title=Schimbați Permisiunile -permissions.header=Schimbați Permisiunile -permissions.warning=Pentru a face aceste permisiuni neschimbabile, se recomandă să le setați cu o parolă prin intermediul paginii de adăugare a parolei -permissions.selectText.1=Selectați PDF-ul pentru a schimba permisiunile -permissions.selectText.2=Permisiunile de setat -permissions.selectText.3=Preveniți asamblarea documentului -permissions.selectText.4=Preveniți extragerea conținutului -permissions.selectText.5=Preveniți extragerea pentru accesibilitate -permissions.selectText.6=Preveniți completarea formularului -permissions.selectText.7=Preveniți modificarea -permissions.selectText.8=Preveniți modificarea adnotărilor -permissions.selectText.9=Preveniți tipărirea -permissions.selectText.10=Preveniți tipărirea în formate diferite -permissions.submit=Schimbare - - -#remove password -removePassword.title=Eliminați parola -removePassword.header=Eliminați parola (Decodificați) -removePassword.selectText.1=Selectați PDF-ul pentru decodificare -removePassword.selectText.2=Parolă -removePassword.submit=Eliminați - - -#changeMetadata -changeMetadata.title=Titlu: -changeMetadata.header=Schimbați Metadatele -changeMetadata.selectText.1=Vă rugăm să editați variabilele pe care doriți să le schimbați -changeMetadata.selectText.2=Ștergeți toate metadatele -changeMetadata.selectText.3=Afișați Metadatele Personalizate: -changeMetadata.author=Autor: -changeMetadata.creationDate=Data creării (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Creator: -changeMetadata.keywords=Cuvinte cheie: -changeMetadata.modDate=Data modificării (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Producător: -changeMetadata.subject=Subiect: -changeMetadata.title=Titlu: -changeMetadata.trapped=Blocat: -changeMetadata.selectText.4=Alte Metadate: -changeMetadata.selectText.5=Adăugați Intrare Metadate Personalizate -changeMetadata.submit=Schimbare - - -#pdfToPDFA -pdfToPDFA.title=PDF către PDF/A -pdfToPDFA.header=PDF către PDF/A -pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A -pdfToPDFA.submit=Convert - - -#PDFToWord -PDFToWord.title=PDF către Word -PDFToWord.header=PDF către Word -PDFToWord.selectText.1=Format fișier de ieșire -PDFToWord.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. -PDFToWord.submit=Convert - - -#PDFToPresentation -PDFToPresentation.title=PDF către Prezentare -PDFToPresentation.header=PDF către Prezentare -PDFToPresentation.selectText.1=Format fișier de ieșire -PDFToPresentation.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. -PDFToPresentation.submit=Convert - - -#PDFToText -PDFToText.title=PDF către Text/RTF -PDFToText.header=PDF către Text/RTF -PDFToText.selectText.1=Format fișier de ieșire -PDFToText.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. -PDFToText.submit=Convert - - -#PDFToHTML -PDFToHTML.title=PDF către HTML -PDFToHTML.header=PDF către HTML -PDFToHTML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. -PDFToHTML.submit=Convert - - -#PDFToXML -PDFToXML.title=PDF către XML -PDFToXML.header=PDF către XML -PDFToXML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului. -PDFToXML.submit=Convert diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties deleted file mode 100644 index 272afccf..00000000 --- a/src/main/resources/messages_ru_RU.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Выберите PDF(ы) -multiPdfPrompt=Выберите PDFы (2+) -multiPdfDropPrompt=Выберите (или перетащите) все необходимые PDFы -imgPrompt=Выберите картинку(и) -genericSubmit=Отправить -processTimeWarning=Внимание: Этот процесс может занять до минуты в зависимости от размера файла. -pageOrderPrompt=Порядок страниц (введите список номеров страниц через запятую): -goToPage=Вперед -true=Истина -false=Ложь -unknown=Неизвестно -save=Сохранить -close=Закрыть -filesSelected=файлов выбрано -noFavourites=Нет избранного -bored=Скучно ждать? -alphabet=Алфавит -downloadPdf=Скачать PDF -text=Текст -font=Шрифт -selectFillter=-- Выбрать -- -pageNum=номер страницы -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Конвертировать -navbar.security=Безопасность -navbar.other=Другое -navbar.darkmode=Темный режим -navbar.pageOps=Операции с страницей -navbar.settings=Настройки - -############# -# SETTINGS # -############# -settings.title=Настройки -settings.update=Доступно обновление -settings.appVersion=Версия приложения: -settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip): -settings.downloadOption.1=Открыть в том же окне -settings.downloadOption.2=Открыть в новом окне -settings.downloadOption.3=Загрузить файл -settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF. - - -home.multiTool.title=Мультиинструмент PDF -home.multiTool.desc=Объединение, поворот, изменение порядка и удаление страниц -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Объединить -home.merge.desc=Легко объединяйте несколько PDF-файлов в один. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Разделить -home.split.desc=Разделить PDF-файлы на несколько документов -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Повернуть -home.rotate.desc=Легко поворачивайте свои PDF-файлы. -rotate.tags=server side - - -home.imageToPdf.title=Изображение в PDF -home.imageToPdf.desc=Преобразование изображения (PNG, JPEG, GIF) в PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF в изображение -home.pdfToImage.desc=Преобразование PDF в изображение. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Реорганизация -home.pdfOrganiser.desc=Удалить/переставить страницы в любом порядке -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Добавить изображение -home.addImage.desc=Добавляет изображение в заданное место в PDF (в процессе) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Добавить водяной знак -home.watermark.desc=Добавьте собственный водяной знак в документ PDF. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Изменить разрешения -home.permissions.desc=Измените разрешения вашего PDF-документа -permissions.tags=read,write,edit,print - - -home.removePages.title=Удаление -home.removePages.desc=Удалите ненужные страницы из документа PDF. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Добавить пароль -home.addPassword.desc=Зашифруйте PDF-документ паролем. -addPassword.tags=secure,security - -home.removePassword.title=Удалить пароль -home.removePassword.desc=Снимите защиту паролем с вашего PDF-документа. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Сжать -home.compressPdfs.desc=Сжимайте PDF-файлы, чтобы уменьшить их размер. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Изменить метаданные -home.changeMetadata.desc=Изменить/удалить/добавить метаданные из документа PDF -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Конвертировать файл в PDF -home.fileToPDF.desc=Конвертируйте практически любой файл в PDF (DOCX, PNG, XLS, PPT, TXT и другие) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Очистка сканирования -home.ocr.desc=Очистка сканирования и обнаружение текста на изображениях в PDF-файле и повторно добавляет его как текст. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Извлечь изображения -home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF в PDF/A -home.pdfToPDFA.desc=Преобразование PDF в PDF/A для длительного хранения -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF в Word -home.PDFToWord.desc=Преобразование PDF в форматы Word (DOC, DOCX и ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF в презентацию -home.PDFToPresentation.desc=Преобразование PDF в форматы презентаций (PPT, PPTX и ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF в Text/RTF -home.PDFToText.desc=Преобразование PDF в текстовый или RTF формат -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF в HTML -home.PDFToHTML.desc=Преобразование PDF в формат HTML -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF в XML -home.PDFToXML.desc=Преобразование PDF в формат XML -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Обнаружение/разделение отсканированных фотографий -home.ScannerImageSplit.desc=Разделяет несколько фотографий из фото/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Подпись -home.sign.desc=Добавляет подпись в PDF с помощью рисунка, текста или изображения -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Сглаживание -home.flatten.desc=Удалить все интерактивные элементы и формы из PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Ремонт -home.repair.desc=Пытается восстановить поврежденный/сломанный PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Удалить пустые страницы -home.removeBlanks.desc=Обнаруживает и удаляет пустые страницы из документа -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Сравнение -home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Подписать сертификатом -home.certSign.desc=Подписать PDF сертификатом/ключом (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Объединить страницы -home.pageLayout.desc=Объединение нескольких страниц документа PDF в одну страницу -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Изменить размер/масштаб страницы -home.scalePages.desc=Изменить размер/масштаб страницы и/или ее содержимого. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Конвейер (расширенный) -home.pipeline.desc=Выполняйте несколько действий с PDF-файлами, определяя конвейерные сценарии. -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Добавить номера страниц -home.add-page-numbers.desc=Добавляйте номера страниц по всему документу в заданном месте -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Автоматическое переименование PDF-файла -home.auto-rename.desc=Автоматическое переименование файла PDF на основе его обнаруженного заголовка -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Настройка цветов/контрастности -home.adjust-contrast.desc=Настройка контрастность, насыщенность и яркость PDF-файла -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Обрезать PDF-файл -home.crop.desc=Обрезать PDF-файл, чтобы уменьшить его размер (текст сохраняется!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Автоматическое разделение страниц -home.autoSplitPDF.desc=Автоматическое разделение отсканированного PDF-файла с помощью физического разделителя отсканированных страниц QR-кода -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Дезинфицировать -home.sanitizePdf.desc=Удаление скриптов и других элементов из PDF-файлов -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/сайт в PDF -home.URLToPDF.desc=Конвертирует любой http(s)URL в PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML в PDF -home.HTMLToPDF.desc=Конвертирует любой HTML-файл или zip-файл в PDF. -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown в PDF -home.MarkdownToPDF.desc=Конвертирует любой файл Markdown в PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Получите ВСЮ информацию в формате PDF -home.getPdfInfo.desc=Собирает любую возможную информацию в PDF-файлах. -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Извлечь страницу(ы) -home.extractPage.desc=Извлекает выбранные страницы из PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF в одну большую страницу -home.PdfToSinglePage.desc=Объединяет все страницы PDF в одну большую страницу. -PdfToSinglePage.tags=single page - - -home.showJS.title=Показать Javascript -home.showJS.desc=Ищет и отображает любой JS, внедренный в PDF-файл. -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Показать Javascript -showJS.header=Показать Javascript -showJS.downloadJS=Скачать Javascript -showJS.submit=Показать - - - -#pdfToSinglePage -pdfToSinglePage.title=PDF на одну страницу -pdfToSinglePage.header=PDF на одну страницу -pdfToSinglePage.submit=Преобразовать в одну страницу - - -#pageExtracter -pageExtracter.title=Извлечь страницы -pageExtracter.header=Извлечь страницы -pageExtracter.submit=Извлечь - - -#getPdfInfo -getPdfInfo.title=Получить информацию в PDF -getPdfInfo.header=Получить информацию в PDF -getPdfInfo.submit=Получить информацию -getPdfInfo.downloadJson=Скачать JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown в PDF -MarkdownToPDF.header=Markdown в PDF -MarkdownToPDF.submit=Конвертировать -MarkdownToPDF.help=Работа в процессе -MarkdownToPDF.credit=Использует WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL в PDF -URLToPDF.header=URL в PDF -URLToPDF.submit=Конвертировать -URLToPDF.credit=Использует WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML в PDF -HTMLToPDF.header=HTML в PDF -HTMLToPDF.help=Принимает файлы HTML и ZIP-файлы, содержащие html/css/изображения и т. д. -HTMLToPDF.submit=Конвертировать -HTMLToPDF.credit=Использует WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Дезинфицировать PDF -sanitizePDF.header=Дезинфицировать PDF файл -sanitizePDF.selectText.1=Удалить JavaScript -sanitizePDF.selectText.2=Удалить встроенные файлы -sanitizePDF.selectText.3=Удалить метаданные -sanitizePDF.selectText.4=Удалить ссылки -sanitizePDF.selectText.5=Удалить шрифты -sanitizePDF.submit=Дезинфицировать - - -#addPageNumbers -addPageNumbers.title=Добавить номера страниц -addPageNumbers.header=Добавить номера страниц -addPageNumbers.selectText.1=Выберите PDF-файл: -addPageNumbers.selectText.2=Размер поля -addPageNumbers.selectText.3=Позиция -addPageNumbers.selectText.4=Стартовый номер -addPageNumbers.selectText.5=Страницы для нумерации -addPageNumbers.selectText.6=Свой текст -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Добавить номера страниц - - -#auto-rename -auto-rename.title=Автоматическое переименование -auto-rename.header=Автоматическое переименование PDF -auto-rename.submit=Автоматическое переименование - - -#adjustContrast -adjustContrast.title=Настройка контрастности -adjustContrast.header=Настройка контрастности -adjustContrast.contrast=Контраст: -adjustContrast.brightness=Яркость: -adjustContrast.saturation=Насыщенность: -adjustContrast.download=Скачать - - -#crop -crop.title=Обрезать -crop.header=Обрезать изображение -crop.submit=Отправить - - -#autoSplitPDF -autoSplitPDF.title=Автоматическое разделение PDF -autoSplitPDF.header=Автоматическое разделение PDF -autoSplitPDF.description=Распечатывайте, вставляйте, сканируйте, загружайте и позволяйте нам автоматически разделять ваши документы. Никакой ручной сортировки работы не требуется. -autoSplitPDF.selectText.1=Печатайте несколько раздельных листов (подойдет черно-белый вариант). -autoSplitPDF.selectText.2=Сканируйте все документы одновременно, вставив между ними разделительный лист. -autoSplitPDF.selectText.3=Загрузите один большой отсканированный PDF-файл, и пусть Stirling PDF сделает все остальное. -autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный окончательный документ. -autoSplitPDF.formPrompt=Отравить PDF-файл, содержащий разделители страниц Stirling-PDF: -autoSplitPDF.duplexMode=Дуплексный режим (сканирование спереди и сзади) -autoSplitPDF.dividerDownload1=Скачать 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Скачать 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Отравить - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Многостраничный макет -pageLayout.header=Многостраничный макет -pageLayout.pagesPerSheet=Страниц на одном листе: -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit -pageLayout.submit=Отправить - - - -#scalePages -scalePages.title=Отрегулировать масштаб страницы -scalePages.header=Отрегулировать масштаб страницы -scalePages.pageSize=Размер страницы документа. -scalePages.scaleFactor=Уровень масштабирования (обрезки) страницы. -scalePages.submit=Отправить - - -#certSign -certSign.title=Подписание сертификата -certSign.header=Подпишите PDF своим сертификатом (работа в процессе) -certSign.selectPDF=Выберите файл PDF для подписи: -certSign.selectKey=Выберите файл закрытого ключа (формат PKCS#8, может быть .pem или .der): -certSign.selectCert=Выберите файл сертификата (формат X.509, может быть .pem или .der): -certSign.selectP12=Выберите файл хранилища ключей PKCS#12 (.p12 или .pfx) (необязательно, если он предоставлен, он должен содержать ваш закрытый ключ и сертификат): -certSign.certType=Тип сертификата -certSign.password=Введите пароль от хранилища ключей или личного ключа (если есть): -certSign.showSig=Показать подпись -certSign.reason=Причина -certSign.location=Местоположение -certSign.name=Имя -certSign.submit=Подписать PDF - - -#removeBlanks -removeBlanks.title=Удалить Пустые -removeBlanks.header=Удалить Пустые Страницы -removeBlanks.threshold=Порог: -removeBlanks.thresholdDesc=Порог для определения того, насколько белым должен быть белый пиксель -removeBlanks.whitePercent=Процент Белого (%): -removeBlanks.whitePercentDesc=Общий процент белого на странице, для удаления -removeBlanks.submit=Удалить Пустые - - -#compare -compare.title=Сравнение -compare.header=Сравнение PDFы -compare.document.1=Документ 1 -compare.document.2=Документ 2 -compare.submit=Сравнить - - -#sign -sign.title=Подпись -sign.header=Подписать PDFы -sign.upload=Загрузить изображение -sign.draw=Нарисовать подпись -sign.text=Ввод текста -sign.clear=Очистить -sign.add=Добавить - - -#repair -repair.title=Ремонт -repair.header=Ремонт PDF ов -repair.submit=Ремонт - - -#flatten -flatten.title=Сглаживание -flatten.header=Сглаживание PDF ов -flatten.submit=Сгладить - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Угловой порог: -ScannerImageSplit.selectText.2=Устанавливает минимальный абсолютный угол, необходимый для поворота изображения (по умолчанию: 10). -ScannerImageSplit.selectText.3=Допуск: -ScannerImageSplit.selectText.4=Определяет диапазон изменения цвета вокруг предполагаемого цвета фона (по умолчанию: 30). -ScannerImageSplit.selectText.5=Минимальная площадь: -ScannerImageSplit.selectText.6=Устанавливает минимальный порог площади для фотографии (по умолчанию: 10000). -ScannerImageSplit.selectText.7=Минимальная площадь контура: -ScannerImageSplit.selectText.8=Устанавливает минимальный порог области контура для фотографии -ScannerImageSplit.selectText.9=Размер границы: -ScannerImageSplit.selectText.10=Устанавливает размер добавляемой и удаляемой границы, чтобы предотвратить появление белых границ на выходе (по умолчанию: 1). - - -#OCR -ocr.title=OCR / Очистка сканирования -ocr.header=Очистка сканирования / OCR (Optical Character Recognition) Распознавание текста -ocr.selectText.1=Выберите языки, которые должны быть обнаружены в PDF-файле (перечислены те, которые обнаружены в данный момент): -ocr.selectText.2=Создайте текстовый файл, содержащий текст OCR, вместе с PDF-файлом, обработанным OCR. -ocr.selectText.3=Правильные страницы были отсканированы под перекошенным углом путем поворота их на место -ocr.selectText.4=Очистите страницу, чтобы меньше шансов, что OCR найдет текст в фоновом шуме. (без изменения выхода) -ocr.selectText.5=Очистите страницу, чтобы меньше шансов, что OCR найдет текст в фоновом шуме, поддерживает очистку вывода. -ocr.selectText.6=Игнорирует страницы с интерактивным текстом, распознает только страницы с изображениями -ocr.selectText.7=Принудительное распознавание символов, будет распознавать каждую страницу, удаляя все элементы исходного текста -ocr.selectText.8=Обычный (будет ошибка, если PDF содержит текст) -ocr.selectText.9=Дополнительные настройки -ocr.selectText.10=OCR режим -ocr.selectText.11=Удалить изображения после OCR (удаляет ВСЕ изображения, полезно только в том случае, если они являются частью шага преобразования) -ocr.selectText.12=Тип рендера (расширенный) -ocr.help=Прочтите эту документацию о том, как использовать это для других языков и/или использовать не в докере. -ocr.credit=Этот сервис использует OCRmyPDF и Tesseract для OCR. -ocr.submit=Обработка PDF с OCR - - -#extractImages -extractImages.title=Извлечь изображения -extractImages.header=Извлечь изображения -extractImages.selectText=Выберите формат изображения для преобразования извлеченных изображений в -extractImages.submit=Извлечь - - -#File to PDF -fileToPDF.title=Файл в PDF -fileToPDF.header=Конвертировать любой файл в PDF -fileToPDF.credit=Этот сервис использует LibreOffice и Unoconv для преобразования файлов. -fileToPDF.supportedFileTypes=Поддерживаемые типы файлов должны включать приведенные ниже, однако полный обновленный список поддерживаемых форматов см. в документации LibreOffice. -fileToPDF.submit=Преобразовать в PDF - - -#compress -compress.title=Сжать -compress.header=Сжать PDF -compress.credit=Эта служба использует Ghostscript для сжатия/оптимизации PDF. -compress.selectText.1=Ручной режим - от 1 до 4 -compress.selectText.2=Уровень оптимизации: -compress.selectText.3=4 (Ужасно для текстовых изображений) -compress.selectText.4=Автоматический режим - автоматически настраивает качество для получения PDF точного размера -compress.selectText.5=Ожидаемый размер PDF (например, 25 МБ, 10,8 МБ, 25 КБ) -compress.submit=Сжать - - -#Add image -addImage.title=Добавить изображение -addImage.header=Добавить изображение в PDF -addImage.everyPage=Каждая страница? -addImage.upload=Добавить изображение -addImage.submit=Добавить изображение - - -#merge -merge.title=Объединить -merge.header=Объединение нескольких PDF-файлов (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Объединить - - -#pdfOrganiser -pdfOrganiser.title=Организатор страниц -pdfOrganiser.header=Организатор PDF-страниц -pdfOrganiser.submit=Переупорядочить страницы - - -#multiTool -multiTool.title=Мультиинструмент PDF -multiTool.header=Мультиинструмент PDF - - -#pageRemover -pageRemover.title=Удаление страниц -pageRemover.header=Удаление PDF-страниц -pageRemover.pagesToDelete=Страницы для удаления (введите список номеров страниц через запятую): -pageRemover.submit=Удалить страницы - - -#rotate -rotate.title=Повернуть PDF -rotate.header=Повернуть PDF -rotate.selectAngle=Выберите угол поворота (кратный 90 градусам): -rotate.submit=Повернуть - - -#merge -split.title=Разделить PDF -split.header=Разделить PDF -split.desc.1=Выбранные вами числа — это номера страниц, на которых вы хотите сделать разделение. -split.desc.2=Таким образом, выбор 1,3,7-8 разделит 10-страничный документ на 6 отдельных PDF-файлов с: -split.desc.3=Документ #1: Page 1 -split.desc.4=Документ #2: Page 2 and 3 -split.desc.5=Документ #3: Page 4, 5 and 6 -split.desc.6=Документ #4: Page 7 -split.desc.7=Документ #5: Page 8 -split.desc.8=Документ #6: Page 9 and 10 -split.splitPages=Введите страницы для разделения: -split.submit=Разделить - - -#merge -imageToPDF.title=Изображение в PDF -imageToPDF.header=Изображение в PDF -imageToPDF.submit=Конвертировать -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Автоматический поворот PDF -imageToPDF.selectText.3=Многофайловая логика (включена только при работе с несколькими изображениями) -imageToPDF.selectText.4=Объединить в один PDF -imageToPDF.selectText.5=Преобразование в отдельные PDF-файлы - - -#pdfToImage -pdfToImage.title=PDF в изображение -pdfToImage.header=PDF в изображение -pdfToImage.selectText=Формат изображения -pdfToImage.singleOrMultiple=Тип результата изображения -pdfToImage.single=Одно большое изображение -pdfToImage.multi=Несколько изображений -pdfToImage.colorType=Тип цвета -pdfToImage.color=Цвет -pdfToImage.grey=Оттенки серого -pdfToImage.blackwhite=Черно-белый (может потерять данные!) -pdfToImage.submit=Конвертировать - - -#addPassword -addPassword.title=Добавить пароль -addPassword.header=Добавить пароль (зашифровать) -addPassword.selectText.1=Выберите PDF для шифрования -addPassword.selectText.2=Пароль -addPassword.selectText.3=Длина ключа шифрования -addPassword.selectText.4=Более высокие значения сильнее, но более низкие значения имеют лучшую совместимость. -addPassword.selectText.5=Разрешения на установку -addPassword.selectText.6=Предотвратить сборку документа -addPassword.selectText.7=Предотвратить извлечение контента -addPassword.selectText.8=Предотвратить извлечение для доступности -addPassword.selectText.9=Запретить заполнение формы -addPassword.selectText.10=Предотвратить модификацию -addPassword.selectText.11=Запретить модификацию аннотаций -addPassword.selectText.12=Запретить печать -addPassword.selectText.13=Запретить печать разных форматов -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Шифровать - - -#watermark -watermark.title=Добавить водяной знак -watermark.header=Добавить водяной знак -watermark.selectText.1=Выберите PDF, чтобы добавить водяной знак: -watermark.selectText.2=Текст водяного знака: -watermark.selectText.3=Размер шрифта: -watermark.selectText.4=Поворот (0-360): -watermark.selectText.5=widthSpacer (пробел между каждым водяным знаком по горизонтали): -watermark.selectText.6=heightSpacer (пробел между каждым водяным знаком по вертикали): -watermark.selectText.7=Непрозрачность (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Добавить водяной знак - - -#Change permissions -permissions.title=Изменить разрешения -permissions.header=Изменить разрешения -permissions.warning=Предупреждение о том, что эти разрешения нельзя изменить, рекомендуется установить их с помощью пароля на странице добавления пароля. -permissions.selectText.1=Выберите PDF, чтобы изменить разрешения -permissions.selectText.2=Разрешения на установку -permissions.selectText.3=Предотвратить сборку документа -permissions.selectText.4=Предотвратить извлечение контента -permissions.selectText.5=Предотвратить извлечение для доступности -permissions.selectText.6=Запретить заполнение формы -permissions.selectText.7=Предотвратить модификацию -permissions.selectText.8=Запретить модификацию аннотаций -permissions.selectText.9=Запретить печать -permissions.selectText.10=Запретить печать разных форматов -permissions.submit=Изменить - - -#remove password -removePassword.title=Удалить пароль -removePassword.header=Удалить пароль (Расшифровка) -removePassword.selectText.1=Выберите PDF для расшифровки -removePassword.selectText.2=Пароль -removePassword.submit=Удалить - - -#changeMetadata -changeMetadata.title=Заголовок: -changeMetadata.header=Изменить метаданные -changeMetadata.selectText.1=Пожалуйста, отредактируйте переменные, которые вы хотите изменить -changeMetadata.selectText.2=Удалить все метаданные -changeMetadata.selectText.3=Показать пользовательские метаданные: -changeMetadata.author=Автор: -changeMetadata.creationDate=Дата создания (yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=Создатель: -changeMetadata.keywords=Ключевые слова: -changeMetadata.modDate=Дата изменения (yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=Изготовитель: -changeMetadata.subject=Тема: -changeMetadata.title=Заголовок: -changeMetadata.trapped=Trapped: -changeMetadata.selectText.4=Другие метаданные: -changeMetadata.selectText.5=Добавить пользовательскую запись метаданных -changeMetadata.submit=Изменить - - -#pdfToPDFA -pdfToPDFA.title=PDF в PDF/A -pdfToPDFA.header=PDF в PDF/A -pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A -pdfToPDFA.submit=Конвертировать - - -#PDFToWord -PDFToWord.title=PDF в Word -PDFToWord.header=PDF в Word -PDFToWord.selectText.1=Формат выходного файла -PDFToWord.credit=Этот сервис использует LibreOffice для преобразования файлов. -PDFToWord.submit=Конвертировать - - -#PDFToPresentation -PDFToPresentation.title=PDF в Презентацию -PDFToPresentation.header=PDF в Презентацию -PDFToPresentation.selectText.1=Формат выходного файла -PDFToPresentation.credit=Этот сервис использует LibreOffice для преобразования файлов. -PDFToPresentation.submit=Конвертировать - - -#PDFToText -PDFToText.title=PDF в Text/RTF -PDFToText.header=PDF в Text/RTF -PDFToText.selectText.1=Формат выходного файла -PDFToText.credit=Этот сервис использует LibreOffice для преобразования файлов. -PDFToText.submit=Конвертировать - - -#PDFToHTML -PDFToHTML.title=PDF в HTML -PDFToHTML.header=PDF в HTML -PDFToHTML.credit=Этот сервис использует LibreOffice для преобразования файлов. -PDFToHTML.submit=Конвертировать - - -#PDFToXML -PDFToXML.title=PDF в XML -PDFToXML.header=PDF в XML -PDFToXML.credit=Этот сервис использует LibreOffice для преобразования файлов. -PDFToXML.submit=Конвертировать diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties deleted file mode 100644 index e2fc2eb8..00000000 --- a/src/main/resources/messages_sv_SE.properties +++ /dev/null @@ -1,820 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=Välj PDF(er) -multiPdfPrompt=Välj PDF-filer (2+) -multiPdfDropPrompt=Välj (eller dra och släpp) alla PDF-filer du behöver -imgPrompt=Välj bild(er) -genericSubmit=Skicka -processTimeWarning=Varning: Denna process kan ta upp till en minut beroende på filstorlek -pageOrderPrompt=Sidordning (Ange en kommaseparerad lista med sidnummer) : -goToPage=Gå till -true=True -false=Falskt -unknown=Okänt -save=Spara -close=Stäng -filesSelected=filer valda -noFavourites=Inga favoriter har lagts till -bored=Utråkad att vänta? -alphabet=Alfabet -downloadPdf=Ladda ner PDF -text=Text -font=Teckensnitt -selectFillter=-- Välj -- -pageNum=Sidnummer -sizes.small=Small -sizes.medium=Medium -sizes.large=Large -sizes.x-large=X-Large -error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. - - - -############# -# NAVBAR # -############# -navbar.convert=Konvertera -navbar.security=Säkerhet -navbar.other=Annat -navbar.darkmode=Mörkt läge -navbar.pageOps=Sidoperationer -navbar.settings=Inställningar - -############# -# SETTINGS # -############# -settings.title=Inställningar -settings.update=Uppdatering tillgänglig -settings.appVersion=Appversion: -settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip): -settings.downloadOption.1=Öppnas i samma fönster -settings.downloadOption.2=Öppna i nytt fönster -settings.downloadOption.3=Ladda ner fil -settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider -settings.signOut=Sign Out -settings.accountSettings=Account Settings - - - -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted) -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes - - - -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.changeUsername=Change Username -account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser - - -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.forceChange=Force user to change username/password on login -adminUserSettings.submit=Save User - -############# -# HOME-PAGE # -############# -home.desc=Din lokala one-stop-shop för alla dina PDF-behov. - - -home.multiTool.title=PDF Multi-verktyg -home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side - -home.merge.title=Sammanfoga -home.merge.desc=Sammanfoga enkelt flera PDF-filer till en. -merge.tags=merge,Page operations,Back end,server side - -home.split.title=Dela -home.split.desc=Dela upp PDF-filer i flera dokument -split.tags=Page operations,divide,Multi Page,cut,server side - -home.rotate.title=Rotera -home.rotate.desc=Rotera enkelt dina PDF-filer. -rotate.tags=server side - - -home.imageToPdf.title=Bild till PDF -home.imageToPdf.desc=Konvertera en bild (PNG, JPEG, GIF) till PDF. -imageToPdf.tags=conversion,img,jpg,picture,photo - -home.pdfToImage.title=PDF till bild -home.pdfToImage.desc=Konvertera en PDF till en bild. (PNG, JPEG, GIF) -pdfToImage.tags=conversion,img,jpg,picture,photo - -home.pdfOrganiser.title=Ordna -home.pdfOrganiser.desc=Ta bort/ordna om sidor i valfri ordning -pdfOrganiser.tags=duplex,even,odd,sort,move - - -home.addImage.title=Lägg till bild -home.addImage.desc=Lägger till en bild på en angiven plats i PDF:en (pågår arbete) -addImage.tags=img,jpg,picture,photo - -home.watermark.title=Lägg till vattenstämpel -home.watermark.desc=Lägg till en anpassad vattenstämpel till ditt PDF-dokument. -watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo - -home.permissions.title=Ändra behörigheter -home.permissions.desc=Ändra behörigheterna för ditt PDF-dokument -permissions.tags=read,write,edit,print - - -home.removePages.title=Ta bort -home.removePages.desc=Ta bort oönskade sidor från ditt PDF-dokument. -removePages.tags=Remove pages,delete pages - -home.addPassword.title=Lägg till lösenord -home.addPassword.desc=Kryptera ditt PDF-dokument med ett lösenord. -addPassword.tags=secure,security - -home.removePassword.title=Ta bort lösenord -home.removePassword.desc=Ta bort lösenordsskydd från ditt PDF-dokument. -removePassword.tags=secure,Decrypt,security,unpassword,delete password - -home.compressPdfs.title=Komprimera -home.compressPdfs.desc=Komprimera PDF-filer för att minska deras filstorlek. -compressPdfs.tags=squish,small,tiny - - -home.changeMetadata.title=Ändra metadata -home.changeMetadata.desc=Ändra/ta bort/lägg till metadata från ett PDF-dokument -changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats - -home.fileToPDF.title=Konvertera fil till PDF -home.fileToPDF.desc=Konvertera nästan vilken fil som helst till PDF (DOCX, PNG, XLS, PPT, TXT och mer) -fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint - -home.ocr.title=OCR / Rensningsskanningar -home.ocr.desc=Cleanup skannar och upptäcker text från bilder i en PDF och lägger till den igen som text. -ocr.tags=recognition,text,image,scan,read,identify,detection,editable - - -home.extractImages.title=Extrahera bilder -home.extractImages.desc=Extraherar alla bilder från en PDF och sparar dem till zip -extractImages.tags=picture,photo,save,archive,zip,capture,grab - -home.pdfToPDFA.title=PDF till PDF/A -home.pdfToPDFA.desc=Konvertera PDF till PDF/A för långtidslagring -pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation - -home.PDFToWord.title=PDF till Word -home.PDFToWord.desc=Konvertera PDF till Word-format (DOC, DOCX och ODT) -PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile - -home.PDFToPresentation.title=PDF till presentation -home.PDFToPresentation.desc=Konvertera PDF till presentationsformat (PPT, PPTX och ODP) -PDFToPresentation.tags=slides,show,office,microsoft - -home.PDFToText.title=PDF till text/RTF -home.PDFToText.desc=Konvertera PDF till text- eller RTF-format -PDFToText.tags=richformat,richtextformat,rich text format - -home.PDFToHTML.title=PDF till HTML -home.PDFToHTML.desc=Konvertera PDF till HTML-format -PDFToHTML.tags=web content,browser friendly - - -home.PDFToXML.title=PDF till XML -home.PDFToXML.desc=Konvertera PDF till XML-format -PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert - -home.ScannerImageSplit.title=Detektera/Dela skannade foton -home.ScannerImageSplit.desc=Delar flera foton från ett foto/PDF -ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize - -home.sign.title=Signera -home.sign.desc=Lägger till signatur till PDF genom ritning, text eller bild -sign.tags=authorize,initials,drawn-signature,text-sign,image-signature - -home.flatten.title=Platta till -home.flatten.desc=Ta bort alla interaktiva element och formulär från en PDF -flatten.tags=static,deactivate,non-interactive,streamline - -home.repair.title=Reparera -home.repair.desc=Försöker reparera en korrupt/trasig PDF -repair.tags=fix,restore,correction,recover - -home.removeBlanks.title=Ta bort tomma sidor -home.removeBlanks.desc=Känner av och tar bort tomma sidor från ett dokument -removeBlanks.tags=cleanup,streamline,non-content,organize - -home.compare.title=Jämför -home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument -compare.tags=differentiate,contrast,changes,analysis - -home.certSign.title=Sign with Certificate -home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12) -certSign.tags=authenticate,PEM,P12,official,encrypt - -home.pageLayout.title=Multi-Page Layout -home.pageLayout.desc=Merge multiple pages of a PDF document into a single page -pageLayout.tags=merge,composite,single-view,organize - -home.scalePages.title=Adjust page size/scale -home.scalePages.desc=Change the size/scale of page and/or its contents. -scalePages.tags=resize,modify,dimension,adapt - -home.pipeline.title=Pipeline (Advanced) -home.pipeline.desc=Run multiple actions on PDFs by defining pipeline scripts -pipeline.tags=automate,sequence,scripted,batch-process - -home.add-page-numbers.title=Add Page Numbers -home.add-page-numbers.desc=Add Page numbers throughout a document in a set location -add-page-numbers.tags=paginate,label,organize,index - -home.auto-rename.title=Auto Rename PDF File -home.auto-rename.desc=Auto renames a PDF file based on its detected header -auto-rename.tags=auto-detect,header-based,organize,relabel - -home.adjust-contrast.title=Adjust Colors/Contrast -home.adjust-contrast.desc=Adjust Contrast, Saturation and Brightness of a PDF -adjust-contrast.tags=color-correction,tune,modify,enhance - -home.crop.title=Crop PDF -home.crop.desc=Crop a PDF to reduce its size (maintains text!) -crop.tags=trim,shrink,edit,shape - -home.autoSplitPDF.title=Auto Split Pages -home.autoSplitPDF.desc=Auto Split Scanned PDF with physical scanned page splitter QR Code -autoSplitPDF.tags=QR-based,separate,scan-segment,organize - -home.sanitizePdf.title=Sanitize -home.sanitizePdf.desc=Remove scripts and other elements from PDF files -sanitizePdf.tags=clean,secure,safe,remove-threats - -home.URLToPDF.title=URL/Website To PDF -home.URLToPDF.desc=Converts any http(s)URL to PDF -URLToPDF.tags=web-capture,save-page,web-to-doc,archive - -home.HTMLToPDF.title=HTML to PDF -home.HTMLToPDF.desc=Converts any HTML file or zip to PDF -HTMLToPDF.tags=markup,web-content,transformation,convert - - -home.MarkdownToPDF.title=Markdown to PDF -home.MarkdownToPDF.desc=Converts any Markdown file to PDF -MarkdownToPDF.tags=markup,web-content,transformation,convert - - -home.getPdfInfo.title=Get ALL Info on PDF -home.getPdfInfo.desc=Grabs any and all information possible on PDFs -getPdfInfo.tags=infomation,data,stats,statistics - - -home.extractPage.title=Extract page(s) -home.extractPage.desc=Extracts select pages from PDF -extractPage.tags=extract - - -home.PdfToSinglePage.title=PDF to Single Large Page -home.PdfToSinglePage.desc=Merges all PDF pages into one large single page -PdfToSinglePage.tags=single page - - -home.showJS.title=Show Javascript -home.showJS.desc=Searches and displays any JS injected into a PDF -showJS.tags=JS - -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -showJS.tags=JS - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in - - -#auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit - - -#showJS -showJS.title=Show Javascript -showJS.header=Show Javascript -showJS.downloadJS=Download Javascript -showJS.submit=Show - - -#pdfToSinglePage -pdfToSinglePage.title=PDF To Single Page -pdfToSinglePage.header=PDF To Single Page -pdfToSinglePage.submit=Convert To Single Page - - -#pageExtracter -pageExtracter.title=Extract Pages -pageExtracter.header=Extract Pages -pageExtracter.submit=Extract - - -#getPdfInfo -getPdfInfo.title=Get Info on PDF -getPdfInfo.header=Get Info on PDF -getPdfInfo.submit=Get Info -getPdfInfo.downloadJson=Download JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown To PDF -MarkdownToPDF.header=Markdown To PDF -MarkdownToPDF.submit=Convert -MarkdownToPDF.help=Work in progress -MarkdownToPDF.credit=Uses WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL To PDF -URLToPDF.header=URL To PDF -URLToPDF.submit=Convert -URLToPDF.credit=Uses WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML To PDF -HTMLToPDF.header=HTML To PDF -HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required -HTMLToPDF.submit=Convert -HTMLToPDF.credit=Uses WeasyPrint - - -#sanitizePDF -sanitizePDF.title=Sanitize PDF -sanitizePDF.header=Sanitize a PDF file -sanitizePDF.selectText.1=Remove JavaScript actions -sanitizePDF.selectText.2=Remove embedded files -sanitizePDF.selectText.3=Remove metadata -sanitizePDF.selectText.4=Remove links -sanitizePDF.selectText.5=Remove fonts -sanitizePDF.submit=Sanitize PDF - - -#addPageNumbers -addPageNumbers.title=Add Page Numbers -addPageNumbers.header=Add Page Numbers -addPageNumbers.selectText.1=Select PDF file: -addPageNumbers.selectText.2=Margin Size -addPageNumbers.selectText.3=Position -addPageNumbers.selectText.4=Starting Number -addPageNumbers.selectText.5=Pages to Number -addPageNumbers.selectText.6=Custom Text -addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} -addPageNumbers.submit=Add Page Numbers - - -#auto-rename -auto-rename.title=Auto Rename -auto-rename.header=Auto Rename PDF -auto-rename.submit=Auto Rename - - -#adjustContrast -adjustContrast.title=Adjust Contrast -adjustContrast.header=Adjust Contrast -adjustContrast.contrast=Contrast: -adjustContrast.brightness=Brightness: -adjustContrast.saturation=Saturation: -adjustContrast.download=Download - - -#crop -crop.title=Crop -crop.header=Crop Image -crop.submit=Submit - - -#autoSplitPDF -autoSplitPDF.title=Auto Split PDF -autoSplitPDF.header=Auto Split PDF -autoSplitPDF.description=Print, Insert, Scan, upload, and let us auto-separate your documents. No manual work sorting needed. -autoSplitPDF.selectText.1=Print out some divider sheets from below (Black and white is fine). -autoSplitPDF.selectText.2=Scan all your documents at once by inserting the divider sheet between them. -autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirling PDF handle the rest. -autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document. -autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: -autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) -autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf' -autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf' -autoSplitPDF.submit=Submit - - -#pipeline -pipeline.title=Pipeline - - -#pageLayout -pageLayout.title=Multi Page Layout -pageLayout.header=Multi Page Layout -pageLayout.pagesPerSheet=Pages per sheet: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=Add Borders -pageLayout.submit=Submit - - -#scalePages -scalePages.title=Adjust page-scale -scalePages.header=Adjust page-scale -scalePages.pageSize=Size of a page of the document. -scalePages.scaleFactor=Zoom level (crop) of a page. -scalePages.submit=Submit - - -#certSign -certSign.title=Certifikatsignering -certSign.header=Skriv under en PDF med ditt certifikat (Pågående arbete) -certSign.selectPDF=Välj en PDF-fil för signering: -certSign.selectKey=Välj din privata nyckelfil (PKCS#8-format, kan vara .pem eller .der): -certSign.selectCert=Välj din certifikatfil (X.509-format, kan vara .pem eller .der): -certSign.selectP12=Välj din PKCS#12-nyckellagringsfil (.p12 eller .pfx) (Valfritt, om den tillhandahålls bör den innehålla din privata nyckel och certifikat): -certSign.certType=Certifikattyp -certSign.password=Ange ditt nyckellager eller privata nyckellösenord (om något): -certSign.showSig=Visa signatur -certSign.reason=Anledning -certSign.location=Plats -certSign.name=Namn -certSign.submit=Skriv under PDF - - -#removeBlanks -removeBlanks.title=Ta bort tomrum -removeBlanks.header=Ta bort tomma sidor -removeBlanks.threshold=Tröskel: -removeBlanks.thresholdDesc=Tröskel för att bestämma hur vit en vit pixel måste vara -removeBlanks.whitePercent=Vit procent (%): -removeBlanks.whitePercentDesc=Procentandel av sidan som måste vara vit för att kunna tas bort -removeBlanks.submit=Ta bort tomrum - - -#compare -compare.title=Jämför -compare.header=Jämför PDF-filer -compare.document.1=Dokument 1 -compare.document.2=Dokument 2 -compare.submit=Jämför - - -#sign -sign.title=Signera -sign.header=Skriv under PDF-filer -sign.upload=Ladda upp bild -sign.draw=Rita signatur -sign.text=Textinmatning -sign.clear=Rensa -sign.add=Lägg till - - -#repair -repair.title=Reparera -repair.header=Reparera PDF-filer -repair.submit=Reparera - - -#flatten -flatten.title=Platta till -flatten.header=Placera PDF-filer -flatten.submit=Platta till - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=Vinkeltröskel: -ScannerImageSplit.selectText.2=Ställer in den minsta absoluta vinkeln som krävs för att bilden ska roteras (standard: 10). -ScannerImageSplit.selectText.3=Tolerans: -ScannerImageSplit.selectText.4=Bestämmer intervallet för färgvariation runt den uppskattade bakgrundsfärgen (standard: 30). -ScannerImageSplit.selectText.5=Minsta area: -ScannerImageSplit.selectText.6=Ställer in minsta areatröskel för ett foto (standard: 10000). -ScannerImageSplit.selectText.7=Minsta konturarea: -ScannerImageSplit.selectText.8=Ställer in minsta tröskelvärde för konturarea för ett foto -ScannerImageSplit.selectText.9=Kantstorlek: -ScannerImageSplit.selectText.10=Ställer in storleken på kanten som läggs till och tas bort för att förhindra vita kanter i utdata (standard: 1). - - -#OCR -ocr.title=OCR / Scan Cleanup -ocr.header=Rengöringsskanningar / OCR (Optical Character Recognition) -ocr.selectText.1=Välj språk som ska upptäckas i PDF:en (de listade är de som för närvarande identifieras): -ocr.selectText.2=Producera en textfil som innehåller OCR-text tillsammans med den OCR-skrivna PDF-filen -ocr.selectText.3=Korrekta sidor skannades i en sned vinkel genom att rotera dem tillbaka på plats -ocr.selectText.4=Rensa sidan så det är mindre troligt att OCR hittar text i bakgrundsbrus. (Ingen utgångsändring) -ocr.selectText.5=Rensa sidan så det är mindre sannolikt att OCR kommer att hitta text i bakgrundsbrus, upprätthåller rensning i utdata. -ocr.selectText.6=Ignorerar sidor som har interaktiv text, endast OCR-sidor som är bilder -ocr.selectText.7=Tvinga OCR, kommer OCR att ta bort alla ursprungliga textelement -ocr.selectText.8=Normal (kommer fel om PDF innehåller text) -ocr.selectText.9=Ytterligare inställningar -ocr.selectText.10=OCR-läge -ocr.selectText.11=Ta bort bilder efter OCR (tar bort ALLA bilder, endast användbart om en del av konverteringssteget) -ocr.selectText.12=Rendertyp (avancerat) -ocr.help=Vänligen läs den här dokumentationen om hur du använder detta för andra språk och/eller använder inte i docker -ocr.credit=Denna tjänst använder OCRmyPDF och Tesseract för OCR. -ocr.submit=Bearbeta PDF med OCR - - -#extractImages -extractImages.title=Extrahera bilder -extractImages.header=Extrahera bilder -extractImages.selectText=Välj bildformat att konvertera extraherade bilder till -extractImages.submit=Extrahera - - -#File to PDF -fileToPDF.title=Fil till PDF -fileToPDF.header=Konvertera valfri fil till PDF -fileToPDF.credit=Denna tjänst använder LibreOffice och Unoconv för filkonvertering. -fileToPDF.supportedFileTypes=Filtyper som stöds bör inkludera nedanstående men för en fullständig uppdaterad lista över format som stöds, se LibreOffice-dokumentationen -fileToPDF.submit=Konvertera till PDF - - -#compress -compress.title=Komprimera -compress.header=Komprimera PDF -compress.credit=Denna tjänst använder Ghostscript för PDF-komprimering/optimering. -compress.selectText.1=Manuellt läge - Från 1 till 4 -compress.selectText.2=Optimeringsnivå: -compress.selectText.3=4 (Fruktansvärt för textbilder) -compress.selectText.4=Autoläge - Autojusterar kvaliteten för att få PDF till exakt storlek -compress.selectText.5=Förväntad PDF-storlek (t.ex. 25MB, 10,8MB, 25KB) -compress.submit=Komprimera - - -#Add image -addImage.title=Lägg till bild -addImage.header=Lägg till bild till PDF -addImage.everyPage=Varje sida? -addImage.upload=Lägg till bild -addImage.submit=Lägg till bild - - -#merge -merge.title=Sammanfoga -merge.header=Slå samman flera PDF-filer (2+) -merge.sortByName=Sort by name -merge.sortByDate=Sort by date -merge.submit=Slå samman - - -#pdfOrganiser -pdfOrganiser.title=Sidorganisatör -pdfOrganiser.header=PDF-sidorganisatör -pdfOrganiser.submit=Ordna om sidor - - -#multiTool -multiTool.title=PDF-multiverktyg -multiTool.header=PDF Multi-verktyg - - -#pageRemover -pageRemover.title=Sidborttagare -pageRemover.header=PDF Sidborttagning -pageRemover.pagesToDelete=Sidor att radera (Ange en kommaseparerad lista med sidnummer) : -pageRemover.submit=Ta bort sidor - - -#rotate -rotate.title=Rotera PDF -rotate.header=Rotera PDF -rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader): -rotate.submit=Rotera - - -#merge -split.title=Dela upp PDF -split.header=Dela upp PDF -split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på -split.desc.2=Som sådan skulle ett val av 1,3,7-8 dela upp ett 10-sidigt dokument i 6 separata PDF-filer med: -split.desc.3=Dokument #1: Sida 1 -split.desc.4=Dokument #2: Sida 2 och 3 -split.desc.5=Dokument #3: Sida 4, 5 och 6 -split.desc.6=Dokument #4: Sida 7 -split.desc.7=Dokument #5: Sida 8 -split.desc.8=Dokument #6: Sida 9 och 10 -split.splitPages=Ange sidor att dela på: -split.submit=Dela - - -#merge -imageToPDF.title=Bild till PDF -imageToPDF.header=Bild till PDF -imageToPDF.submit=Konvertera -imageToPDF.selectLabel=Image Fit Options -imageToPDF.fillPage=Fill Page -imageToPDF.fitDocumentToImage=Fit Page to Image -imageToPDF.maintainAspectRatio=Maintain Aspect Ratios -imageToPDF.selectText.2=Rotera PDF automatiskt -imageToPDF.selectText.3=Multifillogik (Endast aktiverad om man arbetar med flera bilder) -imageToPDF.selectText.4=Slå samman till en enda PDF -imageToPDF.selectText.5=Konvertera till separata PDF-filer - - -#pdfToImage -pdfToImage.title=PDF till bild -pdfToImage.header=PDF till bild -pdfToImage.selectText=Bildformat -pdfToImage.singleOrMultiple=Bildresultattyp -pdfToImage.single=Enstaka stor bild -pdfToImage.multi=Flera bilder -pdfToImage.colorType=Färgtyp -pdfToImage.color=Färg -pdfToImage.grey=Gråskala -pdfToImage.blackwhite=Svartvitt (kan förlora data!) -pdfToImage.submit=Konvertera - - -#addPassword -addPassword.title=Lägg till lösenord -addPassword.header=Lägg till lösenord (kryptera) -addPassword.selectText.1=Välj PDF för att kryptera -addPassword.selectText.2=Lösenord -addPassword.selectText.3=Längd på krypteringsnyckeln -addPassword.selectText.4=Högre värden är starkare, men lägre värden har bättre kompatibilitet. -addPassword.selectText.5=Behörigheter att ställa in -addPassword.selectText.6=Förhindra sammansättning av dokument -addPassword.selectText.7=Förhindra innehållsextraktion -addPassword.selectText.8=Förhindra extraktion för tillgänglighet -addPassword.selectText.9=Förhindra att fylla i formulär -addPassword.selectText.10=Förhindra modifiering -addPassword.selectText.11=Förhindra anteckningsändring -addPassword.selectText.12=Förhindra utskrift -addPassword.selectText.13=Förhindra utskrift av olika format -addPassword.selectText.14=Owner Password -addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers) -addPassword.selectText.16=Restricts the opening of the document itself -addPassword.submit=Kryptera - - -#watermark -watermark.title=Lägg till vattenstämpel -watermark.header=Lägg till vattenstämpel -watermark.selectText.1=Välj PDF för att lägga till vattenstämpel till: -watermark.selectText.2=Vattenmärkestext: -watermark.selectText.3=Teckenstorlek: -watermark.selectText.4=Rotation (0-360): -watermark.selectText.5=widthSpacer (mellanrum mellan varje vattenstämpel horisontellt): -watermark.selectText.6=heightSpacer (mellanrum mellan varje vattenstämpel vertikalt): -watermark.selectText.7=Opacitet (0% - 100%): -watermark.selectText.8=Watermark Type: -watermark.selectText.9=Watermark Image: -watermark.submit=Lägg till vattenstämpel - - -#Change permissions -permissions.title=Ändra behörigheter -permissions.header=Ändra behörigheter -permissions.warning=Varning för att dessa behörigheter ska vara oföränderliga, det rekommenderas att ställa in dem med ett lösenord via sidan Lägg till lösenord -permissions.selectText.1=Välj PDF för att ändra behörigheter -permissions.selectText.2=Behörigheter att ställa in -permissions.selectText.3=Förhindra sammansättning av dokument -permissions.selectText.4=Förhindra innehållsextraktion -permissions.selectText.5=Förhindra extraktion för tillgänglighet -permissions.selectText.6=Förhindra att fylla i formulär -permissions.selectText.7=Förhindra ändring -permissions.selectText.8=Förhindra anteckningsändring -permissions.selectText.9=Förhindra utskrift -permissions.selectText.10=Förhindra utskrift av olika format -permissions.submit=Ändra - - -#remove password -removePassword.title=Ta bort lösenord -removePassword.header=Ta bort lösenord (Dekryptera) -removePassword.selectText.1=Välj PDF att dekryptera -removePassword.selectText.2=Lösenord -removePassword.submit=Ta bort - - -#changeMetadata -changeMetadata.title=Titel: -changeMetadata.header=Ändra metadata -changeMetadata.selectText.1=Redigera de variabler du vill ändra -changeMetadata.selectText.2=Ta bort all metadata -changeMetadata.selectText.3=Visa anpassade metadata: -changeMetadata.author=Författare: -changeMetadata.creationDate=Skapningsdatum (åååå/MM/dd HH:mm:ss): -changeMetadata.creator=Skapare: -changeMetadata.keywords=Sökord: -changeMetadata.modDate=Ändringsdatum (åååå/MM/dd HH:mm:ss): -changeMetadata.producer=Producent: -changeMetadata.subject=Ämne: -changeMetadata.title=Titel: -changeMetadata.trapped=Fångad: -changeMetadata.selectText.4=Andra metadata: -changeMetadata.selectText.5=Lägg till anpassad metadatapost -changeMetadata.submit=Ändra - - -#pdfToPDFA -pdfToPDFA.title=PDF till PDF/A -pdfToPDFA.header=PDF till PDF/A -pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering -pdfToPDFA.submit=Konvertera - - -#PDFToWord -PDFToWord.title=PDF till Word -PDFToWord.header=PDF till Word -PDFToWord.selectText.1=Utdatafilformat -PDFToWord.credit=Denna tjänst använder LibreOffice för filkonvertering. -PDFToWord.submit=Konvertera - - -#PDFToPresentation -PDFToPresentation.title=PDF till presentation -PDFToPresentation.header=PDF till presentation -PDFToPresentation.selectText.1=Utdatafilformat -PDFToPresentation.credit=Denna tjänst använder LibreOffice för filkonvertering. -PDFToPresentation.submit=Konvertera - - -#PDFToText -PDFToText.title=PDF till text/RTF -PDFToText.header=PDF till text/RTF -PDFToText.selectText.1=Utdatafilformat -PDFToText.credit=Denna tjänst använder LibreOffice för filkonvertering. -PDFToText.submit=Konvertera - - -#PDFToHTML -PDFToHTML.title=PDF till HTML -PDFToHTML.header=PDF till HTML -PDFToHTML.credit=Denna tjänst använder LibreOffice för filkonvertering. -PDFToHTML.submit=Konvertera - - -#PDFToXML -PDFToXML.title=PDF till XML -PDFToXML.header=PDF till XML -PDFToXML.credit=Denna tjänst använder LibreOffice för filkonvertering. -PDFToXML.submit=Konvertera diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties deleted file mode 100644 index 8a3554a9..00000000 --- a/src/main/resources/messages_zh_CN.properties +++ /dev/null @@ -1,810 +0,0 @@ -########### -# Generic # -########### -# the direction that the language is written (ltr=left to right, rtl = right to left) -language.direction=ltr - -pdfPrompt=选择PDF -multiPdfPrompt=选择多个PDF(2个或更多) -multiPdfDropPrompt=选择(或拖拽)所需的PDF -imgPrompt=选择图像 -genericSubmit=提交 -processTimeWarning=警告:此过程可能需要多达一分钟,具体时间取决于文件大小 -pageOrderPrompt=页面顺序(输入逗号分隔的页码列表): -goToPage=到 -true=对 -false=错 -unknown=未知 -save=保存 -close=关闭 -filesSelected=选中的文件 -noFavourites=没有添加收藏夹 -bored=无聊等待吗? -alphabet=字母表 -downloadPdf=下载PDF -text=文本 -font=字体 -selectFillter=-- 选择-- -pageNum=页码 -sizes.small=小型尺寸 -sizes.medium=中型尺寸 -sizes.large=大型尺寸 -sizes.x-large=稍大型尺寸 -error.pdfPassword=PDF 文档有密码,未提供密码或密码不正确 -delete=删除 -username=用户名 -password=密码 -welcome=欢迎 -property=资产 -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... - -changedCredsMessage=凭证已更改! -notAuthenticatedMessage=用户未经过身份验证。 -userNotFoundMessage=未找到用户。 -incorrectPasswordMessage=当前密码不正确。 -usernameExistsMessage=新用户名已存在。 - - - -############# -# NAVBAR # -############# -navbar.convert=转换 -navbar.security=安全 -navbar.other=其他 -navbar.darkmode=暗模式 -navbar.pageOps=页面操作 -navbar.settings=设置 - -############# -# SETTINGS # -############# -settings.title=设置 -settings.update=可更新 -settings.appVersion=应用程序版本: -settings.downloadOption.title=选择下载选项(单个文件非压缩文件): -settings.downloadOption.1=在同一窗口打开 -settings.downloadOption.2=在新窗口中打开 -settings.downloadOption.3=下载文件 -settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。 -settings.signOut=登出 -settings.accountSettings=帐号设定 - - - -changeCreds.title=更改凭证 -changeCreds.header=更新您的账户详情 -changeCreds.changeUserAndPassword=您正在使用默认登录凭据。请输入新密码(如果需要,还可以输入新用户名) -changeCreds.newUsername=新用户名 -changeCreds.oldPassword=当前密码 -changeCreds.newPassword=新密码 -changeCreds.confirmNewPassword=确认新密码 -changeCreds.submit=提交更改 - - - -account.title=帐号设定 -account.accountSettings=帐号设定 -account.adminSettings=管理员设置 - 查看和添加用户 -account.userControlSettings=用户控制设置 -account.changeUsername=更改用户名 -account.password=确认密码 -account.oldPassword=旧密码 -account.newPassword=新密码 -account.changePassword=更改密码 -account.confirmNewPassword=确认新密码 -account.signOut=退出登录 -account.yourApiKey=您的 API 密钥 -account.syncTitle=将浏览器设置与账户同步 -account.settingsCompare=设置比较: -account.property=属性 -account.webBrowserSettings=Web 浏览器设置 -account.syncToBrowser=同步账户 -> 浏览器 -account.syncToAccount=同步账户 <- 浏览器 - - -adminUserSettings.title=用户控制设置 -adminUserSettings.header=管理员用户控制设置 -adminUserSettings.admin=管理员 -adminUserSettings.user=用户 -adminUserSettings.addUser=添加新用户 -adminUserSettings.roles=角色 -adminUserSettings.role=角色 -adminUserSettings.actions=操作 -adminUserSettings.apiUser=有限 API 用户 -adminUserSettings.webOnlyUser=仅限 Web 用户 -adminUserSettings.forceChange=强制用户在登录时更改用户名/密码 -adminUserSettings.submit=保存用户 - -############# -# HOME-PAGE # -############# -home.desc=CZL一站式服务,满足您的所有PDF需求。 - - -home.multiTool.title=PDF多功能工具 -home.multiTool.desc=合并、旋转、重新排列和删除PDF页面 -multiTool.tags=多工具,多操作,用户界面,点击拖动,前端,客户端 - -home.merge.title=合并 -home.merge.desc=轻松合并多个PDF为一个。 -merge.tags=合并,页面操作,后端,服务器端 - -home.split.title=拆分 -home.split.desc=将 PDF 拆分为多个文档。 -split.tags=页面操作,划分,多页面,剪切,服务器端 - -home.rotate.title=旋转 -home.rotate.desc=旋转PDF。 -rotate.tags=服务器端 - - -home.imageToPdf.title=转换图像到PDF -home.imageToPdf.desc=将图像(PNG、JPEG、GIF)转换为PDF。 -imageToPdf.tags=转换、图像、JPG、图片、照片 - -home.pdfToImage.title=转换PDF到图像 -home.pdfToImage.desc=将PDF转换为图像(PNG、JPEG、GIF)。 -pdfToImage.tags=转换、图像、JPG、图片、照片 - -home.pdfOrganiser.title=整理 -home.pdfOrganiser.desc=按任意顺序删除/重新排列页面。 -pdfOrganiser.tags=双面、偶数、奇数、排序、移动 - -home.addImage.title=在PDF中添加图片 -home.addImage.desc=将图像添加到PDF的指定位置。 -addImage.tags=图像、JPG、图片、照片 - -home.watermark.title=添加水印 -home.watermark.desc=在PDF中添加自定义水印。 -watermark.tags=文本、重复、标签、自定义、版权、商标、图像、JPG、图片、照片 - -home.permissions.title=更改权限 -home.permissions.desc=更改PDF文档的权限。 -permissions.tags=阅读、写入、编辑、打印 - -home.removePages.title=删除 -home.removePages.desc=从PDF文档中删除不需要的页面。 -removePages.tags=删除页面、删除 - -home.addPassword.title=添加密码 -home.addPassword.desc=使用密码对PDF文档进行加密。 -addPassword.tags=安全、密码、加密 - -home.removePassword.title=删除密码 -home.removePassword.desc=从PDF文档中移除密码保护。 -removePassword.tags=安全、解密、密码、安全性、删除密码 - -home.compressPdfs.title=压缩 -home.compressPdfs.desc=压缩PDF文件以减小文件大小。 -compressPdfs.tags=压缩、小、微小 - -home.changeMetadata.title=更改元数据 -home.changeMetadata.desc=更改/删除/添加PDF文档的元数据。 -changeMetadata.tags=标题、作者、日期、创建、时间、发布者、制作人、统计数据 - -home.fileToPDF.title=将文件转换为PDF文件 -home.fileToPDF.desc=将几乎所有文件转换为PDF(DOCX、PNG、XLS、PPT、TXT等)。 -fileToPDF.tags=转换、格式、文档、图片、幻灯片、文本、转换、办公室、文档、Word、Excel、PowerPoint - -home.ocr.title=运行OCR/清理扫描 -home.ocr.desc=清理和识别PDF中的图像文本,并将其转换为可编辑文本。 -ocr.tags=识别、文本、图像、扫描、阅读、识别、检测、可编辑 - - -home.extractImages.title=提取图像 -home.extractImages.desc=从PDF中提取所有图像并保存到压缩包中。 -extractImages.tags=图片、照片、保存、归档、压缩包、截取、抓取 - -home.pdfToPDFA.title=PDF To PDF/A -home.pdfToPDFA.desc=将PDF转换为PDF/A以进行长期保存。 -pdfToPDFA.tags=归档、长期、标准、转换、存储、保存 - -home.PDFToWord.title=PDF转Word -home.PDFToWord.desc=将PDF转换为Word格式(DOC、DOCX和ODT)。 -PDFToWord.tags=doc、docx、odt、word、转换、格式、办公、Microsoft、文档 - -home.PDFToPresentation.title=PDF转演示文稿 -home.PDFToPresentation.desc=将PDF转换为演示文稿格式(PPT、PPTX和ODP)。 -PDFToPresentation.tags=幻灯片、展示、办公、Microsoft - -home.PDFToText.title=PDF转RTF(文本) -home.PDFToText.desc=将PDF转换为文本或RTF格式。 -PDFToText.tags=富文本格式、RTF、富文本格式 - -home.PDFToHTML.title=PDF转HTML -home.PDFToHTML.desc=将PDF转换为HTML格式。 -PDFToHTML.tags=网页内容、浏览器友好 - -home.PDFToXML.title=PDF转XML -home.PDFToXML.desc=将PDF转换为XML格式。 -PDFToXML.tags=数据提取、结构化内容、互操作、转换 - -home.ScannerImageSplit.title=检测/分割扫描图像 -home.ScannerImageSplit.desc=从一张照片或PDF中分割出多张照片。 -ScannerImageSplit.tags=分离、自动检测、扫描、多张照片、整理 - -home.sign.title=标志 -home.sign.desc=通过绘图、文字或图像向PDF添加签名 -sign.tags=授权、缩写、手绘签名、文本签名、图像签名 - -home.flatten.title=展平 -home.flatten.desc=从PDF中删除所有互动元素和表单 -flatten.tags=静态、停用、非交互、简化 - -home.repair.title=修复 -home.repair.desc=尝试修复损坏/损坏的PDF -repair.tags=修复、恢复、纠正、恢复 - -home.removeBlanks.title=删除空白页 -home.removeBlanks.desc=检测并删除文档中的空白页 -removeBlanks.tags=清理、简化、非内容、整理 - -home.compare.title=比较 -home.compare.desc=比较并显示两个PDF文档之间的差异 -compare.tags=区分、对比、更改、分析 - -home.certSign.title=使用证书签署 -home.certSign.desc=使用证书/密钥(PEM/P12)对PDF进行签署 -certSign.tags=身份验证、PEM、P12、官方、加密 - -home.pageLayout.title=多页布局 -home.pageLayout.desc=将PDF文档的多个页面合并成一页 -pageLayout.tags=合并、组合、单视图、整理 - -home.scalePages.title=调整页面尺寸/缩放 -home.scalePages.desc=调整页面及/或其内容的尺寸/缩放 -scalePages.tags=调整大小、修改、尺寸、适应 - -home.pipeline.title=管道(高级版) -home.pipeline.desc=通过定义管道脚本在PDF上运行多个操作 -pipeline.tags=自动化、顺序、脚本化、批处理 - -home.add-page-numbers.title=添加页码 -home.add-page-numbers.desc=在文档的指定位置添加页码 -add-page-numbers.tags=分页、标签、整理、索引 - -home.auto-rename.title=自动重命名PDF文件 -home.auto-rename.desc=根据检测到的标题自动对PDF文件进行重命名 -auto-rename.tags=自动检测、基于标题、整理、重新标记 - -home.adjust-contrast.title=调整颜色/对比度 -home.adjust-contrast.desc=调整PDF的对比度、饱和度和亮度 -adjust-contrast.tags=颜色校正、调节、修改、增强 - -home.crop.title=裁剪PDF -home.crop.desc=裁剪PDF以减小其文件大小(保留文本!) -crop.tags=修剪、缩小、编辑、形状 - -home.autoSplitPDF.title=自动拆分页面 -home.autoSplitPDF.desc=使用物理扫描页面分割器QR代码自动拆分扫描的PDF -autoSplitPDF.tags=基于QR码、分离、扫描分割、整理 - -home.sanitizePdf.title=清理 -home.sanitizePdf.desc=从PDF文件中删除脚本和其他元素 -sanitizePdf.tags=清理、安全、安全、删除威胁 - -home.URLToPDF.title=URL/网站转PDF -home.URLToPDF.desc=将任何http(s)URL转换为PDF -URLToPDF.tags=网页捕获、保存网页、网页转文档、归档 - -home.HTMLToPDF.title=HTML转PDF -home.HTMLToPDF.desc=将任何HTML文件或zip文件转换为PDF -HTMLToPDF.tags=标记、网页内容、转换、转换 - -home.MarkdownToPDF.title=Markdown转PDF -home.MarkdownToPDF.desc=将任何Markdown文件转换为PDF -MarkdownToPDF.tags=标记、网页内容、转换、转换 - -home.getPdfInfo.title=获取PDF的所有信息 -home.getPdfInfo.desc=获取PDF的所有可能的信息 -getPdfInfo.tags=信息、数据、统计、统计数据 - -home.extractPage.title=提取页面 -home.extractPage.desc=从PDF中提取选定的页面 -extractPage.tags=提取 - -home.PdfToSinglePage.title=PDF转单一大页 -home.PdfToSinglePage.desc=将所有PDF页面合并为一个大的单页 -PdfToSinglePage.tags=单页 - -home.showJS.title=显示JavaScript -home.showJS.desc=搜索并显示嵌入到PDF中的任何JavaScript代码 -showJS.tags=JavaScript - -home.autoRedact.title=自动删除 -home.autoRedact.desc=根据输入文本自动删除(覆盖)PDF中的文本 -showJS.tags=JavaScript - -########################### -# # -# WEB PAGES # -# # -########################### -#login -login.title=登录 -login.signin=登录 -login.rememberme=记住我 -login.invalid=用户名或密码无效。 -login.locked=您的账户已被锁定。 -login.signinTitle=请登录 - - -#auto-redact -autoRedact.title=自动删除 -autoRedact.header=自动删除 -autoRedact.colorLabel=颜色 -autoRedact.textsToRedactLabel=要删除的文本(每行一个) -autoRedact.textsToRedactPlaceholder=例如:\n保密\n绝密 -autoRedact.useRegexLabel=使用正则表达式 -autoRedact.wholeWordSearchLabel=全字匹配 -autoRedact.customPaddingLabel=自定义额外间距 -autoRedact.convertPDFToImageLabel=将PDF转换为PDF-Image(用于删除方框后面的文本) -autoRedact.submitButton=提交 - - -#showJS -showJS.title=显示 JavaScript -showJS.header=显示 JavaScript -showJS.downloadJS=下载 JavaScript -showJS.submit=显示 - - -#pdfToSinglePage -pdfToSinglePage.title=PDF转为单页 -pdfToSinglePage.header=PDF转为单页 -pdfToSinglePage.submit=转为单页 - - -#pageExtracter -pageExtracter.title=提取页面 -pageExtracter.header=提取页面 -pageExtracter.submit=提取 - - -#getPdfInfo -getPdfInfo.title=获取PDF信息 -getPdfInfo.header=获取PDF信息 -getPdfInfo.submit=获取信息 -getPdfInfo.downloadJson=下载JSON - - -#markdown-to-pdf -MarkdownToPDF.title=Markdown转PDF -MarkdownToPDF.header=Markdown转PDF -MarkdownToPDF.submit=转换 -MarkdownToPDF.help=正在努力中 -MarkdownToPDF.credit=使用WeasyPrint - - - -#url-to-pdf -URLToPDF.title=URL转PDF -URLToPDF.header=URL转PDF -URLToPDF.submit=转换 -URLToPDF.credit=使用WeasyPrint - - -#html-to-pdf -HTMLToPDF.title=HTML转PDF -HTMLToPDF.header=HTML转PDF -HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件 -HTMLToPDF.submit=转换 -HTMLToPDF.credit=使用WeasyPrint - - -#sanitizePDF -sanitizePDF.title=清理PDF -sanitizePDF.header=清理PDF文件 -sanitizePDF.selectText.1=移除JavaScript操作 -sanitizePDF.selectText.2=移除嵌入的文件 -sanitizePDF.selectText.3=移除元数据 -sanitizePDF.selectText.4=移除链接 -sanitizePDF.selectText.5=移除字体 -sanitizePDF.submit=清理PDF - - -#addPageNumbers -addPageNumbers.title=添加页码 -addPageNumbers.header=添加页码 -addPageNumbers.selectText.1=选择PDF文件: -addPageNumbers.selectText.2=边距大小 -addPageNumbers.selectText.3=位置 -addPageNumbers.selectText.4=起始页码 -addPageNumbers.selectText.5=添加页码的页数 -addPageNumbers.selectText.6=自定义文本 -addPageNumbers.customTextDesc=自定义文本 -addPageNumbers.numberPagesDesc=要添加页码的页数,默认为“所有”,也可以接受1-5或2,5,9等 -addPageNumbers.customNumberDesc=默认为{n},也可以接受“第{n}页/共{total}页”,“文本-{n}”,“{filename}-{n}” -addPageNumbers.submit=添加页码 - - -#auto-rename -auto-rename.title=自动重命名 -auto-rename.header=自动重命名PDF -auto-rename.submit=自动重命名 - - -#adjustContrast -adjustContrast.title=调整对比度 -adjustContrast.header=调整对比度 -adjustContrast.contrast=对比度: -adjustContrast.brightness=亮度: -adjustContrast.saturation=饱和度: -adjustContrast.download=下载 - - -#crop -crop.title=裁剪 -crop.header=裁剪图像 -crop.submit=提交 - - -#autoSplitPDF -autoSplitPDF.title=自动拆分PDF -autoSplitPDF.header=自动拆分PDF -autoSplitPDF.description=打印、插入、扫描、上传,让我们自动分离您的文档。无需手动排序。 -autoSplitPDF.selectText.1=从下面打印一些分隔页(黑白打印即可)。 -autoSplitPDF.selectText.2=在文档之间插入分隔页,一次性扫描所有文档。 -autoSplitPDF.selectText.3=上传单个大型扫描的PDF文件,让Stirling PDF处理剩下的事情。 -autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。 -autoSplitPDF.formPrompt=提交包含Stirling-PDF分隔页的PDF: -autoSplitPDF.duplexMode=双面模式(正反面扫描) -autoSplitPDF.dividerDownload1=下载“自动拆分分隔页(最小化).pdf” -autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf” -autoSplitPDF.submit=提交 - - -#pipeline -pipeline.title=流水线 - - -#pageLayout -pageLayout.title=多页布局 -pageLayout.header=多页布局 -pageLayout.pagesPerSheet=每页的页面数: -########################## -### TODO: Translate ### -########################## -pageLayout.addBorder=添加边框 -pageLayout.submit=提交 - - -#scalePages -scalePages.title=调整页面缩放比例 -scalePages.header=调整页面缩放比例 -scalePages.pageSize=文档页面的尺寸。 -scalePages.scaleFactor=页面的缩放级别(裁剪)。 -scalePages.submit=提交 - - -#certSign -certSign.title=证书签名 -certSign.header=使用您的证书签署 PDF(进行中) -certSign.selectPDF=选择要签名的 PDF 文件: -certSign.selectKey=选择您的私钥文件(PKCS#8 格式,可以是 .pem 或 .der): -certSign.selectCert=选择您的证书文件(X.509 格式,可以是 .pem 或 .der): -certSign.selectP12=选择您的 PKCS#12 密钥库文件(.p12 或 .pfx)(可选,如果提供,它应该包含您的私钥和证书): -certSign.certType=证书类型 -certSign.password=输入您的密钥库或私钥密码(如果有): -certSign.showSig=显示签名 -certSign.reason=原因 -certSign.location=位置 -certSign.name=名称 -certSign.submit=签署 PDF - - -#removeBlanks -removeBlanks.title=删除空白 -removeBlanks.header=删除空白页 -removeBlanks.threshold=阈值: -removeBlanks.thresholdDesc=确定白色像素必须有多白的阈值 -removeBlanks.whitePercent=白色百分比(%): -removeBlanks.whitePercentDesc=必须为白色才能删除的页面百分比 -removeBlanks.submit=删除空白 - - -#compare -compare.title=比较 -compare.header=比较 PDF -compare.document.1=文档 1 -compare.document.2=文档 2 -compare.submit=比较 - - -#sign -sign.title=签名 -sign.header=签署 PDF -sign.upload=上传图片 -sign.draw=绘制签名 -sign.text=文本输入 -sign.clear=清除 -sign.add=添加 - - -#repair -repair.title=修复 -repair.header=修复 PDF -repair.submit=修复 - - -#flatten -flatten.title=展平 -flatten.header=展平 PDF -flatten.submit=展平 - - -#ScannerImageSplit -ScannerImageSplit.selectText.1=角度阈值: -ScannerImageSplit.selectText.2=设置图像被旋转所需的最小绝对角度(默认:10)。 -ScannerImageSplit.selectText.3=公差: -ScannerImageSplit.selectText.4=确定估计背景颜色周围的颜色变化范围(默认值:30)。 -ScannerImageSplit.selectText.5=最小面积: -ScannerImageSplit.selectText.6=设置照片的最小面积阈值(默认:10000)。 -ScannerImageSplit.selectText.7=最小轮廓面积: -ScannerImageSplit.selectText.8=设置照片的最小轮廓面积阈值。 -ScannerImageSplit.selectText.9=边框尺寸: -ScannerImageSplit.selectText.10=设置添加和删除的边框大小,以防止输出中出现白边(默认值:1)。 - - -#OCR -ocr.title=OCR/扫描清理 -ocr.header=清理扫描件/OCR(光学字符识别)。 -ocr.selectText.1=选择要在PDF中检测的语言(列出的语言是目前检测到的): -ocr.selectText.2=生成包含OCR文本的文本文件,与OCR编辑的PDF一起。 -ocr.selectText.3=通过将页面旋转回原位来纠正偏斜的扫描角度 -ocr.selectText.4=清理页面,降低OCR在噪点中识别到文本的可能。(没有输出变化) -ocr.selectText.5=清洁页面,降低OCR在噪点中识别到文本的可能,保持输出的清洁。 -ocr.selectText.6=忽略有交互式文本的页面,只对有图像的页面进行OCR。 -ocr.selectText.7=强制OCR,将OCR每个页面,删除所有的原始文本元素。 -ocr.selectText.8=Normal (如果PDF包含文本,将出现错误) -ocr.selectText.9=额外设置 -ocr.selectText.10=OCR模式 -ocr.selectText.11=OCR后移除图像(移除所有图像,只有在转换步骤中才有用)。 -ocr.selectText.12=渲染类型(高级) -ocr.help=请阅读此文档,了解如何将其用于其他语言和/或不在docker中使用。 -ocr.credit=此服务使用OCRmyPDF和Tesseract进行OCR。 -ocr.submit=用OCR处理PDF - - -#extractImages -extractImages.title=提取图像 -extractImages.header=提取图像 -extractImages.selectText=选择图像格式,将提取的图像转换为 -extractImages.submit=提取 - - -#File to PDF -fileToPDF.title=文件转换为PDF -fileToPDF.header=将任何文件转换为PDF。 -fileToPDF.credit=本服务使用LibreOffice和Unoconv进行文件转换。 -fileToPDF.supportedFileTypes=支持的文件类型应该包括以下几种,但是,对于支持的格式的完整更新列表,请参考LibreOffice文档。 -fileToPDF.submit=转换为 PDF - - -#compress -compress.title=压缩 -compress.header=压缩PDF -compress.credit=此服务使用 Ghostscript 进行 PDF 压缩/优化。 -compress.selectText.1=手动模式 - 从 1 到 4 -compress.selectText.2=优化级别: -compress.selectText.3=4(文本图像很糟糕) -compress.selectText.4=自动模式 - 自动调整质量以获得精确大小的 PDF -compress.selectText.5=预期 PDF 大小(例如 25MB、10.8MB、25KB) -compress.submit=压缩 - - -#Add image -addImage.title=添加图像 -addImage.header=添加图片到PDF(正在进行中) -addImage.everyPage=每一页? -addImage.upload=添加图片 -addImage.submit=添加图片 - - -#merge -merge.title=合并 -merge.header=合并多个PDF(2个以上)。 -merge.sortByName=按名称排序 -merge.sortByDate=按日期排序 -merge.submit=合并 - - -#pdfOrganiser -pdfOrganiser.title=页面排序 -pdfOrganiser.header=PDF页面排序 -pdfOrganiser.submit=重新排列页面 - - -#multiTool -multiTool.title=PDF多功能工具 -multiTool.header=PDF多功能工具 - - -#pageRemover -pageRemover.title=删除页面 -pageRemover.header=PDF页面移除器 -pageRemover.pagesToDelete=要删除的页面(输入一个用逗号分隔的页码列表): -pageRemover.submit=删除页面 - - -#rotate -rotate.title=旋转PDF -rotate.header=旋转PDF -rotate.selectAngle=选择旋转角度(以90度的倍数): -rotate.submit=旋转 - - -#merge -split.title=拆分PDF -split.header=拆分PDF -split.desc.1=选择希望进行分割的页数 -split.desc.2=如选择1,3,7-8将把一个10页的文件分割成6个独立的PDF: -split.desc.3=文档 #1:第1页 -split.desc.4=文档 #2:第2页和第3页 -split.desc.5=文档 #3:第4页、第5页和第6页 -split.desc.6=文档 #4:第7页 -split.desc.7=文档 #5:第8页 -split.desc.8=文档 #6:第9页和第10页 -split.splitPages=输入要分割的页面: -split.submit=拆分 - - -#merge -imageToPDF.title=图片转PDF -imageToPDF.header=图像转为PDF -imageToPDF.submit=转换 -imageToPDF.selectLabel=图片适应选项 -imageToPDF.fillPage=填充页面 -imageToPDF.fitDocumentToImage=适应图片大小 -imageToPDF.maintainAspectRatio=保持纵横比例 -imageToPDF.selectText.2=自动旋转PDF -imageToPDF.selectText.3=多文件逻辑(仅在处理多个图像时启用) -imageToPDF.selectText.4=合并成一个PDF文件 -imageToPDF.selectText.5=转换为独立的PDF文件 - - -#pdfToImage -pdfToImage.title=PDF to Image -pdfToImage.header=PDF转图片 -pdfToImage.selectText=图像格式 -pdfToImage.singleOrMultiple=图像结果类型 -pdfToImage.single=单张图片 -pdfToImage.multi=多张图片 -pdfToImage.colorType=颜色类型 -pdfToImage.color=颜色 -pdfToImage.grey=灰度 -pdfToImage.blackwhite=黑白(可能会丢失数据!)。 -pdfToImage.submit=转换 - - -#addPassword -addPassword.title=添加密码 -addPassword.header=添加密码(加密)。 -addPassword.selectText.1=选择要加密的PDF。 -addPassword.selectText.2=密码 -addPassword.selectText.3=加密密钥长度 -addPassword.selectText.4=值越高越强,但值越低兼容性越好。 -addPassword.selectText.5=要设置的权限 -addPassword.selectText.6=防止文件的拼接。 -addPassword.selectText.7=防止内容提取 -addPassword.selectText.8=防止为可访问性提取内容 -addPassword.selectText.9=防止填写表格 -addPassword.selectText.10=防止修改 -addPassword.selectText.11=防止修改注释 -addPassword.selectText.12=防止打印 -addPassword.selectText.13=防止打印不同的格式 -addPassword.selectText.14=所有者密码 -addPassword.selectText.15=限制打开后对文档的操作(不被所有阅读器支持) -addPassword.selectText.16=限制打开文档本身 -addPassword.submit=加密 - - -#watermark -watermark.title=添加水印 -watermark.header=添加水印 -watermark.selectText.1=选择要添加水印的PDF: -watermark.selectText.2=水印文本: -watermark.selectText.3=字体大小: -watermark.selectText.4=旋转(0-360): -watermark.selectText.5=水平间距(每个水印之间的水平距离): -watermark.selectText.6=垂直间距(每个水印之间的垂直距离): -watermark.selectText.7=透明度(0% - 100%): -watermark.selectText.8=水印类型: -watermark.selectText.9=水印图片: -watermark.submit=添加水印 - - -#Change permissions -permissions.title=更改权限 -permissions.header=改变权限 -permissions.warning=警告,为了使这些权限不能被改变,建议通过添加密码页面设置密码。 -permissions.selectText.1=选择PDF来改变权限 -permissions.selectText.2=要设置的权限 -permissions.selectText.3=防止文件的拼接 -permissions.selectText.4=防止内容提取 -permissions.selectText.5=防止提取内容的可访问性 -permissions.selectText.6=防止填写表格 -permissions.selectText.7=防止修改 -permissions.selectText.8=防止修改注释 -permissions.selectText.9=防止打印 -permissions.selectText.10=防止打印不同的格式 -permissions.submit=改变 - - -#remove password -removePassword.title=删除密码 -removePassword.header=移除密码(解密)。 -removePassword.selectText.1=选择要解密的PDF -removePassword.selectText.2=密码 -removePassword.submit=删除 - - -#changeMetadata -changeMetadata.title=标题: -changeMetadata.header=更改元数据 -changeMetadata.selectText.1=请编辑你想要改变的变量。 -changeMetadata.selectText.2=删除所有元数据 -changeMetadata.selectText.3=显示自定义元数据: -changeMetadata.author=作者: -changeMetadata.creationDate=创建日期(yyyy/MM/dd HH:mm:ss): -changeMetadata.creator=创建者: -changeMetadata.keywords=关键词: -changeMetadata.modDate=修改日期(yyyy/MM/dd HH:mm:ss): -changeMetadata.producer=生产者: -changeMetadata.subject=主题: -changeMetadata.title=标题: -changeMetadata.trapped=被困: -changeMetadata.selectText.4=其他元数据: -changeMetadata.selectText.5=添加自定义元数据条目 -changeMetadata.submit=更改 - - -#pdfToPDFA -pdfToPDFA.title=将PDF转换为PDF/A -pdfToPDFA.header=PDF转换为PDF/A -pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 -pdfToPDFA.submit=转换 - - -#PDFToWord -PDFToWord.title=PDF to Word -PDFToWord.header=将PDF转换成Word -PDFToWord.selectText.1=输出文件格式 -PDFToWord.credit=此服务使用LibreOffice进行文件转换。 -PDFToWord.submit=转换 - - -#PDFToPresentation -PDFToPresentation.title=PDF转换为演示文稿 -PDFToPresentation.header=将PDF转为演示文稿 -PDFToPresentation.selectText.1=输出文件格式 -PDFToPresentation.credit=该服务使用LibreOffice进行文件转换。 -PDFToPresentation.submit=转换 - - -#PDFToText -PDFToText.title=PDF to RTF (Text) -PDFToText.header=将PDF转换成文本/RTF -PDFToText.selectText.1=输出文件格式 -PDFToText.credit=该服务使用LibreOffice进行文件转换。 -PDFToText.submit=转换 - - -#PDFToHTML -PDFToHTML.title=PDF To HTML -PDFToHTML.header=将PDF转换成HTML -PDFToHTML.credit=此服务使用LibreOffice进行文件转换。 -PDFToHTML.submit=转换 - - -#PDFToXML -PDFToXML.title=PDF To XML -PDFToXML.header=将PDF转换为XML -PDFToXML.credit=此服务使用LibreOffice进行文件转换。 -PDFToXML.submit=转换 diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template deleted file mode 100644 index 0f229ba4..00000000 --- a/src/main/resources/settings.yml.template +++ /dev/null @@ -1,23 +0,0 @@ -# Welcome to settings file -# Remove comment marker # if on start of line to enable the configuration -# If you want to override with environment parameter follow parameter naming SECURITY_INITIALLOGIN_USERNAME - -security: - enableLogin: false # set to 'true' to enable login - csrfDisabled: true - -system: - defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) - googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow - -#ui: -# appName: exampleAppName # Application's visible name -# homeDescription: I am a description # Short description or tagline shown on homepage. -# appNameNavbar: navbarName # Name displayed on the navigation bar - -endpoints: - toRemove: [] # List endpoints to disable (e.g. ['img-to-pdf', 'remove-pages']) - groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice']) - -metrics: - enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable diff --git a/src/main/resources/static/android-chrome-192x192.png b/src/main/resources/static/android-chrome-192x192.png deleted file mode 100644 index 0c199d03..00000000 Binary files a/src/main/resources/static/android-chrome-192x192.png and /dev/null differ diff --git a/src/main/resources/static/android-chrome-512x512.png b/src/main/resources/static/android-chrome-512x512.png deleted file mode 100644 index 011e5383..00000000 Binary files a/src/main/resources/static/android-chrome-512x512.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-114x114.png b/src/main/resources/static/apple-touch-icon-114x114.png deleted file mode 100644 index f777fe88..00000000 Binary files a/src/main/resources/static/apple-touch-icon-114x114.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-120x120.png b/src/main/resources/static/apple-touch-icon-120x120.png deleted file mode 100644 index 20fa2148..00000000 Binary files a/src/main/resources/static/apple-touch-icon-120x120.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-144x144.png b/src/main/resources/static/apple-touch-icon-144x144.png deleted file mode 100644 index 078bbb44..00000000 Binary files a/src/main/resources/static/apple-touch-icon-144x144.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-152x152.png b/src/main/resources/static/apple-touch-icon-152x152.png deleted file mode 100644 index 643ac534..00000000 Binary files a/src/main/resources/static/apple-touch-icon-152x152.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-180x180.png b/src/main/resources/static/apple-touch-icon-180x180.png deleted file mode 100644 index debef0d7..00000000 Binary files a/src/main/resources/static/apple-touch-icon-180x180.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-57x57.png b/src/main/resources/static/apple-touch-icon-57x57.png deleted file mode 100644 index b2d881d0..00000000 Binary files a/src/main/resources/static/apple-touch-icon-57x57.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-60x60.png b/src/main/resources/static/apple-touch-icon-60x60.png deleted file mode 100644 index aa7ead3d..00000000 Binary files a/src/main/resources/static/apple-touch-icon-60x60.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-72x72.png b/src/main/resources/static/apple-touch-icon-72x72.png deleted file mode 100644 index dd4dd5c3..00000000 Binary files a/src/main/resources/static/apple-touch-icon-72x72.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon-76x76.png b/src/main/resources/static/apple-touch-icon-76x76.png deleted file mode 100644 index 6c089459..00000000 Binary files a/src/main/resources/static/apple-touch-icon-76x76.png and /dev/null differ diff --git a/src/main/resources/static/apple-touch-icon.png b/src/main/resources/static/apple-touch-icon.png deleted file mode 100644 index debef0d7..00000000 Binary files a/src/main/resources/static/apple-touch-icon.png and /dev/null differ diff --git a/src/main/resources/static/browserconfig.xml b/src/main/resources/static/browserconfig.xml deleted file mode 100644 index a47e5a5b..00000000 --- a/src/main/resources/static/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #2d89ef - - - diff --git a/src/main/resources/static/css/bootstrap-icons.css b/src/main/resources/static/css/bootstrap-icons.css deleted file mode 100644 index 7ebc9f1a..00000000 --- a/src/main/resources/static/css/bootstrap-icons.css +++ /dev/null @@ -1,2018 +0,0 @@ -@font-face { - font-display: block; - font-family: "bootstrap-icons"; - src: url("./fonts/bootstrap-icons.woff2?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff2"), -url("./fonts/bootstrap-icons.woff?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-1::before { content: "\f2a5"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-1::before { content: "\f68a"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-1::before { content: "\f68d"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-1::before { content: "\f690"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-1::before { content: "\f695"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-1::before { content: "\f698"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-mortorboard-fill::before { content: "\f6a2"; } -.bi-mortorboard::before { content: "\f6a3"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-1::before { content: "\f6b6"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash-1::before { content: "\f6c2"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport-1::before { content: "\f6e0"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-ssd-fill::before { content: "\f6ed"; } -.bi-ssd::before { content: "\f6ee"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt-1::before { content: "\f759"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls-1::before { content: "\f769"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } -.bi-1-circle-1::before { content: "\f794"; } -.bi-1-circle-fill-1::before { content: "\f795"; } -.bi-1-circle-fill::before { content: "\f796"; } -.bi-1-circle::before { content: "\f797"; } -.bi-1-square-fill::before { content: "\f798"; } -.bi-1-square::before { content: "\f799"; } -.bi-2-circle-1::before { content: "\f79a"; } -.bi-2-circle-fill-1::before { content: "\f79b"; } -.bi-2-circle-fill::before { content: "\f79c"; } -.bi-2-circle::before { content: "\f79d"; } -.bi-2-square-fill::before { content: "\f79e"; } -.bi-2-square::before { content: "\f79f"; } -.bi-3-circle-1::before { content: "\f7a0"; } -.bi-3-circle-fill-1::before { content: "\f7a1"; } -.bi-3-circle-fill::before { content: "\f7a2"; } -.bi-3-circle::before { content: "\f7a3"; } -.bi-3-square-fill::before { content: "\f7a4"; } -.bi-3-square::before { content: "\f7a5"; } -.bi-4-circle-1::before { content: "\f7a6"; } -.bi-4-circle-fill-1::before { content: "\f7a7"; } -.bi-4-circle-fill::before { content: "\f7a8"; } -.bi-4-circle::before { content: "\f7a9"; } -.bi-4-square-fill::before { content: "\f7aa"; } -.bi-4-square::before { content: "\f7ab"; } -.bi-5-circle-1::before { content: "\f7ac"; } -.bi-5-circle-fill-1::before { content: "\f7ad"; } -.bi-5-circle-fill::before { content: "\f7ae"; } -.bi-5-circle::before { content: "\f7af"; } -.bi-5-square-fill::before { content: "\f7b0"; } -.bi-5-square::before { content: "\f7b1"; } -.bi-6-circle-1::before { content: "\f7b2"; } -.bi-6-circle-fill-1::before { content: "\f7b3"; } -.bi-6-circle-fill::before { content: "\f7b4"; } -.bi-6-circle::before { content: "\f7b5"; } -.bi-6-square-fill::before { content: "\f7b6"; } -.bi-6-square::before { content: "\f7b7"; } -.bi-7-circle-1::before { content: "\f7b8"; } -.bi-7-circle-fill-1::before { content: "\f7b9"; } -.bi-7-circle-fill::before { content: "\f7ba"; } -.bi-7-circle::before { content: "\f7bb"; } -.bi-7-square-fill::before { content: "\f7bc"; } -.bi-7-square::before { content: "\f7bd"; } -.bi-8-circle-1::before { content: "\f7be"; } -.bi-8-circle-fill-1::before { content: "\f7bf"; } -.bi-8-circle-fill::before { content: "\f7c0"; } -.bi-8-circle::before { content: "\f7c1"; } -.bi-8-square-fill::before { content: "\f7c2"; } -.bi-8-square::before { content: "\f7c3"; } -.bi-9-circle-1::before { content: "\f7c4"; } -.bi-9-circle-fill-1::before { content: "\f7c5"; } -.bi-9-circle-fill::before { content: "\f7c6"; } -.bi-9-circle::before { content: "\f7c7"; } -.bi-9-square-fill::before { content: "\f7c8"; } -.bi-9-square::before { content: "\f7c9"; } -.bi-airplane-engines-fill::before { content: "\f7ca"; } -.bi-airplane-engines::before { content: "\f7cb"; } -.bi-airplane-fill::before { content: "\f7cc"; } -.bi-airplane::before { content: "\f7cd"; } -.bi-alexa::before { content: "\f7ce"; } -.bi-alipay::before { content: "\f7cf"; } -.bi-android::before { content: "\f7d0"; } -.bi-android2::before { content: "\f7d1"; } -.bi-box-fill::before { content: "\f7d2"; } -.bi-box-seam-fill::before { content: "\f7d3"; } -.bi-browser-chrome::before { content: "\f7d4"; } -.bi-browser-edge::before { content: "\f7d5"; } -.bi-browser-firefox::before { content: "\f7d6"; } -.bi-browser-safari::before { content: "\f7d7"; } -.bi-c-circle-1::before { content: "\f7d8"; } -.bi-c-circle-fill-1::before { content: "\f7d9"; } -.bi-c-circle-fill::before { content: "\f7da"; } -.bi-c-circle::before { content: "\f7db"; } -.bi-c-square-fill::before { content: "\f7dc"; } -.bi-c-square::before { content: "\f7dd"; } -.bi-capsule-pill::before { content: "\f7de"; } -.bi-capsule::before { content: "\f7df"; } -.bi-car-front-fill::before { content: "\f7e0"; } -.bi-car-front::before { content: "\f7e1"; } -.bi-cassette-fill::before { content: "\f7e2"; } -.bi-cassette::before { content: "\f7e3"; } -.bi-cc-circle-1::before { content: "\f7e4"; } -.bi-cc-circle-fill-1::before { content: "\f7e5"; } -.bi-cc-circle-fill::before { content: "\f7e6"; } -.bi-cc-circle::before { content: "\f7e7"; } -.bi-cc-square-fill::before { content: "\f7e8"; } -.bi-cc-square::before { content: "\f7e9"; } -.bi-cup-hot-fill::before { content: "\f7ea"; } -.bi-cup-hot::before { content: "\f7eb"; } -.bi-currency-rupee::before { content: "\f7ec"; } -.bi-dropbox::before { content: "\f7ed"; } -.bi-escape::before { content: "\f7ee"; } -.bi-fast-forward-btn-fill::before { content: "\f7ef"; } -.bi-fast-forward-btn::before { content: "\f7f0"; } -.bi-fast-forward-circle-fill::before { content: "\f7f1"; } -.bi-fast-forward-circle::before { content: "\f7f2"; } -.bi-fast-forward-fill::before { content: "\f7f3"; } -.bi-fast-forward::before { content: "\f7f4"; } -.bi-filetype-sql::before { content: "\f7f5"; } -.bi-fire::before { content: "\f7f6"; } -.bi-google-play::before { content: "\f7f7"; } -.bi-h-circle-1::before { content: "\f7f8"; } -.bi-h-circle-fill-1::before { content: "\f7f9"; } -.bi-h-circle-fill::before { content: "\f7fa"; } -.bi-h-circle::before { content: "\f7fb"; } -.bi-h-square-fill::before { content: "\f7fc"; } -.bi-h-square::before { content: "\f7fd"; } -.bi-indent::before { content: "\f7fe"; } -.bi-lungs-fill::before { content: "\f7ff"; } -.bi-lungs::before { content: "\f800"; } -.bi-microsoft-teams::before { content: "\f801"; } -.bi-p-circle-1::before { content: "\f802"; } -.bi-p-circle-fill-1::before { content: "\f803"; } -.bi-p-circle-fill::before { content: "\f804"; } -.bi-p-circle::before { content: "\f805"; } -.bi-p-square-fill::before { content: "\f806"; } -.bi-p-square::before { content: "\f807"; } -.bi-pass-fill::before { content: "\f808"; } -.bi-pass::before { content: "\f809"; } -.bi-prescription::before { content: "\f80a"; } -.bi-prescription2::before { content: "\f80b"; } -.bi-r-circle-1::before { content: "\f80c"; } -.bi-r-circle-fill-1::before { content: "\f80d"; } -.bi-r-circle-fill::before { content: "\f80e"; } -.bi-r-circle::before { content: "\f80f"; } -.bi-r-square-fill::before { content: "\f810"; } -.bi-r-square::before { content: "\f811"; } -.bi-repeat-1::before { content: "\f812"; } -.bi-repeat::before { content: "\f813"; } -.bi-rewind-btn-fill::before { content: "\f814"; } -.bi-rewind-btn::before { content: "\f815"; } -.bi-rewind-circle-fill::before { content: "\f816"; } -.bi-rewind-circle::before { content: "\f817"; } -.bi-rewind-fill::before { content: "\f818"; } -.bi-rewind::before { content: "\f819"; } -.bi-train-freight-front-fill::before { content: "\f81a"; } -.bi-train-freight-front::before { content: "\f81b"; } -.bi-train-front-fill::before { content: "\f81c"; } -.bi-train-front::before { content: "\f81d"; } -.bi-train-lightrail-front-fill::before { content: "\f81e"; } -.bi-train-lightrail-front::before { content: "\f81f"; } -.bi-truck-front-fill::before { content: "\f820"; } -.bi-truck-front::before { content: "\f821"; } -.bi-ubuntu::before { content: "\f822"; } -.bi-unindent::before { content: "\f823"; } -.bi-unity::before { content: "\f824"; } -.bi-universal-access-circle::before { content: "\f825"; } -.bi-universal-access::before { content: "\f826"; } -.bi-virus::before { content: "\f827"; } -.bi-virus2::before { content: "\f828"; } -.bi-wechat::before { content: "\f829"; } -.bi-yelp::before { content: "\f82a"; } -.bi-sign-stop-fill::before { content: "\f82b"; } -.bi-sign-stop-lights-fill::before { content: "\f82c"; } -.bi-sign-stop-lights::before { content: "\f82d"; } -.bi-sign-stop::before { content: "\f82e"; } -.bi-sign-turn-left-fill::before { content: "\f82f"; } -.bi-sign-turn-left::before { content: "\f830"; } -.bi-sign-turn-right-fill::before { content: "\f831"; } -.bi-sign-turn-right::before { content: "\f832"; } -.bi-sign-turn-slight-left-fill::before { content: "\f833"; } -.bi-sign-turn-slight-left::before { content: "\f834"; } -.bi-sign-turn-slight-right-fill::before { content: "\f835"; } -.bi-sign-turn-slight-right::before { content: "\f836"; } -.bi-sign-yield-fill::before { content: "\f837"; } -.bi-sign-yield::before { content: "\f838"; } -.bi-ev-station-fill::before { content: "\f839"; } -.bi-ev-station::before { content: "\f83a"; } -.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } -.bi-fuel-pump-diesel::before { content: "\f83c"; } -.bi-fuel-pump-fill::before { content: "\f83d"; } -.bi-fuel-pump::before { content: "\f83e"; } -.bi-0-circle-fill::before { content: "\f83f"; } -.bi-0-circle::before { content: "\f840"; } -.bi-0-square-fill::before { content: "\f841"; } -.bi-0-square::before { content: "\f842"; } -.bi-rocket-fill::before { content: "\f843"; } -.bi-rocket-takeoff-fill::before { content: "\f844"; } -.bi-rocket-takeoff::before { content: "\f845"; } -.bi-rocket::before { content: "\f846"; } -.bi-stripe::before { content: "\f847"; } -.bi-subscript::before { content: "\f848"; } -.bi-superscript::before { content: "\f849"; } -.bi-trello::before { content: "\f84a"; } -.bi-envelope-at-fill::before { content: "\f84b"; } -.bi-envelope-at::before { content: "\f84c"; } -.bi-regex::before { content: "\f84d"; } -.bi-text-wrap::before { content: "\f84e"; } -.bi-sign-dead-end-fill::before { content: "\f84f"; } -.bi-sign-dead-end::before { content: "\f850"; } -.bi-sign-do-not-enter-fill::before { content: "\f851"; } -.bi-sign-do-not-enter::before { content: "\f852"; } -.bi-sign-intersection-fill::before { content: "\f853"; } -.bi-sign-intersection-side-fill::before { content: "\f854"; } -.bi-sign-intersection-side::before { content: "\f855"; } -.bi-sign-intersection-t-fill::before { content: "\f856"; } -.bi-sign-intersection-t::before { content: "\f857"; } -.bi-sign-intersection-y-fill::before { content: "\f858"; } -.bi-sign-intersection-y::before { content: "\f859"; } -.bi-sign-intersection::before { content: "\f85a"; } -.bi-sign-merge-left-fill::before { content: "\f85b"; } -.bi-sign-merge-left::before { content: "\f85c"; } -.bi-sign-merge-right-fill::before { content: "\f85d"; } -.bi-sign-merge-right::before { content: "\f85e"; } -.bi-sign-no-left-turn-fill::before { content: "\f85f"; } -.bi-sign-no-left-turn::before { content: "\f860"; } -.bi-sign-no-parking-fill::before { content: "\f861"; } -.bi-sign-no-parking::before { content: "\f862"; } -.bi-sign-no-right-turn-fill::before { content: "\f863"; } -.bi-sign-no-right-turn::before { content: "\f864"; } -.bi-sign-railroad-fill::before { content: "\f865"; } -.bi-sign-railroad::before { content: "\f866"; } -.bi-building-add::before { content: "\f867"; } -.bi-building-check::before { content: "\f868"; } -.bi-building-dash::before { content: "\f869"; } -.bi-building-down::before { content: "\f86a"; } -.bi-building-exclamation::before { content: "\f86b"; } -.bi-building-fill-add::before { content: "\f86c"; } -.bi-building-fill-check::before { content: "\f86d"; } -.bi-building-fill-dash::before { content: "\f86e"; } -.bi-building-fill-down::before { content: "\f86f"; } -.bi-building-fill-exclamation::before { content: "\f870"; } -.bi-building-fill-gear::before { content: "\f871"; } -.bi-building-fill-lock::before { content: "\f872"; } -.bi-building-fill-slash::before { content: "\f873"; } -.bi-building-fill-up::before { content: "\f874"; } -.bi-building-fill-x::before { content: "\f875"; } -.bi-building-fill::before { content: "\f876"; } -.bi-building-gear::before { content: "\f877"; } -.bi-building-lock::before { content: "\f878"; } -.bi-building-slash::before { content: "\f879"; } -.bi-building-up::before { content: "\f87a"; } -.bi-building-x::before { content: "\f87b"; } -.bi-buildings-fill::before { content: "\f87c"; } -.bi-buildings::before { content: "\f87d"; } -.bi-bus-front-fill::before { content: "\f87e"; } -.bi-bus-front::before { content: "\f87f"; } -.bi-ev-front-fill::before { content: "\f880"; } -.bi-ev-front::before { content: "\f881"; } -.bi-globe-americas::before { content: "\f882"; } -.bi-globe-asia-australia::before { content: "\f883"; } -.bi-globe-central-south-asia::before { content: "\f884"; } -.bi-globe-europe-africa::before { content: "\f885"; } -.bi-house-add-fill::before { content: "\f886"; } -.bi-house-add::before { content: "\f887"; } -.bi-house-check-fill::before { content: "\f888"; } -.bi-house-check::before { content: "\f889"; } -.bi-house-dash-fill::before { content: "\f88a"; } -.bi-house-dash::before { content: "\f88b"; } -.bi-house-down-fill::before { content: "\f88c"; } -.bi-house-down::before { content: "\f88d"; } -.bi-house-exclamation-fill::before { content: "\f88e"; } -.bi-house-exclamation::before { content: "\f88f"; } -.bi-house-gear-fill::before { content: "\f890"; } -.bi-house-gear::before { content: "\f891"; } -.bi-house-lock-fill::before { content: "\f892"; } -.bi-house-lock::before { content: "\f893"; } -.bi-house-slash-fill::before { content: "\f894"; } -.bi-house-slash::before { content: "\f895"; } -.bi-house-up-fill::before { content: "\f896"; } -.bi-house-up::before { content: "\f897"; } -.bi-house-x-fill::before { content: "\f898"; } -.bi-house-x::before { content: "\f899"; } -.bi-person-add::before { content: "\f89a"; } -.bi-person-down::before { content: "\f89b"; } -.bi-person-exclamation::before { content: "\f89c"; } -.bi-person-fill-add::before { content: "\f89d"; } -.bi-person-fill-check::before { content: "\f89e"; } -.bi-person-fill-dash::before { content: "\f89f"; } -.bi-person-fill-down::before { content: "\f8a0"; } -.bi-person-fill-exclamation::before { content: "\f8a1"; } -.bi-person-fill-gear::before { content: "\f8a2"; } -.bi-person-fill-lock::before { content: "\f8a3"; } -.bi-person-fill-slash::before { content: "\f8a4"; } -.bi-person-fill-up::before { content: "\f8a5"; } -.bi-person-fill-x::before { content: "\f8a6"; } -.bi-person-gear::before { content: "\f8a7"; } -.bi-person-lock::before { content: "\f8a8"; } -.bi-person-slash::before { content: "\f8a9"; } -.bi-person-up::before { content: "\f8aa"; } -.bi-scooter::before { content: "\f8ab"; } -.bi-taxi-front-fill::before { content: "\f8ac"; } -.bi-taxi-front::before { content: "\f8ad"; } -.bi-amd::before { content: "\f8ae"; } -.bi-database-add::before { content: "\f8af"; } -.bi-database-check::before { content: "\f8b0"; } -.bi-database-dash::before { content: "\f8b1"; } -.bi-database-down::before { content: "\f8b2"; } -.bi-database-exclamation::before { content: "\f8b3"; } -.bi-database-fill-add::before { content: "\f8b4"; } -.bi-database-fill-check::before { content: "\f8b5"; } -.bi-database-fill-dash::before { content: "\f8b6"; } -.bi-database-fill-down::before { content: "\f8b7"; } -.bi-database-fill-exclamation::before { content: "\f8b8"; } -.bi-database-fill-gear::before { content: "\f8b9"; } -.bi-database-fill-lock::before { content: "\f8ba"; } -.bi-database-fill-slash::before { content: "\f8bb"; } -.bi-database-fill-up::before { content: "\f8bc"; } -.bi-database-fill-x::before { content: "\f8bd"; } -.bi-database-fill::before { content: "\f8be"; } -.bi-database-gear::before { content: "\f8bf"; } -.bi-database-lock::before { content: "\f8c0"; } -.bi-database-slash::before { content: "\f8c1"; } -.bi-database-up::before { content: "\f8c2"; } -.bi-database-x::before { content: "\f8c3"; } -.bi-database::before { content: "\f8c4"; } -.bi-houses-fill::before { content: "\f8c5"; } -.bi-houses::before { content: "\f8c6"; } -.bi-nvidia::before { content: "\f8c7"; } -.bi-person-vcard-fill::before { content: "\f8c8"; } -.bi-person-vcard::before { content: "\f8c9"; } -.bi-sina-weibo::before { content: "\f8ca"; } -.bi-tencent-qq::before { content: "\f8cb"; } -.bi-wikipedia::before { content: "\f8cc"; } diff --git a/src/main/resources/static/css/bootstrap.min.css b/src/main/resources/static/css/bootstrap.min.css deleted file mode 100644 index edfbbb03..00000000 --- a/src/main/resources/static/css/bootstrap.min.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.0.2 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + (.5rem + 2px));padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + (1rem + 2px));padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + (.75rem + 2px))}textarea.form-control-sm{min-height:calc(1.5em + (.5rem + 2px))}textarea.form-control-lg{min-height:calc(1.5em + (1rem + 2px))}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/main/resources/static/css/dark-mode.css b/src/main/resources/static/css/dark-mode.css deleted file mode 100644 index 82e01676..00000000 --- a/src/main/resources/static/css/dark-mode.css +++ /dev/null @@ -1,116 +0,0 @@ -/* Dark Mode Styles */ -body, select, textarea { - --body-background-color: 51, 51, 51; - --base-font-color: 255, 255, 255; - background-color: rgb(var(--body-background-color)) !important; - color: rgb(var(--base-font-color)) !important; -} -.card { - background-color: rgb(var(--body-background-color)) !important; - border: 1px solid #999; - color: rgb(var(--base-font-color)) !important; -} - -.dark-card { - background-color: rgb(var(--body-background-color)) !important; - color: rgb(var(--base-font-color)) !important; -} -.jumbotron { - background-color: #222; /* or any other dark color */ - color: rgb(var(--base-font-color)) !important; /* or any other light color */ -} - -.list-group { - background-color: #222 !important; - color: rgb(var(--base-font-color)) !important; -} -.list-group-item { - background-color: #222 !important; - color: rgb(var(--base-font-color)) !important; -} -#support-section { - background-color: #444 !important; -} - -#pages-container-wrapper { - --background-color: rgba(255, 255, 255, 0.046) !important; - --scroll-bar-color: #4c4c4c !important; - --scroll-bar-thumb: #d3d3d3 !important; - --scroll-bar-thumb-hover: rgb(var(--base-font-color)) !important; -} - -.favorite-icon img { - filter: brightness(0) invert(1) !important; -} -table thead { - background-color: #333 !important; - border: 1px solid #444; -} -table th, table td { - border: 1px solid #444 !important; - color: white; -} -.btn { - background-color: #444 !important; - border: none; - color: #fff !important; -} -.btn-primary { - background-color: #007bff !important; - border: none; - color: #fff !important; -} -.btn-secondary { - background-color: #6c757d !important; - border: none; - color: #fff !important; -} -.btn-info { - background-color: #17a2b8 !important; - border: none; - color: #fff !important; -} -.btn-danger { - background-color: #dc3545 !important; - border: none; - color: #fff !important; -} -.btn-outline-secondary { - color: #fff !important; - border-color: #fff; -} -.btn-outline-secondary:hover { - background-color: #444 !important; - color: #007bff !important; - border-color: #007bff; -} -.blackwhite-icon { - filter: brightness(0) invert(1); -} -hr { - border-color: rgba(255, 255, 255, 0.6); /* semi-transparent white */ - background-color: rgba(255, 255, 255, 0.6); /* for some browsers that might use background instead of border for
*/ -} - -#global-buttons-container input { - background-color: #323948; - caret-color: #ffffff; - color: #ffffff; -} -#global-buttons-container input::placeholder { - color: #ffffff; -} - -#global-buttons-container input:disabled::-webkit-input-placeholder { /* WebKit browsers */ - color: #6E6865; -} -#global-buttons-container input:disabled:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ - color: #6E6865; -} -#global-buttons-container input:disabled::-moz-placeholder { /* Mozilla Firefox 19+ */ - color: #6E6865; -} -#global-buttons-container input:disabled:-ms-input-placeholder { /* Internet Explorer 10+ */ - color: #6E6865; -} - diff --git a/src/main/resources/static/css/dragdrop.css b/src/main/resources/static/css/dragdrop.css deleted file mode 100644 index e75a0d06..00000000 --- a/src/main/resources/static/css/dragdrop.css +++ /dev/null @@ -1,78 +0,0 @@ -#drag-container { - position: fixed; - display:flex; - inset: 0; - pointer-events: none; - z-index: 10000; - visibility: hidden; -} - -#drag-container:not(:empty) { - visibility: visible; -} - -#drag-container .dragged-img { - position: fixed; - max-width: 200px; - max-height: 200px; - box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.58); - transform-origin: top left; -} - -.drag-manager_dragging { - width: 0px; - visibility: hidden; -} - -.drag-manager_draghover { - width: 375px !important; -} - -.drag-manager_draghover .insert-file-button-container { - display: none !important; -} - -.drag-manager_draghover .button-container { - visibility: hidden !important; -} - -html[lang-direction=ltr] .drag-manager_draghover img { - left: calc(50% + 62.5px) !important; -} - -html[lang-direction=rtl] .drag-manager_draghover img { - left: 125px -} - -.drag-manager_dragging-container .hide-on-drag { - display: none !important; -} - -.drag-manager_endpoint { - width: 80px; - height: 100%; - background-color: #FFFFFF10; - transition: width 0.1s; - animation: end-drop-expand .3s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.drag-manager_endpoint svg { - width: 50px; - height: 50px; -} - -.drag-manager_endpoint.drag-manager_draghover { - width: 150px !important; -} - -@keyframes end-drop-expand { - from { - width: 0; - } - to { - width: 80px; - } -} \ No newline at end of file diff --git a/src/main/resources/static/css/errorBanner.css b/src/main/resources/static/css/errorBanner.css deleted file mode 100644 index 69a940b3..00000000 --- a/src/main/resources/static/css/errorBanner.css +++ /dev/null @@ -1,94 +0,0 @@ -#errorContainer { - margin: 20px; /* adjust this value as needed */ -} - -#helpModalDialog { - width: 90%; - max-width: 800px; -} - -#helpModal h1 { - text-align: center; - margin-top: 10%; -} - -#helpModal p { - text-align: center; - margin-top: 2em; -} - -#helpModal .button:hover { - background-color: #005b7f; -} - -#helpModal .features-container { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(21rem, 3fr)); - gap: 25px 30px; -} - -#helpModal .feature-card { - border: 1px solid rgba(0, 0, 0, .125); - border-radius: 0.25rem; - padding: 1.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; -} - -#helpModal .feature-card .card-text { - flex: 1; -} - -#support-section { - background-color: #f9f9f9; - padding: 4rem; - margin-top: 1rem; - text-align: center; -} - -#support-section h1 { - margin-top: 0; -} - -#support-section p { - margin-top: 0; -} - -#button-group { - display: flex; - justify-content: center; - flex-wrap: wrap; -} - -#github-button, #discord-button { - display: inline-block; - padding: 1rem 2rem; - margin: 1rem; - background-color: #008CBA; - color: #fff; - font-size: 1.2rem; - text-align: center; - text-decoration: none; - border-radius: 3rem; - transition: all 0.3s ease-in-out; -} - -#github-button:hover, #discord-button:hover, #home-button:hover { - background-color: #005b7f; -} - -#home-button { - display: block; - width: 200px; - height: 50px; - margin: 2em auto; - background-color: #008CBA; - color: white; - text-align: center; - line-height: 50px; - text-decoration: none; - font-weight: bold; - border-radius: 25px; - transition: all 0.3s ease-in-out; -} \ No newline at end of file diff --git a/src/main/resources/static/css/fileSelect.css b/src/main/resources/static/css/fileSelect.css deleted file mode 100644 index 2cd2c682..00000000 --- a/src/main/resources/static/css/fileSelect.css +++ /dev/null @@ -1,10 +0,0 @@ -.custom-file-label { - padding-right: 90px; -} - -.selected-files { - margin-top: 10px; - max-height: 150px; - overflow-y: auto; - white-space: pre-wrap; -} \ No newline at end of file diff --git a/src/main/resources/static/css/fonts/bootstrap-icons.woff b/src/main/resources/static/css/fonts/bootstrap-icons.woff deleted file mode 100644 index 74d52c2d..00000000 Binary files a/src/main/resources/static/css/fonts/bootstrap-icons.woff and /dev/null differ diff --git a/src/main/resources/static/css/fonts/bootstrap-icons.woff2 b/src/main/resources/static/css/fonts/bootstrap-icons.woff2 deleted file mode 100644 index 7bacd4d8..00000000 Binary files a/src/main/resources/static/css/fonts/bootstrap-icons.woff2 and /dev/null differ diff --git a/src/main/resources/static/css/game.css b/src/main/resources/static/css/game.css deleted file mode 100644 index 01b93e94..00000000 --- a/src/main/resources/static/css/game.css +++ /dev/null @@ -1,49 +0,0 @@ -#game-container { - position: relative; - width: 100vh; - height: 0; - padding-bottom: 75%; /* 4:3 aspect ratio */ - background-color: transparent; - margin: auto; - overflow: hidden; - border: 2px solid black; /* Add border */ -} - -.pdf, .player, .projectile { - position: absolute; -} -.pdf { - width: 50px; - height: 50px; -} -.player { - width: 50px; - height: 50px; -} -.projectile { - background-color: black !important; - width: 5px; - height: 10px; -} -#score, #level, #lives, #high-score { - color: black; - font-family: sans-serif; - position: absolute; - font-size: calc(14px + 0.25vw); /* Reduced font size */ -} -#score { - top: 10px; - left: 10px; -} -#lives { - top: 10px; - left: calc(7vw); /* Adjusted position */ -} -#high-score { - top: 10px; - left: calc(14vw); /* Adjusted position */ -} -#level { - top: 10px; - right: 10px; -} \ No newline at end of file diff --git a/src/main/resources/static/css/general.css b/src/main/resources/static/css/general.css deleted file mode 100644 index de6b7657..00000000 --- a/src/main/resources/static/css/general.css +++ /dev/null @@ -1,94 +0,0 @@ -#page-container { - min-height: 100vh; - display: flex; - flex-direction: column; -} - -#content-wrap { - flex: 1; -} - -#footer { - bottom: 0; - width: 100%; -} -.navbar { - height: auto; /* Adjusts height automatically based on content */ - white-space: nowrap; /* Prevents wrapping of navbar contents */ -} -/* TODO enable later -.navbar .container { - - - max-width: 100%; //Allows the container to expand up to full width - margin-left: auto; - margin-right: auto; -}*/ - -html[lang-direction=ltr] * { - direction: ltr; -} -html[lang-direction=rtl] * { - direction: rtl; - text-align: right; -} -.ignore-rtl { - direction: ltr !important; - text-align: left !important; -} - -.align-top { - position: absolute; - top: 0; -} -.align-center-right { - position: absolute; - right: 0; - top: 50%; -} - -.align-center-left { - position: absolute; - left: 0; - top: 50%; -} - -.align-bottom { - position: absolute; - bottom: 0; -} - -.btn-group > label:first-of-type { - border-top-left-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important; -} - -html[lang-direction="rtl"] input.form-check-input { - position: relative; - margin-left: 0px; -} -html[lang-direction="rtl"] label.form-check-label { - display: inline; -} - -.margin-auto-parent { - width: 100%; - display: flex; -} -.margin-center { - margin: 0 auto; -} -#pdf-canvas { - box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384); - width: 100%; -} -.fixed-shadow-canvas { - box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384); - width: 100%; -} -.shadow-canvas { - box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.384); -} -.hidden { - display: none; -} \ No newline at end of file diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css deleted file mode 100644 index 9bd1ce70..00000000 --- a/src/main/resources/static/css/home.css +++ /dev/null @@ -1,86 +0,0 @@ -#searchBar { - background-image: url('/images/search.svg'); - background-position: 16px 16px; - background-repeat: no-repeat; - width: 100%; - font-size: 16px; - margin-bottom: 12px; - padding: 12px 20px 12px 40px; - border: 1px solid #ddd; - - -} - - -.features-container { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(15rem, 3fr)); - gap: 25px 30px; -} - -.feature-card { - border: 2px solid rgba(0, 0, 0, .25); - border-radius: 0.25rem; - padding: 1.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - background: rgba(13, 110, 253, 0.05); - transition: transform 0.3s, border 0.3s; - transform-origin: center center; - outline: 2px solid transparent; -} - -.feature-card a { - text-decoration: none; - color: inherit; - display: flex; - flex-direction: column; - width: 100%; - height: 100%; -} - -.feature-card .card-text { - flex: 1; -} - -.feature-card:hover { - outline: 1px solid rgba(0, 0, 0, .5); - cursor: pointer; - transform: scale(1.1); -} - -.feature-card:hover .card-title { - text-decoration: underline; -} -.card-title.text-primary { - color: #000; /* Replace with your desired shade of blue */ -} - -.home-card-icon { - width: 30px; - height: 30px; - transform: translateY(-5px); -} -.home-card-icon-colour { -filter: invert(0.2) sepia(2) saturate(50) hue-rotate(190deg); -} - -.favorite-icon { - display: none; - position: absolute; - top: 10px; - right: 10px; -} - -/* Only show the favorite icons when the parent card is being hovered over */ -.feature-card:hover .favorite-icon { - display: block; -} -.favorite-icon img { - filter: brightness(0); -} - -.jumbotron { - padding: 3rem 3rem; /* Reduce vertical padding */ -} diff --git a/src/main/resources/static/css/imageHighlighter.css b/src/main/resources/static/css/imageHighlighter.css deleted file mode 100644 index 231895d6..00000000 --- a/src/main/resources/static/css/imageHighlighter.css +++ /dev/null @@ -1,40 +0,0 @@ - -#image-highlighter { - position: fixed; - display:flex; - inset: 0; - z-index: 10000; - background-color: rgba(0, 0, 0, 0); - visibility: hidden; - align-items: center; - justify-content: center; - transition: visbility 0.1s linear, background-color 0.1s linear; -} - -#image-highlighter > * { - max-width: 80vw; - max-height: 80vh; - animation: image-highlight .1s linear; - transition: transform .1s linear, opacity .1s linear; -} - -#image-highlighter > *.remove { - transform: scale(0.8) !important; - opacity: 0 !important; -} - -#image-highlighter:not(:empty) { - background-color: rgba(0, 0, 0, 0.37); - visibility: visible; -} - -@keyframes image-highlight { - from { - transform: scale(0.8); - opacity: 0; - } - to { - transform: scale(1); - opacity: 1; - } -} \ No newline at end of file diff --git a/src/main/resources/static/css/light-mode.css b/src/main/resources/static/css/light-mode.css deleted file mode 100644 index 08efbf4c..00000000 --- a/src/main/resources/static/css/light-mode.css +++ /dev/null @@ -1,24 +0,0 @@ -/* Dark Mode Styles */ -body { - --body-background-color: 255, 255, 255; - --base-font-color: 33, 37, 41; -} - - -#global-buttons-container input { - background-color: #ffffff; - /*caret-color: #ffffff;*/ - /*color: #ffffff;*/ -} -/*#global-buttons-container input:disabled::-webkit-input-placeholder { !* WebKit browsers *!*/ -/* color: #98A0AB;*/ -/*}*/ -/*#global-buttons-container input:disabled:-moz-placeholder { !* Mozilla Firefox 4 to 18 *!*/ -/* color: #98A0AB;*/ -/*}*/ -/*#global-buttons-container input:disabled::-moz-placeholder { !* Mozilla Firefox 19+ *!*/ -/* color: #98A0AB;*/ -/*}*/ -/*#global-buttons-container input:disabled:-ms-input-placeholder { !* Internet Explorer 10+ *!*/ -/* color: #98A0AB;*/ -/*}*/ diff --git a/src/main/resources/static/css/merge.css b/src/main/resources/static/css/merge.css deleted file mode 100644 index 5196baad..00000000 --- a/src/main/resources/static/css/merge.css +++ /dev/null @@ -1,29 +0,0 @@ - .list-group-item { - display: flex; - justify-content: space-between; - align-items: center; -} - -.filename { - flex-grow: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - margin-right: 10px; -} - -.arrows { - flex-shrink: 0; - display: flex; - justify-content: flex-end; -} -.arrows .btn { - margin: 0 3px; -} - -.move-up span, -.move-down span { - font-weight: bold; - font-size: 1.2em; - -} diff --git a/src/main/resources/static/css/navbar.css b/src/main/resources/static/css/navbar.css deleted file mode 100644 index 5bb99a5e..00000000 --- a/src/main/resources/static/css/navbar.css +++ /dev/null @@ -1,80 +0,0 @@ - - -#navbarSearch { - top: 100%; - right: 0; -} - -#searchForm { - width: 200px; /* Adjust this value as needed */ -} - -/* Style the search results to match the navbar */ -#searchResults { - max-height: 200px; /* Adjust this value as needed */ - overflow-y: auto; - width: 100%; -} - -#searchResults .dropdown-item { - display: flex; - align-items: center; - white-space: nowrap; - height: 50px; /* Fixed height */ - overflow: hidden; /* Hide overflow */ -} - -#searchResults .icon { - margin-right: 10px; -} - -#searchResults .icon-text { - display: inline; - overflow: hidden; /* Hide overflow */ - text-overflow: ellipsis; /* Add ellipsis for long text */ -} - - - -.main-icon { - width: 36px; - height: 36px; - vertical-align: middle; - transform: translateY(-2px); -} - -.icon { - width: 16px; - height: 16px; - vertical-align: middle; - transform: translateY(-2px); -} - -.icon+.icon { - margin-left: -4px; -} - -.icon-text { - margin-left: 4px; -} - -.nav-item-separator { - position: relative; - margin: 0 4px; /* Adjust the margin as needed */ -} - -.nav-item-separator::before { - content: ''; - position: absolute; - left: 0; - top: 10%; /* Adjust the top and bottom margins as needed */ - bottom: 10%; - width: 1px; - background-color: #ccc; /* Adjust the color as needed */ -} - -.navbar-icon { - width: 20px; - height: 20px; - transform: translateY(-2px); -} \ No newline at end of file diff --git a/src/main/resources/static/css/pdfActions.css b/src/main/resources/static/css/pdfActions.css deleted file mode 100644 index 152e3ebc..00000000 --- a/src/main/resources/static/css/pdfActions.css +++ /dev/null @@ -1,87 +0,0 @@ - -.pdf-actions_button-container { - z-index: 2; - display:flex; - opacity: 0; - transition: opacity 0.1s linear; -} - -.pdf-actions_container:hover .pdf-actions_button-container { - opacity: 1; -} - -.pdf-actions_button-container > * { - padding: 0.25rem 0.5rem; - margin: 3px; - display: block; -} - -.pdf-actions_container svg { - width: 16px; - height: 16px; -} -.pdf-actions_container:nth-child(1) .pdf-actions_move-left-button { - display: none; -} -.pdf-actions_container:last-child .pdf-actions_move-right-button { - display: none; -} - -/* "insert pdf" buttons that appear on the right when hover */ -.pdf-actions_insert-file-button-container { - translate: 0 -50%; - width: 80px; - height: 100%; - - z-index: 1; - opacity: 0; - transition: opacity 0.2s; -} - -.pdf-actions_insert-file-button-container.left { - left: -20px; -} - -.pdf-actions_insert-file-button-container.right { - right: -20px; -} - -html[lang-direction=ltr] .pdf-actions_insert-file-button-container.right { - display:none; -} - -html[lang-direction=rtl] .pdf-actions_insert-file-button-container.left { - display:none; -} - -.pdf-actions_insert-file-button-container.left .pdf-actions_insert-file-button { - left: 0; - translate: 0 -50%; -} - -.pdf-actions_insert-file-button-container.right .pdf-actions_insert-file-button { - right: 0; - translate: 0 -50%; -} - -html[lang-direction=ltr] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.right { - display: block; -} - - -html[lang-direction=rtl] .pdf-actions_container:last-child > .pdf-actions_insert-file-button-container.left { - display: block; -} - -.pdf-actions_insert-file-button-container:hover { - opacity: 1; - transition: opacity 0.05s; -} -.pdf-actions_insert-file-button { - position: absolute; - top: 50%; - right: 50%; - translate: 50% -50%; - aspect-ratio: 1; - border-radius: 100px; -} \ No newline at end of file diff --git a/src/main/resources/static/css/prism.css b/src/main/resources/static/css/prism.css deleted file mode 100644 index f8de88e3..00000000 --- a/src/main/resources/static/css/prism.css +++ /dev/null @@ -1,3 +0,0 @@ -/* PrismJS 1.29.0 -https://prismjs.com/download.html#themes=prism-coy&languages=clike+javascript */ -code[class*=language-],pre[class*=language-]{color:#000;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{position:relative;margin:.5em 0;overflow:visible;padding:1px}pre[class*=language-]>code{position:relative;z-index:1;border-left:10px solid #358ccb;box-shadow:-1px 0 0 0 #358ccb,0 0 0 1px #dfdfdf;background-color:#fdfdfd;background-image:linear-gradient(transparent 50%,rgba(69,142,209,.04) 50%);background-size:3em 3em;background-origin:content-box;background-attachment:local}code[class*=language-]{max-height:inherit;height:inherit;padding:0 1em;display:block;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdfdfd;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}:not(pre)>code[class*=language-]{position:relative;padding:.2em;border-radius:.3em;color:#c92c2c;border:1px solid rgba(0,0,0,.1);display:inline;white-space:normal}pre[class*=language-]:after,pre[class*=language-]:before{content:'';display:block;position:absolute;bottom:.75em;left:.18em;width:40%;height:20%;max-height:13em;box-shadow:0 13px 8px #979797;-webkit-transform:rotate(-2deg);-moz-transform:rotate(-2deg);-ms-transform:rotate(-2deg);-o-transform:rotate(-2deg);transform:rotate(-2deg)}pre[class*=language-]:after{right:.75em;left:auto;-webkit-transform:rotate(2deg);-moz-transform:rotate(2deg);-ms-transform:rotate(2deg);-o-transform:rotate(2deg);transform:rotate(2deg)}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#7d8b99}.token.punctuation{color:#5f6364}.token.boolean,.token.constant,.token.deleted,.token.function-name,.token.number,.token.property,.token.symbol,.token.tag{color:#c92c2c}.token.attr-name,.token.builtin,.token.char,.token.function,.token.inserted,.token.selector,.token.string{color:#2f9c0a}.token.entity,.token.operator,.token.url,.token.variable{color:#a67f59;background:rgba(255,255,255,.5)}.token.atrule,.token.attr-value,.token.class-name,.token.keyword{color:#1990b8}.token.important,.token.regex{color:#e90}.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,.5)}.token.important{font-weight:400}.token.bold{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.namespace{opacity:.7}@media screen and (max-width:767px){pre[class*=language-]:after,pre[class*=language-]:before{bottom:14px;box-shadow:none}}pre[class*=language-].line-numbers.line-numbers{padding-left:0}pre[class*=language-].line-numbers.line-numbers code{padding-left:3.8em}pre[class*=language-].line-numbers.line-numbers .line-numbers-rows{left:0}pre[class*=language-][data-line]{padding-top:0;padding-bottom:0;padding-left:0}pre[data-line] code{position:relative;padding-left:4em}pre .line-highlight{margin-top:0} diff --git a/src/main/resources/static/css/rainbow-mode.css b/src/main/resources/static/css/rainbow-mode.css deleted file mode 100644 index 4780931a..00000000 --- a/src/main/resources/static/css/rainbow-mode.css +++ /dev/null @@ -1,37 +0,0 @@ -/* Rainbow Mode Styles */ -body { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%); - color: #fff !important; - --body-background-color: 255, 255, 255; - --base-font-color: 33, 37, 41; -} - -.dark-card { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; - color: white !important; -} -.jumbotron { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%); - color: #fff !important; -} - -.list-group { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; - color: fff !important; -} -.list-group-item { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; - color: fff !important; -} -#support-section { - background: linear-gradient(90deg, rgba(255,0,0,1) 0%, rgba(255,154,0,1) 10%, rgba(208,222,33,1) 20%, rgba(79,220,74,1) 30%, rgba(63,218,216,1) 40%, rgba(47,201,226,1) 50%, rgba(28,127,238,1) 60%, rgba(95,21,242,1) 70%, rgba(186,12,248,1) 80%, rgba(251,7,217,1) 90%, rgba(255,0,0,1) 100%) !important; -} - - -#pages-container-wrapper { - --background-color: rgba(255, 255, 255, 0.046) !important; - --scroll-bar-color: #4c4c4c !important; - --scroll-bar-thumb: #d3d3d3 !important; - --scroll-bar-thumb-hover: #ffffff !important; -} - diff --git a/src/main/resources/static/css/tab-container.css b/src/main/resources/static/css/tab-container.css deleted file mode 100644 index d1f0771b..00000000 --- a/src/main/resources/static/css/tab-container.css +++ /dev/null @@ -1,26 +0,0 @@ - -.tab-group { - -} - -.tab-container { - display: none; -} -.tab-container.active { - display: block; - border: 1px solid rgba(var(--base-font-color), 0.25); - padding: 15px; -} -.tab-buttons > button { - margin-bottom: -1px; - background: 0 0; - border: 1px solid transparent; - color: rgb(var(--base-font-color)); - - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} -.tab-buttons > button.active { - background-color: rgb(var(--body-background-color)); - border-color: rgba(var(--base-font-color), 0.25) rgba(var(--base-font-color), 0.25) rgb(var(--body-background-color)); -} \ No newline at end of file diff --git a/src/main/resources/static/favicon-16x16.png b/src/main/resources/static/favicon-16x16.png deleted file mode 100644 index 982741bc..00000000 Binary files a/src/main/resources/static/favicon-16x16.png and /dev/null differ diff --git a/src/main/resources/static/favicon-32x32.png b/src/main/resources/static/favicon-32x32.png deleted file mode 100644 index c1f6a97d..00000000 Binary files a/src/main/resources/static/favicon-32x32.png and /dev/null differ diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico deleted file mode 100644 index 90b100a4..00000000 Binary files a/src/main/resources/static/favicon.ico and /dev/null differ diff --git a/src/main/resources/static/favicon.png b/src/main/resources/static/favicon.png deleted file mode 100644 index 11695d86..00000000 Binary files a/src/main/resources/static/favicon.png and /dev/null differ diff --git a/src/main/resources/static/favicon.svg b/src/main/resources/static/favicon.svg deleted file mode 100644 index 700e6444..00000000 --- a/src/main/resources/static/favicon.svg +++ /dev/null @@ -1,298 +0,0 @@ - - - - diff --git a/src/main/resources/static/files/Auto Splitter Divider (minimal).pdf b/src/main/resources/static/files/Auto Splitter Divider (minimal).pdf deleted file mode 100644 index 0859af0f..00000000 Binary files a/src/main/resources/static/files/Auto Splitter Divider (minimal).pdf and /dev/null differ diff --git a/src/main/resources/static/files/Auto Splitter Divider (with instructions).pdf b/src/main/resources/static/files/Auto Splitter Divider (with instructions).pdf deleted file mode 100644 index 6aed127e..00000000 Binary files a/src/main/resources/static/files/Auto Splitter Divider (with instructions).pdf and /dev/null differ diff --git a/src/main/resources/static/fonts/DancingScript-Regular.woff2 b/src/main/resources/static/fonts/DancingScript-Regular.woff2 deleted file mode 100644 index 17c598ae..00000000 Binary files a/src/main/resources/static/fonts/DancingScript-Regular.woff2 and /dev/null differ diff --git a/src/main/resources/static/fonts/Estonia.woff2 b/src/main/resources/static/fonts/Estonia.woff2 deleted file mode 100644 index 7e8b9c27..00000000 Binary files a/src/main/resources/static/fonts/Estonia.woff2 and /dev/null differ diff --git a/src/main/resources/static/fonts/IndieFlower-Regular.woff2 b/src/main/resources/static/fonts/IndieFlower-Regular.woff2 deleted file mode 100644 index f799fdd7..00000000 Binary files a/src/main/resources/static/fonts/IndieFlower-Regular.woff2 and /dev/null differ diff --git a/src/main/resources/static/fonts/Meiryo.ttf b/src/main/resources/static/fonts/Meiryo.ttf deleted file mode 100644 index a608fbb4..00000000 Binary files a/src/main/resources/static/fonts/Meiryo.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/NotoSans-Regular.ttf b/src/main/resources/static/fonts/NotoSans-Regular.ttf deleted file mode 100644 index 7552fbe8..00000000 Binary files a/src/main/resources/static/fonts/NotoSans-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/NotoSansArabic-Regular.ttf b/src/main/resources/static/fonts/NotoSansArabic-Regular.ttf deleted file mode 100644 index 79359c46..00000000 Binary files a/src/main/resources/static/fonts/NotoSansArabic-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/NotoSansJP-Regular.ttf b/src/main/resources/static/fonts/NotoSansJP-Regular.ttf deleted file mode 100644 index 1583096a..00000000 Binary files a/src/main/resources/static/fonts/NotoSansJP-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/NotoSansSC-Regular.ttf b/src/main/resources/static/fonts/NotoSansSC-Regular.ttf deleted file mode 100644 index c10d2aa1..00000000 Binary files a/src/main/resources/static/fonts/NotoSansSC-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/SimSun.ttf b/src/main/resources/static/fonts/SimSun.ttf deleted file mode 100644 index e0115abe..00000000 Binary files a/src/main/resources/static/fonts/SimSun.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/Tangerine.woff2 b/src/main/resources/static/fonts/Tangerine.woff2 deleted file mode 100644 index 935c2160..00000000 Binary files a/src/main/resources/static/fonts/Tangerine.woff2 and /dev/null differ diff --git a/src/main/resources/static/fonts/malgun.ttf b/src/main/resources/static/fonts/malgun.ttf deleted file mode 100644 index 6d8645bc..00000000 Binary files a/src/main/resources/static/fonts/malgun.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/static/NotoSansArabic-Regular.ttf b/src/main/resources/static/fonts/static/NotoSansArabic-Regular.ttf deleted file mode 100644 index 79359c46..00000000 Binary files a/src/main/resources/static/fonts/static/NotoSansArabic-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/fonts/static/NotoSansJP-Regular.ttf b/src/main/resources/static/fonts/static/NotoSansJP-Regular.ttf deleted file mode 100644 index 1583096a..00000000 Binary files a/src/main/resources/static/fonts/static/NotoSansJP-Regular.ttf and /dev/null differ diff --git a/src/main/resources/static/images/Files.svg b/src/main/resources/static/images/Files.svg deleted file mode 100644 index a779353b..00000000 --- a/src/main/resources/static/images/Files.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/main/resources/static/images/add-page-numbers.svg b/src/main/resources/static/images/add-page-numbers.svg deleted file mode 100644 index 3ee3396c..00000000 --- a/src/main/resources/static/images/add-page-numbers.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/adjust-contrast.svg b/src/main/resources/static/images/adjust-contrast.svg deleted file mode 100644 index fea76d92..00000000 --- a/src/main/resources/static/images/adjust-contrast.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/arrow-clockwise.svg b/src/main/resources/static/images/arrow-clockwise.svg deleted file mode 100644 index b072eb09..00000000 --- a/src/main/resources/static/images/arrow-clockwise.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/arrow-left-right.svg b/src/main/resources/static/images/arrow-left-right.svg deleted file mode 100644 index 8aabd7be..00000000 --- a/src/main/resources/static/images/arrow-left-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/arrow-right-short.svg b/src/main/resources/static/images/arrow-right-short.svg deleted file mode 100644 index 4626398c..00000000 --- a/src/main/resources/static/images/arrow-right-short.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/award.svg b/src/main/resources/static/images/award.svg deleted file mode 100644 index 8f572ff0..00000000 --- a/src/main/resources/static/images/award.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/blank-file.svg b/src/main/resources/static/images/blank-file.svg deleted file mode 100644 index 3562fb2b..00000000 --- a/src/main/resources/static/images/blank-file.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/card-list.svg b/src/main/resources/static/images/card-list.svg deleted file mode 100644 index 3dc5d429..00000000 --- a/src/main/resources/static/images/card-list.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/clipboard-data.svg b/src/main/resources/static/images/clipboard-data.svg deleted file mode 100644 index b4fcb336..00000000 --- a/src/main/resources/static/images/clipboard-data.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/clipboard.svg b/src/main/resources/static/images/clipboard.svg deleted file mode 100644 index 360e0894..00000000 --- a/src/main/resources/static/images/clipboard.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/crop.svg b/src/main/resources/static/images/crop.svg deleted file mode 100644 index b7e17490..00000000 --- a/src/main/resources/static/images/crop.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/discord.svg b/src/main/resources/static/images/discord.svg deleted file mode 100644 index 84fd00ec..00000000 --- a/src/main/resources/static/images/discord.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/docker.svg b/src/main/resources/static/images/docker.svg deleted file mode 100644 index 6cc34c22..00000000 --- a/src/main/resources/static/images/docker.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/main/resources/static/images/droplet.svg b/src/main/resources/static/images/droplet.svg deleted file mode 100644 index 2b405d68..00000000 --- a/src/main/resources/static/images/droplet.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/eraser-fill.svg b/src/main/resources/static/images/eraser-fill.svg deleted file mode 100644 index 10959b3d..00000000 --- a/src/main/resources/static/images/eraser-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/extract.svg b/src/main/resources/static/images/extract.svg deleted file mode 100644 index d21f03eb..00000000 --- a/src/main/resources/static/images/extract.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/eye-slash.svg b/src/main/resources/static/images/eye-slash.svg deleted file mode 100644 index c5208375..00000000 --- a/src/main/resources/static/images/eye-slash.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/eye.svg b/src/main/resources/static/images/eye.svg deleted file mode 100644 index 412ff692..00000000 --- a/src/main/resources/static/images/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-earmark-pdf.svg b/src/main/resources/static/images/file-earmark-pdf.svg deleted file mode 100644 index 52da96fe..00000000 --- a/src/main/resources/static/images/file-earmark-pdf.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-earmark-ppt.svg b/src/main/resources/static/images/file-earmark-ppt.svg deleted file mode 100644 index bedf5526..00000000 --- a/src/main/resources/static/images/file-earmark-ppt.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-earmark-richtext.svg b/src/main/resources/static/images/file-earmark-richtext.svg deleted file mode 100644 index 35af1467..00000000 --- a/src/main/resources/static/images/file-earmark-richtext.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-earmark-word.svg b/src/main/resources/static/images/file-earmark-word.svg deleted file mode 100644 index 7186b69e..00000000 --- a/src/main/resources/static/images/file-earmark-word.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-earmark-x.svg b/src/main/resources/static/images/file-earmark-x.svg deleted file mode 100644 index bedb970d..00000000 --- a/src/main/resources/static/images/file-earmark-x.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-pdf.svg b/src/main/resources/static/images/file-pdf.svg deleted file mode 100644 index e8ba0a15..00000000 --- a/src/main/resources/static/images/file-pdf.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file-zip.svg b/src/main/resources/static/images/file-zip.svg deleted file mode 100644 index 3da93c8c..00000000 --- a/src/main/resources/static/images/file-zip.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/file.svg b/src/main/resources/static/images/file.svg deleted file mode 100644 index c3d086b9..00000000 --- a/src/main/resources/static/images/file.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/filetype-html.svg b/src/main/resources/static/images/filetype-html.svg deleted file mode 100644 index 35d72185..00000000 --- a/src/main/resources/static/images/filetype-html.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/filetype-txt.svg b/src/main/resources/static/images/filetype-txt.svg deleted file mode 100644 index 6fae02a0..00000000 --- a/src/main/resources/static/images/filetype-txt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/filetype-xml.svg b/src/main/resources/static/images/filetype-xml.svg deleted file mode 100644 index d8226455..00000000 --- a/src/main/resources/static/images/filetype-xml.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/flags/bg.svg b/src/main/resources/static/images/flags/bg.svg deleted file mode 100644 index b100dd0d..00000000 --- a/src/main/resources/static/images/flags/bg.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/main/resources/static/images/flags/cn.svg b/src/main/resources/static/images/flags/cn.svg deleted file mode 100644 index 24162360..00000000 --- a/src/main/resources/static/images/flags/cn.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/de.svg b/src/main/resources/static/images/flags/de.svg deleted file mode 100644 index b08334b6..00000000 --- a/src/main/resources/static/images/flags/de.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/main/resources/static/images/flags/es-ct.svg b/src/main/resources/static/images/flags/es-ct.svg deleted file mode 100644 index 4d859114..00000000 --- a/src/main/resources/static/images/flags/es-ct.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/main/resources/static/images/flags/es.svg b/src/main/resources/static/images/flags/es.svg deleted file mode 100644 index 815e0f84..00000000 --- a/src/main/resources/static/images/flags/es.svg +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/eu.svg b/src/main/resources/static/images/flags/eu.svg deleted file mode 100644 index 0128915a..00000000 --- a/src/main/resources/static/images/flags/eu.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/main/resources/static/images/flags/fr.svg b/src/main/resources/static/images/flags/fr.svg deleted file mode 100644 index 79689fe9..00000000 --- a/src/main/resources/static/images/flags/fr.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/main/resources/static/images/flags/gb.svg b/src/main/resources/static/images/flags/gb.svg deleted file mode 100644 index dbac25ea..00000000 --- a/src/main/resources/static/images/flags/gb.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/main/resources/static/images/flags/gr.svg b/src/main/resources/static/images/flags/gr.svg deleted file mode 100644 index 599741ee..00000000 --- a/src/main/resources/static/images/flags/gr.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/it.svg b/src/main/resources/static/images/flags/it.svg deleted file mode 100644 index 20a8bfdc..00000000 --- a/src/main/resources/static/images/flags/it.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/main/resources/static/images/flags/jp.svg b/src/main/resources/static/images/flags/jp.svg deleted file mode 100644 index 90af6c49..00000000 --- a/src/main/resources/static/images/flags/jp.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/kr.svg b/src/main/resources/static/images/flags/kr.svg deleted file mode 100755 index 39fa999e..00000000 --- a/src/main/resources/static/images/flags/kr.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/nl.svg b/src/main/resources/static/images/flags/nl.svg deleted file mode 100644 index 4e809744..00000000 --- a/src/main/resources/static/images/flags/nl.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/flags/pl.svg b/src/main/resources/static/images/flags/pl.svg deleted file mode 100644 index 0fa51452..00000000 --- a/src/main/resources/static/images/flags/pl.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/main/resources/static/images/flags/pt_br.svg b/src/main/resources/static/images/flags/pt_br.svg deleted file mode 100644 index af2e3e24..00000000 --- a/src/main/resources/static/images/flags/pt_br.svg +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/ro.svg b/src/main/resources/static/images/flags/ro.svg deleted file mode 100644 index d083769e..00000000 --- a/src/main/resources/static/images/flags/ro.svg +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - image/svg+xml - - - - - Openclipart - - - Flag of Romania - 2009-04-04T01:16:28 - The Romania flag by Alexandru Popescu - https://openclipart.org/detail/23974/flag-of-romania-by-anonymous-23974 - - - Anonymous - - - - - blue - flag - red - romania - yellow - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/ru.svg b/src/main/resources/static/images/flags/ru.svg deleted file mode 100644 index f4d27efc..00000000 --- a/src/main/resources/static/images/flags/ru.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/main/resources/static/images/flags/sa.svg b/src/main/resources/static/images/flags/sa.svg deleted file mode 100644 index b0d56dfc..00000000 --- a/src/main/resources/static/images/flags/sa.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/static/images/flags/se.svg b/src/main/resources/static/images/flags/se.svg deleted file mode 100644 index 0e41780e..00000000 --- a/src/main/resources/static/images/flags/se.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/main/resources/static/images/flags/us.svg b/src/main/resources/static/images/flags/us.svg deleted file mode 100644 index a11cf5f9..00000000 --- a/src/main/resources/static/images/flags/us.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/flatten.svg b/src/main/resources/static/images/flatten.svg deleted file mode 100644 index 944240cf..00000000 --- a/src/main/resources/static/images/flatten.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - diff --git a/src/main/resources/static/images/fonts.svg b/src/main/resources/static/images/fonts.svg deleted file mode 100644 index 3afc7d2e..00000000 --- a/src/main/resources/static/images/fonts.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/gear.svg b/src/main/resources/static/images/gear.svg deleted file mode 100644 index c11dbc1d..00000000 --- a/src/main/resources/static/images/gear.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/github.svg b/src/main/resources/static/images/github.svg deleted file mode 100644 index c3d5f08e..00000000 --- a/src/main/resources/static/images/github.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - Github-color - Created with Sketch. - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/html.svg b/src/main/resources/static/images/html.svg deleted file mode 100644 index 35d72185..00000000 --- a/src/main/resources/static/images/html.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/image.svg b/src/main/resources/static/images/image.svg deleted file mode 100644 index 1e1964b4..00000000 --- a/src/main/resources/static/images/image.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/images.svg b/src/main/resources/static/images/images.svg deleted file mode 100644 index b35ecebc..00000000 --- a/src/main/resources/static/images/images.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/info.svg b/src/main/resources/static/images/info.svg deleted file mode 100644 index 8f48f86c..00000000 --- a/src/main/resources/static/images/info.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/js.svg b/src/main/resources/static/images/js.svg deleted file mode 100644 index 8b198bfc..00000000 --- a/src/main/resources/static/images/js.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/layout-split.svg b/src/main/resources/static/images/layout-split.svg deleted file mode 100644 index 71f33d2e..00000000 --- a/src/main/resources/static/images/layout-split.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/lock.svg b/src/main/resources/static/images/lock.svg deleted file mode 100644 index b50a68ef..00000000 --- a/src/main/resources/static/images/lock.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/markdown.svg b/src/main/resources/static/images/markdown.svg deleted file mode 100644 index ca5cd597..00000000 --- a/src/main/resources/static/images/markdown.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/page-layout.svg b/src/main/resources/static/images/page-layout.svg deleted file mode 100644 index bc505957..00000000 --- a/src/main/resources/static/images/page-layout.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/pipeline.svg b/src/main/resources/static/images/pipeline.svg deleted file mode 100644 index 48722d0c..00000000 --- a/src/main/resources/static/images/pipeline.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/sanitize.svg b/src/main/resources/static/images/sanitize.svg deleted file mode 100644 index fc4dd2f9..00000000 --- a/src/main/resources/static/images/sanitize.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/main/resources/static/images/scale-pages.svg b/src/main/resources/static/images/scale-pages.svg deleted file mode 100644 index dc0acc3c..00000000 --- a/src/main/resources/static/images/scale-pages.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/scales.svg b/src/main/resources/static/images/scales.svg deleted file mode 100644 index 61b9c381..00000000 --- a/src/main/resources/static/images/scales.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - -image/svg+xmlOpenclipartscales of justice2009-06-26T04:35:18https://openclipart.org/detail/26849/scales-of-justice-by-johnny_automaticjohnny_automaticjusticelawmeasurementscalessilhouetteweight diff --git a/src/main/resources/static/images/scanner.svg b/src/main/resources/static/images/scanner.svg deleted file mode 100644 index 491d428c..00000000 --- a/src/main/resources/static/images/scanner.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/search.svg b/src/main/resources/static/images/search.svg deleted file mode 100644 index d3dc7ca1..00000000 --- a/src/main/resources/static/images/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/shield-check.svg b/src/main/resources/static/images/shield-check.svg deleted file mode 100644 index ecbf5439..00000000 --- a/src/main/resources/static/images/shield-check.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/shield-lock.svg b/src/main/resources/static/images/shield-lock.svg deleted file mode 100644 index ff384250..00000000 --- a/src/main/resources/static/images/shield-lock.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/sign.svg b/src/main/resources/static/images/sign.svg deleted file mode 100644 index 013acc25..00000000 --- a/src/main/resources/static/images/sign.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/single-page.svg b/src/main/resources/static/images/single-page.svg deleted file mode 100644 index 4f57d79b..00000000 --- a/src/main/resources/static/images/single-page.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/sort-numeric-down.svg b/src/main/resources/static/images/sort-numeric-down.svg deleted file mode 100644 index 57a3fb03..00000000 --- a/src/main/resources/static/images/sort-numeric-down.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/star-fill.svg b/src/main/resources/static/images/star-fill.svg deleted file mode 100644 index de09c4aa..00000000 --- a/src/main/resources/static/images/star-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/star.svg b/src/main/resources/static/images/star.svg deleted file mode 100644 index 742b5e25..00000000 --- a/src/main/resources/static/images/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/suit-heart-fill.svg b/src/main/resources/static/images/suit-heart-fill.svg deleted file mode 100644 index 74a0f27a..00000000 --- a/src/main/resources/static/images/suit-heart-fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/tools.svg b/src/main/resources/static/images/tools.svg deleted file mode 100644 index fcc8362f..00000000 --- a/src/main/resources/static/images/tools.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/trash.svg b/src/main/resources/static/images/trash.svg deleted file mode 100644 index 4d0ee364..00000000 --- a/src/main/resources/static/images/trash.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/union.svg b/src/main/resources/static/images/union.svg deleted file mode 100644 index e694d774..00000000 --- a/src/main/resources/static/images/union.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/unlock.svg b/src/main/resources/static/images/unlock.svg deleted file mode 100644 index 8eb0925d..00000000 --- a/src/main/resources/static/images/unlock.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/images/url.svg b/src/main/resources/static/images/url.svg deleted file mode 100644 index df35bc8a..00000000 --- a/src/main/resources/static/images/url.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/static/images/wrench.svg b/src/main/resources/static/images/wrench.svg deleted file mode 100644 index bef07136..00000000 --- a/src/main/resources/static/images/wrench.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/js/darkmode.js b/src/main/resources/static/js/darkmode.js deleted file mode 100644 index ebf9c683..00000000 --- a/src/main/resources/static/js/darkmode.js +++ /dev/null @@ -1,90 +0,0 @@ -var toggleCount = 0; -var lastToggleTime = Date.now(); - -var elements = { - lightModeStyles: null, - darkModeStyles: null, - rainbowModeStyles: null, - darkModeIcon: null -}; - -function getElements() { - elements.lightModeStyles = document.getElementById("light-mode-styles"); - elements.darkModeStyles = document.getElementById("dark-mode-styles"); - elements.rainbowModeStyles = document.getElementById("rainbow-mode-styles"); - elements.darkModeIcon = document.getElementById("dark-mode-icon"); -} - -function setMode(mode) { - var event = new CustomEvent('modeChanged', { detail: mode }); - document.dispatchEvent(event); - elements.lightModeStyles.disabled = mode !== "off"; - elements.darkModeStyles.disabled = mode !== "on"; - elements.rainbowModeStyles.disabled = mode !== "rainbow"; - var jumbotron = document.getElementById('jumbotron'); - if (mode === "on") { - elements.darkModeIcon.src = "moon.svg"; - // Add the table-dark class to tables for dark mode - var tables = document.querySelectorAll('.table'); - tables.forEach(table => { - table.classList.add('table-dark'); - }); - if(jumbotron) { - jumbotron.classList.add('bg-dark'); - jumbotron.classList.remove('bg-light'); - } - } else if (mode === "off") { - elements.darkModeIcon.src = "sun.svg"; - // Remove the table-dark class for light mode - var tables = document.querySelectorAll('.table-dark'); - tables.forEach(table => { - table.classList.remove('table-dark'); - }); - if(jumbotron){ - console.log(mode) - jumbotron.classList.remove('bg-dark'); - jumbotron.classList.add('bg-light'); - } - } else if (mode === "rainbow") { - elements.darkModeIcon.src = "rainbow.svg"; - } -} - -function toggleDarkMode() { - var currentTime = Date.now(); - if (currentTime - lastToggleTime < 1000) { - toggleCount++; - } else { - toggleCount = 1; - } - lastToggleTime = currentTime; - - if (toggleCount >= 18) { - localStorage.setItem("dark-mode", "rainbow"); - setMode("rainbow"); - } else if (localStorage.getItem("dark-mode") == "on") { - localStorage.setItem("dark-mode", "off"); - setMode("off"); - } else { - localStorage.setItem("dark-mode", "on"); - setMode("on"); - } -} - -document.addEventListener("DOMContentLoaded", function() { - getElements(); - - var currentMode = localStorage.getItem("dark-mode"); - if (currentMode === "on" || currentMode === "off" || currentMode === "rainbow") { - setMode(currentMode); - } else if (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { - setMode("on"); - } else { - setMode("off"); - } - - document.getElementById("dark-mode-toggle").addEventListener("click", function(event) { - event.preventDefault(); - toggleDarkMode(); - }); -}); diff --git a/src/main/resources/static/js/downloader.js b/src/main/resources/static/js/downloader.js deleted file mode 100644 index 95cf436b..00000000 --- a/src/main/resources/static/js/downloader.js +++ /dev/null @@ -1,242 +0,0 @@ -function showErrorBanner(message, stackTrace) { - const errorContainer = document.getElementById("errorContainer"); - errorContainer.style.display = "block"; // Display the banner - document.querySelector("#errorContainer .alert-heading").textContent = "Error"; - document.querySelector("#errorContainer p").textContent = message; - document.querySelector("#traceContent").textContent = stackTrace; -} -let firstErrorOccurred = false; - -$(document).ready(function() { - $('form').submit(async function(event) { - event.preventDefault(); - firstErrorOccurred = false; - const url = this.action; - const files = $('#fileInput-input')[0].files; - const formData = new FormData(this); - - // Remove empty file entries - for (let [key, value] of formData.entries()) { - if (value instanceof File && !value.name) { - formData.delete(key); - } - } - const override = $('#override').val() || ''; - const originalButtonText = $('#submitBtn').text(); - $('#submitBtn').text('Processing...'); - console.log(override); - try { - if(remoteCall === true) { - if (override === 'multi' || (!multiple && files.length > 1) && override !== 'single' ) { - await submitMultiPdfForm(url, files); - } else { - await handleSingleDownload(url, formData); - } - } - $('#submitBtn').text(originalButtonText); - } catch (error) { - handleDownloadError(error); - $('#submitBtn').text(originalButtonText); - console.error(error); - } - }); -}); - - - -async function handleSingleDownload(url, formData, isMulti = false , isZip = false) { - try { - const response = await fetch(url, { method: 'POST', body: formData }); - const contentType = response.headers.get('content-type'); - - if (!response.ok) { - if (contentType && contentType.includes('application/json')) { - return handleJsonResponse(response); - console.error('Throwing error banner, response was not okay'); - } - throw new Error(`HTTP error! status: ${response.status}`); - } - - const contentDisposition = response.headers.get('Content-Disposition'); - let filename = getFilenameFromContentDisposition(contentDisposition); - - const blob = await response.blob(); - if (contentType.includes('application/pdf') || contentType.includes('image/')) { - return handleResponse(blob, filename, !isMulti, isZip); - } else { - return handleResponse(blob, filename, false, isZip); - } - } catch (error) { - console.error('Error in handleSingleDownload:', error); - throw error; // Re-throw the error if you want it to be handled higher up. - } -} - -function getFilenameFromContentDisposition(contentDisposition) { - let filename; - - if (contentDisposition && contentDisposition.indexOf('attachment') !== -1) { - filename = decodeURIComponent(contentDisposition.split('filename=')[1].replace(/"/g, '')).trim(); - } else { - // If the Content-Disposition header is not present or does not contain the filename, use a default filename - filename = 'download'; - } - - return filename; -} - - - -async function handleJsonResponse(response) { - const json = await response.json(); - const errorMessage = JSON.stringify(json, null, 2); - if (errorMessage.toLowerCase().includes('the password is incorrect') || errorMessage.toLowerCase().includes('Password is not provided') || errorMessage.toLowerCase().includes('PDF contains an encryption dictionary')) { - if (!firstErrorOccurred) { - firstErrorOccurred = true; - alert(pdfPasswordPrompt); - } - } else { - showErrorBanner(json.error + ':' + json.message, json.trace); - } -} - - -async function handleResponse(blob, filename, considerViewOptions = false, isZip = false) { - if (!blob) return; - const downloadOption = localStorage.getItem('downloadOption'); - if (considerViewOptions) { - if (downloadOption === 'sameWindow') { - const url = URL.createObjectURL(blob); - window.location.href = url; - return; - } else if (downloadOption === 'newWindow') { - const url = URL.createObjectURL(blob); - window.open(url, '_blank'); - return; - } - } - if(!isZip){ - downloadFile(blob, filename); - } - return { filename, blob }; -} - -function handleDownloadError(error) { - const errorMessage = error.message; - showErrorBanner(errorMessage); -} - -let urls = []; // An array to hold all the URLs - -function downloadFile(blob, filename) { - if (!(blob instanceof Blob)) { - console.error('Invalid blob passed to downloadFile function'); - return; - } - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = filename; - a.click(); - urls.push(url); // Store the URL so it doesn't get garbage collected too soon - - return { filename, blob }; -} - - - -async function submitMultiPdfForm(url, files) { - const zipThreshold = parseInt(localStorage.getItem('zipThreshold'), 10) || 4; - const zipFiles = files.length > zipThreshold; - let jszip = null; - // Show the progress bar - $('#progressBarContainer').show(); - // Initialize the progress bar - - let progressBar = $('#progressBar'); - progressBar.css('width', '0%'); - progressBar.attr('aria-valuenow', 0); - progressBar.attr('aria-valuemax', files.length); - - if (zipFiles) { - jszip = new JSZip(); - } - - - // Get the form with the method attribute set to POST - let postForm = document.querySelector('form[method="POST"]'); - - // Get existing form data - let formData; - if (postForm) { - formData = new FormData($(postForm)[0]); // Convert the form to a jQuery object and get the raw DOM element - } else { - console.log("No form with POST method found."); - } - //Remove file to reuse parameters for other runs - formData.delete('fileInput'); - // Remove empty file entries - for (let [key, value] of formData.entries()) { - if (value instanceof File && !value.name) { - formData.delete(key); - } - } - const CONCURRENCY_LIMIT = 8; - const chunks = []; - for (let i = 0; i < Array.from(files).length; i += CONCURRENCY_LIMIT) { - chunks.push(Array.from(files).slice(i, i + CONCURRENCY_LIMIT)); - } - - for (const chunk of chunks) { - const promises = chunk.map(async file => { - let fileFormData = new FormData(); - fileFormData.append('fileInput', file); - console.log(fileFormData); - // Add other form data - for (let pair of formData.entries()) { - fileFormData.append(pair[0], pair[1]); - console.log(pair[0]+ ', ' + pair[1]); - } - - try { - const downloadDetails = await handleSingleDownload(url, fileFormData, true, zipFiles); - console.log(downloadDetails); - if (zipFiles) { - jszip.file(downloadDetails.filename, downloadDetails.blob); - } else { - //downloadFile(downloadDetails.blob, downloadDetails.filename); - } - updateProgressBar(progressBar, Array.from(files).length); - } catch (error) { - handleDownloadError(error); - console.error(error); - } - }); - await Promise.all(promises); - - } - - if (zipFiles) { - try { - const content = await jszip.generateAsync({ type: "blob" }); - downloadFile(content, "files.zip"); - } catch (error) { - console.error('Error generating ZIP file: ' + error); - } - } - progressBar.css('width', '100%'); - progressBar.attr('aria-valuenow', Array.from(files).length); -} - - - -function updateProgressBar(progressBar, files) { - let progress = ((progressBar.attr('aria-valuenow') / files.length) * 100) + (100 / files.length); - progressBar.css('width', progress + '%'); - progressBar.attr('aria-valuenow', parseInt(progressBar.attr('aria-valuenow')) + 1); -} -window.addEventListener('unload', () => { - for (const url of urls) { - URL.revokeObjectURL(url); - } -}); diff --git a/src/main/resources/static/js/draggable-utils.js b/src/main/resources/static/js/draggable-utils.js deleted file mode 100644 index 4dadf920..00000000 --- a/src/main/resources/static/js/draggable-utils.js +++ /dev/null @@ -1,282 +0,0 @@ -const DraggableUtils = { - - boxDragContainer: document.getElementById('box-drag-container'), - pdfCanvas: document.getElementById('pdf-canvas'), - nextId: 0, - pdfDoc: null, - pageIndex: 0, - documentsMap: new Map(), - - init() { - interact('.draggable-canvas') - .draggable({ - listeners: { - move: (event) => { - const target = event.target; - const x = (parseFloat(target.getAttribute('data-bs-x')) || 0) + event.dx; - const y = (parseFloat(target.getAttribute('data-bs-y')) || 0) + event.dy; - - target.style.transform = `translate(${x}px, ${y}px)`; - target.setAttribute('data-bs-x', x); - target.setAttribute('data-bs-y', y); - - this.onInteraction(target); - }, - }, - }) - .resizable({ - edges: { left: true, right: true, bottom: true, top: true }, - listeners: { - move: (event) => { - var target = event.target - var x = (parseFloat(target.getAttribute('data-bs-x')) || 0) - var y = (parseFloat(target.getAttribute('data-bs-y')) || 0) - - // check if control key is pressed - if (event.ctrlKey) { - const aspectRatio = target.offsetWidth / target.offsetHeight; - // preserve aspect ratio - let width = event.rect.width; - let height = event.rect.height; - - if (Math.abs(event.deltaRect.width) >= Math.abs(event.deltaRect.height)) { - height = width / aspectRatio; - } else { - width = height * aspectRatio; - } - - event.rect.width = width; - event.rect.height = height; - } - - target.style.width = event.rect.width + 'px' - target.style.height = event.rect.height + 'px' - - // translate when resizing from top or left edges - x += event.deltaRect.left - y += event.deltaRect.top - - target.style.transform = 'translate(' + x + 'px,' + y + 'px)' - - target.setAttribute('data-bs-x', x) - target.setAttribute('data-bs-y', y) - target.textContent = Math.round(event.rect.width) + '\u00D7' + Math.round(event.rect.height) - - this.onInteraction(target); - }, - }, - - modifiers: [ - interact.modifiers.restrictSize({ - min: { width: 5, height: 5 }, - }), - ], - inertia: true, - }); - }, - onInteraction(target) { - this.boxDragContainer.appendChild(target); - }, - - createDraggableCanvas() { - const createdCanvas = document.createElement('canvas'); - createdCanvas.id = `draggable-canvas-${this.nextId++}`; - createdCanvas.classList.add("draggable-canvas"); - - const x = 0; - const y = 20; - createdCanvas.style.transform = `translate(${x}px, ${y}px)`; - createdCanvas.setAttribute('data-bs-x', x); - createdCanvas.setAttribute('data-bs-y', y); - - createdCanvas.onclick = e => this.onInteraction(e.target); - - this.boxDragContainer.appendChild(createdCanvas); - return createdCanvas; - }, - createDraggableCanvasFromUrl(dataUrl) { - return new Promise((resolve) => { - var myImage = new Image(); - myImage.src = dataUrl; - myImage.onload = () => { - var createdCanvas = this.createDraggableCanvas(); - - createdCanvas.width = myImage.width; - createdCanvas.height = myImage.height; - - const imgAspect = myImage.width / myImage.height; - const pdfAspect = this.boxDragContainer.offsetWidth / this.boxDragContainer.offsetHeight; - - var scaleMultiplier; - if (imgAspect > pdfAspect) { - scaleMultiplier = this.boxDragContainer.offsetWidth / myImage.width; - } else { - scaleMultiplier = this.boxDragContainer.offsetHeight / myImage.height; - } - - var newWidth = createdCanvas.width; - var newHeight = createdCanvas.height; - if (scaleMultiplier < 1) { - newWidth = newWidth * scaleMultiplier; - newHeight = newHeight * scaleMultiplier; - } - - createdCanvas.style.width = newWidth+"px"; - createdCanvas.style.height = newHeight+"px"; - - var myContext = createdCanvas.getContext("2d"); - myContext.drawImage(myImage,0,0); - resolve(createdCanvas); - } - }) - }, - deleteAllDraggableCanvases() { - this.boxDragContainer.querySelectorAll(".draggable-canvas").forEach(el => el.remove()); - }, - deleteDraggableCanvas(element) { - if (element) { - element.remove(); - } - }, - getLastInteracted() { - return this.boxDragContainer.querySelector(".draggable-canvas:last-of-type"); - }, - - storePageContents() { - var pagesMap = this.documentsMap.get(this.pdfDoc); - if (!pagesMap) { - pagesMap = {}; - } - - const elements = [...this.boxDragContainer.querySelectorAll(".draggable-canvas")]; - const draggablesData = elements.map(el => {return{element:el, offsetWidth:el.offsetWidth, offsetHeight:el.offsetHeight}}); - elements.forEach(el => this.boxDragContainer.removeChild(el)); - - pagesMap[this.pageIndex] = draggablesData; - pagesMap[this.pageIndex+"-offsetWidth"] = this.pdfCanvas.offsetWidth; - pagesMap[this.pageIndex+"-offsetHeight"] = this.pdfCanvas.offsetHeight; - - this.documentsMap.set(this.pdfDoc, pagesMap); - }, - loadPageContents() { - var pagesMap = this.documentsMap.get(this.pdfDoc); - this.deleteAllDraggableCanvases(); - if (!pagesMap) { - return; - } - - const draggablesData = pagesMap[this.pageIndex]; - if (draggablesData) { - draggablesData.forEach(draggableData => this.boxDragContainer.appendChild(draggableData.element)); - } - - this.documentsMap.set(this.pdfDoc, pagesMap); - }, - - async renderPage(pdfDocument, pageIdx) { - this.pdfDoc = pdfDocument ? pdfDocument : this.pdfDoc; - this.pageIndex = pageIdx; - - // persist - const page = await this.pdfDoc.getPage(this.pageIndex+1); - - // set the canvas size to the size of the page - if (page.rotate == 90 || page.rotate == 270) { - this.pdfCanvas.width = page.view[3]; - this.pdfCanvas.height = page.view[2]; - } else { - this.pdfCanvas.width = page.view[2]; - this.pdfCanvas.height = page.view[3]; - } - - // render the page onto the canvas - var renderContext = { - canvasContext: this.pdfCanvas.getContext("2d"), - viewport: page.getViewport({ scale: 1 }) - }; - await page.render(renderContext).promise; - - //return pdfCanvas.toDataURL(); - }, - async incrementPage() { - if (this.pageIndex < this.pdfDoc.numPages-1) { - this.storePageContents(); - await this.renderPage(this.pdfDoc, this.pageIndex+1); - this.loadPageContents(); - } - }, - async decrementPage() { - if (this.pageIndex > 0) { - this.storePageContents(); - await this.renderPage(this.pdfDoc, this.pageIndex-1); - this.loadPageContents(); - } - }, - - parseTransform(element) { - - }, - async getOverlayedPdfDocument() { - const pdfBytes = await this.pdfDoc.getData(); - const pdfDocModified = await PDFLib.PDFDocument.load(pdfBytes, { ignoreEncryption: true }); - this.storePageContents(); - - const pagesMap = this.documentsMap.get(this.pdfDoc); - for (let pageIdx in pagesMap) { - if (pageIdx.includes("offset")) { - continue; - } - console.log(typeof pageIdx); - - const page = pdfDocModified.getPage(parseInt(pageIdx)); - const draggablesData = pagesMap[pageIdx]; - const offsetWidth = pagesMap[pageIdx+"-offsetWidth"]; - const offsetHeight = pagesMap[pageIdx+"-offsetHeight"]; - - for (const draggableData of draggablesData) { - // embed the draggable canvas - const draggableElement = draggableData.element; - const response = await fetch(draggableElement.toDataURL()); - const draggableImgBytes = await response.arrayBuffer(); - const pdfImageObject = await pdfDocModified.embedPng(draggableImgBytes); - - // calculate the position in the pdf document - const tansform = draggableElement.style.transform.replace(/[^.,-\d]/g, ''); - const transformComponents = tansform.split(","); - const draggablePositionPixels = { - x: parseFloat(transformComponents[0]), - y: parseFloat(transformComponents[1]), - width: draggableData.offsetWidth, - height: draggableData.offsetHeight, - }; - const draggablePositionRelative = { - x: draggablePositionPixels.x / offsetWidth, - y: draggablePositionPixels.y / offsetHeight, - width: draggablePositionPixels.width / offsetWidth, - height: draggablePositionPixels.height / offsetHeight, - } - const draggablePositionPdf = { - x: draggablePositionRelative.x * page.getWidth(), - y: draggablePositionRelative.y * page.getHeight(), - width: draggablePositionRelative.width * page.getWidth(), - height: draggablePositionRelative.height * page.getHeight(), - } - - // draw the image - page.drawImage(pdfImageObject, { - x: draggablePositionPdf.x, - y: page.getHeight() - draggablePositionPdf.y - draggablePositionPdf.height, - width: draggablePositionPdf.width, - height: draggablePositionPdf.height, - }); - } - } - - this.loadPageContents(); - return pdfDocModified; - }, -} - -document.addEventListener("DOMContentLoaded", () => { - DraggableUtils.init(); -}); diff --git a/src/main/resources/static/js/errorBanner.js b/src/main/resources/static/js/errorBanner.js deleted file mode 100644 index 9d151407..00000000 --- a/src/main/resources/static/js/errorBanner.js +++ /dev/null @@ -1,50 +0,0 @@ -var traceVisible = false; - -function toggletrace() { - var traceDiv = document.getElementById("trace"); - if (!traceVisible) { - traceDiv.style.maxHeight = "500px"; - traceVisible = true; - } else { - traceDiv.style.maxHeight = "0px"; - traceVisible = false; - } - adjustContainerHeight(); -} - -function copytrace() { - var flip = false - if (!traceVisible) { - toggletrace() - flip = true - } - var traceContent = document.getElementById("traceContent"); - var range = document.createRange(); - range.selectNode(traceContent); - window.getSelection().removeAllRanges(); - window.getSelection().addRange(range); - document.execCommand("copy"); - window.getSelection().removeAllRanges(); - if (flip) { - toggletrace() - } -} - -function dismissError() { - var errorContainer = document.getElementById("errorContainer"); - errorContainer.style.display = "none"; - errorContainer.style.height = "0"; -} - -function adjustContainerHeight() { - var errorContainer = document.getElementById("errorContainer"); - var traceDiv = document.getElementById("trace"); - if (traceVisible) { - errorContainer.style.height = errorContainer.scrollHeight - traceDiv.scrollHeight + traceDiv.offsetHeight + "px"; - } else { - errorContainer.style.height = "auto"; - } -} -function showHelp() { - $('#helpModal').modal('show'); -} \ No newline at end of file diff --git a/src/main/resources/static/js/favourites.js b/src/main/resources/static/js/favourites.js deleted file mode 100644 index 11cdbf04..00000000 --- a/src/main/resources/static/js/favourites.js +++ /dev/null @@ -1,45 +0,0 @@ -function updateFavoritesDropdown() { - var dropdown = document.querySelector('#favoritesDropdown'); - - // Check if dropdown exists - if (!dropdown) { - console.error('Dropdown element with ID "favoritesDropdown" not found!'); - return; // Exit the function - } - dropdown.innerHTML = ''; // Clear the current favorites - - var hasFavorites = false; - - for (var i = 0; i < localStorage.length; i++) { - var key = localStorage.key(i); - if (localStorage.getItem(key) === 'favorite') { - // Find the corresponding navbar entry - var navbarEntry = document.querySelector(`a[href='${key}']`); - if (navbarEntry) { - // Create a new dropdown entry - var dropdownItem = document.createElement('a'); - dropdownItem.className = 'dropdown-item'; - dropdownItem.href = navbarEntry.href; - dropdownItem.innerHTML = navbarEntry.innerHTML; - dropdown.appendChild(dropdownItem); - hasFavorites = true; - } else { - console.warn(`Navbar entry not found for key: ${key}`); - } - } - } - - // Show or hide the default item based on whether there are any favorites - if (!hasFavorites) { - var defaultItem = document.createElement('a'); - defaultItem.className = 'dropdown-item'; - defaultItem.textContent = noFavourites; - dropdown.appendChild(defaultItem); - } -} - -// Ensure that the DOM content has been fully loaded before calling the function -document.addEventListener('DOMContentLoaded', function() { - console.log('DOMContentLoaded event fired'); - updateFavoritesDropdown(); -}); diff --git a/src/main/resources/static/js/fileInput.js b/src/main/resources/static/js/fileInput.js deleted file mode 100644 index 12d50b3f..00000000 --- a/src/main/resources/static/js/fileInput.js +++ /dev/null @@ -1,104 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - document.querySelectorAll('.custom-file-chooser').forEach(setupFileInput); -}); - -function setupFileInput(chooser) { - const elementId = chooser.getAttribute('data-bs-element-id'); - const filesSelected = chooser.getAttribute('data-bs-files-selected'); - const pdfPrompt = chooser.getAttribute('data-bs-pdf-prompt'); - - let allFiles = []; - let overlay; - let dragCounter = 0; - - const dragenterListener = function() { - dragCounter++; - if (!overlay) { - overlay = document.createElement('div'); - overlay.style.position = 'fixed'; - overlay.style.top = 0; - overlay.style.left = 0; - overlay.style.width = '100%'; - overlay.style.height = '100%'; - overlay.style.background = 'rgba(0, 0, 0, 0.5)'; - overlay.style.color = '#fff'; - overlay.style.zIndex = '1000'; - overlay.style.display = 'flex'; - overlay.style.alignItems = 'center'; - overlay.style.justifyContent = 'center'; - overlay.style.pointerEvents = 'none'; - overlay.innerHTML = '

Drop files anywhere to upload

'; - document.getElementById('content-wrap').appendChild(overlay); - } - }; - - const dragleaveListener = function() { - dragCounter--; - if (dragCounter === 0) { - if (overlay) { - overlay.remove(); - overlay = null; - } - } - }; - - const dropListener = function(e) { - e.preventDefault(); - const dt = e.dataTransfer; - const files = dt.files; - - for (let i = 0; i < files.length; i++) { - allFiles.push(files[i]); - } - - const dataTransfer = new DataTransfer(); - allFiles.forEach(file => dataTransfer.items.add(file)); - - const fileInput = document.getElementById(elementId); - fileInput.files = dataTransfer.files; - - if (overlay) { - overlay.remove(); - overlay = null; - } - - dragCounter = 0; - - fileInput.dispatchEvent(new Event('change', { bubbles: true })); - }; - - ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { - document.body.addEventListener(eventName, preventDefaults, false); - }); - - function preventDefaults(e) { - e.preventDefault(); - e.stopPropagation(); - } - - document.body.addEventListener('dragenter', dragenterListener); - document.body.addEventListener('dragleave', dragleaveListener); - document.body.addEventListener('drop', dropListener); - - $("#" + elementId).on("change", function(e) { - allFiles = Array.from(e.target.files); - handleFileInputChange(this); - }); - - function handleFileInputChange(inputElement) { - const files = allFiles; - const fileNames = files.map(f => f.name); - const selectedFilesContainer = $(inputElement).siblings(".selected-files"); - selectedFilesContainer.empty(); - fileNames.forEach(fileName => { - selectedFilesContainer.append("
" + fileName + "
"); - }); - if (fileNames.length === 1) { - $(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames[0]); - } else if (fileNames.length > 1) { - $(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames.length + " " + filesSelected); - } else { - $(inputElement).siblings(".custom-file-label").addClass("selected").html(pdfPrompt); - } - } -} diff --git a/src/main/resources/static/js/game.js b/src/main/resources/static/js/game.js deleted file mode 100644 index ffad304b..00000000 --- a/src/main/resources/static/js/game.js +++ /dev/null @@ -1,283 +0,0 @@ -function initializeGame() { - const gameContainer = document.getElementById('game-container'); - const player = document.getElementById('player'); - - let playerSize = gameContainer.clientWidth * 0.0625; // 5% of container width - player.style.width = playerSize + 'px'; - player.style.height = playerSize + 'px'; - - let playerX = gameContainer.clientWidth / 2 - playerSize / 2; - let playerY = gameContainer.clientHeight * 0.1; - const scoreElement = document.getElementById('score'); - const levelElement = document.getElementById('level'); - const livesElement = document.getElementById('lives'); - const highScoreElement = document.getElementById('high-score'); - - let pdfSize = gameContainer.clientWidth * 0.0625; // 5% of container width - let projectileWidth = gameContainer.clientWidth * 0.00625; // 0.5% of container width - let projectileHeight = gameContainer.clientHeight * 0.01667; // 1% of container height - - let paused = false; - const fireRate = 200; // Time between shots in milliseconds - let lastProjectileTime = 0; - let lives = 3; - let highScore = localStorage.getItem('highScore') ? parseInt(localStorage.getItem('highScore')) : 0; - updateHighScore(); - - - - const keysPressed = {}; - const pdfs = []; - const projectiles = []; - let score = 0; - let level = 1; - let pdfSpeed = 1; - let gameOver = false; - - function handleKeys() { - if (keysPressed['ArrowLeft']) { - playerX -= 10; - } - if (keysPressed['ArrowRight']) { - playerX += 10; - } - if (keysPressed[' '] && !gameOver) { - const currentTime = new Date().getTime(); - if (currentTime - lastProjectileTime >= fireRate) { - shootProjectile(); - lastProjectileTime = currentTime; - } - } - updatePlayerPosition(); - } - - - - - document.addEventListener('keydown', (event) => { - if (event.key === ' ') { - event.preventDefault(); - } - keysPressed[event.key] = true; - handleKeys(); - }); - - document.addEventListener('keyup', (event) => { - keysPressed[event.key] = false; - }); - - - function updatePlayerPosition() { - player.style.left = playerX + 'px'; - player.style.bottom = playerY + 'px'; - } - - function updateLives() { - livesElement.textContent = 'Lives: ' + lives; - } - - function updateHighScore() { - highScoreElement.textContent = 'High Score: ' + highScore; - } - - - function shootProjectile() { - const projectile = document.createElement('div'); - projectile.classList.add('projectile'); - projectile.style.backgroundColor = 'black'; - projectile.style.width = projectileWidth + 'px'; - projectile.style.height = projectileHeight + 'px'; - projectile.style.left = (playerX + playerSize / 2 - projectileWidth / 2) + 'px'; - projectile.style.top = (gameContainer.clientHeight - playerY - playerSize) + 'px'; - gameContainer.appendChild(projectile); - projectiles.push(projectile); - } - - - - function spawnPdf() { - const pdf = document.createElement('img'); - pdf.src = 'images/file-earmark-pdf.svg'; - pdf.classList.add('pdf'); - pdf.style.width = pdfSize + 'px'; - pdf.style.height = pdfSize + 'px'; - pdf.style.left = Math.floor(Math.random() * (gameContainer.clientWidth - pdfSize)) + 'px'; - pdf.style.top = '0px'; - gameContainer.appendChild(pdf); - pdfs.push(pdf); - } - - - function resetEnemies() { - pdfs.forEach((pdf) => gameContainer.removeChild(pdf)); - pdfs.length = 0; - } - - - function updateGame() { - if (gameOver || paused) return; - - for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) { - const pdf = pdfs[pdfIndex]; - const pdfY = parseInt(pdf.style.top) + pdfSpeed; - if (pdfY + 50 > gameContainer.clientHeight) { - gameContainer.removeChild(pdf); - pdfs.splice(pdfIndex, 1); - - // Deduct 2 points when a PDF gets past the player - score -= 0; - updateScore(); - - // Decrease lives and check if game over - lives--; - updateLives(); - if (lives <= 0) { - endGame(); - return; - } - - } else { - pdf.style.top = pdfY + 'px'; - - // Check for collision with player - if (collisionDetected(player, pdf)) { - lives--; - updateLives(); - resetEnemies(); - if (lives <= 0) { - endGame(); - return; - } - } - } - }; - - projectiles.forEach((projectile, projectileIndex) => { - const projectileY = parseInt(projectile.style.top) - 10; - if (projectileY < 0) { - gameContainer.removeChild(projectile); - projectiles.splice(projectileIndex, 1); - } else { - projectile.style.top = projectileY + 'px'; - } - - for (let pdfIndex = 0; pdfIndex < pdfs.length; pdfIndex++) { - const pdf = pdfs[pdfIndex]; - if (collisionDetected(projectile, pdf)) { - gameContainer.removeChild(pdf); - gameContainer.removeChild(projectile); - pdfs.splice(pdfIndex, 1); - projectiles.splice(projectileIndex, 1); - score = score + 10; - updateScore(); - break; - } - } - }); - - setTimeout(updateGame, 1000 / 60); - } - - function resetGame() { - playerX = gameContainer.clientWidth / 2; - playerY = 50; - updatePlayerPosition(); - - pdfs.forEach((pdf) => gameContainer.removeChild(pdf)); - projectiles.forEach((projectile) => gameContainer.removeChild(projectile)); - - pdfs.length = 0; - projectiles.length = 0; - - score = 0; - level = 1; - lives = 3; - - gameOver = false; - - updateScore(); - updateLives(); - levelElement.textContent = 'Level: ' + level; - pdfSpeed = 1; - clearTimeout(spawnPdfTimeout); // Clear the existing spawnPdfTimeout - setTimeout(updateGame, 1000 / 60); - spawnPdfInterval(); - } - - - - function updateScore() { - scoreElement.textContent = 'Score: ' + score; - checkLevelUp(); - } - - - - function checkLevelUp() { - const newLevel = Math.floor(score / 100) + 1; - if (newLevel > level) { - level = newLevel; - levelElement.textContent = 'Level: ' + level; - pdfSpeed += 1; - } - } - - function collisionDetected(a, b) { - const rectA = a.getBoundingClientRect(); - const rectB = b.getBoundingClientRect(); - return ( - rectA.left < rectB.right && - rectA.right > rectB.left && - rectA.top < rectB.bottom && - rectA.bottom > rectB.top - ); - } - - function endGame() { - gameOver = true; - if (score > highScore) { - highScore = score; - localStorage.setItem('highScore', highScore); - updateHighScore(); - } - alert('Game Over! Your final score is: ' + score); - document.getElementById('game-container-wrapper').close(); - } - - - - - let spawnPdfTimeout; - - function spawnPdfInterval() { - console.log("spawnPdfInterval"); - if (gameOver || paused) { - console.log("spawnPdfInterval 2"); - clearTimeout(spawnPdfTimeout); - return; - } - console.log("spawnPdfInterval 3"); - spawnPdf(); - spawnPdfTimeout = setTimeout(spawnPdfInterval, 1000 - level * 50); - } - - updatePlayerPosition(); - updateGame(); - spawnPdfInterval(); - - - document.addEventListener('visibilitychange', function() { - if (document.hidden) { - paused = true; - } else { - paused = false; - updateGame(); - spawnPdfInterval(); - } - - }); - - window.resetGame = resetGame; -} - -window.initializeGame = initializeGame; diff --git a/src/main/resources/static/js/githubVersion.js b/src/main/resources/static/js/githubVersion.js deleted file mode 100644 index 35433f76..00000000 --- a/src/main/resources/static/js/githubVersion.js +++ /dev/null @@ -1,41 +0,0 @@ -function compareVersions(version1, version2) { - const v1 = version1.split('.'); - const v2 = version2.split('.'); - - for (let i = 0; i < v1.length || i < v2.length; i++) { - const n1 = parseInt(v1[i]) || 0; - const n2 = parseInt(v2[i]) || 0; - - if (n1 > n2) { - return 1; - } else if (n1 < n2) { - return -1; - } - } - - return 0; -} - -async function getLatestReleaseVersion() { - const url = "https://api.github.com/repos/Frooodle/Stirling-PDF/releases/latest"; - const response = await fetch(url); - const data = await response.json(); - return data.tag_name.substring(1); -} - - -async function checkForUpdate() { - const latestVersion = await getLatestReleaseVersion(); - console.log("latestVersion=" + latestVersion) - console.log("currentVersion=" + currentVersion) - console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)) - if (latestVersion != null && latestVersion != "" && compareVersions(latestVersion, currentVersion) > 0) { - document.getElementById("update-btn").style.display = "block"; - console.log("visible") - } else { - document.getElementById("update-btn").style.display = "none"; - console.log("hidden") - } -} - -checkForUpdate(); \ No newline at end of file diff --git a/src/main/resources/static/js/homecard.js b/src/main/resources/static/js/homecard.js deleted file mode 100644 index d0d56185..00000000 --- a/src/main/resources/static/js/homecard.js +++ /dev/null @@ -1,78 +0,0 @@ -function filterCards() { - var input = document.getElementById('searchBar'); - var filter = input.value.toUpperCase(); - var cards = document.querySelectorAll('.feature-card'); - - for (var i = 0; i < cards.length; i++) { - var card = cards[i]; - var title = card.querySelector('h5.card-title').innerText; - var text = card.querySelector('p.card-text').innerText; - - // Get the navbar tags associated with the card - var navbarItem = document.querySelector(`a.dropdown-item[href="${card.id}"]`); - var navbarTags = navbarItem ? navbarItem.getAttribute('data-bs-tags') : ''; - - var content = title + ' ' + text + ' ' + navbarTags; - - if (content.toUpperCase().indexOf(filter) > -1) { - card.style.display = ""; - } else { - card.style.display = "none"; - } - } -} - - - -function toggleFavorite(element) { - var img = element.querySelector('img'); - var card = element.closest('.feature-card'); - var cardId = card.id; - if (img.src.endsWith('star.svg')) { - img.src = 'images/star-fill.svg'; - card.classList.add('favorite'); - localStorage.setItem(cardId, 'favorite'); - } else { - img.src = 'images/star.svg'; - card.classList.remove('favorite'); - localStorage.removeItem(cardId); - } - reorderCards(); - updateFavoritesDropdown(); - filterCards(); -} - -function reorderCards() { - var container = document.querySelector('.features-container'); - var cards = Array.from(container.getElementsByClassName('feature-card')); - cards.sort(function(a, b) { - var aIsFavorite = localStorage.getItem(a.id) === 'favorite'; - var bIsFavorite = localStorage.getItem(b.id) === 'favorite'; - if (aIsFavorite && !bIsFavorite) { - return -1; - } - if (!aIsFavorite && bIsFavorite) { - return 1; - } - return 0; - }); - cards.forEach(function(card) { - container.appendChild(card); - }); -} -function initializeCards() { - var cards = document.querySelectorAll('.feature-card'); - cards.forEach(function(card) { - var cardId = card.id; - var img = card.querySelector('.favorite-icon img'); - if (localStorage.getItem(cardId) === 'favorite') { - img.src = 'images/star-fill.svg'; - card.classList.add('favorite'); - } - }); - reorderCards(); - updateFavoritesDropdown(); - filterCards(); -} - -window.onload = initializeCards; \ No newline at end of file diff --git a/src/main/resources/static/js/languageSelection.js b/src/main/resources/static/js/languageSelection.js deleted file mode 100644 index c554c2a7..00000000 --- a/src/main/resources/static/js/languageSelection.js +++ /dev/null @@ -1,69 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - setLanguageForDropdown('.lang_dropdown-item'); - const defaultLocale = document.documentElement.lang || 'en_GB'; - const storedLocale = localStorage.getItem('languageCode') || defaultLocale; - const dropdownItems = document.querySelectorAll('.lang_dropdown-item'); - - for (let i = 0; i < dropdownItems.length; i++) { - const item = dropdownItems[i]; - item.classList.remove('active'); - if (item.dataset.languageCode === storedLocale) { - item.classList.add('active'); - } - item.addEventListener('click', handleDropdownItemClick); - } -}); - -function setLanguageForDropdown(dropdownClass) { - const defaultLocale = document.documentElement.lang || 'en_GB'; - const storedLocale = localStorage.getItem('languageCode') || defaultLocale; - const dropdownItems = document.querySelectorAll(dropdownClass); - - for (let i = 0; i < dropdownItems.length; i++) { - const item = dropdownItems[i]; - item.classList.remove('active'); - if (item.dataset.languageCode === storedLocale) { - item.classList.add('active'); - } - item.addEventListener('click', handleDropdownItemClick); - } -} - -function handleDropdownItemClick(event) { - event.preventDefault(); - const languageCode = event.currentTarget.dataset.bsLanguageCode; // change this to event.currentTarget - if (languageCode) { - localStorage.setItem('languageCode', languageCode); - - const currentUrl = window.location.href; - if (currentUrl.indexOf('?lang=') === -1) { - window.location.href = currentUrl + '?lang=' + languageCode; - } else { - window.location.href = currentUrl.replace(/\?lang=\w{2,}/, '?lang=' + languageCode); - } - } else { - console.error("Language code is not set for this item."); // for debugging - } -} - - -document.addEventListener('DOMContentLoaded', function() { - document.querySelectorAll('.nav-item.dropdown').forEach((element) => { - const dropdownMenu = element.querySelector(".dropdown-menu"); - if (dropdownMenu.id !== 'favoritesDropdown' && dropdownMenu.children.length <= 2 && dropdownMenu.querySelectorAll("hr.dropdown-divider").length === dropdownMenu.children.length) { - if (element.previousElementSibling && element.previousElementSibling.classList.contains('nav-item') && element.previousElementSibling.classList.contains('nav-item-separator')) { - element.previousElementSibling.remove(); - } - element.remove(); - } - }); - - //Sort languages by alphabet - const list = Array.from(document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').children).filter(child => child.matches('a')); - list.sort(function(a, b) { - var A = a.textContent.toUpperCase(); - var B = b.textContent.toUpperCase(); - return (A < B) ? -1 : (A > B) ? 1 : 0; - }).forEach(node => document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').appendChild(node)); - -}); \ No newline at end of file diff --git a/src/main/resources/static/js/local-pdf-input-download.js b/src/main/resources/static/js/local-pdf-input-download.js deleted file mode 100644 index 37090390..00000000 --- a/src/main/resources/static/js/local-pdf-input-download.js +++ /dev/null @@ -1,47 +0,0 @@ -async function downloadFilesWithCallback(processFileCallback) { - const fileInput = document.querySelector('input[type="file"]'); - const files = fileInput.files; - - const zipThreshold = 4; - const zipFiles = files.length > zipThreshold; - - let jszip = null; - if (zipFiles) { - jszip = new JSZip(); - } - - const promises = Array.from(files).map(async file => { - const { processedData, fileName } = await processFileCallback(file); - - if (zipFiles) { - jszip.file(fileName, processedData); - } else { - const url = URL.createObjectURL(processedData); - const downloadOption = localStorage.getItem('downloadOption'); - - if (downloadOption === 'sameWindow') { - window.location.href = url; - } else if (downloadOption === 'newWindow') { - window.open(url, '_blank'); - } else { - const downloadLink = document.createElement('a'); - downloadLink.href = url; - downloadLink.download = fileName; - downloadLink.click(); - } - } - }); - - await Promise.all(promises); - - if (zipFiles) { - const content = await jszip.generateAsync({ type: "blob" }); - const url = URL.createObjectURL(content); - const a = document.createElement('a'); - a.href = url; - a.download = "files.zip"; - document.body.appendChild(a); - a.click(); - a.remove(); - } -} diff --git a/src/main/resources/static/js/merge.js b/src/main/resources/static/js/merge.js deleted file mode 100644 index d27730b9..00000000 --- a/src/main/resources/static/js/merge.js +++ /dev/null @@ -1,113 +0,0 @@ -let currentSort = { - field: null, - descending: false -}; - -document.getElementById("fileInput-input").addEventListener("change", function() { - var files = this.files; - displayFiles(files); -}); - -function displayFiles(files) { - var list = document.getElementById("selectedFiles"); - list.innerHTML = ""; - - for (var i = 0; i < files.length; i++) { - var item = document.createElement("li"); - item.className = "list-group-item"; - item.innerHTML = ` -
-
${files[i].name}
-
- - -
-
- `; - list.appendChild(item); - } - - attachMoveButtons(); -} - -function attachMoveButtons() { - var moveUpButtons = document.querySelectorAll(".move-up"); - for (var i = 0; i < moveUpButtons.length; i++) { - moveUpButtons[i].addEventListener("click", function(event) { - event.preventDefault(); - var parent = this.closest(".list-group-item"); - var grandParent = parent.parentNode; - if (parent.previousElementSibling) { - grandParent.insertBefore(parent, parent.previousElementSibling); - updateFiles(); - } - }); - } - - var moveDownButtons = document.querySelectorAll(".move-down"); - for (var i = 0; i < moveDownButtons.length; i++) { - moveDownButtons[i].addEventListener("click", function(event) { - event.preventDefault(); - var parent = this.closest(".list-group-item"); - var grandParent = parent.parentNode; - if (parent.nextElementSibling) { - grandParent.insertBefore(parent.nextElementSibling, parent); - updateFiles(); - } - }); - } -} - -document.getElementById("sortByNameBtn").addEventListener("click", function() { - if (currentSort.field === "name" && !currentSort.descending) { - currentSort.descending = true; - sortFiles((a, b) => b.name.localeCompare(a.name)); - } else { - currentSort.field = "name"; - currentSort.descending = false; - sortFiles((a, b) => a.name.localeCompare(b.name)); - } -}); - -document.getElementById("sortByDateBtn").addEventListener("click", function() { - if (currentSort.field === "lastModified" && !currentSort.descending) { - currentSort.descending = true; - sortFiles((a, b) => b.lastModified - a.lastModified); - } else { - currentSort.field = "lastModified"; - currentSort.descending = false; - sortFiles((a, b) => a.lastModified - b.lastModified); - } -}); - -function sortFiles(comparator) { - // Convert FileList to array and sort - const sortedFilesArray = Array.from(document.getElementById("fileInput-input").files).sort(comparator); - - // Refresh displayed list - displayFiles(sortedFilesArray); - - // Update the files property - const dataTransfer = new DataTransfer(); - sortedFilesArray.forEach(file => dataTransfer.items.add(file)); - document.getElementById("fileInput-input").files = dataTransfer.files; -} - -function updateFiles() { - var dataTransfer = new DataTransfer(); - var liElements = document.querySelectorAll("#selectedFiles li"); - const files = document.getElementById("fileInput-input").files; - - for (var i = 0; i < liElements.length; i++) { - var fileNameFromList = liElements[i].querySelector(".filename").innerText; - var fileFromFiles; - for (var j = 0; j < files.length; j++) { - var file = files[j]; - if (file.name === fileNameFromList) { - dataTransfer.items.add(file); - break; - } - } - } - document.getElementById("fileInput-input").files = dataTransfer.files; -} diff --git a/src/main/resources/static/js/multitool/DragDropManager.js b/src/main/resources/static/js/multitool/DragDropManager.js deleted file mode 100644 index 93fbbdf1..00000000 --- a/src/main/resources/static/js/multitool/DragDropManager.js +++ /dev/null @@ -1,127 +0,0 @@ - - -class DragDropManager { - dragContainer; - wrapper; - pageDirection; - movePageTo; - pageDragging; - draggelEl; - draggedImageEl; - hoveredEl; - endInsertionElement; - - constructor(id, wrapperId) { - this.dragContainer = document.getElementById(id); - this.pageDirection = document.documentElement.getAttribute("lang-direction"); - this.wrapper = document.getElementById(wrapperId); - this.pageDragging = false; - this.hoveredEl = undefined; - this.draggelEl = undefined - this.draggedImageEl = undefined; - - var styleElement = document.createElement('link'); - styleElement.rel = 'stylesheet'; - styleElement.href = 'css/dragdrop.css' - - document.head.appendChild(styleElement); - - const div = document.createElement('div'); - div.classList.add('drag-manager_endpoint'); - div.innerHTML = ` - - - ` - this.endInsertionElement = div; - - this.startDraggingPage = this.startDraggingPage.bind(this); - this.onDragEl = this.onDragEl.bind(this); - this.stopDraggingPage = this.stopDraggingPage.bind(this); - - this.adapt(div); - } - - startDraggingPage(div,) { - this.pageDragging = true; - this.draggedEl = div; - const img = div.querySelector('img'); - div.classList.add('drag-manager_dragging'); - const imageSrc = img.src; - - const imgEl = document.createElement('img'); - imgEl.classList.add('dragged-img'); - imgEl.src = imageSrc; - this.draggedImageEl = imgEl; - imgEl.style.left = screenX; - imgEl.style.right = screenY; - imgEl.style.transform = `rotate(${img.style.rotate === '' ? '0deg' : img.style.rotate}) translate(-50%, -50%)`; - this.dragContainer.appendChild(imgEl); - - window.addEventListener('mouseup', this.stopDraggingPage) - window.addEventListener('mousemove', this.onDragEl) - this.wrapper.classList.add('drag-manager_dragging-container'); - this.wrapper.appendChild(this.endInsertionElement); - } - - onDragEl(mouseEvent) { - const { clientX, clientY } = mouseEvent; - if(this.draggedImageEl) { - this.draggedImageEl.style.left = `${clientX}px`; - this.draggedImageEl.style.top = `${clientY}px`; - } - } - - - stopDraggingPage() { - window.removeEventListener('mousemove', this.onDragEl); - this.wrapper.classList.remove('drag-manager_dragging-container'); - this.wrapper.removeChild(this.endInsertionElement); - window.removeEventListener('mouseup', this.stopDraggingPage) - this.draggedImageEl = undefined; - this.pageDragging = false; - this.draggedEl.classList.remove('drag-manager_dragging'); - this.hoveredEl?.classList.remove('drag-manager_draghover'); - this.dragContainer.childNodes.forEach((dragChild) => { - this.dragContainer.removeChild(dragChild); - }) - if(!this.hoveredEl) { - return; - } - if(this.hoveredEl === this.endInsertionElement) { - this.movePageTo(this.draggedEl); - return; - } - this.movePageTo(this.draggedEl, this.hoveredEl); - } - - setActions({ movePageTo }) { - this.movePageTo = movePageTo; - } - - - adapt(div) { - const onDragStart = () => { - this.startDraggingPage(div); - } - - const onMouseEnter = () => { - if (this.pageDragging) { - this.hoveredEl = div; - div.classList.add('drag-manager_draghover'); - } - } - - const onMouseLeave = () => { - this.hoveredEl = undefined - div.classList.remove('drag-manager_draghover'); - } - - div.addEventListener('dragstart', onDragStart); - div.addEventListener('mouseenter', onMouseEnter); - div.addEventListener('mouseleave', onMouseLeave); - - return div; - } -} - -export default DragDropManager; \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/ImageHighlighter.js b/src/main/resources/static/js/multitool/ImageHighlighter.js deleted file mode 100644 index 6f7cd22e..00000000 --- a/src/main/resources/static/js/multitool/ImageHighlighter.js +++ /dev/null @@ -1,46 +0,0 @@ -class ImageHiglighter { - imageHighlighter; - constructor(id) { - this.imageHighlighter = document.getElementById(id); - this.imageHighlightCallback = this.imageHighlightCallback.bind(this); - - var styleElement = document.createElement('link'); - styleElement.rel = 'stylesheet'; - styleElement.href = 'css/imageHighlighter.css' - - document.head.appendChild(styleElement); - - this.imageHighlighter.onclick = () => { - this.imageHighlighter.childNodes.forEach((child) => { - child.classList.add('remove'); - setTimeout(() => { - this.imageHighlighter.removeChild(child); - }, 100) - }) - } - } - - imageHighlightCallback(highlightEvent) { - var bigImg = document.createElement('img'); - bigImg.onclick = (imageClickEvent) => { - // This prevents the highlighter's onClick from closing the image when clicking - // on the image instead of next to it. - imageClickEvent.preventDefault(); - imageClickEvent.stopPropagation(); - }; - bigImg.src = highlightEvent.target.src; - this.imageHighlighter.appendChild(bigImg); - }; - - setActions() { - // not needed in this case - } - - adapt(div) { - const img = div.querySelector('.page-image'); - img.addEventListener('click', this.imageHighlightCallback) - return div; - } -} - -export default ImageHiglighter; \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/PdfActionsManager.js b/src/main/resources/static/js/multitool/PdfActionsManager.js deleted file mode 100644 index 3a4fd33d..00000000 --- a/src/main/resources/static/js/multitool/PdfActionsManager.js +++ /dev/null @@ -1,178 +0,0 @@ -class PdfActionsManager { - pageDirection; - pagesContainer; - - constructor(id) { - this.pagesContainer = document.getElementById(id); - this.pageDirection = document.documentElement.getAttribute("lang-direction"); - - var styleElement = document.createElement('link'); - styleElement.rel = 'stylesheet'; - styleElement.href = 'css/pdfActions.css' - - document.head.appendChild(styleElement); - } - - getPageContainer(element) { - var container = element - while (!container.classList.contains('page-container')) { - container = container.parentNode; - } - return container; - } - - moveUpButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - - const sibling = imgContainer.previousSibling; - if (sibling) { - this.movePageTo(imgContainer, sibling, true); - } - } - - moveDownButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - const sibling = imgContainer.nextSibling; - if (sibling) { - this.movePageTo(imgContainer, sibling.nextSibling, true); - } - }; - - rotateCCWButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - const img = imgContainer.querySelector("img"); - - this.rotateElement(img, -90) - }; - - rotateCWButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - const img = imgContainer.querySelector("img"); - - this.rotateElement(img, 90) - }; - - deletePageButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - this.pagesContainer.removeChild(imgContainer); - if (this.pagesContainer.childElementCount === 0) { - const filenameInput = document.getElementById('filename-input'); - const filenameParagraph = document.getElementById('filename'); - const downloadBtn = document.getElementById('export-button'); - - filenameInput.disabled = true; - filenameInput.value = ""; - filenameParagraph.innerText = ""; - - downloadBtn.disabled = true; - } - }; - - insertFileButtonCallback(e) { - var imgContainer = this.getPageContainer(e.target); - this.addPdfs(imgContainer) - }; - - setActions({ movePageTo, addPdfs, rotateElement }) { - this.movePageTo = movePageTo; - this.addPdfs = addPdfs; - this.rotateElement = rotateElement; - - this.moveUpButtonCallback = this.moveUpButtonCallback.bind(this); - this.moveDownButtonCallback = this.moveDownButtonCallback.bind(this); - this.rotateCCWButtonCallback = this.rotateCCWButtonCallback.bind(this); - this.rotateCWButtonCallback = this.rotateCWButtonCallback.bind(this); - this.deletePageButtonCallback = this.deletePageButtonCallback.bind(this); - this.insertFileButtonCallback = this.insertFileButtonCallback.bind(this); - } - - adapt(div) { - div.classList.add('pdf-actions_container'); - const leftDirection = this.pageDirection === 'rtl' ? 'right' : 'left' - const rightDirection = this.pageDirection === 'rtl' ? 'left' : 'right' - const buttonContainer = document.createElement('div'); - - buttonContainer.classList.add("pdf-actions_button-container", "hide-on-drag"); - - const moveUp = document.createElement('button'); - moveUp.classList.add("pdf-actions_move-left-button","btn", "btn-secondary"); - moveUp.innerHTML = ``; - moveUp.onclick = this.moveUpButtonCallback; - buttonContainer.appendChild(moveUp); - - const moveDown = document.createElement('button'); - moveDown.classList.add("pdf-actions_move-right-button","btn", "btn-secondary"); - moveDown.innerHTML = ``; - moveDown.onclick = this.moveDownButtonCallback; - buttonContainer.appendChild(moveDown); - - const rotateCCW = document.createElement('button'); - rotateCCW.classList.add("btn", "btn-secondary"); - rotateCCW.innerHTML = ` - - - `; - rotateCCW.onclick = this.rotateCCWButtonCallback; - buttonContainer.appendChild(rotateCCW); - - const rotateCW = document.createElement('button'); - rotateCW.classList.add("btn", "btn-secondary"); - rotateCW.innerHTML = ` - - - `; - rotateCW.onclick = this.rotateCWButtonCallback; - buttonContainer.appendChild(rotateCW); - - const deletePage = document.createElement('button'); - deletePage.classList.add("btn", "btn-danger"); - deletePage.innerHTML = ` - - - `; - deletePage.onclick = this.deletePageButtonCallback; - buttonContainer.appendChild(deletePage); - - div.appendChild(buttonContainer); - - const insertFileButtonContainer = document.createElement('div'); - - insertFileButtonContainer.classList.add( - "pdf-actions_insert-file-button-container", - leftDirection, - `align-center-${leftDirection}`); - - const insertFileButton = document.createElement('button'); - insertFileButton.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button"); - insertFileButton.innerHTML = ` - - - `; - insertFileButton.onclick = this.insertFileButtonCallback; - insertFileButtonContainer.appendChild(insertFileButton); - - div.appendChild(insertFileButtonContainer); - - // add this button to every element, but only show it on the last one :D - const insertFileButtonRightContainer = document.createElement('div'); - insertFileButtonRightContainer.classList.add( - "pdf-actions_insert-file-button-container", - rightDirection, - `align-center-${rightDirection}`); - - const insertFileButtonRight = document.createElement('button'); - insertFileButtonRight.classList.add("btn", "btn-primary", "pdf-actions_insert-file-button"); - insertFileButtonRight.innerHTML = ` - - - insertFileButtonRight`; - insertFileButtonRight.onclick = () => addPdfs(); - insertFileButtonRightContainer.appendChild(insertFileButtonRight); - - div.appendChild(insertFileButtonRightContainer); - - return div; - } -} - -export default PdfActionsManager; \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js deleted file mode 100644 index 4c7c8497..00000000 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ /dev/null @@ -1,301 +0,0 @@ -class PdfContainer { - fileName; - pagesContainer; - pagesContainerWrapper; - pdfAdapters; - downloadLink; - - constructor(id, wrapperId, pdfAdapters) { - this.pagesContainer = document.getElementById(id) - this.pagesContainerWrapper = document.getElementById(wrapperId); - this.downloadLink = null; - this.movePageTo = this.movePageTo.bind(this); - this.addPdfs = this.addPdfs.bind(this); - this.addPdfsFromFiles = this.addPdfsFromFiles.bind(this); - this.rotateElement = this.rotateElement.bind(this); - this.rotateAll = this.rotateAll.bind(this); - this.exportPdf = this.exportPdf.bind(this); - this.updateFilename = this.updateFilename.bind(this); - this.setDownloadAttribute = this.setDownloadAttribute.bind(this); - this.preventIllegalChars = this.preventIllegalChars.bind(this); - - this.pdfAdapters = pdfAdapters; - - this.pdfAdapters.forEach(adapter => { - adapter.setActions({ - movePageTo: this.movePageTo, - addPdfs: this.addPdfs, - rotateElement: this.rotateElement, - }) - }) - - window.addPdfs = this.addPdfs; - window.exportPdf = this.exportPdf; - window.rotateAll = this.rotateAll; - - const filenameInput = document.getElementById('filename-input'); - const downloadBtn = document.getElementById('export-button'); - - filenameInput.onkeyup = this.updateFilename; - filenameInput.onkeydown = this.preventIllegalChars; - filenameInput.disabled = true; - filenameInput.innerText = ""; - downloadBtn.disabled = true; - } - - movePageTo(startElement, endElement, scrollTo = false) { - const childArray = Array.from(this.pagesContainer.childNodes); - const startIndex = childArray.indexOf(startElement); - const endIndex = childArray.indexOf(endElement); - this.pagesContainer.removeChild(startElement); - if(!endElement) { - this.pagesContainer.append(startElement); - } else { - this.pagesContainer.insertBefore(startElement, endElement); - } - - if(scrollTo) { - const { width } = startElement.getBoundingClientRect(); - const vector = (endIndex !== -1 && startIndex > endIndex) - ? 0-width - : width; - - this.pagesContainerWrapper.scroll({ - left: this.pagesContainerWrapper.scrollLeft + vector, - }) - } - } - - addPdfs(nextSiblingElement) { - var input = document.createElement('input'); - input.type = 'file'; - input.multiple = true; - input.setAttribute("accept", "application/pdf"); - input.onchange = async(e) => { - const files = e.target.files; - if (files.length > 0) { - const filenameInput = document.getElementById('filename-input'); - const pagesContainer = document.getElementById('pages-container'); - const downloadBtn = document.getElementById('export-button'); - - filenameInput.disabled = false; - - if (pagesContainer.childElementCount === 0) { - filenameInput.value = ""; - this.filename = null; - downloadBtn.disabled = true; - } else { - this.filename = filenameInput.value; - } - - if (this.filename === null || this.filename === undefined) { - filenameInput.value = files[0].name; - } else { - filenameInput.value = this.filename; - } - - } - - this.addPdfsFromFiles(files, nextSiblingElement); - } - - input.click(); - } - - async addPdfsFromFiles(files, nextSiblingElement) { - this.fileName = files[0].name; - for (var i=0; i < files.length; i++) { - await this.addPdfFile(files[i], nextSiblingElement); - } - - document.querySelectorAll(".enable-on-file").forEach(element => { - element.disabled = false; - }); - } - - rotateElement(element, deg) { - var lastTransform = element.style.rotate; - if (!lastTransform) { - lastTransform = "0"; - } - const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, '')); - const newAngle = lastAngle + deg; - - element.style.rotate = newAngle + "deg"; - } - - async addPdfFile(file, nextSiblingElement) { - const { renderer, pdfDocument } = await this.loadFile(file); - - for (var i=0; i < renderer.pageCount; i++) { - const div = document.createElement('div'); - - div.classList.add("page-container"); - - var img = document.createElement('img'); - img.classList.add('page-image') - const imageSrc = await renderer.renderPage(i) - img.src = imageSrc; - img.pageIdx = i; - img.rend = renderer; - img.doc = pdfDocument; - div.appendChild(img); - - this.pdfAdapters.forEach((adapter) => { - adapter.adapt?.(div) - }) - if (nextSiblingElement) { - this.pagesContainer.insertBefore(div, nextSiblingElement); - } else { - this.pagesContainer.appendChild(div); - } - } - } - - async loadFile(file) { - var objectUrl = URL.createObjectURL(file); - var pdfDocument = await this.toPdfLib(objectUrl); - var renderer = await this.toRenderer(objectUrl); - return { renderer, pdfDocument }; - } - - async toRenderer(objectUrl) { - pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js' - const pdf = await pdfjsLib.getDocument(objectUrl).promise; - return { - document: pdf, - pageCount: pdf.numPages, - renderPage: async function(pageIdx) { - const page = await this.document.getPage(pageIdx+1); - - const canvas = document.createElement("canvas"); - - // set the canvas size to the size of the page - if (page.rotate == 90 || page.rotate == 270) { - canvas.width = page.view[3]; - canvas.height = page.view[2]; - } else { - canvas.width = page.view[2]; - canvas.height = page.view[3]; - } - - // render the page onto the canvas - var renderContext = { - canvasContext: canvas.getContext("2d"), - viewport: page.getViewport({ scale: 1 }) - }; - - await page.render(renderContext).promise; - return canvas.toDataURL(); - } - }; - } - - async toPdfLib(objectUrl) { - const existingPdfBytes = await fetch(objectUrl).then(res => res.arrayBuffer()); - const pdfDoc = await PDFLib.PDFDocument.load(existingPdfBytes, { ignoreEncryption: true }); - return pdfDoc; - } - - - - rotateAll(deg) { - for (var i=0; i 0) { - - inputArr = inputArr.filter(n => n); // remove all empty strings, nulls or undefined - - if (inputArr.length > 1) { - inputArr.pop(); // remove right part after last dot - } - - filenameInput.value = inputArr.join(''); - this.filename = filenameInput.value; - } - - if (!filenameInput.value.includes('.pdf')) { - filenameInput.value = filenameInput.value + '.pdf'; - this.filename = filenameInput.value; - } - - if (downloadOption === 'sameWindow') { - // Open the file in the same window - window.location.href = url; - } else if (downloadOption === 'newWindow') { - // Open the file in a new window - window.open(url, '_blank'); - } else { - // Download the file - this.downloadLink = document.createElement('a'); - this.downloadLink.id = 'download-link'; - this.downloadLink.href = url; - // downloadLink.download = this.fileName ? this.fileName : 'managed.pdf'; - // downloadLink.download = this.fileName; - this.downloadLink.setAttribute('download', this.filename ? this.fileName : 'managed.pdf'); - this.downloadLink.setAttribute('target', '_blank'); - this.downloadLink.onclick = this.setDownloadAttribute; - this.downloadLink.click(); - } - } - - setDownloadAttribute() { - this.downloadLink.setAttribute("download", this.filename ? this.filename : 'managed.pdf'); - } - - updateFilename() { - const filenameInput = document.getElementById('filename-input'); - const downloadBtn = document.getElementById('export-button'); - - if (filenameInput.value === "") { - downloadBtn.disabled = true; - return; - } - - downloadBtn.disabled = false; - this.filename = filenameInput.value; - } - - preventIllegalChars(e) { - // const filenameInput = document.getElementById('filename-input'); - // - // filenameInput.value = filenameInput.value.replace('.pdf', ''); - // - // // prevent . - // if (filenameInput.value.includes('.')) { - // filenameInput.value.replace('.',''); - // } - } -} - -export default PdfContainer; diff --git a/src/main/resources/static/js/multitool/fileInput.js b/src/main/resources/static/js/multitool/fileInput.js deleted file mode 100644 index 1a76bd48..00000000 --- a/src/main/resources/static/js/multitool/fileInput.js +++ /dev/null @@ -1,69 +0,0 @@ -const addFileDragListener = (callback) => { - let overlay; - let dragCounter = 0; - - const dragenterListener = function() { - dragCounter++; - if (!overlay) { - // Create and show the overlay - overlay = document.createElement('div'); - overlay.style.position = 'fixed'; - overlay.style.top = 0; - overlay.style.left = 0; - overlay.style.width = '100%'; - overlay.style.height = '100%'; - overlay.style.background = 'rgba(0, 0, 0, 0.5)'; - overlay.style.color = '#fff'; - overlay.style.zIndex = '1000'; - overlay.style.display = 'flex'; - overlay.style.alignItems = 'center'; - overlay.style.justifyContent = 'center'; - overlay.style.pointerEvents = 'none'; - overlay.innerHTML = '

Drop files anywhere to upload

'; - document.getElementById('content-wrap').appendChild(overlay); - } - }; - - const dragleaveListener = function() { - dragCounter--; - if (dragCounter === 0) { - // Hide and remove the overlay - if (overlay) { - overlay.remove(); - overlay = null; - } - } - }; - - const dropListener = function(e) { - - const dt = e.dataTransfer; - const files = dt.files; - callback(files).catch((err) => { - console.error(err); - //maybe - }).finally(() => { - if (overlay) { - overlay.remove(); - overlay = null; - } - }); - }; - - // Prevent default behavior for drag events - ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { - document.body.addEventListener(eventName, preventDefaults, false); - }); - - function preventDefaults(e) { - e.preventDefault(); - e.stopPropagation(); - } - - document.body.addEventListener('dragenter', dragenterListener); - document.body.addEventListener('dragleave', dragleaveListener); - // Add drop event listener - document.body.addEventListener('drop', dropListener); -} - -export default addFileDragListener; \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/horizontalScroll.js b/src/main/resources/static/js/multitool/horizontalScroll.js deleted file mode 100644 index 2d20ee79..00000000 --- a/src/main/resources/static/js/multitool/horizontalScroll.js +++ /dev/null @@ -1,35 +0,0 @@ -const scrollDivHorizontally = (id) => { - var scrollDelta = 0; // variable to store the accumulated scroll delta - var isScrolling = false; // variable to track if scroll is already in progress - const divToScrollHorizontally = document.getElementById(id) - function scrollLoop() { - // Scroll the div horizontally by a fraction of the accumulated scroll delta - divToScrollHorizontally.scrollLeft += scrollDelta * 0.1; - - // Reduce the accumulated scroll delta by a fraction - scrollDelta *= 0.9; - - // If scroll delta is still significant, continue the scroll loop - if (Math.abs(scrollDelta) > 0.1) { - requestAnimationFrame(scrollLoop); - } else { - isScrolling = false; // Reset scroll in progress flag - } - } - - - divToScrollHorizontally.addEventListener("wheel", function(e) { - e.preventDefault(); // prevent default mousewheel behavior - - // Accumulate the horizontal scroll delta - scrollDelta -= e.deltaX || e.wheelDeltaX || -e.deltaY || -e.wheelDeltaY; - - // If scroll is not already in progress, start the scroll loop - if (!isScrolling) { - isScrolling = true; - requestAnimationFrame(scrollLoop); - } - }); -} - -export default scrollDivHorizontally; diff --git a/src/main/resources/static/js/pipeline.js b/src/main/resources/static/js/pipeline.js deleted file mode 100644 index 06810743..00000000 --- a/src/main/resources/static/js/pipeline.js +++ /dev/null @@ -1,494 +0,0 @@ -document.getElementById('validateButton').addEventListener('click', function(event) { - event.preventDefault(); - validatePipeline(); -}); -function validatePipeline() { - let pipelineListItems = document.getElementById('pipelineList').children; - let isValid = true; - let containsAddPassword = false; - for (let i = 0; i < pipelineListItems.length - 1; i++) { - let currentOperation = pipelineListItems[i].querySelector('.operationName').textContent; - let nextOperation = pipelineListItems[i + 1].querySelector('.operationName').textContent; - if (currentOperation === '/add-password') { - containsAddPassword = true; - } - console.log(currentOperation); - console.log(apiDocs[currentOperation]); - let currentOperationDescription = apiDocs[currentOperation]?.post?.description || ""; - let nextOperationDescription = apiDocs[nextOperation]?.post?.description || ""; - - console.log("currentOperationDescription", currentOperationDescription); - console.log("nextOperationDescription", nextOperationDescription); - - let currentOperationOutput = currentOperationDescription.match(/Output:([A-Z\/]*)/)?.[1] || ""; - let nextOperationInput = nextOperationDescription.match(/Input:([A-Z\/]*)/)?.[1] || ""; - - console.log("Operation " + currentOperation + " Output: " + currentOperationOutput); - console.log("Operation " + nextOperation + " Input: " + nextOperationInput); - - // Splitting in case of multiple possible output/input - let currentOperationOutputArr = currentOperationOutput.split('/'); - let nextOperationInputArr = nextOperationInput.split('/'); - - if (currentOperationOutput !== 'ANY' && nextOperationInput !== 'ANY') { - let intersection = currentOperationOutputArr.filter(value => nextOperationInputArr.includes(value)); - console.log(`Intersection: ${intersection}`); - - if (intersection.length === 0) { - isValid = false; - console.log(`Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`); - alert(`Incompatible operations: The output of operation '${currentOperation}' (${currentOperationOutput}) is not compatible with the input of the following operation '${nextOperation}' (${nextOperationInput}).`); - break; - } - } - } - if (containsAddPassword && pipelineListItems[pipelineListItems.length - 1].querySelector('.operationName').textContent !== '/add-password') { - alert('The "add-password" operation should be at the end of the operations sequence. Please adjust the operations order.'); - return false; - } - if (isValid) { - console.log('Pipeline is valid'); - // Continue with the pipeline operation - } else { - console.error('Pipeline is not valid'); - // Stop operation, maybe display an error to the user - } - - return isValid; -} - - - - - -document.getElementById('submitConfigBtn').addEventListener('click', function() { - - if (validatePipeline() === false) { - return; - } - let selectedOperation = document.getElementById('operationsDropdown').value; - let parameters = operationSettings[selectedOperation] || {}; - - let pipelineConfig = { - "name": "uniquePipelineName", - "pipeline": [{ - "operation": selectedOperation, - "parameters": parameters - }], - "_examples": { - "outputDir": "{outputFolder}/{folderName}", - "outputFileName": "{filename}-{pipelineName}-{date}-{time}" - }, - "outputDir": "httpWebRequest", - "outputFileName": "{filename}" - }; - - let pipelineConfigJson = JSON.stringify(pipelineConfig, null, 2); - - let formData = new FormData(); - - let fileInput = document.getElementById('fileInput-input'); - let files = fileInput.files; - - for (let i = 0; i < files.length; i++) { - console.log("files[i]", files[i].name); - formData.append('fileInput', files[i], files[i].name); - } - - console.log("pipelineConfigJson", pipelineConfigJson); - formData.append('json', pipelineConfigJson); - console.log("formData", formData); - - fetch('/handleData', { - method: 'POST', - body: formData - }) - .then(response => response.blob()) - .then(blob => { - - let url = window.URL.createObjectURL(blob); - let a = document.createElement('a'); - a.href = url; - a.download = 'outputfile'; - document.body.appendChild(a); - a.click(); - a.remove(); - }) - .catch((error) => { - console.error('Error:', error); - }); -}); - -let apiDocs = {}; - -let operationSettings = {}; - -fetch('v3/api-docs') - .then(response => response.json()) - .then(data => { - - apiDocs = data.paths; - let operationsDropdown = document.getElementById('operationsDropdown'); - const ignoreOperations = ["/handleData", "operationToIgnore"]; // Add the operations you want to ignore here - - operationsDropdown.innerHTML = ''; - - let operationsByTag = {}; - - // Group operations by tags - Object.keys(data.paths).forEach(operationPath => { - let operation = data.paths[operationPath].post; - if (operation && !ignoreOperations.includes(operationPath) && !operation.description.includes("Type:MISO")) { - let operationTag = operation.tags[0]; // This assumes each operation has exactly one tag - if (!operationsByTag[operationTag]) { - operationsByTag[operationTag] = []; - } - operationsByTag[operationTag].push(operationPath); - } - }); - - // Specify the order of tags - let tagOrder = ["General", "Security", "Convert", "Other", "Filter"]; - - // Create dropdown options - tagOrder.forEach(tag => { - if (operationsByTag[tag]) { - let group = document.createElement('optgroup'); - group.label = tag; - - operationsByTag[tag].forEach(operationPath => { - let option = document.createElement('option'); - let operationWithoutSlash = operationPath.replace(/\//g, ''); // Remove slashes - option.textContent = operationWithoutSlash; - option.value = operationPath; // Keep the value with slashes for querying - group.appendChild(option); - }); - - operationsDropdown.appendChild(group); - } - }); - }); - - -document.getElementById('addOperationBtn').addEventListener('click', function() { - let selectedOperation = document.getElementById('operationsDropdown').value; - let pipelineList = document.getElementById('pipelineList'); - - let listItem = document.createElement('li'); - listItem.className = "list-group-item"; - let hasSettings = (apiDocs[selectedOperation] && apiDocs[selectedOperation].post && - ((apiDocs[selectedOperation].post.parameters && apiDocs[selectedOperation].post.parameters.length > 0) || - (apiDocs[selectedOperation].post.requestBody && - apiDocs[selectedOperation].post.requestBody.content['multipart/form-data'].schema.properties))); - - - - - listItem.innerHTML = ` -
-
${selectedOperation}
-
- - - - -
-
- `; - - pipelineList.appendChild(listItem); - - listItem.querySelector('.move-up').addEventListener('click', function(event) { - event.preventDefault(); - if (listItem.previousElementSibling) { - pipelineList.insertBefore(listItem, listItem.previousElementSibling); - } - }); - - listItem.querySelector('.move-down').addEventListener('click', function(event) { - event.preventDefault(); - if (listItem.nextElementSibling) { - pipelineList.insertBefore(listItem.nextElementSibling, listItem); - } - }); - - listItem.querySelector('.remove').addEventListener('click', function(event) { - event.preventDefault(); - pipelineList.removeChild(listItem); - }); - - listItem.querySelector('.pipelineSettings').addEventListener('click', function(event) { - event.preventDefault(); - showpipelineSettingsModal(selectedOperation); - }); - - function showpipelineSettingsModal(operation) { - let pipelineSettingsModal = document.getElementById('pipelineSettingsModal'); - let pipelineSettingsContent = document.getElementById('pipelineSettingsContent'); - let operationData = apiDocs[operation].post.parameters || []; - let requestBodyData = apiDocs[operation].post.requestBody.content['multipart/form-data'].schema.properties || {}; - - // Combine operationData and requestBodyData into a single array - operationData = operationData.concat(Object.keys(requestBodyData).map(key => ({ - name: key, - schema: requestBodyData[key] - }))); - - pipelineSettingsContent.innerHTML = ''; - - operationData.forEach(parameter => { - // If the parameter name is 'fileInput', return early to skip the rest of this iteration - if (parameter.name === 'fileInput') return; - - let parameterDiv = document.createElement('div'); - parameterDiv.className = "mb-3"; - - let parameterLabel = document.createElement('label'); - parameterLabel.textContent = `${parameter.name} (${parameter.schema.type}): `; - parameterLabel.title = parameter.description; - parameterDiv.appendChild(parameterLabel); - - let parameterInput; - - // check if enum exists in schema - if (parameter.schema.enum) { - // if enum exists, create a select element - parameterInput = document.createElement('select'); - parameterInput.className = "form-control"; - - // iterate over each enum value and create an option for it - parameter.schema.enum.forEach(value => { - let option = document.createElement('option'); - option.value = value; - option.text = value; - parameterInput.appendChild(option); - }); - } else { - // switch-case statement for handling non-enum types - switch (parameter.schema.type) { - case 'string': - if (parameter.schema.format === 'binary') { - // This is a file input - - //parameterInput = document.createElement('input'); - //parameterInput.type = 'file'; - //parameterInput.className = "form-control"; - - parameterInput = document.createElement('input'); - parameterInput.type = 'text'; - parameterInput.className = "form-control"; - parameterInput.value = "automatedFileInput"; - } else { - parameterInput = document.createElement('input'); - parameterInput.type = 'text'; - parameterInput.className = "form-control"; - } - break; - case 'number': - case 'integer': - parameterInput = document.createElement('input'); - parameterInput.type = 'number'; - parameterInput.className = "form-control"; - break; - case 'boolean': - parameterInput = document.createElement('input'); - parameterInput.type = 'checkbox'; - break; - case 'array': - case 'object': - parameterInput = document.createElement('textarea'); - parameterInput.placeholder = `Enter a JSON formatted ${parameter.schema.type}`; - parameterInput.className = "form-control"; - break; - default: - parameterInput = document.createElement('input'); - parameterInput.type = 'text'; - parameterInput.className = "form-control"; - } - } - parameterInput.id = parameter.name; - - if (operationSettings[operation] && operationSettings[operation][parameter.name] !== undefined) { - let savedValue = operationSettings[operation][parameter.name]; - - switch (parameter.schema.type) { - case 'number': - case 'integer': - parameterInput.value = savedValue.toString(); - break; - case 'boolean': - parameterInput.checked = savedValue; - break; - case 'array': - case 'object': - parameterInput.value = JSON.stringify(savedValue); - break; - default: - parameterInput.value = savedValue; - } - } - - parameterDiv.appendChild(parameterInput); - - pipelineSettingsContent.appendChild(parameterDiv); - }); - - let saveButton = document.createElement('button'); - saveButton.textContent = "Save Settings"; - saveButton.className = "btn btn-primary"; - saveButton.addEventListener('click', function(event) { - event.preventDefault(); - let settings = {}; - operationData.forEach(parameter => { - let value = document.getElementById(parameter.name).value; - switch (parameter.schema.type) { - case 'number': - case 'integer': - settings[parameter.name] = Number(value); - break; - case 'boolean': - settings[parameter.name] = document.getElementById(parameter.name).checked; - break; - case 'array': - case 'object': - try { - settings[parameter.name] = JSON.parse(value); - } catch (err) { - console.error(`Invalid JSON format for ${parameter.name}`); - } - break; - default: - settings[parameter.name] = value; - } - }); - operationSettings[operation] = settings; - console.log(settings); - pipelineSettingsModal.style.display = "none"; - }); - pipelineSettingsContent.appendChild(saveButton); - - pipelineSettingsModal.style.display = "block"; - - pipelineSettingsModal.getElementsByClassName("close")[0].onclick = function() { - pipelineSettingsModal.style.display = "none"; - } - - window.onclick = function(event) { - if (event.target == pipelineSettingsModal) { - pipelineSettingsModal.style.display = "none"; - } - } - } - - document.getElementById('savePipelineBtn').addEventListener('click', function() { - if (validatePipeline() === false) { - return; - } - var pipelineName = document.getElementById('pipelineName').value; - let pipelineList = document.getElementById('pipelineList').children; - let pipelineConfig = { - "name": pipelineName, - "pipeline": [], - "_examples": { - "outputDir": "{outputFolder}/{folderName}", - "outputFileName": "{filename}-{pipelineName}-{date}-{time}" - }, - "outputDir": "httpWebRequest", - "outputFileName": "{filename}" - }; - - for (let i = 0; i < pipelineList.length; i++) { - let operationName = pipelineList[i].querySelector('.operationName').textContent; - let parameters = operationSettings[operationName] || {}; - - pipelineConfig.pipeline.push({ - "operation": operationName, - "parameters": parameters - }); - } - - let a = document.createElement('a'); - a.href = URL.createObjectURL(new Blob([JSON.stringify(pipelineConfig, null, 2)], { - type: 'application/json' - })); - a.download = 'pipelineConfig.json'; - a.style.display = 'none'; - - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - }); - - async function processPipelineConfig(configString) { - let pipelineConfig = JSON.parse(configString); - let pipelineList = document.getElementById('pipelineList'); - - while (pipelineList.firstChild) { - pipelineList.removeChild(pipelineList.firstChild); - } - document.getElementById('pipelineName').value = pipelineConfig.name - for (const operationConfig of pipelineConfig.pipeline) { - let operationsDropdown = document.getElementById('operationsDropdown'); - operationsDropdown.value = operationConfig.operation; - operationSettings[operationConfig.operation] = operationConfig.parameters; - - // assuming addOperation is async - await new Promise((resolve) => { - document.getElementById('addOperationBtn').addEventListener('click', resolve, { once: true }); - document.getElementById('addOperationBtn').click(); - }); - - let lastOperation = pipelineList.lastChild; - - Object.keys(operationConfig.parameters).forEach(parameterName => { - let input = document.getElementById(parameterName); - if (input) { - switch (input.type) { - case 'checkbox': - input.checked = operationConfig.parameters[parameterName]; - break; - case 'number': - input.value = operationConfig.parameters[parameterName].toString(); - break; - case 'file': - if (parameterName !== 'fileInput') { - // Create a new file input element - let newInput = document.createElement('input'); - newInput.type = 'file'; - newInput.id = parameterName; - - // Add the new file input to the main page (change the selector according to your needs) - document.querySelector('#main').appendChild(newInput); - } - break; - case 'text': - case 'textarea': - default: - input.value = JSON.stringify(operationConfig.parameters[parameterName]); - } - } - }); - - } - } - - - document.getElementById('uploadPipelineBtn').addEventListener('click', function() { - document.getElementById('uploadPipelineInput').click(); - }); - - document.getElementById('uploadPipelineInput').addEventListener('change', function(e) { - let reader = new FileReader(); - reader.onload = function(event) { - processPipelineConfig(event.target.result); - }; - reader.readAsText(e.target.files[0]); - }); - - document.getElementById('pipelineSelect').addEventListener('change', function(e) { - let selectedPipelineJson = e.target.value; // assuming the selected value is the JSON string of the pipeline config - processPipelineConfig(selectedPipelineJson); - }); - - -}); \ No newline at end of file diff --git a/src/main/resources/static/js/search.js b/src/main/resources/static/js/search.js deleted file mode 100644 index 5dd4acf5..00000000 --- a/src/main/resources/static/js/search.js +++ /dev/null @@ -1,75 +0,0 @@ -// Toggle search bar when the search icon is clicked -document.querySelector('#search-icon').addEventListener('click', function(e) { - e.preventDefault(); - var searchBar = document.querySelector('#navbarSearch'); - searchBar.classList.toggle('show'); -}); -window.onload = function() { - var items = document.querySelectorAll('.dropdown-item, .nav-link'); - var dummyContainer = document.createElement('div'); - dummyContainer.style.position = 'absolute'; - dummyContainer.style.visibility = 'hidden'; - dummyContainer.style.whiteSpace = 'nowrap'; // Ensure we measure full width - document.body.appendChild(dummyContainer); - - var maxWidth = 0; - - items.forEach(function(item) { - var clone = item.cloneNode(true); - dummyContainer.appendChild(clone); - var width = clone.offsetWidth; - if (width > maxWidth) { - maxWidth = width; - } - dummyContainer.removeChild(clone); - }); - - document.body.removeChild(dummyContainer); - - // Store max width for later use - window.navItemMaxWidth = maxWidth; -}; - -// Show search results as user types in search box -document.querySelector('#navbarSearchInput').addEventListener('input', function(e) { - var searchText = e.target.value.toLowerCase(); - var items = document.querySelectorAll('.dropdown-item, .nav-link'); - var resultsBox = document.querySelector('#searchResults'); - - // Clear any previous results - resultsBox.innerHTML = ''; - - items.forEach(function(item) { - var titleElement = item.querySelector('.icon-text'); - var iconElement = item.querySelector('.icon'); - var itemHref = item.getAttribute('href'); - var tags = item.getAttribute('data-bs-tags') || ""; // If no tags, default to empty string - - if (titleElement && iconElement && itemHref !== '#') { - var title = titleElement.innerText; - if ((title.toLowerCase().indexOf(searchText) !== -1 || tags.toLowerCase().indexOf(searchText) !== -1) && !resultsBox.querySelector(`a[href="${item.getAttribute('href')}"]`)) { - var result = document.createElement('a'); - result.href = itemHref; - result.classList.add('dropdown-item'); - - var resultIcon = document.createElement('img'); - resultIcon.src = iconElement.src; - resultIcon.alt = 'icon'; - resultIcon.classList.add('icon'); - result.appendChild(resultIcon); - - var resultText = document.createElement('span'); - resultText.textContent = title; - resultText.classList.add('icon-text'); - result.appendChild(resultText); - - resultsBox.appendChild(result); - } - } - }); - - // Set the width of the search results box to the maximum width - resultsBox.style.width = window.navItemMaxWidth + 'px'; -}); - - diff --git a/src/main/resources/static/js/settings.js b/src/main/resources/static/js/settings.js deleted file mode 100644 index 272b555b..00000000 --- a/src/main/resources/static/js/settings.js +++ /dev/null @@ -1,42 +0,0 @@ -// Get the download option from local storage, or set it to 'sameWindow' if it doesn't exist -var downloadOption = localStorage.getItem('downloadOption') - || 'sameWindow'; - -// Set the selected option in the dropdown -document.getElementById('downloadOption').value = downloadOption; - - -// Save the selected option to local storage when the dropdown value changes -document.getElementById('downloadOption').addEventListener( - 'change', - function() { - downloadOption = this.value; - localStorage.setItem('downloadOption', - downloadOption); - }); - - -// Get the zipThreshold value from local storage, or set it to 0 if it doesn't exist -var zipThreshold = parseInt(localStorage.getItem('zipThreshold'), 10) || 4; - -// Set the value of the slider and the display span -document.getElementById('zipThreshold').value = zipThreshold; -document.getElementById('zipThresholdValue').textContent = zipThreshold; - - - -// Save the selected value to local storage when the slider value changes -document.getElementById('zipThreshold').addEventListener('input', function() { - zipThreshold = this.value; - document.getElementById('zipThresholdValue').textContent = zipThreshold; - localStorage.setItem('zipThreshold', zipThreshold); -}); - - -var boredWaiting = localStorage.getItem('boredWaiting') || 'disabled'; -document.getElementById('boredWaiting').checked = boredWaiting === 'enabled'; - -document.getElementById('boredWaiting').addEventListener('change', function() { - boredWaiting = this.checked ? 'enabled' : 'disabled'; - localStorage.setItem('boredWaiting', boredWaiting); -}); \ No newline at end of file diff --git a/src/main/resources/static/js/tab-container.js b/src/main/resources/static/js/tab-container.js deleted file mode 100644 index 6ae7162c..00000000 --- a/src/main/resources/static/js/tab-container.js +++ /dev/null @@ -1,39 +0,0 @@ - -TabContainer = { - initTabGroups() { - const groups = document.querySelectorAll(".tab-group"); - const unloadedGroups = [...groups].filter(g => !g.initialised); - unloadedGroups.forEach(group => { - const containers = group.querySelectorAll(".tab-container"); - const tabTitles = [...containers].map(c => c.getAttribute("title")); - - const tabList = document.createElement("div"); - tabList.classList.add("tab-buttons"); - tabTitles.forEach(title => { - const tabButton = document.createElement("button"); - tabButton.innerHTML = title; - tabButton.onclick = e => { - this.setActiveTab(e.target); - } - tabList.appendChild(tabButton); - }); - group.prepend(tabList); - - this.setActiveTab(tabList.firstChild); - - group.initialised = true; - }); - }, - setActiveTab(tabButton) { - const group = tabButton.closest(".tab-group") - - group.querySelectorAll(".active").forEach(el => el.classList.remove("active")); - - tabButton.classList.add("active"); - group.querySelector(`[title="${tabButton.innerHTML}"]`).classList.add("active"); - }, -} - -document.addEventListener("DOMContentLoaded", () => { - TabContainer.initTabGroups(); -}) \ No newline at end of file diff --git a/src/main/resources/static/js/thirdParty/bootstrap.min.js b/src/main/resources/static/js/thirdParty/bootstrap.min.js deleted file mode 100644 index aed031fd..00000000 --- a/src/main/resources/static/js/thirdParty/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.0.2 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e(t.Popper)}(this,(function(t){"use strict";function e(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach((function(s){if("default"!==s){var i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:function(){return t[s]}})}})),e.default=t,Object.freeze(e)}var s=e(t);const i={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter(t=>t.matches(e)),parents(t,e){const s=[];let i=t.parentNode;for(;i&&i.nodeType===Node.ELEMENT_NODE&&3!==i.nodeType;)i.matches(e)&&s.push(i),i=i.parentNode;return s},prev(t,e){let s=t.previousElementSibling;for(;s;){if(s.matches(e))return[s];s=s.previousElementSibling}return[]},next(t,e){let s=t.nextElementSibling;for(;s;){if(s.matches(e))return[s];s=s.nextElementSibling}return[]}},n=t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t},o=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let s=t.getAttribute("href");if(!s||!s.includes("#")&&!s.startsWith("."))return null;s.includes("#")&&!s.startsWith("#")&&(s="#"+s.split("#")[1]),e=s&&"#"!==s?s.trim():null}return e},r=t=>{const e=o(t);return e&&document.querySelector(e)?e:null},a=t=>{const e=o(t);return e?document.querySelector(e):null},l=t=>{t.dispatchEvent(new Event("transitionend"))},c=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),h=t=>c(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?i.findOne(t):null,d=(t,e,s)=>{Object.keys(s).forEach(i=>{const n=s[i],o=e[i],r=o&&c(o)?"element":null==(a=o)?""+a:{}.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase();var a;if(!new RegExp(n).test(r))throw new TypeError(`${t.toUpperCase()}: Option "${i}" provided type "${r}" but expected type "${n}".`)})},u=t=>!(!c(t)||0===t.getClientRects().length)&&"visible"===getComputedStyle(t).getPropertyValue("visibility"),g=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),p=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?p(t.parentNode):null},f=()=>{},m=t=>t.offsetHeight,_=()=>{const{jQuery:t}=window;return t&&!document.body.hasAttribute("data-bs-no-jquery")?t:null},b=[],v=()=>"rtl"===document.documentElement.dir,y=t=>{var e;e=()=>{const e=_();if(e){const s=t.NAME,i=e.fn[s];e.fn[s]=t.jQueryInterface,e.fn[s].Constructor=t,e.fn[s].noConflict=()=>(e.fn[s]=i,t.jQueryInterface)}},"loading"===document.readyState?(b.length||document.addEventListener("DOMContentLoaded",()=>{b.forEach(t=>t())}),b.push(e)):e()},w=t=>{"function"==typeof t&&t()},E=(t,e,s=!0)=>{if(!s)return void w(t);const i=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:s}=window.getComputedStyle(t);const i=Number.parseFloat(e),n=Number.parseFloat(s);return i||n?(e=e.split(",")[0],s=s.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(s))):0})(e)+5;let n=!1;const o=({target:s})=>{s===e&&(n=!0,e.removeEventListener("transitionend",o),w(t))};e.addEventListener("transitionend",o),setTimeout(()=>{n||l(e)},i)},A=(t,e,s,i)=>{let n=t.indexOf(e);if(-1===n)return t[!s&&i?t.length-1:0];const o=t.length;return n+=s?1:-1,i&&(n=(n+o)%o),t[Math.max(0,Math.min(n,o-1))]},T=/[^.]*(?=\..*)\.|.*/,C=/\..*/,k=/::\d+$/,L={};let O=1;const D={mouseenter:"mouseover",mouseleave:"mouseout"},I=/^(mouseenter|mouseleave)/i,N=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function S(t,e){return e&&`${e}::${O++}`||t.uidEvent||O++}function x(t){const e=S(t);return t.uidEvent=e,L[e]=L[e]||{},L[e]}function M(t,e,s=null){const i=Object.keys(t);for(let n=0,o=i.length;nfunction(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};i?i=t(i):s=t(s)}const[o,r,a]=P(e,s,i),l=x(t),c=l[a]||(l[a]={}),h=M(c,r,o?s:null);if(h)return void(h.oneOff=h.oneOff&&n);const d=S(r,e.replace(T,"")),u=o?function(t,e,s){return function i(n){const o=t.querySelectorAll(e);for(let{target:r}=n;r&&r!==this;r=r.parentNode)for(let a=o.length;a--;)if(o[a]===r)return n.delegateTarget=r,i.oneOff&&B.off(t,n.type,e,s),s.apply(r,[n]);return null}}(t,s,i):function(t,e){return function s(i){return i.delegateTarget=t,s.oneOff&&B.off(t,i.type,e),e.apply(t,[i])}}(t,s);u.delegationSelector=o?s:null,u.originalHandler=r,u.oneOff=n,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function H(t,e,s,i,n){const o=M(e[s],i,n);o&&(t.removeEventListener(s,o,Boolean(n)),delete e[s][o.uidEvent])}function R(t){return t=t.replace(C,""),D[t]||t}const B={on(t,e,s,i){j(t,e,s,i,!1)},one(t,e,s,i){j(t,e,s,i,!0)},off(t,e,s,i){if("string"!=typeof e||!t)return;const[n,o,r]=P(e,s,i),a=r!==e,l=x(t),c=e.startsWith(".");if(void 0!==o){if(!l||!l[r])return;return void H(t,l,r,o,n?s:null)}c&&Object.keys(l).forEach(s=>{!function(t,e,s,i){const n=e[s]||{};Object.keys(n).forEach(o=>{if(o.includes(i)){const i=n[o];H(t,e,s,i.originalHandler,i.delegationSelector)}})}(t,l,s,e.slice(1))});const h=l[r]||{};Object.keys(h).forEach(s=>{const i=s.replace(k,"");if(!a||e.includes(i)){const e=h[s];H(t,l,r,e.originalHandler,e.delegationSelector)}})},trigger(t,e,s){if("string"!=typeof e||!t)return null;const i=_(),n=R(e),o=e!==n,r=N.has(n);let a,l=!0,c=!0,h=!1,d=null;return o&&i&&(a=i.Event(e,s),i(t).trigger(a),l=!a.isPropagationStopped(),c=!a.isImmediatePropagationStopped(),h=a.isDefaultPrevented()),r?(d=document.createEvent("HTMLEvents"),d.initEvent(n,l,!0)):d=new CustomEvent(e,{bubbles:l,cancelable:!0}),void 0!==s&&Object.keys(s).forEach(t=>{Object.defineProperty(d,t,{get:()=>s[t]})}),h&&d.preventDefault(),c&&t.dispatchEvent(d),d.defaultPrevented&&void 0!==a&&a.preventDefault(),d}},$=new Map;var W={set(t,e,s){$.has(t)||$.set(t,new Map);const i=$.get(t);i.has(e)||0===i.size?i.set(e,s):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`)},get:(t,e)=>$.has(t)&&$.get(t).get(e)||null,remove(t,e){if(!$.has(t))return;const s=$.get(t);s.delete(e),0===s.size&&$.delete(t)}};class q{constructor(t){(t=h(t))&&(this._element=t,W.set(this._element,this.constructor.DATA_KEY,this))}dispose(){W.remove(this._element,this.constructor.DATA_KEY),B.off(this._element,this.constructor.EVENT_KEY),Object.getOwnPropertyNames(this).forEach(t=>{this[t]=null})}_queueCallback(t,e,s=!0){E(t,e,s)}static getInstance(t){return W.get(t,this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.0.2"}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}static get DATA_KEY(){return"bs."+this.NAME}static get EVENT_KEY(){return"."+this.DATA_KEY}}class z extends q{static get NAME(){return"alert"}close(t){const e=t?this._getRootElement(t):this._element,s=this._triggerCloseEvent(e);null===s||s.defaultPrevented||this._removeElement(e)}_getRootElement(t){return a(t)||t.closest(".alert")}_triggerCloseEvent(t){return B.trigger(t,"close.bs.alert")}_removeElement(t){t.classList.remove("show");const e=t.classList.contains("fade");this._queueCallback(()=>this._destroyElement(t),t,e)}_destroyElement(t){t.remove(),B.trigger(t,"closed.bs.alert")}static jQueryInterface(t){return this.each((function(){const e=z.getOrCreateInstance(this);"close"===t&&e[t](this)}))}static handleDismiss(t){return function(e){e&&e.preventDefault(),t.close(this)}}}B.on(document,"click.bs.alert.data-api",'[data-bs-dismiss="alert"]',z.handleDismiss(new z)),y(z);class F extends q{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=F.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}function U(t){return"true"===t||"false"!==t&&(t===Number(t).toString()?Number(t):""===t||"null"===t?null:t)}function K(t){return t.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}B.on(document,"click.bs.button.data-api",'[data-bs-toggle="button"]',t=>{t.preventDefault();const e=t.target.closest('[data-bs-toggle="button"]');F.getOrCreateInstance(e).toggle()}),y(F);const V={setDataAttribute(t,e,s){t.setAttribute("data-bs-"+K(e),s)},removeDataAttribute(t,e){t.removeAttribute("data-bs-"+K(e))},getDataAttributes(t){if(!t)return{};const e={};return Object.keys(t.dataset).filter(t=>t.startsWith("bs")).forEach(s=>{let i=s.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=U(t.dataset[s])}),e},getDataAttribute:(t,e)=>U(t.getAttribute("data-bs-"+K(e))),offset(t){const e=t.getBoundingClientRect();return{top:e.top+document.body.scrollTop,left:e.left+document.body.scrollLeft}},position:t=>({top:t.offsetTop,left:t.offsetLeft})},Q={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0,touch:!0},X={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean",touch:"boolean"},Y="next",G="prev",Z="left",J="right",tt={ArrowLeft:J,ArrowRight:Z};class et extends q{constructor(t,e){super(t),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this.touchStartX=0,this.touchDeltaX=0,this._config=this._getConfig(e),this._indicatorsElement=i.findOne(".carousel-indicators",this._element),this._touchSupported="ontouchstart"in document.documentElement||navigator.maxTouchPoints>0,this._pointerEvent=Boolean(window.PointerEvent),this._addEventListeners()}static get Default(){return Q}static get NAME(){return"carousel"}next(){this._slide(Y)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(G)}pause(t){t||(this._isPaused=!0),i.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(l(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null}cycle(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))}to(t){this._activeElement=i.findOne(".active.carousel-item",this._element);const e=this._getItemIndex(this._activeElement);if(t>this._items.length-1||t<0)return;if(this._isSliding)return void B.one(this._element,"slid.bs.carousel",()=>this.to(t));if(e===t)return this.pause(),void this.cycle();const s=t>e?Y:G;this._slide(s,this._items[t])}_getConfig(t){return t={...Q,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("carousel",t,X),t}_handleSwipe(){const t=Math.abs(this.touchDeltaX);if(t<=40)return;const e=t/this.touchDeltaX;this.touchDeltaX=0,e&&this._slide(e>0?J:Z)}_addEventListeners(){this._config.keyboard&&B.on(this._element,"keydown.bs.carousel",t=>this._keydown(t)),"hover"===this._config.pause&&(B.on(this._element,"mouseenter.bs.carousel",t=>this.pause(t)),B.on(this._element,"mouseleave.bs.carousel",t=>this.cycle(t))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()}_addTouchEventListeners(){const t=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType?this._pointerEvent||(this.touchStartX=t.touches[0].clientX):this.touchStartX=t.clientX},e=t=>{this.touchDeltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this.touchStartX},s=t=>{!this._pointerEvent||"pen"!==t.pointerType&&"touch"!==t.pointerType||(this.touchDeltaX=t.clientX-this.touchStartX),this._handleSwipe(),"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(t=>this.cycle(t),500+this._config.interval))};i.find(".carousel-item img",this._element).forEach(t=>{B.on(t,"dragstart.bs.carousel",t=>t.preventDefault())}),this._pointerEvent?(B.on(this._element,"pointerdown.bs.carousel",e=>t(e)),B.on(this._element,"pointerup.bs.carousel",t=>s(t)),this._element.classList.add("pointer-event")):(B.on(this._element,"touchstart.bs.carousel",e=>t(e)),B.on(this._element,"touchmove.bs.carousel",t=>e(t)),B.on(this._element,"touchend.bs.carousel",t=>s(t)))}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=tt[t.key];e&&(t.preventDefault(),this._slide(e))}_getItemIndex(t){return this._items=t&&t.parentNode?i.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)}_getItemByOrder(t,e){const s=t===Y;return A(this._items,e,s,this._config.wrap)}_triggerSlideEvent(t,e){const s=this._getItemIndex(t),n=this._getItemIndex(i.findOne(".active.carousel-item",this._element));return B.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:n,to:s})}_setActiveIndicatorElement(t){if(this._indicatorsElement){const e=i.findOne(".active",this._indicatorsElement);e.classList.remove("active"),e.removeAttribute("aria-current");const s=i.find("[data-bs-target]",this._indicatorsElement);for(let e=0;e{B.trigger(this._element,"slid.bs.carousel",{relatedTarget:r,direction:u,from:o,to:a})};if(this._element.classList.contains("slide")){r.classList.add(d),m(r),n.classList.add(h),r.classList.add(h);const t=()=>{r.classList.remove(h,d),r.classList.add("active"),n.classList.remove("active",d,h),this._isSliding=!1,setTimeout(g,0)};this._queueCallback(t,n,!0)}else n.classList.remove("active"),r.classList.add("active"),this._isSliding=!1,g();l&&this.cycle()}_directionToOrder(t){return[J,Z].includes(t)?v()?t===Z?G:Y:t===Z?Y:G:t}_orderToDirection(t){return[Y,G].includes(t)?v()?t===G?Z:J:t===G?J:Z:t}static carouselInterface(t,e){const s=et.getOrCreateInstance(t,e);let{_config:i}=s;"object"==typeof e&&(i={...i,...e});const n="string"==typeof e?e:i.slide;if("number"==typeof e)s.to(e);else if("string"==typeof n){if(void 0===s[n])throw new TypeError(`No method named "${n}"`);s[n]()}else i.interval&&i.ride&&(s.pause(),s.cycle())}static jQueryInterface(t){return this.each((function(){et.carouselInterface(this,t)}))}static dataApiClickHandler(t){const e=a(this);if(!e||!e.classList.contains("carousel"))return;const s={...V.getDataAttributes(e),...V.getDataAttributes(this)},i=this.getAttribute("data-bs-slide-to");i&&(s.interval=!1),et.carouselInterface(e,s),i&&et.getInstance(e).to(i),t.preventDefault()}}B.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",et.dataApiClickHandler),B.on(window,"load.bs.carousel.data-api",()=>{const t=i.find('[data-bs-ride="carousel"]');for(let e=0,s=t.length;et===this._element);null!==n&&o.length&&(this._selector=n,this._triggerArray.push(e))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}static get Default(){return st}static get NAME(){return"collapse"}toggle(){this._element.classList.contains("show")?this.hide():this.show()}show(){if(this._isTransitioning||this._element.classList.contains("show"))return;let t,e;this._parent&&(t=i.find(".show, .collapsing",this._parent).filter(t=>"string"==typeof this._config.parent?t.getAttribute("data-bs-parent")===this._config.parent:t.classList.contains("collapse")),0===t.length&&(t=null));const s=i.findOne(this._selector);if(t){const i=t.find(t=>s!==t);if(e=i?nt.getInstance(i):null,e&&e._isTransitioning)return}if(B.trigger(this._element,"show.bs.collapse").defaultPrevented)return;t&&t.forEach(t=>{s!==t&&nt.collapseInterface(t,"hide"),e||W.set(t,"bs.collapse",null)});const n=this._getDimension();this._element.classList.remove("collapse"),this._element.classList.add("collapsing"),this._element.style[n]=0,this._triggerArray.length&&this._triggerArray.forEach(t=>{t.classList.remove("collapsed"),t.setAttribute("aria-expanded",!0)}),this.setTransitioning(!0);const o="scroll"+(n[0].toUpperCase()+n.slice(1));this._queueCallback(()=>{this._element.classList.remove("collapsing"),this._element.classList.add("collapse","show"),this._element.style[n]="",this.setTransitioning(!1),B.trigger(this._element,"shown.bs.collapse")},this._element,!0),this._element.style[n]=this._element[o]+"px"}hide(){if(this._isTransitioning||!this._element.classList.contains("show"))return;if(B.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=this._element.getBoundingClientRect()[t]+"px",m(this._element),this._element.classList.add("collapsing"),this._element.classList.remove("collapse","show");const e=this._triggerArray.length;if(e>0)for(let t=0;t{this.setTransitioning(!1),this._element.classList.remove("collapsing"),this._element.classList.add("collapse"),B.trigger(this._element,"hidden.bs.collapse")},this._element,!0)}setTransitioning(t){this._isTransitioning=t}_getConfig(t){return(t={...st,...t}).toggle=Boolean(t.toggle),d("collapse",t,it),t}_getDimension(){return this._element.classList.contains("width")?"width":"height"}_getParent(){let{parent:t}=this._config;t=h(t);const e=`[data-bs-toggle="collapse"][data-bs-parent="${t}"]`;return i.find(e,t).forEach(t=>{const e=a(t);this._addAriaAndCollapsedClass(e,[t])}),t}_addAriaAndCollapsedClass(t,e){if(!t||!e.length)return;const s=t.classList.contains("show");e.forEach(t=>{s?t.classList.remove("collapsed"):t.classList.add("collapsed"),t.setAttribute("aria-expanded",s)})}static collapseInterface(t,e){let s=nt.getInstance(t);const i={...st,...V.getDataAttributes(t),..."object"==typeof e&&e?e:{}};if(!s&&i.toggle&&"string"==typeof e&&/show|hide/.test(e)&&(i.toggle=!1),s||(s=new nt(t,i)),"string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){nt.collapseInterface(this,t)}))}}B.on(document,"click.bs.collapse.data-api",'[data-bs-toggle="collapse"]',(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=V.getDataAttributes(this),s=r(this);i.find(s).forEach(t=>{const s=nt.getInstance(t);let i;s?(null===s._parent&&"string"==typeof e.parent&&(s._config.parent=e.parent,s._parent=s._getParent()),i="toggle"):i=e,nt.collapseInterface(t,i)})})),y(nt);const ot=new RegExp("ArrowUp|ArrowDown|Escape"),rt=v()?"top-end":"top-start",at=v()?"top-start":"top-end",lt=v()?"bottom-end":"bottom-start",ct=v()?"bottom-start":"bottom-end",ht=v()?"left-start":"right-start",dt=v()?"right-start":"left-start",ut={offset:[0,2],boundary:"clippingParents",reference:"toggle",display:"dynamic",popperConfig:null,autoClose:!0},gt={offset:"(array|string|function)",boundary:"(string|element)",reference:"(string|element|object)",display:"string",popperConfig:"(null|object|function)",autoClose:"(boolean|string)"};class pt extends q{constructor(t,e){super(t),this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}static get Default(){return ut}static get DefaultType(){return gt}static get NAME(){return"dropdown"}toggle(){g(this._element)||(this._element.classList.contains("show")?this.hide():this.show())}show(){if(g(this._element)||this._menu.classList.contains("show"))return;const t=pt.getParentFromElement(this._element),e={relatedTarget:this._element};if(!B.trigger(this._element,"show.bs.dropdown",e).defaultPrevented){if(this._inNavbar)V.setDataAttribute(this._menu,"popper","none");else{if(void 0===s)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let e=this._element;"parent"===this._config.reference?e=t:c(this._config.reference)?e=h(this._config.reference):"object"==typeof this._config.reference&&(e=this._config.reference);const i=this._getPopperConfig(),n=i.modifiers.find(t=>"applyStyles"===t.name&&!1===t.enabled);this._popper=s.createPopper(e,this._menu,i),n&&V.setDataAttribute(this._menu,"popper","static")}"ontouchstart"in document.documentElement&&!t.closest(".navbar-nav")&&[].concat(...document.body.children).forEach(t=>B.on(t,"mouseover",f)),this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.toggle("show"),this._element.classList.toggle("show"),B.trigger(this._element,"shown.bs.dropdown",e)}}hide(){if(g(this._element)||!this._menu.classList.contains("show"))return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_addEventListeners(){B.on(this._element,"click.bs.dropdown",t=>{t.preventDefault(),this.toggle()})}_completeHide(t){B.trigger(this._element,"hide.bs.dropdown",t).defaultPrevented||("ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._popper&&this._popper.destroy(),this._menu.classList.remove("show"),this._element.classList.remove("show"),this._element.setAttribute("aria-expanded","false"),V.removeDataAttribute(this._menu,"popper"),B.trigger(this._element,"hidden.bs.dropdown",t))}_getConfig(t){if(t={...this.constructor.Default,...V.getDataAttributes(this._element),...t},d("dropdown",t,this.constructor.DefaultType),"object"==typeof t.reference&&!c(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError("dropdown".toUpperCase()+': Option "reference" provided type "object" without a required "getBoundingClientRect" method.');return t}_getMenuElement(){return i.next(this._element,".dropdown-menu")[0]}_getPlacement(){const t=this._element.parentNode;if(t.classList.contains("dropend"))return ht;if(t.classList.contains("dropstart"))return dt;const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?at:rt:e?ct:lt}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return"static"===this._config.display&&(t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const s=i.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter(u);s.length&&A(s,e,"ArrowDown"===t,!s.includes(e)).focus()}static dropdownInterface(t,e){const s=pt.getOrCreateInstance(t,e);if("string"==typeof e){if(void 0===s[e])throw new TypeError(`No method named "${e}"`);s[e]()}}static jQueryInterface(t){return this.each((function(){pt.dropdownInterface(this,t)}))}static clearMenus(t){if(t&&(2===t.button||"keyup"===t.type&&"Tab"!==t.key))return;const e=i.find('[data-bs-toggle="dropdown"]');for(let s=0,i=e.length;sthis.matches('[data-bs-toggle="dropdown"]')?this:i.prev(this,'[data-bs-toggle="dropdown"]')[0];return"Escape"===t.key?(s().focus(),void pt.clearMenus()):"ArrowUp"===t.key||"ArrowDown"===t.key?(e||s().click(),void pt.getInstance(s())._selectMenuItem(t)):void(e&&"Space"!==t.key||pt.clearMenus())}}B.on(document,"keydown.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',pt.dataApiKeydownHandler),B.on(document,"keydown.bs.dropdown.data-api",".dropdown-menu",pt.dataApiKeydownHandler),B.on(document,"click.bs.dropdown.data-api",pt.clearMenus),B.on(document,"keyup.bs.dropdown.data-api",pt.clearMenus),B.on(document,"click.bs.dropdown.data-api",'[data-bs-toggle="dropdown"]',(function(t){t.preventDefault(),pt.dropdownInterface(this)})),y(pt);class ft{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,"paddingRight",e=>e+t),this._setElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight",e=>e+t),this._setElementAttributes(".sticky-top","marginRight",e=>e-t)}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,s){const i=this.getWidth();this._applyManipulationCallback(t,t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+i)return;this._saveInitialAttribute(t,e);const n=window.getComputedStyle(t)[e];t.style[e]=s(Number.parseFloat(n))+"px"})}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,"paddingRight"),this._resetElementAttributes(".fixed-top, .fixed-bottom, .is-fixed, .sticky-top","paddingRight"),this._resetElementAttributes(".sticky-top","marginRight")}_saveInitialAttribute(t,e){const s=t.style[e];s&&V.setDataAttribute(t,e,s)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,t=>{const s=V.getDataAttribute(t,e);void 0===s?t.style.removeProperty(e):(V.removeDataAttribute(t,e),t.style[e]=s)})}_applyManipulationCallback(t,e){c(t)?e(t):i.find(t,this._element).forEach(e)}isOverflowing(){return this.getWidth()>0}}const mt={isVisible:!0,isAnimated:!1,rootElement:"body",clickCallback:null},_t={isVisible:"boolean",isAnimated:"boolean",rootElement:"(element|string)",clickCallback:"(function|null)"};class bt{constructor(t){this._config=this._getConfig(t),this._isAppended=!1,this._element=null}show(t){this._config.isVisible?(this._append(),this._config.isAnimated&&m(this._getElement()),this._getElement().classList.add("show"),this._emulateAnimation(()=>{w(t)})):w(t)}hide(t){this._config.isVisible?(this._getElement().classList.remove("show"),this._emulateAnimation(()=>{this.dispose(),w(t)})):w(t)}_getElement(){if(!this._element){const t=document.createElement("div");t.className="modal-backdrop",this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_getConfig(t){return(t={...mt,..."object"==typeof t?t:{}}).rootElement=h(t.rootElement),d("backdrop",t,_t),t}_append(){this._isAppended||(this._config.rootElement.appendChild(this._getElement()),B.on(this._getElement(),"mousedown.bs.backdrop",()=>{w(this._config.clickCallback)}),this._isAppended=!0)}dispose(){this._isAppended&&(B.off(this._element,"mousedown.bs.backdrop"),this._element.remove(),this._isAppended=!1)}_emulateAnimation(t){E(t,this._getElement(),this._config.isAnimated)}}const vt={backdrop:!0,keyboard:!0,focus:!0},yt={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean"};class wt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._dialog=i.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._isShown=!1,this._ignoreBackdropClick=!1,this._isTransitioning=!1,this._scrollBar=new ft}static get Default(){return vt}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||B.trigger(this._element,"show.bs.modal",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isAnimated()&&(this._isTransitioning=!0),this._scrollBar.hide(),document.body.classList.add("modal-open"),this._adjustDialog(),this._setEscapeEvent(),this._setResizeEvent(),B.on(this._element,"click.dismiss.bs.modal",'[data-bs-dismiss="modal"]',t=>this.hide(t)),B.on(this._dialog,"mousedown.dismiss.bs.modal",()=>{B.one(this._element,"mouseup.dismiss.bs.modal",t=>{t.target===this._element&&(this._ignoreBackdropClick=!0)})}),this._showBackdrop(()=>this._showElement(t)))}hide(t){if(t&&["A","AREA"].includes(t.target.tagName)&&t.preventDefault(),!this._isShown||this._isTransitioning)return;if(B.trigger(this._element,"hide.bs.modal").defaultPrevented)return;this._isShown=!1;const e=this._isAnimated();e&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),B.off(document,"focusin.bs.modal"),this._element.classList.remove("show"),B.off(this._element,"click.dismiss.bs.modal"),B.off(this._dialog,"mousedown.dismiss.bs.modal"),this._queueCallback(()=>this._hideModal(),this._element,e)}dispose(){[window,this._dialog].forEach(t=>B.off(t,".bs.modal")),this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.modal")}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new bt({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_getConfig(t){return t={...vt,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("modal",t,yt),t}_showElement(t){const e=this._isAnimated(),s=i.findOne(".modal-body",this._dialog);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0,s&&(s.scrollTop=0),e&&m(this._element),this._element.classList.add("show"),this._config.focus&&this._enforceFocus(),this._queueCallback(()=>{this._config.focus&&this._element.focus(),this._isTransitioning=!1,B.trigger(this._element,"shown.bs.modal",{relatedTarget:t})},this._dialog,e)}_enforceFocus(){B.off(document,"focusin.bs.modal"),B.on(document,"focusin.bs.modal",t=>{document===t.target||this._element===t.target||this._element.contains(t.target)||this._element.focus()})}_setEscapeEvent(){this._isShown?B.on(this._element,"keydown.dismiss.bs.modal",t=>{this._config.keyboard&&"Escape"===t.key?(t.preventDefault(),this.hide()):this._config.keyboard||"Escape"!==t.key||this._triggerBackdropTransition()}):B.off(this._element,"keydown.dismiss.bs.modal")}_setResizeEvent(){this._isShown?B.on(window,"resize.bs.modal",()=>this._adjustDialog()):B.off(window,"resize.bs.modal")}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove("modal-open"),this._resetAdjustments(),this._scrollBar.reset(),B.trigger(this._element,"hidden.bs.modal")})}_showBackdrop(t){B.on(this._element,"click.dismiss.bs.modal",t=>{this._ignoreBackdropClick?this._ignoreBackdropClick=!1:t.target===t.currentTarget&&(!0===this._config.backdrop?this.hide():"static"===this._config.backdrop&&this._triggerBackdropTransition())}),this._backdrop.show(t)}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(B.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const{classList:t,scrollHeight:e,style:s}=this._element,i=e>document.documentElement.clientHeight;!i&&"hidden"===s.overflowY||t.contains("modal-static")||(i||(s.overflowY="hidden"),t.add("modal-static"),this._queueCallback(()=>{t.remove("modal-static"),i||this._queueCallback(()=>{s.overflowY=""},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),s=e>0;(!s&&t&&!v()||s&&!t&&v())&&(this._element.style.paddingLeft=e+"px"),(s&&!t&&!v()||!s&&t&&v())&&(this._element.style.paddingRight=e+"px")}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const s=wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===s[t])throw new TypeError(`No method named "${t}"`);s[t](e)}}))}}B.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=a(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),B.one(e,"show.bs.modal",t=>{t.defaultPrevented||B.one(e,"hidden.bs.modal",()=>{u(this)&&this.focus()})}),wt.getOrCreateInstance(e).toggle(this)})),y(wt);const Et={backdrop:!0,keyboard:!0,scroll:!1},At={backdrop:"boolean",keyboard:"boolean",scroll:"boolean"};class Tt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._addEventListeners()}static get NAME(){return"offcanvas"}static get Default(){return Et}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||B.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._element.style.visibility="visible",this._backdrop.show(),this._config.scroll||((new ft).hide(),this._enforceFocusOnElement(this._element)),this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add("show"),this._queueCallback(()=>{B.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})},this._element,!0))}hide(){this._isShown&&(B.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(B.off(document,"focusin.bs.offcanvas"),this._element.blur(),this._isShown=!1,this._element.classList.remove("show"),this._backdrop.hide(),this._queueCallback(()=>{this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._element.style.visibility="hidden",this._config.scroll||(new ft).reset(),B.trigger(this._element,"hidden.bs.offcanvas")},this._element,!0)))}dispose(){this._backdrop.dispose(),super.dispose(),B.off(document,"focusin.bs.offcanvas")}_getConfig(t){return t={...Et,...V.getDataAttributes(this._element),..."object"==typeof t?t:{}},d("offcanvas",t,At),t}_initializeBackDrop(){return new bt({isVisible:this._config.backdrop,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:()=>this.hide()})}_enforceFocusOnElement(t){B.off(document,"focusin.bs.offcanvas"),B.on(document,"focusin.bs.offcanvas",e=>{document===e.target||t===e.target||t.contains(e.target)||t.focus()}),t.focus()}_addEventListeners(){B.on(this._element,"click.dismiss.bs.offcanvas",'[data-bs-dismiss="offcanvas"]',()=>this.hide()),B.on(this._element,"keydown.dismiss.bs.offcanvas",t=>{this._config.keyboard&&"Escape"===t.key&&this.hide()})}static jQueryInterface(t){return this.each((function(){const e=Tt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}B.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=a(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this))return;B.one(e,"hidden.bs.offcanvas",()=>{u(this)&&this.focus()});const s=i.findOne(".offcanvas.show");s&&s!==e&&Tt.getInstance(s).hide(),Tt.getOrCreateInstance(e).toggle(this)})),B.on(window,"load.bs.offcanvas.data-api",()=>i.find(".offcanvas.show").forEach(t=>Tt.getOrCreateInstance(t).show())),y(Tt);const Ct=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),kt=/^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i,Lt=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Ot=(t,e)=>{const s=t.nodeName.toLowerCase();if(e.includes(s))return!Ct.has(s)||Boolean(kt.test(t.nodeValue)||Lt.test(t.nodeValue));const i=e.filter(t=>t instanceof RegExp);for(let t=0,e=i.length;t{Ot(t,a)||s.removeAttribute(t.nodeName)})}return i.body.innerHTML}const It=new RegExp("(^|\\s)bs-tooltip\\S+","g"),Nt=new Set(["sanitize","allowList","sanitizeFn"]),St={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(array|string|function)",container:"(string|element|boolean)",fallbackPlacements:"array",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",allowList:"object",popperConfig:"(null|object|function)"},xt={AUTO:"auto",TOP:"top",RIGHT:v()?"left":"right",BOTTOM:"bottom",LEFT:v()?"right":"left"},Mt={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:[0,0],container:!1,fallbackPlacements:["top","right","bottom","left"],boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:{"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},popperConfig:null},Pt={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"};class jt extends q{constructor(t,e){if(void 0===s)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this._config=this._getConfig(e),this.tip=null,this._setListeners()}static get Default(){return Mt}static get NAME(){return"tooltip"}static get Event(){return Pt}static get DefaultType(){return St}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(t){if(this._isEnabled)if(t){const e=this._initializeOnDelegatedTarget(t);e._activeTrigger.click=!e._activeTrigger.click,e._isWithActiveTrigger()?e._enter(null,e):e._leave(null,e)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}}dispose(){clearTimeout(this._timeout),B.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.remove(),this._popper&&this._popper.destroy(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this.isWithContent()||!this._isEnabled)return;const t=B.trigger(this._element,this.constructor.Event.SHOW),e=p(this._element),i=null===e?this._element.ownerDocument.documentElement.contains(this._element):e.contains(this._element);if(t.defaultPrevented||!i)return;const o=this.getTipElement(),r=n(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this._config.animation&&o.classList.add("fade");const a="function"==typeof this._config.placement?this._config.placement.call(this,o,this._element):this._config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);const{container:c}=this._config;W.set(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||(c.appendChild(o),B.trigger(this._element,this.constructor.Event.INSERTED)),this._popper?this._popper.update():this._popper=s.createPopper(this._element,o,this._getPopperConfig(l)),o.classList.add("show");const h="function"==typeof this._config.customClass?this._config.customClass():this._config.customClass;h&&o.classList.add(...h.split(" ")),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>{B.on(t,"mouseover",f)});const d=this.tip.classList.contains("fade");this._queueCallback(()=>{const t=this._hoverState;this._hoverState=null,B.trigger(this._element,this.constructor.Event.SHOWN),"out"===t&&this._leave(null,this)},this.tip,d)}hide(){if(!this._popper)return;const t=this.getTipElement();if(B.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented)return;t.classList.remove("show"),"ontouchstart"in document.documentElement&&[].concat(...document.body.children).forEach(t=>B.off(t,"mouseover",f)),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1;const e=this.tip.classList.contains("fade");this._queueCallback(()=>{this._isWithActiveTrigger()||("show"!==this._hoverState&&t.remove(),this._cleanTipClass(),this._element.removeAttribute("aria-describedby"),B.trigger(this._element,this.constructor.Event.HIDDEN),this._popper&&(this._popper.destroy(),this._popper=null))},this.tip,e),this._hoverState=""}update(){null!==this._popper&&this._popper.update()}isWithContent(){return Boolean(this.getTitle())}getTipElement(){if(this.tip)return this.tip;const t=document.createElement("div");return t.innerHTML=this._config.template,this.tip=t.children[0],this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")}setElementContent(t,e){if(null!==t)return c(e)?(e=h(e),void(this._config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this._config.html?(this._config.sanitize&&(e=Dt(e,this._config.allowList,this._config.sanitizeFn)),t.innerHTML=e):t.textContent=e)}getTitle(){let t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this._config.title?this._config.title.call(this._element):this._config.title),t}updateAttachment(t){return"right"===t?"end":"left"===t?"start":t}_initializeOnDelegatedTarget(t,e){const s=this.constructor.DATA_KEY;return(e=e||W.get(t.delegateTarget,s))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),W.set(t.delegateTarget,s,e)),e}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map(t=>Number.parseInt(t,10)):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:t=>this._handlePopperPlacementChange(t)}],onFirstUpdate:t=>{t.options.placement!==t.placement&&this._handlePopperPlacementChange(t)}};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_addAttachmentClass(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))}_getAttachment(t){return xt[t.toUpperCase()]}_setListeners(){this._config.trigger.split(" ").forEach(t=>{if("click"===t)B.on(this._element,this.constructor.Event.CLICK,this._config.selector,t=>this.toggle(t));else if("manual"!==t){const e="hover"===t?this.constructor.Event.MOUSEENTER:this.constructor.Event.FOCUSIN,s="hover"===t?this.constructor.Event.MOUSELEAVE:this.constructor.Event.FOCUSOUT;B.on(this._element,e,this._config.selector,t=>this._enter(t)),B.on(this._element,s,this._config.selector,t=>this._leave(t))}}),this._hideModalHandler=()=>{this._element&&this.hide()},B.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this._config.selector?this._config={...this._config,trigger:"manual",selector:""}:this._fixTitle()}_fixTitle(){const t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))}_enter(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e._config.delay&&e._config.delay.show?e._timeout=setTimeout(()=>{"show"===e._hoverState&&e.show()},e._config.delay.show):e.show())}_leave(t,e){e=this._initializeOnDelegatedTarget(t,e),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=e._element.contains(t.relatedTarget)),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e._config.delay&&e._config.delay.hide?e._timeout=setTimeout(()=>{"out"===e._hoverState&&e.hide()},e._config.delay.hide):e.hide())}_isWithActiveTrigger(){for(const t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1}_getConfig(t){const e=V.getDataAttributes(this._element);return Object.keys(e).forEach(t=>{Nt.has(t)&&delete e[t]}),(t={...this.constructor.Default,...e,..."object"==typeof t&&t?t:{}}).container=!1===t.container?document.body:h(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),d("tooltip",t,this.constructor.DefaultType),t.sanitize&&(t.template=Dt(t.template,t.allowList,t.sanitizeFn)),t}_getDelegateConfig(){const t={};if(this._config)for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(It);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}_handlePopperPlacementChange(t){const{state:e}=t;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))}static jQueryInterface(t){return this.each((function(){const e=jt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(jt);const Ht=new RegExp("(^|\\s)bs-popover\\S+","g"),Rt={...jt.Default,placement:"right",offset:[0,8],trigger:"click",content:"",template:''},Bt={...jt.DefaultType,content:"(string|element|function)"},$t={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"};class Wt extends jt{static get Default(){return Rt}static get NAME(){return"popover"}static get Event(){return $t}static get DefaultType(){return Bt}isWithContent(){return this.getTitle()||this._getContent()}getTipElement(){return this.tip||(this.tip=super.getTipElement(),this.getTitle()||i.findOne(".popover-header",this.tip).remove(),this._getContent()||i.findOne(".popover-body",this.tip).remove()),this.tip}setContent(){const t=this.getTipElement();this.setElementContent(i.findOne(".popover-header",t),this.getTitle());let e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(i.findOne(".popover-body",t),e),t.classList.remove("fade","show")}_addAttachmentClass(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))}_getContent(){return this._element.getAttribute("data-bs-content")||this._config.content}_cleanTipClass(){const t=this.getTipElement(),e=t.getAttribute("class").match(Ht);null!==e&&e.length>0&&e.map(t=>t.trim()).forEach(e=>t.classList.remove(e))}static jQueryInterface(t){return this.each((function(){const e=Wt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}y(Wt);const qt={offset:10,method:"auto",target:""},zt={offset:"number",method:"string",target:"(string|element)"};class Ft extends q{constructor(t,e){super(t),this._scrollElement="BODY"===this._element.tagName?window:this._element,this._config=this._getConfig(e),this._selector=`${this._config.target} .nav-link, ${this._config.target} .list-group-item, ${this._config.target} .dropdown-item`,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,B.on(this._scrollElement,"scroll.bs.scrollspy",()=>this._process()),this.refresh(),this._process()}static get Default(){return qt}static get NAME(){return"scrollspy"}refresh(){const t=this._scrollElement===this._scrollElement.window?"offset":"position",e="auto"===this._config.method?t:this._config.method,s="position"===e?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),i.find(this._selector).map(t=>{const n=r(t),o=n?i.findOne(n):null;if(o){const t=o.getBoundingClientRect();if(t.width||t.height)return[V[e](o).top+s,n]}return null}).filter(t=>t).sort((t,e)=>t[0]-e[0]).forEach(t=>{this._offsets.push(t[0]),this._targets.push(t[1])})}dispose(){B.off(this._scrollElement,".bs.scrollspy"),super.dispose()}_getConfig(t){if("string"!=typeof(t={...qt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}}).target&&c(t.target)){let{id:e}=t.target;e||(e=n("scrollspy"),t.target.id=e),t.target="#"+e}return d("scrollspy",t,zt),t}_getScrollTop(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop}_getScrollHeight(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)}_getOffsetHeight(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height}_process(){const t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),s=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=s){const t=this._targets[this._targets.length-1];this._activeTarget!==t&&this._activate(t)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(let e=this._offsets.length;e--;)this._activeTarget!==this._targets[e]&&t>=this._offsets[e]&&(void 0===this._offsets[e+1]||t`${e}[data-bs-target="${t}"],${e}[href="${t}"]`),s=i.findOne(e.join(","));s.classList.contains("dropdown-item")?(i.findOne(".dropdown-toggle",s.closest(".dropdown")).classList.add("active"),s.classList.add("active")):(s.classList.add("active"),i.parents(s,".nav, .list-group").forEach(t=>{i.prev(t,".nav-link, .list-group-item").forEach(t=>t.classList.add("active")),i.prev(t,".nav-item").forEach(t=>{i.children(t,".nav-link").forEach(t=>t.classList.add("active"))})})),B.trigger(this._scrollElement,"activate.bs.scrollspy",{relatedTarget:t})}_clear(){i.find(this._selector).filter(t=>t.classList.contains("active")).forEach(t=>t.classList.remove("active"))}static jQueryInterface(t){return this.each((function(){const e=Ft.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(window,"load.bs.scrollspy.data-api",()=>{i.find('[data-bs-spy="scroll"]').forEach(t=>new Ft(t))}),y(Ft);class Ut extends q{static get NAME(){return"tab"}show(){if(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&this._element.classList.contains("active"))return;let t;const e=a(this._element),s=this._element.closest(".nav, .list-group");if(s){const e="UL"===s.nodeName||"OL"===s.nodeName?":scope > li > .active":".active";t=i.find(e,s),t=t[t.length-1]}const n=t?B.trigger(t,"hide.bs.tab",{relatedTarget:this._element}):null;if(B.trigger(this._element,"show.bs.tab",{relatedTarget:t}).defaultPrevented||null!==n&&n.defaultPrevented)return;this._activate(this._element,s);const o=()=>{B.trigger(t,"hidden.bs.tab",{relatedTarget:this._element}),B.trigger(this._element,"shown.bs.tab",{relatedTarget:t})};e?this._activate(e,e.parentNode,o):o()}_activate(t,e,s){const n=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?i.children(e,".active"):i.find(":scope > li > .active",e))[0],o=s&&n&&n.classList.contains("fade"),r=()=>this._transitionComplete(t,n,s);n&&o?(n.classList.remove("show"),this._queueCallback(r,t,!0)):r()}_transitionComplete(t,e,s){if(e){e.classList.remove("active");const t=i.findOne(":scope > .dropdown-menu .active",e.parentNode);t&&t.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),m(t),t.classList.contains("fade")&&t.classList.add("show");let n=t.parentNode;if(n&&"LI"===n.nodeName&&(n=n.parentNode),n&&n.classList.contains("dropdown-menu")){const e=t.closest(".dropdown");e&&i.find(".dropdown-toggle",e).forEach(t=>t.classList.add("active")),t.setAttribute("aria-expanded",!0)}s&&s()}static jQueryInterface(t){return this.each((function(){const e=Ut.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}B.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),g(this)||Ut.getOrCreateInstance(this).show()})),y(Ut);const Kt={animation:"boolean",autohide:"boolean",delay:"number"},Vt={animation:!0,autohide:!0,delay:5e3};class Qt extends q{constructor(t,e){super(t),this._config=this._getConfig(e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get DefaultType(){return Kt}static get Default(){return Vt}static get NAME(){return"toast"}show(){B.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove("hide"),m(this._element),this._element.classList.add("showing"),this._queueCallback(()=>{this._element.classList.remove("showing"),this._element.classList.add("show"),B.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){this._element.classList.contains("show")&&(B.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.remove("show"),this._queueCallback(()=>{this._element.classList.add("hide"),B.trigger(this._element,"hidden.bs.toast")},this._element,this._config.animation)))}dispose(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),super.dispose()}_getConfig(t){return t={...Vt,...V.getDataAttributes(this._element),..."object"==typeof t&&t?t:{}},d("toast",t,this.constructor.DefaultType),t}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const s=t.relatedTarget;this._element===s||this._element.contains(s)||this._maybeScheduleHide()}_setListeners(){B.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',()=>this.hide()),B.on(this._element,"mouseover.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"mouseout.bs.toast",t=>this._onInteraction(t,!1)),B.on(this._element,"focusin.bs.toast",t=>this._onInteraction(t,!0)),B.on(this._element,"focusout.bs.toast",t=>this._onInteraction(t,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Qt.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return y(Qt),{Alert:z,Button:F,Carousel:et,Collapse:nt,Dropdown:pt,Modal:wt,Offcanvas:Tt,Popover:Wt,ScrollSpy:Ft,Tab:Ut,Toast:Qt,Tooltip:jt}})); -//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/js/thirdParty/interact.min.js b/src/main/resources/static/js/thirdParty/interact.min.js deleted file mode 100644 index 442e0e7e..00000000 --- a/src/main/resources/static/js/thirdParty/interact.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/* interact.js 1.10.11 | https://interactjs.io/license */ -!function(t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).interact=t()}((function(){var t={};Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,t.default=function(t){return!(!t||!t.Window)&&t instanceof t.Window};var e={};Object.defineProperty(e,"__esModule",{value:!0}),e.init=o,e.getWindow=function(e){return(0,t.default)(e)?e:(e.ownerDocument||e).defaultView||r.window},e.window=e.realWindow=void 0;var n=void 0;e.realWindow=n;var r=void 0;function o(t){e.realWindow=n=t;var o=t.document.createTextNode("");o.ownerDocument!==t.document&&"function"==typeof t.wrap&&t.wrap(o)===o&&(t=t.wrap(t)),e.window=r=t}e.window=r,"undefined"!=typeof window&&window&&o(window);var i={};function a(t){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;var s=function(t){return!!t&&"object"===a(t)},l=function(t){return"function"==typeof t},u={window:function(n){return n===e.window||(0,t.default)(n)},docFrag:function(t){return s(t)&&11===t.nodeType},object:s,func:l,number:function(t){return"number"==typeof t},bool:function(t){return"boolean"==typeof t},string:function(t){return"string"==typeof t},element:function(t){if(!t||"object"!==a(t))return!1;var n=e.getWindow(t)||e.window;return/object|function/.test(a(n.Element))?t instanceof n.Element:1===t.nodeType&&"string"==typeof t.nodeName},plainObject:function(t){return s(t)&&!!t.constructor&&/function Object\b/.test(t.constructor.toString())},array:function(t){return s(t)&&void 0!==t.length&&l(t.splice)}};i.default=u;var c={};function f(t){var e=t.interaction;if("drag"===e.prepared.name){var n=e.prepared.axis;"x"===n?(e.coords.cur.page.y=e.coords.start.page.y,e.coords.cur.client.y=e.coords.start.client.y,e.coords.velocity.client.y=0,e.coords.velocity.page.y=0):"y"===n&&(e.coords.cur.page.x=e.coords.start.page.x,e.coords.cur.client.x=e.coords.start.client.x,e.coords.velocity.client.x=0,e.coords.velocity.page.x=0)}}function d(t){var e=t.iEvent,n=t.interaction;if("drag"===n.prepared.name){var r=n.prepared.axis;if("x"===r||"y"===r){var o="x"===r?"y":"x";e.page[o]=n.coords.start.page[o],e.client[o]=n.coords.start.client[o],e.delta[o]=0}}}Object.defineProperty(c,"__esModule",{value:!0}),c.default=void 0;var p={id:"actions/drag",install:function(t){var e=t.actions,n=t.Interactable,r=t.defaults;n.prototype.draggable=p.draggable,e.map.drag=p,e.methodDict.drag="draggable",r.actions.drag=p.defaults},listeners:{"interactions:before-action-move":f,"interactions:action-resume":f,"interactions:action-move":d,"auto-start:check":function(t){var e=t.interaction,n=t.interactable,r=t.buttons,o=n.options.drag;if(o&&o.enabled&&(!e.pointerIsDown||!/mouse|pointer/.test(e.pointerType)||0!=(r&n.options.drag.mouseButtons)))return t.action={name:"drag",axis:"start"===o.lockAxis?o.startAxis:o.lockAxis},!1}},draggable:function(t){return i.default.object(t)?(this.options.drag.enabled=!1!==t.enabled,this.setPerAction("drag",t),this.setOnEvents("drag",t),/^(xy|x|y|start)$/.test(t.lockAxis)&&(this.options.drag.lockAxis=t.lockAxis),/^(xy|x|y)$/.test(t.startAxis)&&(this.options.drag.startAxis=t.startAxis),this):i.default.bool(t)?(this.options.drag.enabled=t,this):this.options.drag},beforeMove:f,move:d,defaults:{startAxis:"xy",lockAxis:"xy"},getCursor:function(){return"move"}},v=p;c.default=v;var h={};Object.defineProperty(h,"__esModule",{value:!0}),h.default=void 0;var g={init:function(t){var e=t;g.document=e.document,g.DocumentFragment=e.DocumentFragment||y,g.SVGElement=e.SVGElement||y,g.SVGSVGElement=e.SVGSVGElement||y,g.SVGElementInstance=e.SVGElementInstance||y,g.Element=e.Element||y,g.HTMLElement=e.HTMLElement||g.Element,g.Event=e.Event,g.Touch=e.Touch||y,g.PointerEvent=e.PointerEvent||e.MSPointerEvent},document:null,DocumentFragment:null,SVGElement:null,SVGSVGElement:null,SVGElementInstance:null,Element:null,HTMLElement:null,Event:null,Touch:null,PointerEvent:null};function y(){}var m=g;h.default=m;var b={};Object.defineProperty(b,"__esModule",{value:!0}),b.default=void 0;var x={init:function(t){var e=h.default.Element,n=t.navigator||{};x.supportsTouch="ontouchstart"in t||i.default.func(t.DocumentTouch)&&h.default.document instanceof t.DocumentTouch,x.supportsPointerEvent=!1!==n.pointerEnabled&&!!h.default.PointerEvent,x.isIOS=/iP(hone|od|ad)/.test(n.platform),x.isIOS7=/iP(hone|od|ad)/.test(n.platform)&&/OS 7[^\d]/.test(n.appVersion),x.isIe9=/MSIE 9/.test(n.userAgent),x.isOperaMobile="Opera"===n.appName&&x.supportsTouch&&/Presto/.test(n.userAgent),x.prefixedMatchesSelector="matches"in e.prototype?"matches":"webkitMatchesSelector"in e.prototype?"webkitMatchesSelector":"mozMatchesSelector"in e.prototype?"mozMatchesSelector":"oMatchesSelector"in e.prototype?"oMatchesSelector":"msMatchesSelector",x.pEventTypes=x.supportsPointerEvent?h.default.PointerEvent===t.MSPointerEvent?{up:"MSPointerUp",down:"MSPointerDown",over:"mouseover",out:"mouseout",move:"MSPointerMove",cancel:"MSPointerCancel"}:{up:"pointerup",down:"pointerdown",over:"pointerover",out:"pointerout",move:"pointermove",cancel:"pointercancel"}:null,x.wheelEvent=h.default.document&&"onmousewheel"in h.default.document?"mousewheel":"wheel"},supportsTouch:null,supportsPointerEvent:null,isIOS7:null,isIOS:null,isIe9:null,isOperaMobile:null,prefixedMatchesSelector:null,pEventTypes:null,wheelEvent:null},w=x;b.default=w;var _={};function P(t){var e=t.parentNode;if(i.default.docFrag(e)){for(;(e=e.host)&&i.default.docFrag(e););return e}return e}function O(t,n){return e.window!==e.realWindow&&(n=n.replace(/\/deep\//g," ")),t[b.default.prefixedMatchesSelector](n)}Object.defineProperty(_,"__esModule",{value:!0}),_.nodeContains=function(t,e){if(t.contains)return t.contains(e);for(;e;){if(e===t)return!0;e=e.parentNode}return!1},_.closest=function(t,e){for(;i.default.element(t);){if(O(t,e))return t;t=P(t)}return null},_.parentNode=P,_.matchesSelector=O,_.indexOfDeepestElement=function(t){for(var n,r=[],o=0;o=(parseInt(e.getWindow(g).getComputedStyle(g).zIndex,10)||0)&&(n=o);else n=o}else n=o}var v,g;return n},_.matchesUpTo=function(t,e,n){for(;i.default.element(t);){if(O(t,e))return!0;if((t=P(t))===n)return O(t,e)}return!1},_.getActualElement=function(t){return t.correspondingUseElement||t},_.getScrollXY=T,_.getElementClientRect=M,_.getElementRect=function(t){var n=M(t);if(!b.default.isIOS7&&n){var r=T(e.getWindow(t));n.left+=r.x,n.right+=r.x,n.top+=r.y,n.bottom+=r.y}return n},_.getPath=function(t){for(var e=[];t;)e.push(t),t=P(t);return e},_.trySelector=function(t){return!!i.default.string(t)&&(h.default.document.querySelector(t),!0)};var S=function(t){return t.parentNode||t.host};function E(t,e){for(var n,r=[],o=t;(n=S(o))&&o!==e&&n!==o.ownerDocument;)r.unshift(o),o=n;return r}function T(t){return{x:(t=t||e.window).scrollX||t.document.documentElement.scrollLeft,y:t.scrollY||t.document.documentElement.scrollTop}}function M(t){var e=t instanceof h.default.SVGElement?t.getBoundingClientRect():t.getClientRects()[0];return e&&{left:e.left,right:e.right,top:e.top,bottom:e.bottom,width:e.width||e.right-e.left,height:e.height||e.bottom-e.top}}var j={};Object.defineProperty(j,"__esModule",{value:!0}),j.default=function(t,e){for(var n in e)t[n]=e[n];return t};var k={};function I(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n1?q(e):e[0];U(r,t.page),V(r,t.client),t.timeStamp=n},B.getTouchPair=N,B.pointerAverage=q,B.touchBBox=function(t){if(!t.length)return null;var e=N(t),n=Math.min(e[0].pageX,e[1].pageX),r=Math.min(e[0].pageY,e[1].pageY),o=Math.max(e[0].pageX,e[1].pageX),i=Math.max(e[0].pageY,e[1].pageY);return{x:n,y:r,left:n,top:r,right:o,bottom:i,width:o-n,height:i-r}},B.touchDistance=function(t,e){var n=e+"X",r=e+"Y",o=N(t),i=o[0][n]-o[1][n],a=o[0][r]-o[1][r];return(0,C.default)(i,a)},B.touchAngle=function(t,e){var n=e+"X",r=e+"Y",o=N(t),i=o[1][n]-o[0][n],a=o[1][r]-o[0][r];return 180*Math.atan2(a,i)/Math.PI},B.getPointerType=function(t){return i.default.string(t.pointerType)?t.pointerType:i.default.number(t.pointerType)?[void 0,void 0,"touch","pen","mouse"][t.pointerType]:/touch/.test(t.type||"")||t instanceof h.default.Touch?"touch":"mouse"},B.getEventTargets=function(t){var e=i.default.func(t.composedPath)?t.composedPath():t.path;return[_.getActualElement(e?e[0]:t.target),_.getActualElement(t.currentTarget)]},B.newCoords=function(){return{page:{x:0,y:0},client:{x:0,y:0},timeStamp:0}},B.coordsToEvent=function(t){return{coords:t,get page(){return this.coords.page},get client(){return this.coords.client},get timeStamp(){return this.coords.timeStamp},get pageX(){return this.coords.page.x},get pageY(){return this.coords.page.y},get clientX(){return this.coords.client.x},get clientY(){return this.coords.client.y},get pointerId(){return this.coords.pointerId},get target(){return this.coords.target},get type(){return this.coords.type},get pointerType(){return this.coords.pointerType},get buttons(){return this.coords.buttons},preventDefault:function(){}}},Object.defineProperty(B,"pointerExtend",{enumerable:!0,get:function(){return F.default}});var $={};function G(t,e){for(var n=0;ns.left&&f.xs.top&&f.y=s.left&&h<=s.right&&g>=s.top&&g<=s.bottom}return v&&i.default.number(u)&&(l=Math.max(0,Math.min(s.right,v.right)-Math.max(s.left,v.left))*Math.max(0,Math.min(s.bottom,v.bottom)-Math.max(s.top,v.top))/(v.width*v.height)>=u),t.options.drop.checker&&(l=t.options.drop.checker(e,n,l,t,a,r,o)),l}(this,t,e,n,r,o,a)},n.dynamicDrop=function(e){return i.default.bool(e)?(t.dynamicDrop=e,n):t.dynamicDrop},(0,j.default)(e.phaselessTypes,{dragenter:!0,dragleave:!0,dropactivate:!0,dropdeactivate:!0,dropmove:!0,drop:!0}),e.methodDict.drop="dropzone",t.dynamicDrop=!1,o.actions.drop=gt.defaults},listeners:{"interactions:before-action-start":function(t){var e=t.interaction;"drag"===e.prepared.name&&(e.dropState={cur:{dropzone:null,element:null},prev:{dropzone:null,element:null},rejected:null,events:null,activeDrops:[]})},"interactions:after-action-start":function(t,e){var n=t.interaction,r=(t.event,t.iEvent);if("drag"===n.prepared.name){var o=n.dropState;o.activeDrops=null,o.events=null,o.activeDrops=ft(e,n.element),o.events=pt(n,0,r),o.events.activate&&(ct(o.activeDrops,o.events.activate),e.fire("actions/drop:start",{interaction:n,dragEvent:r}))}},"interactions:action-move":ht,"interactions:after-action-move":function(t,e){var n=t.interaction,r=t.iEvent;"drag"===n.prepared.name&&(vt(n,n.dropState.events),e.fire("actions/drop:move",{interaction:n,dragEvent:r}),n.dropState.events={})},"interactions:action-end":function(t,e){if("drag"===t.interaction.prepared.name){var n=t.interaction,r=t.iEvent;ht(t,e),vt(n,n.dropState.events),e.fire("actions/drop:end",{interaction:n,dragEvent:r})}},"interactions:stop":function(t){var e=t.interaction;if("drag"===e.prepared.name){var n=e.dropState;n&&(n.activeDrops=null,n.events=null,n.cur.dropzone=null,n.cur.element=null,n.prev.dropzone=null,n.prev.element=null,n.rejected=!1)}}},getActiveDrops:ft,getDrop:dt,getDropEvents:pt,fireDropEvents:vt,defaults:{enabled:!1,accept:null,overlap:"pointer"}},yt=gt;ut.default=yt;var mt={};function bt(t){var e=t.interaction,n=t.iEvent,r=t.phase;if("gesture"===e.prepared.name){var o=e.pointers.map((function(t){return t.pointer})),a="start"===r,s="end"===r,l=e.interactable.options.deltaSource;if(n.touches=[o[0],o[1]],a)n.distance=B.touchDistance(o,l),n.box=B.touchBBox(o),n.scale=1,n.ds=0,n.angle=B.touchAngle(o,l),n.da=0,e.gesture.startDistance=n.distance,e.gesture.startAngle=n.angle;else if(s){var u=e.prevEvent;n.distance=u.distance,n.box=u.box,n.scale=u.scale,n.ds=0,n.angle=u.angle,n.da=0}else n.distance=B.touchDistance(o,l),n.box=B.touchBBox(o),n.scale=n.distance/e.gesture.startDistance,n.angle=B.touchAngle(o,l),n.ds=n.scale-e.gesture.scale,n.da=n.angle-e.gesture.angle;e.gesture.distance=n.distance,e.gesture.angle=n.angle,i.default.number(n.scale)&&n.scale!==1/0&&!isNaN(n.scale)&&(e.gesture.scale=n.scale)}}Object.defineProperty(mt,"__esModule",{value:!0}),mt.default=void 0;var xt={id:"actions/gesture",before:["actions/drag","actions/resize"],install:function(t){var e=t.actions,n=t.Interactable,r=t.defaults;n.prototype.gesturable=function(t){return i.default.object(t)?(this.options.gesture.enabled=!1!==t.enabled,this.setPerAction("gesture",t),this.setOnEvents("gesture",t),this):i.default.bool(t)?(this.options.gesture.enabled=t,this):this.options.gesture},e.map.gesture=xt,e.methodDict.gesture="gesturable",r.actions.gesture=xt.defaults},listeners:{"interactions:action-start":bt,"interactions:action-move":bt,"interactions:action-end":bt,"interactions:new":function(t){t.interaction.gesture={angle:0,distance:0,scale:1,startAngle:0,startDistance:0}},"auto-start:check":function(t){if(!(t.interaction.pointers.length<2)){var e=t.interactable.options.gesture;if(e&&e.enabled)return t.action={name:"gesture"},!1}}},defaults:{},getCursor:function(){return""}},wt=xt;mt.default=wt;var _t={};function Pt(t,e,n,r,o,a,s){if(!e)return!1;if(!0===e){var l=i.default.number(a.width)?a.width:a.right-a.left,u=i.default.number(a.height)?a.height:a.bottom-a.top;if(s=Math.min(s,Math.abs(("left"===t||"right"===t?l:u)/2)),l<0&&("left"===t?t="right":"right"===t&&(t="left")),u<0&&("top"===t?t="bottom":"bottom"===t&&(t="top")),"left"===t)return n.x<(l>=0?a.left:a.right)+s;if("top"===t)return n.y<(u>=0?a.top:a.bottom)+s;if("right"===t)return n.x>(l>=0?a.right:a.left)-s;if("bottom"===t)return n.y>(u>=0?a.bottom:a.top)-s}return!!i.default.element(r)&&(i.default.element(e)?e===r:_.matchesUpTo(r,e,o))}function Ot(t){var e=t.iEvent,n=t.interaction;if("resize"===n.prepared.name&&n.resizeAxes){var r=e;n.interactable.options.resize.square?("y"===n.resizeAxes?r.delta.x=r.delta.y:r.delta.y=r.delta.x,r.axes="xy"):(r.axes=n.resizeAxes,"x"===n.resizeAxes?r.delta.y=0:"y"===n.resizeAxes&&(r.delta.x=0))}}Object.defineProperty(_t,"__esModule",{value:!0}),_t.default=void 0;var St={id:"actions/resize",before:["actions/drag"],install:function(t){var e=t.actions,n=t.browser,r=t.Interactable,o=t.defaults;St.cursors=function(t){return t.isIe9?{x:"e-resize",y:"s-resize",xy:"se-resize",top:"n-resize",left:"w-resize",bottom:"s-resize",right:"e-resize",topleft:"se-resize",bottomright:"se-resize",topright:"ne-resize",bottomleft:"ne-resize"}:{x:"ew-resize",y:"ns-resize",xy:"nwse-resize",top:"ns-resize",left:"ew-resize",bottom:"ns-resize",right:"ew-resize",topleft:"nwse-resize",bottomright:"nwse-resize",topright:"nesw-resize",bottomleft:"nesw-resize"}}(n),St.defaultMargin=n.supportsTouch||n.supportsPointerEvent?20:10,r.prototype.resizable=function(e){return function(t,e,n){return i.default.object(e)?(t.options.resize.enabled=!1!==e.enabled,t.setPerAction("resize",e),t.setOnEvents("resize",e),i.default.string(e.axis)&&/^x$|^y$|^xy$/.test(e.axis)?t.options.resize.axis=e.axis:null===e.axis&&(t.options.resize.axis=n.defaults.actions.resize.axis),i.default.bool(e.preserveAspectRatio)?t.options.resize.preserveAspectRatio=e.preserveAspectRatio:i.default.bool(e.square)&&(t.options.resize.square=e.square),t):i.default.bool(e)?(t.options.resize.enabled=e,t):t.options.resize}(this,e,t)},e.map.resize=St,e.methodDict.resize="resizable",o.actions.resize=St.defaults},listeners:{"interactions:new":function(t){t.interaction.resizeAxes="xy"},"interactions:action-start":function(t){!function(t){var e=t.iEvent,n=t.interaction;if("resize"===n.prepared.name&&n.prepared.edges){var r=e,o=n.rect;n._rects={start:(0,j.default)({},o),corrected:(0,j.default)({},o),previous:(0,j.default)({},o),delta:{left:0,right:0,width:0,top:0,bottom:0,height:0}},r.edges=n.prepared.edges,r.rect=n._rects.corrected,r.deltaRect=n._rects.delta}}(t),Ot(t)},"interactions:action-move":function(t){!function(t){var e=t.iEvent,n=t.interaction;if("resize"===n.prepared.name&&n.prepared.edges){var r=e,o=n.interactable.options.resize.invert,i="reposition"===o||"negate"===o,a=n.rect,s=n._rects,l=s.start,u=s.corrected,c=s.delta,f=s.previous;if((0,j.default)(f,u),i){if((0,j.default)(u,a),"reposition"===o){if(u.top>u.bottom){var d=u.top;u.top=u.bottom,u.bottom=d}if(u.left>u.right){var p=u.left;u.left=u.right,u.right=p}}}else u.top=Math.min(a.top,l.bottom),u.bottom=Math.max(a.bottom,l.top),u.left=Math.min(a.left,l.right),u.right=Math.max(a.right,l.left);for(var v in u.width=u.right-u.left,u.height=u.bottom-u.top,u)c[v]=u[v]-f[v];r.edges=n.prepared.edges,r.rect=u,r.deltaRect=c}}(t),Ot(t)},"interactions:action-end":function(t){var e=t.iEvent,n=t.interaction;if("resize"===n.prepared.name&&n.prepared.edges){var r=e;r.edges=n.prepared.edges,r.rect=n._rects.corrected,r.deltaRect=n._rects.delta}},"auto-start:check":function(t){var e=t.interaction,n=t.interactable,r=t.element,o=t.rect,a=t.buttons;if(o){var s=(0,j.default)({},e.coords.cur.page),l=n.options.resize;if(l&&l.enabled&&(!e.pointerIsDown||!/mouse|pointer/.test(e.pointerType)||0!=(a&l.mouseButtons))){if(i.default.object(l.edges)){var u={left:!1,right:!1,top:!1,bottom:!1};for(var c in u)u[c]=Pt(c,l.edges[c],s,e._latestPointer.eventTarget,r,o,l.margin||St.defaultMargin);u.left=u.left&&!u.right,u.top=u.top&&!u.bottom,(u.left||u.right||u.top||u.bottom)&&(t.action={name:"resize",edges:u})}else{var f="y"!==l.axis&&s.x>o.right-St.defaultMargin,d="x"!==l.axis&&s.y>o.bottom-St.defaultMargin;(f||d)&&(t.action={name:"resize",axes:(f?"x":"")+(d?"y":"")})}return!t.action&&void 0}}}},defaults:{square:!1,preserveAspectRatio:!1,axis:"xy",margin:NaN,edges:null,invert:"none"},cursors:null,getCursor:function(t){var e=t.edges,n=t.axis,r=t.name,o=St.cursors,i=null;if(n)i=o[r+n];else if(e){for(var a="",s=["top","bottom","left","right"],l=0;l=1){var c={x:zt.x*u,y:zt.y*u};if(c.x||c.y){var f=Ft(a);i.default.window(a)?a.scrollBy(c.x,c.y):a&&(a.scrollLeft+=c.x,a.scrollTop+=c.y);var d=Ft(a),p={x:d.x-f.x,y:d.y-f.y};(p.x||p.y)&&e.fire({type:"autoscroll",target:n,interactable:e,delta:p,interaction:t,container:a})}zt.prevTime=s}zt.isScrolling&&(jt.default.cancel(zt.i),zt.i=jt.default.request(zt.scroll))},check:function(t,e){var n;return null==(n=t.options[e].autoScroll)?void 0:n.enabled},onInteractionMove:function(t){var e=t.interaction,n=t.pointer;if(e.interacting()&&zt.check(e.interactable,e.prepared.name))if(e.simulation)zt.x=zt.y=0;else{var r,o,a,s,l=e.interactable,u=e.element,c=e.prepared.name,f=l.options[c].autoScroll,d=Ct(f.container,l,u);if(i.default.window(d))s=n.clientXd.innerWidth-zt.margin,a=n.clientY>d.innerHeight-zt.margin;else{var p=_.getElementClientRect(d);s=n.clientXp.right-zt.margin,a=n.clientY>p.bottom-zt.margin}zt.x=o?1:s?-1:0,zt.y=a?1:r?-1:0,zt.isScrolling||(zt.margin=f.margin,zt.speed=f.speed,zt.start(e))}}};function Ct(t,n,r){return(i.default.string(t)?(0,k.getStringOptionResult)(t,n,r):t)||(0,e.getWindow)(r)}function Ft(t){return i.default.window(t)&&(t=window.document.body),{x:t.scrollLeft,y:t.scrollTop}}var Xt={id:"auto-scroll",install:function(t){var e=t.defaults,n=t.actions;t.autoScroll=zt,zt.now=function(){return t.now()},n.phaselessTypes.autoscroll=!0,e.perAction.autoScroll=zt.defaults},listeners:{"interactions:new":function(t){t.interaction.autoScroll=null},"interactions:destroy":function(t){t.interaction.autoScroll=null,zt.stop(),zt.interaction&&(zt.interaction=null)},"interactions:stop":zt.stop,"interactions:action-move":function(t){return zt.onInteractionMove(t)}}};Rt.default=Xt;var Yt={};Object.defineProperty(Yt,"__esModule",{value:!0}),Yt.warnOnce=function(t,n){var r=!1;return function(){return r||(e.window.console.warn(n),r=!0),t.apply(this,arguments)}},Yt.copyAction=function(t,e){return t.name=e.name,t.axis=e.axis,t.edges=e.edges,t},Yt.sign=void 0,Yt.sign=function(t){return t>=0?1:-1};var Bt={};function Wt(t){return i.default.bool(t)?(this.options.styleCursor=t,this):null===t?(delete this.options.styleCursor,this):this.options.styleCursor}function Lt(t){return i.default.func(t)?(this.options.actionChecker=t,this):null===t?(delete this.options.actionChecker,this):this.options.actionChecker}Object.defineProperty(Bt,"__esModule",{value:!0}),Bt.default=void 0;var Ut={id:"auto-start/interactableMethods",install:function(t){var e=t.Interactable;e.prototype.getAction=function(e,n,r,o){var i=function(t,e,n,r,o){var i=t.getRect(r),a={action:null,interactable:t,interaction:n,element:r,rect:i,buttons:e.buttons||{0:1,1:4,3:8,4:16}[e.button]};return o.fire("auto-start:check",a),a.action}(this,n,r,o,t);return this.options.actionChecker?this.options.actionChecker(e,n,i,this,o,r):i},e.prototype.ignoreFrom=(0,Yt.warnOnce)((function(t){return this._backCompatOption("ignoreFrom",t)}),"Interactable.ignoreFrom() has been deprecated. Use Interactble.draggable({ignoreFrom: newValue})."),e.prototype.allowFrom=(0,Yt.warnOnce)((function(t){return this._backCompatOption("allowFrom",t)}),"Interactable.allowFrom() has been deprecated. Use Interactble.draggable({allowFrom: newValue})."),e.prototype.actionChecker=Lt,e.prototype.styleCursor=Wt}};Bt.default=Ut;var Vt={};function Nt(t,e,n,r,o){return e.testIgnoreAllow(e.options[t.name],n,r)&&e.options[t.name].enabled&&Ht(e,n,t,o)?t:null}function qt(t,e,n,r,o,i,a){for(var s=0,l=r.length;s=s)return!1;if(d.interactable===t){if((u+=p===n.name?1:0)>=i)return!1;if(d.element===e&&(c++,p===n.name&&c>=a))return!1}}}return s>0}function Kt(t,e){return i.default.number(t)?(e.autoStart.maxInteractions=t,this):e.autoStart.maxInteractions}function Zt(t,e,n){var r=n.autoStart.cursorElement;r&&r!==t&&(r.style.cursor=""),t.ownerDocument.documentElement.style.cursor=e,t.style.cursor=e,n.autoStart.cursorElement=e?t:null}function Jt(t,e){var n=t.interactable,r=t.element,o=t.prepared;if("mouse"===t.pointerType&&n&&n.options.styleCursor){var a="";if(o.name){var s=n.options[o.name].cursorChecker;a=i.default.func(s)?s(o,n,r,t._interacting):e.actions.map[o.name].getCursor(o)}Zt(t.element,a||"",e)}else e.autoStart.cursorElement&&Zt(e.autoStart.cursorElement,"",e)}Object.defineProperty(Vt,"__esModule",{value:!0}),Vt.default=void 0;var Qt={id:"auto-start/base",before:["actions"],install:function(t){var e=t.interactStatic,n=t.defaults;t.usePlugin(Bt.default),n.base.actionChecker=null,n.base.styleCursor=!0,(0,j.default)(n.perAction,{manualStart:!1,max:1/0,maxPerElement:1,allowFrom:null,ignoreFrom:null,mouseButtons:1}),e.maxInteractions=function(e){return Kt(e,t)},t.autoStart={maxInteractions:1/0,withinInteractionLimit:Ht,cursorElement:null}},listeners:{"interactions:down":function(t,e){var n=t.interaction,r=t.pointer,o=t.event,i=t.eventTarget;n.interacting()||Gt(n,$t(n,r,o,i,e),e)},"interactions:move":function(t,e){!function(t,e){var n=t.interaction,r=t.pointer,o=t.event,i=t.eventTarget;"mouse"!==n.pointerType||n.pointerIsDown||n.interacting()||Gt(n,$t(n,r,o,i,e),e)}(t,e),function(t,e){var n=t.interaction;if(n.pointerIsDown&&!n.interacting()&&n.pointerWasMoved&&n.prepared.name){e.fire("autoStart:before-start",t);var r=n.interactable,o=n.prepared.name;o&&r&&(r.options[o].manualStart||!Ht(r,n.element,n.prepared,e)?n.stop():(n.start(n.prepared,r,n.element),Jt(n,e)))}}(t,e)},"interactions:stop":function(t,e){var n=t.interaction,r=n.interactable;r&&r.options.styleCursor&&Zt(n.element,"",e)}},maxInteractions:Kt,withinInteractionLimit:Ht,validateAction:Nt};Vt.default=Qt;var te={};Object.defineProperty(te,"__esModule",{value:!0}),te.default=void 0;var ee={id:"auto-start/dragAxis",listeners:{"autoStart:before-start":function(t,e){var n=t.interaction,r=t.eventTarget,o=t.dx,a=t.dy;if("drag"===n.prepared.name){var s=Math.abs(o),l=Math.abs(a),u=n.interactable.options.drag,c=u.startAxis,f=s>l?"x":s0&&(e.autoStartHoldTimer=setTimeout((function(){e.start(e.prepared,e.interactable,e.element)}),n))},"interactions:move":function(t){var e=t.interaction,n=t.duplicate;e.autoStartHoldTimer&&e.pointerWasMoved&&!n&&(clearTimeout(e.autoStartHoldTimer),e.autoStartHoldTimer=null)},"autoStart:before-start":function(t){var e=t.interaction;re(e)>0&&(e.prepared.name=null)}},getHoldDuration:re};ne.default=oe;var ie={};Object.defineProperty(ie,"__esModule",{value:!0}),ie.default=void 0;var ae={id:"auto-start",install:function(t){t.usePlugin(Vt.default),t.usePlugin(ne.default),t.usePlugin(te.default)}};ie.default=ae;var se={};function le(t){return/^(always|never|auto)$/.test(t)?(this.options.preventDefault=t,this):i.default.bool(t)?(this.options.preventDefault=t?"always":"never",this):this.options.preventDefault}function ue(t){var e=t.interaction,n=t.event;e.interactable&&e.interactable.checkAndPreventDefault(n)}function ce(t){var n=t.Interactable;n.prototype.preventDefault=le,n.prototype.checkAndPreventDefault=function(n){return function(t,n,r){var o=t.options.preventDefault;if("never"!==o)if("always"!==o){if(n.events.supportsPassive&&/^touch(start|move)$/.test(r.type)){var a=(0,e.getWindow)(r.target).document,s=n.getDocOptions(a);if(!s||!s.events||!1!==s.events.passive)return}/^(mouse|pointer|touch)*(down|start)/i.test(r.type)||i.default.element(r.target)&&(0,_.matchesSelector)(r.target,"input,select,textarea,[contenteditable=true],[contenteditable=true] *")||r.preventDefault()}else r.preventDefault()}(this,t,n)},t.interactions.docEvents.push({type:"dragstart",listener:function(e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=Array(e);n150)return null;var e=180*Math.atan2(t.prevEvent.velocityY,t.prevEvent.velocityX)/Math.PI;e<0&&(e+=360);var n=112.5<=e&&e<247.5,r=202.5<=e&&e<337.5;return{up:r,down:!r&&22.5<=e&&e<157.5,left:n,right:!n&&(292.5<=e||e<67.5),angle:e,speed:t.prevEvent.speed,velocity:{x:t.prevEvent.velocityX,y:t.prevEvent.velocityY}}}},{key:"preventDefault",value:function(){}},{key:"stopImmediatePropagation",value:function(){this.immediatePropagationStopped=this.propagationStopped=!0}},{key:"stopPropagation",value:function(){this.propagationStopped=!0}}])&&Ie(e.prototype,n),a}($.BaseEvent);je.InteractEvent=Fe,Object.defineProperties(Fe.prototype,{pageX:{get:function(){return this.page.x},set:function(t){this.page.x=t}},pageY:{get:function(){return this.page.y},set:function(t){this.page.y=t}},clientX:{get:function(){return this.client.x},set:function(t){this.client.x=t}},clientY:{get:function(){return this.client.y},set:function(t){this.client.y=t}},dx:{get:function(){return this.delta.x},set:function(t){this.delta.x=t}},dy:{get:function(){return this.delta.y},set:function(t){this.delta.y=t}},velocityX:{get:function(){return this.velocity.x},set:function(t){this.velocity.x=t}},velocityY:{get:function(){return this.velocity.y},set:function(t){this.velocity.y=t}}});var Xe={};function Ye(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}Object.defineProperty(Xe,"__esModule",{value:!0}),Xe.PointerInfo=void 0,Xe.PointerInfo=function t(e,n,r,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),Ye(this,"id",void 0),Ye(this,"pointer",void 0),Ye(this,"event",void 0),Ye(this,"downTime",void 0),Ye(this,"downTarget",void 0),this.id=e,this.pointer=n,this.event=r,this.downTime=o,this.downTarget=i};var Be,We,Le={};function Ue(t,e){for(var n=0;nthis.pointerMoveTolerance);var a=this.getPointerIndex(t),s={pointer:t,pointerIndex:a,pointerInfo:this.pointers[a],event:e,type:"move",eventTarget:n,dx:r,dy:o,duplicate:i,interaction:this};i||B.setCoordVelocity(this.coords.velocity,this.coords.delta),this._scopeFire("interactions:move",s),i||this.simulation||(this.interacting()&&(s.type=null,this.move(s)),this.pointerWasMoved&&B.copyCoords(this.coords.prev,this.coords.cur))}},{key:"move",value:function(t){t&&t.event||B.setZeroCoords(this.coords.delta),(t=(0,j.default)({pointer:this._latestPointer.pointer,event:this._latestPointer.event,eventTarget:this._latestPointer.eventTarget,interaction:this},t||{})).phase="move",this._doPhase(t)}},{key:"pointerUp",value:function(t,e,n,r){var o=this.getPointerIndex(t);-1===o&&(o=this.updatePointer(t,e,n,!1));var i=/cancel$/i.test(e.type)?"cancel":"up";this._scopeFire("interactions:".concat(i),{pointer:t,pointerIndex:o,pointerInfo:this.pointers[o],event:e,eventTarget:n,type:i,curEventTarget:r,interaction:this}),this.simulation||this.end(e),this.removePointer(t,e)}},{key:"documentBlur",value:function(t){this.end(t),this._scopeFire("interactions:blur",{event:t,type:"blur",interaction:this})}},{key:"end",value:function(t){var e;this._ending=!0,t=t||this._latestPointer.event,this.interacting()&&(e=this._doPhase({event:t,interaction:this,phase:"end"})),this._ending=!1,!0===e&&this.stop()}},{key:"currentAction",value:function(){return this._interacting?this.prepared.name:null}},{key:"interacting",value:function(){return this._interacting}},{key:"stop",value:function(){this._scopeFire("interactions:stop",{interaction:this}),this.interactable=this.element=null,this._interacting=!1,this._stopped=!0,this.prepared.name=this.prevEvent=null}},{key:"getPointerIndex",value:function(t){var e=B.getPointerId(t);return"mouse"===this.pointerType||"pen"===this.pointerType?this.pointers.length-1:Z.findIndex(this.pointers,(function(t){return t.id===e}))}},{key:"getPointerInfo",value:function(t){return this.pointers[this.getPointerIndex(t)]}},{key:"updatePointer",value:function(t,e,n,r){var o=B.getPointerId(t),i=this.getPointerIndex(t),a=this.pointers[i];return r=!1!==r&&(r||/(down|start)$/i.test(e.type)),a?a.pointer=t:(a=new Xe.PointerInfo(o,t,e,null,null),i=this.pointers.length,this.pointers.push(a)),B.setCoords(this.coords.cur,this.pointers.map((function(t){return t.pointer})),this._now()),B.setCoordDeltas(this.coords.delta,this.coords.prev,this.coords.cur),r&&(this.pointerIsDown=!0,a.downTime=this.coords.cur.timeStamp,a.downTarget=n,B.pointerExtend(this.downPointer,t),this.interacting()||(B.copyCoords(this.coords.start,this.coords.cur),B.copyCoords(this.coords.prev,this.coords.cur),this.downEvent=e,this.pointerWasMoved=!1)),this._updateLatestPointer(t,e,n),this._scopeFire("interactions:update-pointer",{pointer:t,event:e,eventTarget:n,down:r,pointerInfo:a,pointerIndex:i,interaction:this}),i}},{key:"removePointer",value:function(t,e){var n=this.getPointerIndex(t);if(-1!==n){var r=this.pointers[n];this._scopeFire("interactions:remove-pointer",{pointer:t,event:e,eventTarget:null,pointerIndex:n,pointerInfo:r,interaction:this}),this.pointers.splice(n,1),this.pointerIsDown=!1}}},{key:"_updateLatestPointer",value:function(t,e,n){this._latestPointer.pointer=t,this._latestPointer.event=e,this._latestPointer.eventTarget=n}},{key:"destroy",value:function(){this._latestPointer.pointer=null,this._latestPointer.event=null,this._latestPointer.eventTarget=null}},{key:"_createPreparedEvent",value:function(t,e,n,r){return new je.InteractEvent(this,t,this.prepared.name,e,this.element,n,r)}},{key:"_fireEvent",value:function(t){this.interactable.fire(t),(!this.prevEvent||t.timeStamp>=this.prevEvent.timeStamp)&&(this.prevEvent=t)}},{key:"_doPhase",value:function(t){var e=t.event,n=t.phase,r=t.preEnd,o=t.type,i=this.rect;if(i&&"move"===n&&(k.addEdges(this.edges,i,this.coords.delta[this.interactable.options.deltaSource]),i.width=i.right-i.left,i.height=i.bottom-i.top),!1===this._scopeFire("interactions:before-action-".concat(n),t))return!1;var a=t.iEvent=this._createPreparedEvent(e,n,r,o);return this._scopeFire("interactions:action-".concat(n),t),"start"===n&&(this.prevEvent=a),this._fireEvent(a),this._scopeFire("interactions:after-action-".concat(n),t),!0}},{key:"_now",value:function(){return Date.now()}}])&&Ue(e.prototype,n),t}();Le.Interaction=qe;var $e=qe;Le.default=$e;var Ge={};function He(t){t.pointerIsDown&&(Qe(t.coords.cur,t.offset.total),t.offset.pending.x=0,t.offset.pending.y=0)}function Ke(t){Ze(t.interaction)}function Ze(t){if(!function(t){return!(!t.offset.pending.x&&!t.offset.pending.y)}(t))return!1;var e=t.offset.pending;return Qe(t.coords.cur,e),Qe(t.coords.delta,e),k.addEdges(t.edges,t.rect,e),e.x=0,e.y=0,!0}function Je(t){var e=t.x,n=t.y;this.offset.pending.x+=e,this.offset.pending.y+=n,this.offset.total.x+=e,this.offset.total.y+=n}function Qe(t,e){var n=t.page,r=t.client,o=e.x,i=e.y;n.x+=o,n.y+=i,r.x+=o,r.y+=i}Object.defineProperty(Ge,"__esModule",{value:!0}),Ge.addTotal=He,Ge.applyPending=Ze,Ge.default=void 0,Le._ProxyMethods.offsetBy="";var tn={id:"offset",before:["modifiers","pointer-events","actions","inertia"],install:function(t){t.Interaction.prototype.offsetBy=Je},listeners:{"interactions:new":function(t){t.interaction.offset={total:{x:0,y:0},pending:{x:0,y:0}}},"interactions:update-pointer":function(t){return He(t.interaction)},"interactions:before-action-start":Ke,"interactions:before-action-move":Ke,"interactions:before-action-end":function(t){var e=t.interaction;if(Ze(e))return e.move({offset:!0}),e.end(),!1},"interactions:stop":function(t){var e=t.interaction;e.offset.total.x=0,e.offset.total.y=0,e.offset.pending.x=0,e.offset.pending.y=0}}};Ge.default=tn;var en={};function nn(t,e){for(var n=0;nn.minSpeed&&o>n.endSpeed)this.startInertia();else{if(i.result=i.setAll(this.modifierArg),!i.result.changed)return!1;this.startSmoothEnd()}return e.modification.result.rect=null,e.offsetBy(this.targetOffset),e._doPhase({interaction:e,event:t,phase:"inertiastart"}),e.offsetBy({x:-this.targetOffset.x,y:-this.targetOffset.y}),e.modification.result.rect=null,this.active=!0,e.simulation=this,!0}},{key:"startInertia",value:function(){var t=this,e=this.interaction.coords.velocity.client,n=an(this.interaction),r=n.resistance,o=-Math.log(n.endSpeed/this.v0)/r;this.targetOffset={x:(e.x-o)/r,y:(e.y-o)/r},this.te=o,this.lambda_v0=r/this.v0,this.one_ve_v0=1-n.endSpeed/this.v0;var i=this.modification,a=this.modifierArg;a.pageCoords={x:this.startCoords.x+this.targetOffset.x,y:this.startCoords.y+this.targetOffset.y},i.result=i.setAll(a),i.result.changed&&(this.isModified=!0,this.modifiedOffset={x:this.targetOffset.x+i.result.delta.x,y:this.targetOffset.y+i.result.delta.y}),this.onNextFrame((function(){return t.inertiaTick()}))}},{key:"startSmoothEnd",value:function(){var t=this;this.smoothEnd=!0,this.isModified=!0,this.targetOffset={x:this.modification.result.delta.x,y:this.modification.result.delta.y},this.onNextFrame((function(){return t.smoothEndTick()}))}},{key:"onNextFrame",value:function(t){var e=this;this.timeout=jt.default.request((function(){e.active&&t()}))}},{key:"inertiaTick",value:function(){var t,e,n,r,o,i=this,a=this.interaction,s=an(a).resistance,l=(a._now()-this.t0)/1e3;if(l=0;n--){var r=e[n],o=r.selector,a=r.context,s=r.listeners;o===this.target&&a===this._context&&e.splice(n,1);for(var l=s.length-1;l>=0;l--)this._scopeEvents.removeDelegate(this.target,this._context,t,s[l][0],s[l][1])}else this._scopeEvents.remove(this.target,"all")}}])&&mn(n.prototype,r),t}();yn.Interactable=xn;var wn={};function _n(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=Array(e);n=0;a--){var p=f[a];if(p.selector===t&&p.context===e){for(var v=p.listeners,h=v.length-1;h>=0;h--){var g=Mn(v[h],2),y=g[0],m=g[1],b=m.capture,x=m.passive;if(y===o&&b===s.capture&&x===s.passive){v.splice(h,1),v.length||(f.splice(a,1),l(e,n,u),l(e,n,c,!0)),d=!0;break}}if(d)break}}},delegateListener:u,delegateUseCapture:c,delegatedEvents:r,documents:o,targets:n,supportsOptions:!1,supportsPassive:!1};function s(t,e,r,o){var i=In(o),s=Z.find(n,(function(e){return e.eventTarget===t}));s||(s={eventTarget:t,events:{}},n.push(s)),s.events[e]||(s.events[e]=[]),t.addEventListener&&!Z.contains(s.events[e],r)&&(t.addEventListener(e,r,a.supportsOptions?i:i.capture),s.events[e].push(r))}function l(t,e,r,o){var i=In(o),s=Z.findIndex(n,(function(e){return e.eventTarget===t})),u=n[s];if(u&&u.events)if("all"!==e){var c=!1,f=u.events[e];if(f){if("all"===r){for(var d=f.length-1;d>=0;d--)l(t,e,f[d],i);return}for(var p=0;p=2)continue;if(!o.interacting()&&e===o.pointerType)return o}return null}};function zn(t,e){return t.pointers.some((function(t){return t.id===e}))}var Cn=Rn;An.default=Cn;var Fn={};function Xn(t){return(Xn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function Yn(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=t[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}}(t,e)||function(t,e){if(t){if("string"==typeof t)return Bn(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Bn(t,e):void 0}}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Bn(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n=0;r--){var o=e.interactions.list[r];o.interactable===n&&(o.stop(),e.fire("interactions:destroy",{interaction:o}),o.destroy(),e.interactions.list.length>2&&e.interactions.list.splice(r,1))}}},onDocSignal:Hn,doOnInteractions:$n,methodNames:qn};Fn.default=Kn;var Zn={};function Jn(t){return(Jn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function Qn(t,e,n){return(Qn="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(t,e,n){var r=function(t,e){for(;!Object.prototype.hasOwnProperty.call(t,e)&&null!==(t=nr(t)););return t}(t,e);if(r){var o=Object.getOwnPropertyDescriptor(r,e);return o.get?o.get.call(n):o.value}})(t,e,n||t)}function tr(t,e){return(tr=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function er(t,e){return!e||"object"!==Jn(e)&&"function"!=typeof e?function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t):e}function nr(t){return(nr=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function rr(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function or(t,e){for(var n=0;nt.length)&&(e=t.length);for(var n=0,r=Array(e);nMath.abs(l.y),s.coords,s.rect),(0,j.default)(r,s.coords)),s.eventProps},defaults:{ratio:"preserve",equalDelta:!1,modifiers:[],enabled:!1}};function Tr(t,e,n){var r=t.startCoords,o=t.edgeSign;e?n.y=r.y+(n.x-r.x)*o:n.x=r.x+(n.y-r.y)*o}function Mr(t,e,n,r){var o=t.startRect,i=t.startCoords,a=t.ratio,s=t.edgeSign;if(e){var l=r.width/a;n.y=i.y+(l-o.height)*s}else{var u=r.height*a;n.x=i.x+(u-o.width)*s}}_r.aspectRatio=Er;var jr=(0,Se.makeModifier)(Er,"aspectRatio");_r.default=jr;var kr={};Object.defineProperty(kr,"__esModule",{value:!0}),kr.default=void 0;var Ir=function(){};Ir._defaults={};var Dr=Ir;kr.default=Dr;var Ar={};Object.defineProperty(Ar,"__esModule",{value:!0}),Object.defineProperty(Ar,"default",{enumerable:!0,get:function(){return kr.default}});var Rr={};function zr(t,e,n){return i.default.func(t)?k.resolveRectLike(t,e.interactable,e.element,[n.x,n.y,e]):k.resolveRectLike(t,e.interactable,e.element)}Object.defineProperty(Rr,"__esModule",{value:!0}),Rr.getRestrictionRect=zr,Rr.restrict=Rr.default=void 0;var Cr={start:function(t){var e=t.rect,n=t.startOffset,r=t.state,o=t.interaction,i=t.pageCoords,a=r.options,s=a.elementRect,l=(0,j.default)({left:0,top:0,right:0,bottom:0},a.offset||{});if(e&&s){var u=zr(a.restriction,o,i);if(u){var c=u.right-u.left-e.width,f=u.bottom-u.top-e.height;c<0&&(l.left+=c,l.right+=c),f<0&&(l.top+=f,l.bottom+=f)}l.left+=n.left-e.width*s.left,l.top+=n.top-e.height*s.top,l.right+=n.right-e.width*(1-s.right),l.bottom+=n.bottom-e.height*(1-s.bottom)}r.offset=l},set:function(t){var e=t.coords,n=t.interaction,r=t.state,o=r.options,i=r.offset,a=zr(o.restriction,n,e);if(a){var s=k.xywhToTlbr(a);e.x=Math.max(Math.min(s.right-i.right,e.x),s.left+i.left),e.y=Math.max(Math.min(s.bottom-i.bottom,e.y),s.top+i.top)}},defaults:{restriction:null,elementRect:null,offset:null,endOnly:!1,enabled:!1}};Rr.restrict=Cr;var Fr=(0,Se.makeModifier)(Cr,"restrict");Rr.default=Fr;var Xr={};Object.defineProperty(Xr,"__esModule",{value:!0}),Xr.restrictEdges=Xr.default=void 0;var Yr={top:1/0,left:1/0,bottom:-1/0,right:-1/0},Br={top:-1/0,left:-1/0,bottom:1/0,right:1/0};function Wr(t,e){for(var n=["top","left","bottom","right"],r=0;rt.length)&&(e=t.length);for(var n=0,r=Array(e);n+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 - -(c) 2009-2016 Stuart Knightley -Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/main/LICENSE.markdown. - -JSZip uses the library pako released under the MIT license : -https://github.com/nodeca/pako/blob/main/LICENSE -*/ - -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=e()}}(function(){return function s(a,o,h){function u(r,e){if(!o[r]){if(!a[r]){var t="function"==typeof require&&require;if(!e&&t)return t(r,!0);if(l)return l(r,!0);var n=new Error("Cannot find module '"+r+"'");throw n.code="MODULE_NOT_FOUND",n}var i=o[r]={exports:{}};a[r][0].call(i.exports,function(e){var t=a[r][1][e];return u(t||e)},i,i.exports,s,a,o,h)}return o[r].exports}for(var l="function"==typeof require&&require,e=0;e>2,s=(3&t)<<4|r>>4,a=1>6:64,o=2>4,r=(15&i)<<4|(s=p.indexOf(e.charAt(o++)))>>2,n=(3&s)<<6|(a=p.indexOf(e.charAt(o++))),l[h++]=t,64!==s&&(l[h++]=r),64!==a&&(l[h++]=n);return l}},{"./support":30,"./utils":32}],2:[function(e,t,r){"use strict";var n=e("./external"),i=e("./stream/DataWorker"),s=e("./stream/Crc32Probe"),a=e("./stream/DataLengthProbe");function o(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}o.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new a("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",t)},t.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(){return new n("STORE compression")},uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(e,t,r){"use strict";var n=e("./utils");var o=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t){return void 0!==e&&e.length?"string"!==n.getTypeOf(e)?function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}(0|t,e,e.length,0):function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t.charCodeAt(a))];return-1^e}(0|t,e,e.length,0):0}},{"./utils":32}],5:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(e,t,r){"use strict";var n=null;n="undefined"!=typeof Promise?Promise:e("lie"),t.exports={Promise:n}},{lie:37}],7:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,i=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),o=n?"uint8array":"array";function h(e,t){a.call(this,"FlateWorker/"+e),this._pako=null,this._pakoAction=e,this._pakoOptions=t,this.meta={}}r.magic="\b\0",s.inherits(h,a),h.prototype.processChunk=function(e){this.meta=e.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,e.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new i[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var t=this;this._pako.onData=function(e){t.push({data:e,meta:t.meta})}},r.compressWorker=function(e){return new h("Deflate",e)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(e,t,r){"use strict";function A(e,t){var r,n="";for(r=0;r>>=8;return n}function n(e,t,r,n,i,s){var a,o,h=e.file,u=e.compression,l=s!==O.utf8encode,f=I.transformTo("string",s(h.name)),c=I.transformTo("string",O.utf8encode(h.name)),d=h.comment,p=I.transformTo("string",s(d)),m=I.transformTo("string",O.utf8encode(d)),_=c.length!==h.name.length,g=m.length!==d.length,b="",v="",y="",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};t&&!r||(x.crc32=e.crc32,x.compressedSize=e.compressedSize,x.uncompressedSize=e.uncompressedSize);var S=0;t&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),"UNIX"===i?(C=798,z|=function(e,t){var r=e;return e||(r=t?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(e){return 63&(e||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+c,b+="up"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+="uc"+A(y.length,2)+y);var E="";return E+="\n\0",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+"\0\0\0\0"+A(z,4)+A(n,4)+f+b+p}}var I=e("../utils"),i=e("../stream/GenericWorker"),O=e("../utf8"),B=e("../crc32"),R=e("../signature");function s(e,t,r,n){i.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=t,this.zipPlatform=r,this.encodeFileName=n,this.streamFiles=e,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,i),s.prototype.push=function(e){var t=e.meta.percent||0,r=this.entriesCount,n=this._sources.length;this.accumulate?this.contentBuffer.push(e):(this.bytesWritten+=e.data.length,i.prototype.push.call(this,{data:e.data,meta:{currentFile:this.currentFile,percent:r?(t+100*(r-n-1))/r:100}}))},s.prototype.openedSource=function(e){this.currentSourceOffset=this.bytesWritten,this.currentFile=e.file.name;var t=this.streamFiles&&!e.file.dir;if(t){var r=n(e,t,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(e){this.accumulate=!1;var t=this.streamFiles&&!e.file.dir,r=n(e,t,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),t)this.push({data:function(e){return R.DATA_DESCRIPTOR+A(e.crc32,4)+A(e.compressedSize,4)+A(e.uncompressedSize,4)}(e),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var e=this.bytesWritten,t=0;t=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC(1980+(e>>25&127),(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=i},{"../utils":32}],19:[function(e,t,r){"use strict";var n=e("./Uint8ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(e,t,r){"use strict";var n=e("./DataReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},i.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},i.prototype.readAndCheckSignature=function(e){return e===this.readData(4)},i.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./DataReader":18}],21:[function(e,t,r){"use strict";var n=e("./ArrayReader");function i(e){n.call(this,e)}e("../utils").inherits(i,n),i.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=i},{"../utils":32,"./ArrayReader":17}],22:[function(e,t,r){"use strict";var n=e("../utils"),i=e("../support"),s=e("./ArrayReader"),a=e("./StringReader"),o=e("./NodeBufferReader"),h=e("./Uint8ArrayReader");t.exports=function(e){var t=n.getTypeOf(e);return n.checkSupport(t),"string"!==t||i.uint8array?"nodebuffer"===t?new o(e):i.uint8array?new h(n.transformTo("uint8array",e)):new s(n.transformTo("array",e)):new a(e)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../utils");function s(e){n.call(this,"ConvertWorker to "+e),this.destType=e}i.inherits(s,n),s.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(e,t,r){"use strict";var n=e("./GenericWorker"),i=e("../crc32");function s(){n.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}e("../utils").inherits(s,n),s.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}n.inherits(s,i),s.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(e,t,r){"use strict";var n=e("../utils"),i=e("./GenericWorker");function s(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}n.inherits(s,i),s.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!i.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=null,t=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":e=this.data.substring(this.index,t);break;case"uint8array":e=this.data.subarray(this.index,t);break;case"array":case"nodebuffer":e=this.data.slice(this.index,t)}return this.index=t,this.push({data:e,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(e,t,r){"use strict";function n(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}n.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return!this.isFinished&&(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=n},{}],29:[function(e,t,r){"use strict";var h=e("../utils"),i=e("./ConvertWorker"),s=e("./GenericWorker"),u=e("../base64"),n=e("../support"),a=e("../external"),o=null;if(n.nodestream)try{o=e("../nodejs/NodejsStreamOutputAdapter")}catch(e){}function l(e,o){return new a.Promise(function(t,r){var n=[],i=e._internalType,s=e._outputType,a=e._mimeType;e.on("data",function(e,t){n.push(e),o&&o(t)}).on("error",function(e){n=[],r(e)}).on("end",function(){try{var e=function(e,t,r){switch(e){case"blob":return h.newBlob(h.transformTo("arraybuffer",t),r);case"base64":return u.encode(t);default:return h.transformTo(e,t)}}(s,function(e,t){var r,n=0,i=null,s=0;for(r=0;r>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t}(e)},s.utf8decode=function(e){return h.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(t=r=0;t>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(e=o.transformTo(h.uint8array?"uint8array":"array",e))},o.inherits(a,n),a.prototype.processChunk=function(e){var t=o.transformTo(h.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=t;(t=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),t.set(r,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var n=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}(t),i=t;n!==t.length&&(h.uint8array?(i=t.subarray(0,n),this.leftOver=t.subarray(n,t.length)):(i=t.slice(0,n),this.leftOver=t.slice(n,t.length))),this.push({data:s.utf8decode(i),meta:e.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,n),l.prototype.processChunk=function(e){this.push({data:s.utf8encode(e.data),meta:e.meta})},s.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(e,t,a){"use strict";var o=e("./support"),h=e("./base64"),r=e("./nodejsUtils"),u=e("./external");function n(e){return e}function l(e,t){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==e&&(this.dosPermissions=63&this.externalFileAttributes),3==e&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.index+4>>6:(r<65536?t[s++]=224|r>>>12:(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63),t[s++]=128|r>>>6&63),t[s++]=128|63&r);return t},r.buf2binstring=function(e){return l(e,e.length)},r.binstring2buf=function(e){for(var t=new h.Buf8(e.length),r=0,n=t.length;r>10&1023,o[n++]=56320|1023&i)}return l(o,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;0<=r&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+u[e[r]]>t?r:t}},{"./common":41}],43:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e|0,s=e>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,n){var i=o,s=n+r;e^=-1;for(var a=n;a>>8^i[255&(e^t[a])];return-1^e}},{}],46:[function(e,t,r){"use strict";var h,c=e("../utils/common"),u=e("./trees"),d=e("./adler32"),p=e("./crc32"),n=e("./messages"),l=0,f=4,m=0,_=-2,g=-1,b=4,i=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(e,t){return e.msg=n[t],t}function T(e){return(e<<1)-(4e.avail_out&&(r=e.avail_out),0!==r&&(c.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function N(e,t){u._tr_flush_block(e,0<=e.block_start?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,F(e.strm)}function U(e,t){e.pending_buf[e.pending++]=t}function P(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function L(e,t){var r,n,i=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match,h=e.strstart>e.w_size-z?e.strstart-(e.w_size-z):0,u=e.window,l=e.w_mask,f=e.prev,c=e.strstart+S,d=u[s+a-1],p=u[s+a];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(u[(r=t)+a]===p&&u[r+a-1]===d&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--i);return a<=e.lookahead?a:e.lookahead}function j(e){var t,r,n,i,s,a,o,h,u,l,f=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=f+(f-z)){for(c.arraySet(e.window,e.window,f,f,0),e.match_start-=f,e.strstart-=f,e.block_start-=f,t=r=e.hash_size;n=e.head[--t],e.head[t]=f<=n?n-f:0,--r;);for(t=r=f;n=e.prev[--t],e.prev[t]=f<=n?n-f:0,--r;);i+=f}if(0===e.strm.avail_in)break;if(a=e.strm,o=e.window,h=e.strstart+e.lookahead,u=i,l=void 0,l=a.avail_in,u=x)for(s=e.strstart-e.insert,e.ins_h=e.window[s],e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x)if(n=u._tr_tally(e,e.strstart-e.match_start,e.match_length-x),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=x){for(e.match_length--;e.strstart++,e.ins_h=(e.ins_h<=x&&(e.ins_h=(e.ins_h<=x&&e.match_length<=e.prev_length){for(i=e.strstart+e.lookahead-x,n=u._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-x),e.lookahead-=e.prev_length-1,e.prev_length-=2;++e.strstart<=i&&(e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(j(e),0===e.lookahead&&t===l)return A;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,N(e,!1),0===e.strm.avail_out))return A;if(e.strstart-e.block_start>=e.w_size-z&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):(e.strstart>e.block_start&&(N(e,!1),e.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(e,t){return Y(e,t,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?_:(e.state.gzhead=t,m):_},r.deflate=function(e,t){var r,n,i,s;if(!e||!e.state||5>8&255),U(n,n.gzhead.time>>16&255),U(n,n.gzhead.time>>24&255),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,255&n.gzhead.os),n.gzhead.extra&&n.gzhead.extra.length&&(U(n,255&n.gzhead.extra.length),U(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=p(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=69):(U(n,0),U(n,0),U(n,0),U(n,0),U(n,0),U(n,9===n.level?2:2<=n.strategy||n.level<2?4:0),U(n,3),n.status=E);else{var a=v+(n.w_bits-8<<4)<<8;a|=(2<=n.strategy||n.level<2?0:n.level<6?1:6===n.level?2:3)<<6,0!==n.strstart&&(a|=32),a+=31-a%31,n.status=E,P(n,a),0!==n.strstart&&(P(n,e.adler>>>16),P(n,65535&e.adler)),e.adler=1}if(69===n.status)if(n.gzhead.extra){for(i=n.pending;n.gzindex<(65535&n.gzhead.extra.length)&&(n.pending!==n.pending_buf_size||(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending!==n.pending_buf_size));)U(n,255&n.gzhead.extra[n.gzindex]),n.gzindex++;n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex===n.gzhead.extra.length&&(n.gzindex=0,n.status=73)}else n.status=73;if(73===n.status)if(n.gzhead.name){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.gzindex=0,n.status=91)}else n.status=91;if(91===n.status)if(n.gzhead.comment){i=n.pending;do{if(n.pending===n.pending_buf_size&&(n.gzhead.hcrc&&n.pending>i&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),F(e),i=n.pending,n.pending===n.pending_buf_size)){s=1;break}s=n.gzindexi&&(e.adler=p(e.adler,n.pending_buf,n.pending-i,i)),0===s&&(n.status=103)}else n.status=103;if(103===n.status&&(n.gzhead.hcrc?(n.pending+2>n.pending_buf_size&&F(e),n.pending+2<=n.pending_buf_size&&(U(n,255&e.adler),U(n,e.adler>>8&255),e.adler=0,n.status=E)):n.status=E),0!==n.pending){if(F(e),0===e.avail_out)return n.last_flush=-1,m}else if(0===e.avail_in&&T(t)<=T(r)&&t!==f)return R(e,-5);if(666===n.status&&0!==e.avail_in)return R(e,-5);if(0!==e.avail_in||0!==n.lookahead||t!==l&&666!==n.status){var o=2===n.strategy?function(e,t){for(var r;;){if(0===e.lookahead&&(j(e),0===e.lookahead)){if(t===l)return A;break}if(e.match_length=0,r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):3===n.strategy?function(e,t){for(var r,n,i,s,a=e.window;;){if(e.lookahead<=S){if(j(e),e.lookahead<=S&&t===l)return A;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=x&&0e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=x?(r=u._tr_tally(e,1,e.match_length-x),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=u._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(N(e,!1),0===e.strm.avail_out))return A}return e.insert=0,t===f?(N(e,!0),0===e.strm.avail_out?O:B):e.last_lit&&(N(e,!1),0===e.strm.avail_out)?A:I}(n,t):h[n.level].func(n,t);if(o!==O&&o!==B||(n.status=666),o===A||o===O)return 0===e.avail_out&&(n.last_flush=-1),m;if(o===I&&(1===t?u._tr_align(n):5!==t&&(u._tr_stored_block(n,0,0,!1),3===t&&(D(n.head),0===n.lookahead&&(n.strstart=0,n.block_start=0,n.insert=0))),F(e),0===e.avail_out))return n.last_flush=-1,m}return t!==f?m:n.wrap<=0?1:(2===n.wrap?(U(n,255&e.adler),U(n,e.adler>>8&255),U(n,e.adler>>16&255),U(n,e.adler>>24&255),U(n,255&e.total_in),U(n,e.total_in>>8&255),U(n,e.total_in>>16&255),U(n,e.total_in>>24&255)):(P(n,e.adler>>>16),P(n,65535&e.adler)),F(e),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new c.Buf8(r.w_size),c.arraySet(u,t,l-r.w_size,r.w_size,0),t=u,l=r.w_size),a=e.avail_in,o=e.next_in,h=e.input,e.avail_in=l,e.next_in=0,e.input=t,j(r);r.lookahead>=x;){for(n=r.strstart,i=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<>>=y,p-=y),p<15&&(d+=z[n++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(d&(1<>>=y,p-=y,(y=s-a)>3,d&=(1<<(p-=w<<3))-1,e.next_in=n,e.next_out=s,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new I.Buf32(n),t.distcode=t.distdyn=new I.Buf32(i),t.sane=1,t.back=-1,N):U}function o(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,a(e)):U}function h(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||15=s.wsize?(I.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(n<(i=s.wsize-s.wnext)&&(i=n),I.arraySet(s.window,t,r-n,i,s.wnext),(n-=i)?(I.arraySet(s.window,t,r-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){e.msg="incorrect header check",r.mode=30;break}if(8!=(15&u)){e.msg="unknown compression method",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){e.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break e;o--,u+=n[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(d=r.length)&&(d=o),d&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,n,s,d,k)),512&r.flags&&(r.check=B(r.check,n,d,s)),o-=d,s+=d,r.length-=d),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break e;for(d=0;k=n[s+d++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&d>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break e;o--,u+=n[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break e;o--,u+=n[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==t)break;u>>>=2,l-=2;break e;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,u+=n[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===t)break e;case 15:r.mode=16;case 16:if(d=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){e.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],d=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+d>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=30;break}for(;d--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){e.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){e.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===t)break e;case 20:r.mode=21;case 21:if(6<=o&&258<=h){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,r.hold=u,r.bits=l,R(e,c),a=e.next_out,i=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){e.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break e;o--,u+=n[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){e.msg="invalid distance code",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===h)break e;if(d=c-h,r.offset>d){if((d=r.offset-d)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=30;break}p=d>r.wnext?(d-=r.wnext,r.wsize-d):r.wnext-d,d>r.length&&(d=r.length),m=r.window}else m=i,p=a-r.offset,d=r.length;for(hd?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=t[r+a[v]]}if(k>>7)]}function U(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function P(e,t,r){e.bi_valid>d-r?(e.bi_buf|=t<>d-e.bi_valid,e.bi_valid+=r-d):(e.bi_buf|=t<>>=1,r<<=1,0<--t;);return r>>>1}function Z(e,t,r){var n,i,s=new Array(g+1),a=0;for(n=1;n<=g;n++)s[n]=a=a+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=j(s[o]++,o))}}function W(e){var t;for(t=0;t>1;1<=r;r--)G(e,s,r);for(i=h;r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],G(e,s,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,s[2*i]=s[2*r]+s[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,s[2*r+1]=s[2*n+1]=i,e.heap[1]=i++,G(e,s,1),2<=e.heap_len;);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,s,a,o,h=t.dyn_tree,u=t.max_code,l=t.stat_desc.static_tree,f=t.stat_desc.has_stree,c=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,m=0;for(s=0;s<=g;s++)e.bl_count[s]=0;for(h[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;r<_;r++)p<(s=h[2*h[2*(n=e.heap[r])+1]+1]+1)&&(s=p,m++),h[2*n+1]=s,u>=7;n>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return o;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return h;for(t=32;t>>3,(s=e.static_len+3+7>>>3)<=i&&(i=s)):i=s=r+5,r+4<=i&&-1!==t?J(e,t,r,n):4===e.strategy||s===i?(P(e,2+(n?1:0),3),K(e,z,C)):(P(e,4+(n?1:0),3),function(e,t,r,n){var i;for(P(e,t-257,5),P(e,r-1,5),P(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(A[r]+u+1)]++,e.dyn_dtree[2*N(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){P(e,2,3),L(e,m,z),function(e){16===e.bi_valid?(U(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):8<=e.bi_valid&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":41}],53:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(e,t,r){(function(e){!function(r,n){"use strict";if(!r.setImmediate){var i,s,t,a,o=1,h={},u=!1,l=r.document,e=Object.getPrototypeOf&&Object.getPrototypeOf(r);e=e&&e.setTimeout?e:r,i="[object process]"==={}.toString.call(r.process)?function(e){process.nextTick(function(){c(e)})}:function(){if(r.postMessage&&!r.importScripts){var e=!0,t=r.onmessage;return r.onmessage=function(){e=!1},r.postMessage("","*"),r.onmessage=t,e}}()?(a="setImmediate$"+Math.random()+"$",r.addEventListener?r.addEventListener("message",d,!1):r.attachEvent("onmessage",d),function(e){r.postMessage(a+e,"*")}):r.MessageChannel?((t=new MessageChannel).port1.onmessage=function(e){c(e.data)},function(e){t.port2.postMessage(e)}):l&&"onreadystatechange"in l.createElement("script")?(s=l.documentElement,function(e){var t=l.createElement("script");t.onreadystatechange=function(){c(e),t.onreadystatechange=null,s.removeChild(t),t=null},s.appendChild(t)}):function(e){setTimeout(c,0,e)},e.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),r=0;r0&&i[i.length-1])||6!==o[0]&&2!==o[0])){a=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]>2],e+=s[(3&t[r])<<4|t[r+1]>>4],e+=s[(15&t[r+1])<<2|t[r+2]>>6],e+=s[63&t[r+2]];return n%3==2?e=e.substring(0,e.length-1)+"=":n%3==1&&(e=e.substring(0,e.length-2)+"=="),e},d=function(t){var e,n,r,i,o,a=.75*t.length,s=t.length,h=0;"="===t[t.length-1]&&(a--,"="===t[t.length-2]&&a--);var u=new Uint8Array(a);for(e=0;e>4,u[h++]=(15&r)<<4|i>>2,u[h++]=(3&i)<<6|63&o;return u},f=/^(data)?:?([\w\/\+]+)?;?(charset=[\w-]+|base64)?.*,/i,p=function(t){var e=t.trim(),n=e.substring(0,100).match(f);if(!n)return d(e);var r=n[0],i=e.substring(r.length);return d(i)},g=function(t){return t.charCodeAt(0)},v=function(t){return t.codePointAt(0)},y=function(t,e){return x(t.toString(16),e,"0").toUpperCase()},m=function(t){return y(t,2)},b=function(t){return String.fromCharCode(t)},w=function(t){return b(parseInt(t,16))},x=function(t,e,n){for(var r="",i=0,o=e-t.length;i=55296&&r<=56319&&t.length>i&&(n=t.charCodeAt(i))>=56320&&n<=57343&&(o=2),[t.slice(e,e+o),o]},R=function(t){for(var e=[],n=0,r=t.length;nn&&h(),a+=d,s+=f}}return h(),l},D=/^D:(\d\d\d\d)(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([+\-Z])?(\d\d)?'?(\d\d)?'?$/,B=function(t){var e=t.match(D);if(e){var n=e[1],r=e[2],i=void 0===r?"01":r,o=e[3],a=void 0===o?"01":o,s=e[4],l=void 0===s?"00":s,h=e[5],u=void 0===h?"00":h,c=e[6],d=void 0===c?"00":c,f=e[7],p=void 0===f?"Z":f,g=e[8],v=void 0===g?"00":g,y=e[9];return new Date(n+"-"+i+"-"+a+"T"+l+":"+u+":"+d+("Z"===p?"Z":""+p+v+":"+(void 0===y?"00":y)))}},N=function(t,e){for(var n,r,i=0;i=0&&t<=65535},J=function(t){return t>=65536&&t<=1114111},Q=function(t){return Math.floor((t-65536)/1024)+55296},$=function(t){return(t-65536)%1024+56320};!function(t){t.BigEndian="BigEndian",t.LittleEndian="LittleEndian"}(u||(u={}));var tt="�".codePointAt(0),et=function(t,e){if(void 0===e&&(e=!0),t.length<=1)return String.fromCodePoint(tt);for(var n=e?ot(t):u.BigEndian,r=e?2:0,i=[];t.length-r>=2;){var o=it(t[r++],t[r++],n);if(nt(o))if(t.length-r<2)i.push(tt);else{var a=it(t[r++],t[r++],n);rt(a)?i.push(o,a):i.push(tt)}else rt(o)?(r+=2,i.push(tt)):i.push(o)}return r=55296&&t<=56319},rt=function(t){return t>=56320&&t<=57343},it=function(t,e,n){if(n===u.LittleEndian)return e<<8|t;if(n===u.BigEndian)return t<<8|e;throw new Error("Invalid byteOrder: "+n)},ot=function(t){return at(t)?u.BigEndian:st(t)?u.LittleEndian:u.BigEndian},at=function(t){return 254===t[0]&&255===t[1]},st=function(t){return 255===t[0]&&254===t[1]},lt=function(t){return at(t)||st(t)},ht=function(t){var e,n=String(t);if(Math.abs(t)<1){if(e=parseInt(t.toString().split("e-")[1])){var r=t<0;r&&(t*=-1),t*=Math.pow(10,e-1),n="0."+new Array(e).join("0")+t.toString().substring(2),r&&(n="-"+n)}}else(e=parseInt(t.toString().split("+")[1]))>20&&(e-=20,n=(t/=Math.pow(10,e)).toString()+new Array(e+1).join("0"));return n},ut=function(t){return Math.ceil(t.toString(2).length/8)},ct=function(t){for(var e=new Uint8Array(ut(t)),n=1;n<=e.length;n++)e[n-1]=t>>8*(e.length-n);return e},dt=function(t){throw new Error(t)};function ft(t,e,n){return t(n={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&n.path)}},n.exports),n.exports}var pt=ft((function(t,e){var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function r(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.assign=function(t){for(var e=Array.prototype.slice.call(arguments,1);e.length;){var n=e.shift();if(n){if("object"!=typeof n)throw new TypeError(n+"must be non-object");for(var i in n)r(n,i)&&(t[i]=n[i])}}return t},e.shrinkBuf=function(t,e){return t.length===e?t:t.subarray?t.subarray(0,e):(t.length=e,t)};var i={arraySet:function(t,e,n,r,i){if(e.subarray&&t.subarray)t.set(e.subarray(n,n+r),i);else for(var o=0;o=0;)t[e]=0}var vt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],yt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],mt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],bt=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],wt=new Array(576);gt(wt);var xt=new Array(60);gt(xt);var kt=new Array(512);gt(kt);var Ft=new Array(256);gt(Ft);var St=new Array(29);gt(St);var Ct,At,Tt,Pt=new Array(30);function zt(t,e,n,r,i){this.static_tree=t,this.extra_bits=e,this.extra_base=n,this.elems=r,this.max_length=i,this.has_stree=t&&t.length}function Rt(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function Ot(t){return t<256?kt[t]:kt[256+(t>>>7)]}function Dt(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function Bt(t,e,n){t.bi_valid>16-n?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=n-16):(t.bi_buf|=e<>>=1,n<<=1}while(--e>0);return n>>>1}function jt(t,e,n){var r,i,o=new Array(16),a=0;for(r=1;r<=15;r++)o[r]=a=a+n[r-1]<<1;for(i=0;i<=e;i++){var s=t[2*i+1];0!==s&&(t[2*i]=Et(o[s]++,s))}}function Mt(t){var e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function It(t){t.bi_valid>8?Dt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function Ut(t,e,n,r){var i=2*e,o=2*n;return t[i]>1;n>=1;n--)Vt(t,o,n);i=l;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Vt(t,o,1),r=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=r,o[2*i]=o[2*n]+o[2*r],t.depth[i]=(t.depth[n]>=t.depth[r]?t.depth[n]:t.depth[r])+1,o[2*n+1]=o[2*r+1]=i,t.heap[1]=i++,Vt(t,o,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var n,r,i,o,a,s,l=e.dyn_tree,h=e.max_code,u=e.stat_desc.static_tree,c=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(o=0;o<=15;o++)t.bl_count[o]=0;for(l[2*t.heap[t.heap_max]+1]=0,n=t.heap_max+1;n<573;n++)(o=l[2*l[2*(r=t.heap[n])+1]+1]+1)>p&&(o=p,g++),l[2*r+1]=o,r>h||(t.bl_count[o]++,a=0,r>=f&&(a=d[r-f]),s=l[2*r],t.opt_len+=s*(o+a),c&&(t.static_len+=s*(u[2*r+1]+a)));if(0!==g){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(o=p;0!==o;o--)for(r=t.bl_count[o];0!==r;)(i=t.heap[--n])>h||(l[2*i+1]!==o&&(t.opt_len+=(o-l[2*i+1])*l[2*i],l[2*i+1]=o),r--)}}(t,e),jt(o,h,t.bl_count)}function Lt(t,e,n){var r,i,o=-1,a=e[1],s=0,l=7,h=4;for(0===a&&(l=138,h=3),e[2*(n+1)+1]=65535,r=0;r<=n;r++)i=a,a=e[2*(r+1)+1],++s>=7;r<30;r++)for(Pt[r]=i<<7,t=0;t<1<0?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,n=4093624447;for(e=0;e<=31;e++,n>>>=1)if(1&n&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0}(t)),qt(t,t.l_desc),qt(t,t.d_desc),a=function(t){var e;for(Lt(t,t.dyn_ltree,t.l_desc.max_code),Lt(t,t.dyn_dtree,t.d_desc.max_code),qt(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*bt[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),i=t.opt_len+3+7>>>3,(o=t.static_len+3+7>>>3)<=i&&(i=o)):i=o=n+5,n+4<=i&&-1!==e?Ht(t,e,n,r):4===t.strategy||o===i?(Bt(t,2+(r?1:0),3),Wt(t,wt,xt)):(Bt(t,4+(r?1:0),3),function(t,e,n,r){var i;for(Bt(t,e-257,5),Bt(t,n-1,5),Bt(t,r-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&n,t.last_lit++,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(Ft[n]+256+1)]++,t.dyn_dtree[2*Ot(e)]++),t.last_lit===t.lit_bufsize-1},_tr_align:function(t){Bt(t,2,3),Nt(t,256,wt),function(t){16===t.bi_valid?(Dt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}};var Xt=function(t,e,n,r){for(var i=65535&t|0,o=t>>>16&65535|0,a=0;0!==n;){n-=a=n>2e3?2e3:n;do{o=o+(i=i+e[r++]|0)|0}while(--a);i%=65521,o%=65521}return i|o<<16|0};var Zt=function(){for(var t,e=[],n=0;n<256;n++){t=n;for(var r=0;r<8;r++)t=1&t?3988292384^t>>>1:t>>>1;e[n]=t}return e}();var Yt,Jt=function(t,e,n,r){var i=Zt,o=r+n;t^=-1;for(var a=r;a>>8^i[255&(t^e[a])];return-1^t},Qt={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};function $t(t,e){return t.msg=Qt[e],e}function te(t){return(t<<1)-(t>4?9:0)}function ee(t){for(var e=t.length;--e>=0;)t[e]=0}function ne(t){var e=t.state,n=e.pending;n>t.avail_out&&(n=t.avail_out),0!==n&&(pt.arraySet(t.output,e.pending_buf,e.pending_out,n,t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,0===e.pending&&(e.pending_out=0))}function re(t,e){_t._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,ne(t.strm)}function ie(t,e){t.pending_buf[t.pending++]=e}function oe(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function ae(t,e,n,r){var i=t.avail_in;return i>r&&(i=r),0===i?0:(t.avail_in-=i,pt.arraySet(e,t.input,t.next_in,i,n),1===t.state.wrap?t.adler=Xt(t.adler,e,i,n):2===t.state.wrap&&(t.adler=Jt(t.adler,e,i,n)),t.next_in+=i,t.total_in+=i,i)}function se(t,e){var n,r,i=t.max_chain_length,o=t.strstart,a=t.prev_length,s=t.nice_match,l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,h=t.window,u=t.w_mask,c=t.prev,d=t.strstart+258,f=h[o+a-1],p=h[o+a];t.prev_length>=t.good_match&&(i>>=2),s>t.lookahead&&(s=t.lookahead);do{if(h[(n=e)+a]===p&&h[n+a-1]===f&&h[n]===h[o]&&h[++n]===h[o+1]){o+=2,n++;do{}while(h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&oa){if(t.match_start=e,a=r,r>=s)break;f=h[o+a-1],p=h[o+a]}}}while((e=c[e&u])>l&&0!=--i);return a<=t.lookahead?a:t.lookahead}function le(t){var e,n,r,i,o,a=t.w_size;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=a+(a-262)){pt.arraySet(t.window,t.window,a,a,0),t.match_start-=a,t.strstart-=a,t.block_start-=a,e=n=t.hash_size;do{r=t.head[--e],t.head[e]=r>=a?r-a:0}while(--n);e=n=a;do{r=t.prev[--e],t.prev[e]=r>=a?r-a:0}while(--n);i+=a}if(0===t.strm.avail_in)break;if(n=ae(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(o=t.strstart-t.insert,t.ins_h=t.window[o],t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<=3)if(r=_t._tr_tally(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,r=_t._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=(t.ins_h<15&&(a=2,r-=16),i<1||i>9||8!==n||r<8||r>15||e<0||e>9||o<0||o>4)return $t(t,-2);8===r&&(r=9);var s=new de;return t.state=s,s.strm=t,s.wrap=a,s.gzhead=null,s.w_bits=r,s.w_size=1<t.pending_buf_size-5&&(n=t.pending_buf_size-5);;){if(t.lookahead<=1){if(le(t),0===t.lookahead&&0===e)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var r=t.block_start+n;if((0===t.strstart||t.strstart>=r)&&(t.lookahead=t.strstart-r,t.strstart=r,re(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&(re(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(re(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(re(t,!1),t.strm.avail_out),1)})),new ce(4,4,8,4,he),new ce(4,5,16,8,he),new ce(4,6,32,32,he),new ce(4,4,16,16,ue),new ce(8,16,32,32,ue),new ce(8,16,128,128,ue),new ce(8,32,128,256,ue),new ce(32,128,258,1024,ue),new ce(32,258,258,4096,ue)];var ve={deflateInit:function(t,e){return ge(t,e,8,15,8,0)},deflateInit2:ge,deflateReset:pe,deflateResetKeep:fe,deflateSetHeader:function(t,e){return t&&t.state?2!==t.state.wrap?-2:(t.state.gzhead=e,0):-2},deflate:function(t,e){var n,r,i,o;if(!t||!t.state||e>5||e<0)return t?$t(t,-2):-2;if(r=t.state,!t.output||!t.input&&0!==t.avail_in||666===r.status&&4!==e)return $t(t,0===t.avail_out?-5:-2);if(r.strm=t,n=r.last_flush,r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,ie(r,31),ie(r,139),ie(r,8),r.gzhead?(ie(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),ie(r,255&r.gzhead.time),ie(r,r.gzhead.time>>8&255),ie(r,r.gzhead.time>>16&255),ie(r,r.gzhead.time>>24&255),ie(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),ie(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(ie(r,255&r.gzhead.extra.length),ie(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=Jt(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(ie(r,0),ie(r,0),ie(r,0),ie(r,0),ie(r,0),ie(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),ie(r,3),r.status=113);else{var a=8+(r.w_bits-8<<4)<<8;a|=(r.strategy>=2||r.level<2?0:r.level<6?1:6===r.level?2:3)<<6,0!==r.strstart&&(a|=32),a+=31-a%31,r.status=113,oe(r,a),0!==r.strstart&&(oe(r,t.adler>>>16),oe(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(i=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>i&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),ne(t),i=r.pending,r.pending!==r.pending_buf_size));)ie(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),ne(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),ne(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=Jt(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&ne(t),r.pending+2<=r.pending_buf_size&&(ie(r,255&t.adler),ie(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(ne(t),0===t.avail_out)return r.last_flush=-1,0}else if(0===t.avail_in&&te(e)<=te(n)&&4!==e)return $t(t,-5);if(666===r.status&&0!==t.avail_in)return $t(t,-5);if(0!==t.avail_in||0!==r.lookahead||0!==e&&666!==r.status){var s=2===r.strategy?function(t,e){for(var n;;){if(0===t.lookahead&&(le(t),0===t.lookahead)){if(0===e)return 1;break}if(t.match_length=0,n=_t._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&(re(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(re(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(re(t,!1),0===t.strm.avail_out)?1:2}(r,e):3===r.strategy?function(t,e){for(var n,r,i,o,a=t.window;;){if(t.lookahead<=258){if(le(t),t.lookahead<=258&&0===e)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=a[i=t.strstart-1])===a[++i]&&r===a[++i]&&r===a[++i]){o=t.strstart+258;do{}while(r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(n=_t._tr_tally(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=_t._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&(re(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(re(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(re(t,!1),0===t.strm.avail_out)?1:2}(r,e):Yt[r.level].func(r,e);if(3!==s&&4!==s||(r.status=666),1===s||3===s)return 0===t.avail_out&&(r.last_flush=-1),0;if(2===s&&(1===e?_t._tr_align(r):5!==e&&(_t._tr_stored_block(r,0,0,!1),3===e&&(ee(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),ne(t),0===t.avail_out))return r.last_flush=-1,0}return 4!==e?0:r.wrap<=0?1:(2===r.wrap?(ie(r,255&t.adler),ie(r,t.adler>>8&255),ie(r,t.adler>>16&255),ie(r,t.adler>>24&255),ie(r,255&t.total_in),ie(r,t.total_in>>8&255),ie(r,t.total_in>>16&255),ie(r,t.total_in>>24&255)):(oe(r,t.adler>>>16),oe(r,65535&t.adler)),ne(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?0:1)},deflateEnd:function(t){var e;return t&&t.state?42!==(e=t.state.status)&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?$t(t,-2):(t.state=null,113===e?$t(t,-3):0):-2},deflateSetDictionary:function(t,e){var n,r,i,o,a,s,l,h,u=e.length;if(!t||!t.state)return-2;if(2===(o=(n=t.state).wrap)||1===o&&42!==n.status||n.lookahead)return-2;for(1===o&&(t.adler=Xt(t.adler,e,u,0)),n.wrap=0,u>=n.w_size&&(0===o&&(ee(n.head),n.strstart=0,n.block_start=0,n.insert=0),h=new pt.Buf8(n.w_size),pt.arraySet(h,e,u-n.w_size,n.w_size,0),e=h,u=n.w_size),a=t.avail_in,s=t.next_in,l=t.input,t.avail_in=u,t.next_in=0,t.input=e,le(n);n.lookahead>=3;){r=n.strstart,i=n.lookahead-2;do{n.ins_h=(n.ins_h<=252?6:we>=248?5:we>=240?4:we>=224?3:we>=192?2:1;be[254]=be[254]=1;function xe(t,e){if(e<65534&&(t.subarray&&me||!t.subarray&&ye))return String.fromCharCode.apply(null,pt.shrinkBuf(t,e));for(var n="",r=0;r>>6,e[o++]=128|63&n):n<65536?(e[o++]=224|n>>>12,e[o++]=128|n>>>6&63,e[o++]=128|63&n):(e[o++]=240|n>>>18,e[o++]=128|n>>>12&63,e[o++]=128|n>>>6&63,e[o++]=128|63&n);return e},Fe=function(t){return xe(t,t.length)},Se=function(t){for(var e=new pt.Buf8(t.length),n=0,r=e.length;n4)s[r++]=65533,n+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&n1?s[r++]=65533:i<65536?s[r++]=i:(i-=65536,s[r++]=55296|i>>10&1023,s[r++]=56320|1023&i)}return xe(s,r)},Ae=function(t,e){var n;for((e=e||t.length)>t.length&&(e=t.length),n=e-1;n>=0&&128==(192&t[n]);)n--;return n<0||0===n?e:n+be[t[n]]>e?n:e};var Te=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},Pe=Object.prototype.toString;function ze(t){if(!(this instanceof ze))return new ze(t);this.options=pt.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Te,this.strm.avail_out=0;var n=ve.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(0!==n)throw new Error(Qt[n]);if(e.header&&ve.deflateSetHeader(this.strm,e.header),e.dictionary){var r;if(r="string"==typeof e.dictionary?ke(e.dictionary):"[object ArrayBuffer]"===Pe.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,0!==(n=ve.deflateSetDictionary(this.strm,r)))throw new Error(Qt[n]);this._dict_set=!0}}function Re(t,e){var n=new ze(e);if(n.push(t,!0),n.err)throw n.msg||Qt[n.err];return n.result}ze.prototype.push=function(t,e){var n,r,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;r=e===~~e?e:!0===e?4:0,"string"==typeof t?i.input=ke(t):"[object ArrayBuffer]"===Pe.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new pt.Buf8(o),i.next_out=0,i.avail_out=o),1!==(n=ve.deflate(i,r))&&0!==n)return this.onEnd(n),this.ended=!0,!1;0!==i.avail_out&&(0!==i.avail_in||4!==r&&2!==r)||("string"===this.options.to?this.onData(Fe(pt.shrinkBuf(i.output,i.next_out))):this.onData(pt.shrinkBuf(i.output,i.next_out)))}while((i.avail_in>0||0===i.avail_out)&&1!==n);return 4===r?(n=ve.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,0===n):2!==r||(this.onEnd(0),i.avail_out=0,!0)},ze.prototype.onData=function(t){this.chunks.push(t)},ze.prototype.onEnd=function(t){0===t&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=pt.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Oe={Deflate:ze,deflate:Re,deflateRaw:function(t,e){return(e=e||{}).raw=!0,Re(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,Re(t,e)}},De=function(t,e){var n,r,i,o,a,s,l,h,u,c,d,f,p,g,v,y,m,b,w,x,k,F,S,C,A;n=t.state,r=t.next_in,C=t.input,i=r+(t.avail_in-5),o=t.next_out,A=t.output,a=o-(e-t.avail_out),s=o+(t.avail_out-257),l=n.dmax,h=n.wsize,u=n.whave,c=n.wnext,d=n.window,f=n.hold,p=n.bits,g=n.lencode,v=n.distcode,y=(1<>>=w=b>>>24,p-=w,0===(w=b>>>16&255))A[o++]=65535&b;else{if(!(16&w)){if(0==(64&w)){b=g[(65535&b)+(f&(1<>>=w,p-=w),p<15&&(f+=C[r++]<>>=w=b>>>24,p-=w,!(16&(w=b>>>16&255))){if(0==(64&w)){b=v[(65535&b)+(f&(1<l){t.msg="invalid distance too far back",n.mode=30;break t}if(f>>>=w,p-=w,k>(w=o-a)){if((w=k-w)>u&&n.sane){t.msg="invalid distance too far back",n.mode=30;break t}if(F=0,S=d,0===c){if(F+=h-w,w2;)A[o++]=S[F++],A[o++]=S[F++],A[o++]=S[F++],x-=3;x&&(A[o++]=S[F++],x>1&&(A[o++]=S[F++]))}else{F=o-k;do{A[o++]=A[F++],A[o++]=A[F++],A[o++]=A[F++],x-=3}while(x>2);x&&(A[o++]=A[F++],x>1&&(A[o++]=A[F++]))}break}}break}}while(r>3,f&=(1<<(p-=x<<3))-1,t.next_in=r,t.next_out=o,t.avail_in=r=1&&0===R[x];x--);if(k>x&&(k=x),0===x)return i[o++]=20971520,i[o++]=20971520,s.bits=1,0;for(w=1;w0&&(0===t||1!==x))return-1;for(O[1]=0,m=1;m<15;m++)O[m+1]=O[m]+R[m];for(b=0;b852||2===t&&A>592)return 1;for(;;){p=m-S,a[b]f?(g=D[B+a[b]],v=P[z+a[b]]):(g=96,v=0),l=1<>S)+(h-=l)]=p<<24|g<<16|v|0}while(0!==h);for(l=1<>=1;if(0!==l?(T&=l-1,T+=l):T=0,b++,0==--R[m]){if(m===x)break;m=e[n+a[b]]}if(m>k&&(T&c)!==u){for(0===S&&(S=k),d+=w,C=1<<(F=m-S);F+S852||2===t&&A>592)return 1;i[u=T&c]=k<<24|F<<16|d-o|0}}return 0!==T&&(i[d+T]=m-S<<24|64<<16|0),s.bits=k,0};function Ie(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function Ue(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new pt.Buf16(320),this.work=new pt.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function Ve(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new pt.Buf32(852),e.distcode=e.distdyn=new pt.Buf32(592),e.sane=1,e.back=-1,0):-2}function We(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,Ve(t)):-2}function qe(t,e){var n,r;return t&&t.state?(r=t.state,e<0?(n=0,e=-e):(n=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?-2:(null!==r.window&&r.wbits!==e&&(r.window=null),r.wrap=n,r.wbits=e,We(t))):-2}function Le(t,e){var n,r;return t?(r=new Ue,t.state=r,r.window=null,0!==(n=qe(t,e))&&(t.state=null),n):-2}var Ke,Ge,He=!0;function _e(t){if(He){var e;for(Ke=new pt.Buf32(512),Ge=new pt.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Me(1,t.lens,0,288,Ke,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Me(2,t.lens,0,32,Ge,0,t.work,{bits:5}),He=!1}t.lencode=Ke,t.lenbits=9,t.distcode=Ge,t.distbits=5}function Xe(t,e,n,r){var i,o=t.state;return null===o.window&&(o.wsize=1<=o.wsize?(pt.arraySet(o.window,e,n-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((i=o.wsize-o.wnext)>r&&(i=r),pt.arraySet(o.window,e,n-r,i,o.wnext),(r-=i)?(pt.arraySet(o.window,e,n-r,r,0),o.wnext=r,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,n.check=Jt(n.check,T,2,0),h=0,u=0,n.mode=2;break}if(n.flags=0,n.head&&(n.head.done=!1),!(1&n.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",n.mode=30;break}if(8!=(15&h)){t.msg="unknown compression method",n.mode=30;break}if(u-=4,k=8+(15&(h>>>=4)),0===n.wbits)n.wbits=k;else if(k>n.wbits){t.msg="invalid window size",n.mode=30;break}n.dmax=1<>8&1),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=Jt(n.check,T,2,0)),h=0,u=0,n.mode=3;case 3:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>8&255,T[2]=h>>>16&255,T[3]=h>>>24&255,n.check=Jt(n.check,T,4,0)),h=0,u=0,n.mode=4;case 4:for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>8),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=Jt(n.check,T,2,0)),h=0,u=0,n.mode=5;case 5:if(1024&n.flags){for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>>8&255,n.check=Jt(n.check,T,2,0)),h=0,u=0}else n.head&&(n.head.extra=null);n.mode=6;case 6:if(1024&n.flags&&((f=n.length)>s&&(f=s),f&&(n.head&&(k=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Array(n.head.extra_len)),pt.arraySet(n.head.extra,r,o,f,k)),512&n.flags&&(n.check=Jt(n.check,r,f,o)),s-=f,o+=f,n.length-=f),n.length))break t;n.length=0,n.mode=7;case 7:if(2048&n.flags){if(0===s)break t;f=0;do{k=r[o+f++],n.head&&k&&n.length<65536&&(n.head.name+=String.fromCharCode(k))}while(k&&f>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=12;break;case 10:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>=7&u,u-=7&u,n.mode=27;break}for(;u<3;){if(0===s)break t;s--,h+=r[o++]<>>=1)){case 0:n.mode=14;break;case 1:if(_e(n),n.mode=20,6===e){h>>>=2,u-=2;break t}break;case 2:n.mode=17;break;case 3:t.msg="invalid block type",n.mode=30}h>>>=2,u-=2;break;case 14:for(h>>>=7&u,u-=7&u;u<32;){if(0===s)break t;s--,h+=r[o++]<>>16^65535)){t.msg="invalid stored block lengths",n.mode=30;break}if(n.length=65535&h,h=0,u=0,n.mode=15,6===e)break t;case 15:n.mode=16;case 16:if(f=n.length){if(f>s&&(f=s),f>l&&(f=l),0===f)break t;pt.arraySet(i,r,o,f,a),s-=f,o+=f,l-=f,a+=f,n.length-=f;break}n.mode=12;break;case 17:for(;u<14;){if(0===s)break t;s--,h+=r[o++]<>>=5,u-=5,n.ndist=1+(31&h),h>>>=5,u-=5,n.ncode=4+(15&h),h>>>=4,u-=4,n.nlen>286||n.ndist>30){t.msg="too many length or distance symbols",n.mode=30;break}n.have=0,n.mode=18;case 18:for(;n.have>>=3,u-=3}for(;n.have<19;)n.lens[P[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,S={bits:n.lenbits},F=Me(0,n.lens,0,19,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid code lengths set",n.mode=30;break}n.have=0,n.mode=19;case 19:for(;n.have>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=v,u-=v,n.lens[n.have++]=m;else{if(16===m){for(C=v+2;u>>=v,u-=v,0===n.have){t.msg="invalid bit length repeat",n.mode=30;break}k=n.lens[n.have-1],f=3+(3&h),h>>>=2,u-=2}else if(17===m){for(C=v+3;u>>=v)),h>>>=3,u-=3}else{for(C=v+7;u>>=v)),h>>>=7,u-=7}if(n.have+f>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=30;break}for(;f--;)n.lens[n.have++]=k}}if(30===n.mode)break;if(0===n.lens[256]){t.msg="invalid code -- missing end-of-block",n.mode=30;break}if(n.lenbits=9,S={bits:n.lenbits},F=Me(1,n.lens,0,n.nlen,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid literal/lengths set",n.mode=30;break}if(n.distbits=6,n.distcode=n.distdyn,S={bits:n.distbits},F=Me(2,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,S),n.distbits=S.bits,F){t.msg="invalid distances set",n.mode=30;break}if(n.mode=20,6===e)break t;case 20:n.mode=21;case 21:if(s>=6&&l>=258){t.next_out=a,t.avail_out=l,t.next_in=o,t.avail_in=s,n.hold=h,n.bits=u,De(t,d),a=t.next_out,i=t.output,l=t.avail_out,o=t.next_in,r=t.input,s=t.avail_in,h=n.hold,u=n.bits,12===n.mode&&(n.back=-1);break}for(n.back=0;y=(A=n.lencode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,n.length=m,0===y){n.mode=26;break}if(32&y){n.back=-1,n.mode=12;break}if(64&y){t.msg="invalid literal/length code",n.mode=30;break}n.extra=15&y,n.mode=22;case 22:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;y=(A=n.distcode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,64&y){t.msg="invalid distance code",n.mode=30;break}n.offset=m,n.extra=15&y,n.mode=24;case 24:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=30;break}n.mode=25;case 25:if(0===l)break t;if(f=d-l,n.offset>f){if((f=n.offset-f)>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=30;break}f>n.wnext?(f-=n.wnext,p=n.wsize-f):p=n.wnext-f,f>n.length&&(f=n.length),g=n.window}else g=i,p=a-n.offset,f=n.length;f>l&&(f=l),l-=f,n.length-=f;do{i[a++]=g[p++]}while(--f);0===n.length&&(n.mode=21);break;case 26:if(0===l)break t;i[a++]=n.length,l--,n.mode=21;break;case 27:if(n.wrap){for(;u<32;){if(0===s)break t;s--,h|=r[o++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Te,this.strm.avail_out=0;var n=Ze.inflateInit2(this.strm,e.windowBits);if(n!==Ye.Z_OK)throw new Error(Qt[n]);if(this.header=new Je,Ze.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=ke(e.dictionary):"[object ArrayBuffer]"===Qe.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=Ze.inflateSetDictionary(this.strm,e.dictionary))!==Ye.Z_OK))throw new Error(Qt[n])}function tn(t,e){var n=new $e(e);if(n.push(t,!0),n.err)throw n.msg||Qt[n.err];return n.result}$e.prototype.push=function(t,e){var n,r,i,o,a,s=this.strm,l=this.options.chunkSize,h=this.options.dictionary,u=!1;if(this.ended)return!1;r=e===~~e?e:!0===e?Ye.Z_FINISH:Ye.Z_NO_FLUSH,"string"==typeof t?s.input=Se(t):"[object ArrayBuffer]"===Qe.call(t)?s.input=new Uint8Array(t):s.input=t,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new pt.Buf8(l),s.next_out=0,s.avail_out=l),(n=Ze.inflate(s,Ye.Z_NO_FLUSH))===Ye.Z_NEED_DICT&&h&&(n=Ze.inflateSetDictionary(this.strm,h)),n===Ye.Z_BUF_ERROR&&!0===u&&(n=Ye.Z_OK,u=!1),n!==Ye.Z_STREAM_END&&n!==Ye.Z_OK)return this.onEnd(n),this.ended=!0,!1;s.next_out&&(0!==s.avail_out&&n!==Ye.Z_STREAM_END&&(0!==s.avail_in||r!==Ye.Z_FINISH&&r!==Ye.Z_SYNC_FLUSH)||("string"===this.options.to?(i=Ae(s.output,s.next_out),o=s.next_out-i,a=Ce(s.output,i),s.next_out=o,s.avail_out=l-o,o&&pt.arraySet(s.output,s.output,i,o,0),this.onData(a)):this.onData(pt.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(u=!0)}while((s.avail_in>0||0===s.avail_out)&&n!==Ye.Z_STREAM_END);return n===Ye.Z_STREAM_END&&(r=Ye.Z_FINISH),r===Ye.Z_FINISH?(n=Ze.inflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===Ye.Z_OK):r!==Ye.Z_SYNC_FLUSH||(this.onEnd(Ye.Z_OK),s.avail_out=0,!0)},$e.prototype.onData=function(t){this.chunks.push(t)},$e.prototype.onEnd=function(t){t===Ye.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=pt.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var en={Inflate:$e,inflate:tn,inflateRaw:function(t,e){return(e=e||{}).raw=!0,tn(t,e)},ungzip:tn},nn={};(0,pt.assign)(nn,Oe,en,Ye);for(var rn=nn,on="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",an=new Uint8Array(256),sn=0;sn>4,h[l++]=(15&r)<<4|i>>2,h[l++]=(3&i)<<6|63&o;return h}(t)))},un={Courier:"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","Courier-Bold":"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","Courier-Oblique":"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","Courier-BoldOblique":"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",Helvetica:"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","Helvetica-Bold":"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","Helvetica-Oblique":"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","Helvetica-BoldOblique":"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","Times-Roman":"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","Times-Bold":"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","Times-Italic":"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","Times-BoldItalic":"eJyFnV9TG0myxb8K0U/3RjC7NgZj5o0ZZnYGz5pZGyH3bsyDEA3oImhWfxCajf3ut1Xqyjx5Mkt+cbh/p9RdlZV1qrrVJf5T/dg+PjZPi+r76urvy/nortk7PPpwfLh39P7DyUm1X/3cPi0+jR6brsDl5LGZf/dDO735dTGaTsYbdTmdorq3UfdUHj1Opmss0MFhM7m731xwU7Y73pY+fbqbdqW+e3vUkfnPk9fm5vfJYnxffb+YLZv96sf70Ww0XjSzL83msz+9Lpqnm+bmc/s4euqr+cMP7Wv1/b++O3jzZv+7g7cf9k9O3u+fHLz9Y78adGVn08lT83s7nywm7dPmSl0xFS7vJ+OHp2Y+r74/6vhVM5unYtWbNwd/efPmTXeNT+1iMt605Mf2eT3bNGLvf8b/u/f25MPR/ubf4/Tvyebfkzfp33fp3+O905v2utn7sp4vmsf53q9P43b23M5Gi+bmL3t7p9Pp3ufN2eZ7n5t5M3vp6DaYk/neaG8xG900j6PZw157u/fb5KldrJ+b735puk+d/m1v9HTz13a2N+k+PF9ezyc3k9Fs0sz/0lX3p+4yN5Onuy/j+yZ1QKrFl0X3kdHsJqtdwR9Hz7/0ffL+/cl+9TUfHb4/2K9O5+NNpGed+OHdfnXWyHEX4+P96svi5pdhV/Yg/feq++/bg7fb/vp7s5hNxl1E//Wfavi1+v5gE9lPXU3mz6MukP/d3+J3XcwSbl7H09Gj8KOjoy3/97LtQnU9VeVNf6Kn5eP1pqfunrx2006no5nwD+/ebflzMxtvMj4Lx8cftsLosZPmXXi0ZvkzqQapy732PJo1T9PmtiTZj0n1RvPNGecPqhz3yvN0ORcqMRt3A3XkL3G/fr5vnnzxrimTVltykBs5n47m9742fzaz1tP2qfFwsQpKLu5nTVD2tl3OAjp5CcrOJ68BbF6aoG+bOKZPE6iwhGjcTtsnj+fN48RK0gPTjQ842vx7OZp6fDdrupEcNPPfy2aevEZT8KDve637+/fHW3bq0Q8e/ahpe9Cf7MyX+smjn/0H/+aHwC9+UP7qG3buT/9R0du3W/Sbtjuf6+++Ep88uvDn+t2X+oevxGewjvdb9MWf69Kfa+DPdeVrP/SlvvrT1x790yffdTeZPTQLYxsyRq87zY5T/hx5yrF4yngyGU9m4+Wj77XlxrXn3dQTDJHkb6Yy6lMeXQs6PDzsx1jgv75UcOVb/8E73433PkgTj/7Pn+vBl9IhLGn/6K8YmE5ge8/BqPdDaObR3Ndr4Sux9CF88Um48pV49R9c+0r8qejwg+aXTYSDg9zrMJna8ruycTGZ3hSn+pt2FcTZzM46EyzSQk2T421u/+1mYYg+K59ZR3PH7bSdTQI+bwpnGS9n3TQ+XvsuS8NmPklL18D+t6uWeFjdLSed8tgu4pXDRk4n/oZMoc+JczsJWLB+6lZy4XLgZnR3F01pW45LMVpwbPqumTU3/qPdWmh0Nxs9g6nlj153dxFN0EoN7/VoviPCu9XC+ks6wOrdXUGOzXQ6eZ5P5oHUtXVx3y7NWtFN+ya5tedmo5fABkfj5SJauiQvv502r16jkZXx42g8i5Y717MmuvBNuxiNzYhTadL1JAZAlBmOQ61sc9OFNFqjLp/uRrPl43S0DC7T3nXLzIfgdCNsB/TLo8nZk2xwp7rqOXjf53w7u7ntlnlmXagLFDvH6vrDcrnAhV7gncwJs5vHzueWU7yCnGmkTDzjZjPk5/Ng+poW1uZtoZ5tkPTd6OxuiLush16TlZzrUJ2Ybf7p5G+zRiemsEv1dLbvdG3kaiCTxc3kZXITdFJta6bL5WBoaLXth3SdF3xIJ0gagzJVpzsvGiTQVH9KvZ4ZKIp9GKTmNBr0M9RD0hP0Ab0HcBfRO4bOIeAWxN5iUkOPD4+z2D/0CC5FnqOrQpsH2so4Lp+iCujwKOWotVRd50dn0xup0tmsrUI4vVFqhphmAidH1MWrvfrhSR+waftn83QXXP6zvYTew0WN1OTYOUgCUYcXTyOylrUVga6mturdj4+c9tF9OwtadUFX1zAURsEXcok32WwLYRvQBTRidmozjzfmy7TGmQX1pRSUKJY42Wo2wcfldDF5nq6DelEDNcltd+RE6lZbi8loejO5vfV9tS5bwyd7HU3YXcny08402zHrlKVxoaOfSjZIHQqeEo/NX+lE+PCtWzDgEzi5AZq1D80T3gaJOc6au8ncLnx1iNLKS6djPy7kXmTZjWpzN6LBphWkDMyCobU8lmRcFlLqn2Tahyd55Zqec9mnYNLKnxb3vq4/Fg1wGvnWu7xsWxRMpinOjqVZ8LS0fNiRlYUA/1kaGqVKXZR6pDT1lDx3XrpyeRxf7FyW8IyZ1wXNdBE87lkYk1ZPXLU7HDFY6b3PJhe0xNZIQxWuM3UsUOj1PtWucI6P0Me7BJ51iQxVk2nE3cJ8OMj5OgonpI/hIkPuMGzH6T2MfKkTmWJ5ofFrITV/LY3x32j+y3HoonY/msKztzzIN7cm9Jxb+iJyefFlu2zSVPtGB9I6SILA87Pc31gzxQb13Rr16iic67+E613J4PgWRzKss4noG4+2MOX/WKjEkjL/UOz8ZjKOjPasMKHNdrbmk+0frW5huft5d17vXFqfFs55WjTp+HbgovDs8M9g4tSlSGG6LznFQ9iUN9mrzEpAz7ZzKNgq6PPdnVeatneb/n5qg0dVrTdTSR8v5QzqTlUYyXfhTYM8X4GZXGNeSN+ncB6H7w/dFKGeXxrjPy0330X+sV99bGZPv48ms803yP+qTjdfVVf7370/+mO/P9q6h0HbelrUmzrCv22O3sjR1lUMwoahcNEdHelRrgIgSA7DpasM3Y5/g4zzGKUPmWHbp0MGbQcOon9sjqT1l/YoxwyRab0KA3PWgW/9oND6Qdj6gW/9oNj6QdD6vPAzLNkJkqvu6ETaMOyOuqk4H9bd4bEe5SYBgqorhVcCOnyY8bI7eieFlvlsgEyAgMNVgOYAAaIAgSIBAiYBAtYHSMmLacPKHK3tkcRHEcZnS/tCOF4F0aAVTiNXOQ/frMAYFkQDWXg4mrMKQ1oQZbbwKL1F9DkuEiW68DjbReaUF4FGvXAa+pnD+M/oMkDkBMojO8jqwF+OjUH4rvAFFiFSIXwFsxC5FD5nGyJY78gYDCQjdJHMwEoEkZ8I96aSpchZsgb2Iog8RnhkNCJ6txGJLEd47Dsis/mIwA4kgrWhjF98q1cerQNE1iTc+1NvE+hPgsifhJM/KWd/ygr4kyDyJ+GhP2UV/EkQDTDh0QAT0Q8wkWiACY8HmMg8wEQgfxJO/pQ5+FNGlwEif1Ie+VNWB/5y7E/Cd4Uv8CeRCuEr+JPIpfA5fxLB+lPG4E8ZoT9lBv4kiPxJuPenLEX+lDXwJ0HkT8IjfxLR+5NI5E/CY38Smf1JBPYnEaw/ZfziW73yaB0g8ifh3p8wNGhSlpNTWZHsikT2LCODcVlO7mXF0MJMEfAxy2k0WjEakraEH5dWp8FpxXiE2jI8TK1KVmdF8jsjgukZflniZH8kRh5oigwK9WA3tOI34x/4otV3xb/gkLbMzvg7r7SqNUyjgWsajtZpBPBPy8lEreid1OiRnZoC4KmWk7FaMXJXW8JbrNXJZ60Ym60tw45rVbZdq1rvNdpLIU6rAl+XOPmxFb0pK0FLRkqGjBLZsZHYjEEEK0ZKRoxSaMNQAEwYKVkASpEBoO6HP6o0+FGKhz6W4IGPGtkuSmS6IIHlAr2MKdmtkSKzhQKD8OpstCh9I8qByaJajnLBYLHEjig7c0XNWisoYKxA0VYBg6kiJUtFyRsqqJGdggxmipSsFKXISFH3NooqmShKsYViCTZQ1Ng+UbPmCcpLGJNVSNcxJdNEyVtm33r0S0FklsLJKZWzTWYFPFIQGaTw0B2zCtYoiEas8Gi4iujHqkg0UIXHo1RkHqIikAsKJwvMHPwvo8sAkfMpj2wvqwN/OTY84bvCF1idSIXwFUxO5FL4nL2JYL0tYzC2jNDVMgNLE0R+JtybWZYiJ8sa2Jgg8jDhkYGJ6N1LJLIu4bFvicymJQI7lgjWrjJ+8a1eebQOEFmUcO9Pua5oUMrIoVQgiwKBPUokMCll5FIqhDYlMviUMhppKkRDTVU/1lSjwaZCPNpU5+GmCtmVCuRXIoBhCbuMGFkWCJFniTwIrsmupcLOWAa+pVoplgXnUr0YS+ddqljzEg7uJQztSyD4lzIyMBW8g4kWWZiI4GHKyMRUiFxMVW9jqpGPqRAbmersZKqwlalivUz4S9D+VcDWESM/U8EbWq4YGpoyMjQVyNBAYEMTCQxNGRmaCqGhiQyGpowGoQrRIFTVD0LVaBCqEA9C1XkQqkKGpgIZmghgaMIuI0aGBkJkaCIPgmuyoamwM5aBoalWimXB0FQvxtIZmirW0ISDoQlDQxMIhqaMDE0Fb2iiRYYmIhiaMjI0FSJDU9UbmmpkaCrEhqY6G5oqbGiqWEMT/hK0fxWwjaG9YyYxYQFbvdVm/W+UqANlQmaWMVmZYDayXgAby4RMLOPQwnoRDCwTGnIZRwMua364ZYUGW8bxUMsqD7TMybIyJsPqMdhVTy49IasSHBlVLw7cldikMt4RscCgshJHrGBOWS1EzBlT5taWegqm1BO0pB6BIWVCdpSxN6Neiayol8CIMiEbyjgyoax5C8oKGVDGsf1klc0nc7aezK3x9PTFtXXlyNoTWkFl7NdP/SBAvxFEhiOcHEc5W05WwHMEkekID10nq2A7gmgUCY+GkYh+HIlEA0l4PJJE5qEkArmPcLKfzMF/MroMEDmQ8siCsjrwl2MTEr4rfIENiVQIX8GIRC6Fz1mRCNaLMgYzygjdKDOwI0HkR8K9IWUpcqSsgSUJIk8SHpmSiN6VRCJbEh77kshsTCKwM4lgrSnjF9/qlUfrAJE9CXf+9ENHT7ujgyM5yp8FlL0EkAkpcLgC0BxIQBIkYBIfYH1ogOSBrWiQMlCOcgsAmeoCh+oCzdUFRF0OijQEmDQEWN+QLTkzcT/zcT/zcT8rxP0sjPuZj/tZEPezIO5nLu5nPu5nvRkcSXs2PnAoR7XRamuDZzTue9qbLkZGEIVHOMVIeBQoEX20RKKQCee4icDBE8FGUDCFMfMrHwYIaEa1L8WhFR7EN21itPHNiOObOcc38zC+WQzimyWOb+Yuvllw8c0CxTdjjm/Pr3wYML49qn0pF9/MXXx/7kPbT4Y/Y1iR5ZAiI4NSwTiUYrUoZeBECsGKFIoXKcphAzaSuT4d5aYAyi0BZBoCHNoBNDcDkLQCmDQCWN8GILkJira/cdk16uAkI2pjE3RQkxd/hhU6qIk7CHbdWh50XBN1XBN13EQyNh3lugMy1QQOtQSaKwNI6gJMqqKsldVaOrJru4RMTYC75V6iuSaAaMoFReoILN8GAMr5oKj/EVOTEDMzfmd2tCck9wKA7G1AEs6Ns557Uz33fnpesNLz0EXPvYGeB955HtjmuXPMc2+W5/2gP5T2jGyKneOgBxRk3TkNeqA2687NoAdGWXcOgx5IboEiGfRCrN74NsmIRxS3qQnbZIY7YN/UJmhqEzS1tUe+zm2hgm1YwdbXhAcYKEEdZYAB8rHXASZoaQosfUOWhYYsw4YsfUP4fgyUoCHLINhLk1cfq+2TkHd6ZO8sEwpuKhN395OJ2lvJhMK7yKTQDWRiOfyAcvgV6VD+iIkOKCc6Im8/HynRkUKiA7au9NEkOjBypY99osORr3NbqGAbVrD1NeFEByWooyQ6IGuTH/usPpC4S1YDsrVWjrVWKrVWxLVWRWutTCOrLPu9kLU98rVe+9qZqQ7HBQk0REiNRgsV8QOHCtAYIjUeTlSIRxbJNMhIpfFmVUgPEiijSaUByWqQ+lTEjwIu4EcslaAhQyqPEZJ5SFu5LQo7wxKOeSryrYazE5AamwIV2t12tgpSyTWsuiyNMPYSUiNboSLfGsNsNqTGvkOF2IJIZjci2RqTFddFYWdgvHP9Vm0f7b/9IEdyYwfIrORV2DwveHecj4bmqLZH4nyK0MuEmsfZ268OfusbrIXW/mxrfzbcc9/X2e25dzxqKW5Ip3MPPaoDRPWN9qOTFMUBt2FTcY5ItA27l2xKQHBIoBCxGgXKlrkqXXNYEuqiQM0j9VuNjILpB1T4UQ5seUD1BXq7w8AKopAqj4KZ1St/7qFHdYCo6sLLlY4ClbW1L87BEe6u8Kna3vdvlwXpyK6FEsp3zYCCNVHibiGUqF39JESrmcToO6bEzNdLidilzKc8pE4DRG0RTg0SHrVKRN80kah9wrmRInBLRbDNFUxtxi8bGFGb3ZcNzKM2R182sERt9l82sMBt5i8bGHObzQg/LQrcfqtyFKwaxsIWCSJiC3BcrOqiY2UXIytTpKxI8cpfnJ4GiGIknKIjPIqLiD4iIlEshHMUROD2i2BbLti2+aJv7qEe2Uc2F9hIQMFTnAtqGlD7FOfCNAgYPau5gGYAsc+hLvoZCo7s470LPy+poN8TXfSzkR59NSVro9HXRBdV9A3RBRrtISEKszNa5lHAI6NliULvjZYF7gQ2WsbUHbhWZUQdU1irknrl4zn06Kv/YO1LcbdFy9deMtu5oQMtp160InWlFaP+tCV8p1qdetaK3L1W5T62qu1oq1Fvux+eCDn1+64fnoiKXBV6ZVjgXwvnqQvlOSuKv7/Q67BpFRIDKaUFSpQUKEUpgbpPCFQpHVDiZECNUwE1mwioUBrQZviAUgqUN8P7Aldh5Ich/RqeoQ7LcrcX9oj3at4GCD0uiLpbOPW18KijRfS9LBJ1sXDuXxG4c0WwPSuYuhX3+DKiDi3s8SX1ysdz6NFX/8Hal+Lui7bE9pJ9xoVdyAr1JMvUoSxH/cplfPdyCepllrmzWec+Z912PauUASRflhXKBydHaUGFroo9NiwqX4tnq4uf4cxh2SeQ7JmD1FFGSaMCpYsKUaKo6lNENUoOFTgtVOGEUMWmgnJKArNz1jHq+NLOWZavgugOA/Y1+GwdlONODTeY9lp+ugO9KYg6Uzj1pfCoK0X0PSkSdaRw7kcRuBtFsL0omDoRn+Yxoi4sPM0j9crHc+jRV//B2pfizose8PUS3qQfEqK+czfpzKO+i27SWaK+8zfpLHDf8U06Y+o73LrAiPqusHWB1Csfz6FHX/0Ha1+K+y56038r/d5324cjOcqfBZQ7C5DpJ+BwBaC5dwBJxwCTPgHWdweQ3BOK9JWpdGRzLiGbbgkFmZa4S7JEbX4lRKmVGGVVYiahErG5tEH0nuQGNaaTGtulCdnX4rbIb2pJPOx488U0YLvDJSHavZIYbVzZsM2XzUfSLfINMyBbQeVYQaVSE0W8zUYVraMy2ZukSLYlCeKXEv9R4Y6GdGR3NCQU7GhI3O1oSNTuaEgo3NGQFNrRkBjtaEjM7Gj4XG1fDjnUIzsQEgqyPnGX9YnarE8ofNUrKTQeErPvrCVkk/9z76Hv9CinNSLjnCoMzHkGvr2DQnsHYXsHvr3cS6AE7R3Q+P8MvaRkY/Xb7+E+9y6vR7U9krxThPm1pfmRGfS+IAqJ8CguIvrgiEQREh6HSWSOlQiUIMIpS/AR5jtClC+FR5ikDvy5OX2E74pVkEgiFWJVSCmRS7FyySWCzTB8SksZMvSoDhBlXfRItpfy91yQeoIonMKjcIrowykShVN4HE6ROZwiUOoJp9TLHFJPEKWe8ij1sjrw5+bUE74rVkHqiVSIVSH1RC7FyqWeCDb1cC8VZcjQozpAlHrRXqosudcicyXi1yJjNQxw8bXIuAAHe+drkXEhF/j4tchY5YR17+C8CwVO3l3v4IRlBqVrunS26rdjHqW2LbAz5qU0t4V2x9ynvJUp8d3LSWGWDktCXRR4QBRfTtoW6Lo73dBtV7fpyK7CE8q3Q4CChXnibmGeqF2YJ0TL78T0FkFZ3tauxK7IL/vRrO25sDG4dOMWeBgQGaGAePWtiq6+leUBCEj26wlK2/UO5CjXGpBs11Nkt+spx+16SmW7niLdrqdMt+spy9v1lMh2PUHjdrrd1nWoZHtjqmXsJxrfSrkvRRS30tyXAoX7UigsSadIk05Z0Pj79fN9Y6u02cm3fX0sHdmXzRLS1ziEbe5vTyRL5f4WULD7MnG3+zJRu/syIcpLUGhfZmI5LwHZTZgbJPe32vqZadbMt1723CGyU4II8+Zx4jNnacos/SXoVyGUuxf8EpXXcBTxjgNV9N0cZUF/yu8+CFmZo7U98m3wLyPmaRVd2L3Wxpz8OH6tjUXvzO61Nubs0f61NhasW7vX2oiDb7vbAOaRg0e3ASyRl5duA1hmV3e3AczJ3zMHMxREHiic7F545IYieuMXidxfOE8BIrAVimAnA8E0I2ROg1uxmRsyDk7As4RwmiqU74hQMGmo5GcO0Wj6EM5ziAil6PFskjlMKYLIMoSzGWUBZhhBNM0Ij+YaEf2EIxLNOsLjqUdknn9EoElIOM1EmfN0lPnMR4MnJuE0OymPpqisBvNUlpa+NM9YwqNpS8TyfMATmPB4FhOZpzIRSilEk1rGK4/WASq0Opro3LvMeTaI32WOVZ76drzLHBcJpsH4XeZYdVNi4V3mWKbpMX6XOVRxqowfWMRqOG0WH1jEBXgK3fnAIi7kptP4gUWs8tRqVJxRrMCTiFV5srVqOKHYIsHEawvw9GtVNwlb2U0mVqYJ2Yo8LRuVHY1EO0XbnaNFYWek3aRN6jcjHU3gVCCYxm0Jnsyt6qZ0K+/uCze9GxUneSuwc1rVubXdqgrTpBV48rdquASwRYKFgC3AywGrFhYFtpBbGliZFwhW5WWCUd1iwaizUjzdwsGqvHwgNVxEmDLRUsIUWJY+6ZYVVg0XF7bIt2Zit9CwamG5YQu5RYeVdyczL0CMuCoJ66KwM2J+YTLoVyOHR3Ikz6MVyRshiuxzaeX4MFqpPIFWpE+UleljZGX52bESeYS/RWaXCiFqi9+lQjxqVbhLhSRqX7BLhQRuqdulQpja7Hd3RJxaX9jdEYlRHMq7OyKdIlLa3RGpHJt4d0ekUZR4o4OnFKFwo4OXouiUNjp4lSITb3TwGkcl2ujgFYqI2QVAiGLhdwEQj6IQ7gIgidof7AIggVvudgEQpjZHb8/HCkWg+PZ8LEfx2PX2fFyColN+ez7WOValt+djlSJnXxtnRtEKXhtnIYpQ/No4axSV6LVxVjgS/rVx5tR6+bsMpxGj1qtArVchar2qvvWqUetV4Narwq1XxbZeObW+/5H4U0+o5RlTuzOOWp013+asUIsz5vZmzq3N3LY1U9vSq76VH/TIvtV7ha0DFLzVe0WtAmrf6r0yrQFGb/VeQSuA2Ld6N2jzo/rbVxvTkf5oqyC7UFdBfyMrHdmN4gkFe8ETd9vAE7U7wBMKf+wqKbQtPDH7s1YJ2U3fG5Te/337Vg7lORAwCQIw+0QIBHwOBFie/gDTxzkA9ZVTgPmdU0DyOEeZvTfaEvOG8wbRZ5qgwfpLsMgKDcbnCsdA8YdgobT84qki/V1TZVEU5BHBsfTe5rnAkeTuxD70TIgeJW5Ya0/bBhFoS61t4+5tg+7lm3iUop6XG3ZkQS/zi9Mb5u+MN3Rpmr300VkGT3oTd493E7XPdBMKXwxPCj3iTSzojKV5mDvsPXTbhiF6KKA8HgHZn91VjsmpVJJQkSahMqkusL66QOT3dgWlp8zSHn20rMiml3LMLqWSXIo4t1TR1FImmaVIEkvQSOaBIRohIDt3DZ0NAndz1xBNEBDNXUNjgcDM3DVEA1SUR8ARkK3/ad+kZ15v5Ege9CmSB62AzAM/5W6Dx5CtDwrbDR5D43zA9DGpMDE+LaYPRIeVewo6rPyjz2FvfB/kFOJ7gGx3KsfuVCrdqYjyEhTtaGU5LwFJrwoSv9NORLvTzl7aI2t3w4LdDUO7G3q7GxbtbhjY3TCwu2Fod2t75Gu9drWrjUvW3iVr75J1wSXr0CVr75J14JJ14JK1c8nau2Tdu+SBtEdcElDwa5g1uSRQ+7uXdeCSoNAvXNbokoDsb1nWFX5RVlfu27G6cl+J1c4lgbsvv+rKfeNVV/5rrrry323VFX+hVVfuW6waXBIJfl9VV2aRWFd+kVhXfpFYO6M8Vu7WiDUbJZ7FrhHryq8R6ypYI9aV+xqprnCNWFdujVhXfo1YV2aNWFd+jVg7s0TBrxHryq8R68AvUeI1Yl35NWJd+TVi7T2zJs/U4CztkU/nZSF3l2HuLn3usmeCEmT1Msjqpc1qfEzfN889pmdOXhg/pmfRu6J7TM+c/dE/pmfBOqV7TE8cPNNtNmMeuWe02Ywl8tHSZjOW2VHdZjPm5K2Zj3xPs8sKJ6sVHuWsiD5xRaLsFc6JKgJnqwhxyrIbZ07jUrHx5YxxrAtjgxKBbVqFwKtF9IatUuDaIpJ1C2f/FsGZeFbYyTMHOxdEni6cjT0LbXA9Z/EihD4vamD2orHji1CwfdGd94vCE4AIPAtkgaeCzIP5IEvLABWGYDg9iFgeajxRCI9nC5FLI9HNGyLYkUjf5PUxib7JCySaRYrf5AW6n0uib/ICiWeU8Ju8QLPzSvRNnpdgdkFKEwxK0RyDup9mUKWZBqV4ssESPN+gRlMOSjTrgDQKs4TnHpRo+kEpGhao+5GBKg0OlHgAoMZjALXiMOA5CSSyB6OYmQkUtCDE7K6o8RRltGCWQt1PVEYN5irUabpCiWcs1NykBSLPWyDB1IWUZi+UeAIDrY0v76Yx1MKZDAsEkxnKPJ+hVpjSsIib1VDkiQ01nttA4+kNpGCGA3UZ0/JwD6c61HeOaZ7wUIrnPCyxY9S7mQ81M+qvO3Jd5a/srjF4h4L0D3RcYzgABX+K45qaD9T+0Y3roLmg0J/XuDbNA2b+kMZ4M+ikWZujB3sUfWE5lmWmRw8BCs8hW1M8eghQfI78183NWQQ+hDA809aStz/4f3M9zb/5v33B06hWakxaZKNGlFuACF+XAg7Jh1RtGHF+0QaQvEQBTF4tUHZb8R+825DuMtNmPk/PxgU2pgj84UtB9m9WCqbf/tmw2yq/Pn+bHVi01p+Z/Fa5/V2i28g+VRFjVKR/tTQj+gt0t9TV2+njoQ/HNjgPGA5A9hcKHtwkDNx9cf/A8QRsv89/MHMsMPod9wcT6Acf6IdCoB94PlNqw/9QDP+DnbSU2S558F1iRygGvfDOf6xSV+x65z8u4jtoxzv/cQnqttI7/7HMnenfvw/jxV286/37uIjv+ML797Eap0Pp/ftYpiQpvH+/VTeO9yLz8FP2YEDZgxGZM4KQf3lQUdsfbb/t3Rxt3gg/kCMN5OZobY9sZyTkwttilfurZASXyujVf3AdILqycH95Mx9BHQyHihj+WjjPusSpXlb0lYNJEaoGFCoG9DU8wzqmVCWUfIXyxAu1yQiqktGr/+A6QFQD4f7y9LYo1IIUqAwpr8WzrcsK1ZBlX1FZjUAVhUHlhL0Gn11HjKqigq9E/g1YqENGUIWMXv0H1wGi60d/5qmX0Ez6y2cEl8/o1X9wHSC6vHB3+byuKSxrrWy1hKbN7SLL2//3N4r4gepG2mbxePtH7yPNXDA45Sz+mGyRijR5DhJpdsnvS8zjeszt80yr5QuGWr7diFVTnajE82hcuKxugLI42gFmSmgKdtGV9f97IbII7hF/j0KYi/MvLBB2xcM9n6FIH+1js/37SseG2Bd5BMtfV7I42LcmGi79rGJ3qgmm3WfC6UUi4Wa/mVB5w9bgzW9zbd/azGToSO2J5K7F+MwvKS/QAdsLv/Sr7m26vOBSG5AdcC9uUQ3cvZn3wstnwPaFvRezUAamd5jCWnvk69wWKtiGFWx9TdzaVpWgjq19dfDFLF0FSX5vg9/NC5Xemacja/gJ2VfLEwoW9om7aSFRu4RPiJbkidF9fGLmN3wTsevxlUuoVYWPElaVe5SwMgkFKG5TE7YpeBaxMgmlKGgqP7JYmYRa+YRaFRJqFSbUyifUqphQqyChVj6hVj6hVj6hXk3wX33wX33wXwvBfw2D/xoH/9UH/zUI/msQ/LVLobVv2JqnKMJcPPgKxiv4oT/++/9jjgIE",Symbol:"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",ZapfDingbats:"eJxtmNtu20YQhl+F4FULyMGeD7pz3AY1ChtG7NpFA18w1NomIlECSRcxgrx7SVk7+wOdG8H5OJydf2Z2d5gf9cV+t0v9VK/r+6vXsXlOlbHe28paq229qj/t++m62aXZ4J/m8PRb1z9/baZxefK63Z6eXN5dVMvTCh83u277xr/6kLrnl2XNq7TpXnczuZyabdee98/b2VzM/x4/dd/T5qab2pd6PQ2vaVVfvDRD005puE3Lu7eH1HbN9hTjx4/77/X6y5lcnUmjVzHIVVDicVX/1W/SsO36dLMfu6nb9/X6TAoBD+5euvZbn8axXtuZ36dhPJrVQqgPQoh5hev91LWLkIv94W1Ygq9+aX+tZAx2tfz64284/sblN/rqfLP/mqrbt3FKu7G67Nv9cNgPzZQ2H6rz7bb6vLgZq89pTMO/M/xfEqturJpqSM/d7GJIm2oamk3aNcO3av80O5xh3yyKmm1193ZIT02bqovTKjP+MAf++7zsZvZ3276kYyWWXB0z99S18/PbafPHQ71W4fjn/fxnFO+ZvkrT0LVzTr78qB/+nk38bHM9exgP8zr1z9U7jt6840YW5uSJKcZOCaBBnKgm5mU8MVNYyMwWFvO7Ukagkmgg6sDWQ5yFFqjzUrLEaQ3BEmiwNsMSaZS0vgWfOkPHWQowNeTUc0kumnxZvsgPxlGai6VTGUqAVCTQ6QkWnc77DKEiLktSUBJKqHIQZ86d8gCpHYoiEzMsb1ubYy8vW50DChB5ZhGqrijD0EqUIeiaEHIfCg5Kpuu0ApiToaGPSY0uaQsyr65L2oKi1yFt1PLaQ3lzfXTgXodGoJYzglndSLDMPg1sTPJpQJHJigw0QrGERqD9YhyTOgONQDUyuF1zaxuokc/BW2ztXCMrGZ9WMW1oQZHIXWNBkSCfRZEL5BMUiZw6CzVSFCfUSGZFNjIldoKDkonTKQiJIGzWmFd3BizJJ9SINoLDriOfUCOZS+zg+KGD1qGiLNMLxtJD1/ns00ON6EzyUCM6vbxhoBKaqbG3DFQCNiL1iHccBPV0DHhQH/JW8EW90dkyFKGywCJU0WkVSvSGeiSUODWFFD0HYdPQVoiRgfPMA+/nnRgiAyNYSjpWNQcNSMrtFCUH4ZIRpSCWocFCSuhCEY6hoUClc0WC52BJlCYYLQdhN+hygRRRlo5BKRRLS6oihSqh+ZzzRGG1Mo4Iz1LoP0qsxDGFzk0JE42ji0jCPejomJKCuwil4m5CiRMEUMVSzVLDUstSx1Juc0oVWMpqY295qVltmtWmWW2a1aZZbZrVplltmtWmWW2G1WZYbYbVZlhthtVmWG2G1WZYbYbVZlhtltVmWW2W1WZZbZbVZlltltVmWW2W1QYjQCh7E2aAQHeGhCFgPoNoy8KNb2wxBhmGKBxoUZXlLGsLI6AsftEDHV0wIURVbANLcTKlGGBIKPOAxCmhePCKUwFzAmpDFRQvjA9R06Hq8TONvshgKDCuRAZTXigUxjxNFfKRo3CLhnIJBMFRvMZpqpNBMlQJzGT5WFQMVQI/AikPMIhEU1aDjqJvQwmjSHB05cC9jbYwc5UtAHNLhDw41ha+lEqF4JaH3gmB61SYcqInxTDmQK8v08vjqv4zDf1N0w3Lf4A8/vwPpfK11w=="};!function(t){t.Courier="Courier",t.CourierBold="Courier-Bold",t.CourierOblique="Courier-Oblique",t.CourierBoldOblique="Courier-BoldOblique",t.Helvetica="Helvetica",t.HelveticaBold="Helvetica-Bold",t.HelveticaOblique="Helvetica-Oblique",t.HelveticaBoldOblique="Helvetica-BoldOblique",t.TimesRoman="Times-Roman",t.TimesRomanBold="Times-Bold",t.TimesRomanItalic="Times-Italic",t.TimesRomanBoldItalic="Times-BoldItalic",t.Symbol="Symbol",t.ZapfDingbats="ZapfDingbats"}(ln||(ln={}));for(var cn={},dn=function(){function t(){var t=this;this.getWidthOfGlyph=function(e){return t.CharWidths[e]},this.getXAxisKerningForPair=function(e,n){return(t.KernPairXAmounts[e]||{})[n]}}return t.load=function(e){var n=cn[e];if(n)return n;var r=hn(un[e]),i=Object.assign(new t,JSON.parse(r));return i.CharWidths=i.CharMetrics.reduce((function(t,e){return t[e.N]=e.WX,t}),{}),i.KernPairXAmounts=i.KernPairs.reduce((function(t,e){var n=e[0],r=e[1],i=e[2];return t[n]||(t[n]={}),t[n][r]=i,t}),{}),cn[e]=i,i},t}(),fn=hn("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"),pn=JSON.parse(fn),gn=function(t,e){var n=this;this.canEncodeUnicodeCodePoint=function(t){return t in n.unicodeMappings},this.encodeUnicodeCodePoint=function(t){var e=n.unicodeMappings[t];if(!e){var r=String.fromCharCode(t),i="0x"+function(t,e,n){for(var r="",i=0,o=e-t.length;ir)throw new Error(xn(e)+" must be at least "+n+" and at most "+r+", but was actually "+t)},En=function(t,e,n,r){On(t,e,["number","undefined"]),"number"==typeof t&&Nn(t,e,n,r)},jn=function(t,e,n){if(On(t,e,["number"]),t%n!=0)throw new Error(xn(e)+" must be a multiple of "+n+", but was actually "+t)},Mn=function(t,e){if(!Number.isInteger(t))throw new Error(xn(e)+" must be an integer, but was actually "+t)},In=function(t,e){if(![1,0].includes(Math.sign(t)))throw new Error(xn(e)+" must be a positive number or 0, but was actually "+t)},Un=new Uint16Array(256),Vn=0;Vn<256;Vn++)Un[Vn]=Vn;Un[22]=g(""),Un[24]=g("˘"),Un[25]=g("ˇ"),Un[26]=g("ˆ"),Un[27]=g("˙"),Un[28]=g("˝"),Un[29]=g("˛"),Un[30]=g("˚"),Un[31]=g("˜"),Un[127]=g("�"),Un[128]=g("•"),Un[129]=g("†"),Un[130]=g("‡"),Un[131]=g("…"),Un[132]=g("—"),Un[133]=g("–"),Un[134]=g("ƒ"),Un[135]=g("⁄"),Un[136]=g("‹"),Un[137]=g("›"),Un[138]=g("−"),Un[139]=g("‰"),Un[140]=g("„"),Un[141]=g("“"),Un[142]=g("”"),Un[143]=g("‘"),Un[144]=g("’"),Un[145]=g("‚"),Un[146]=g("™"),Un[147]=g("fi"),Un[148]=g("fl"),Un[149]=g("Ł"),Un[150]=g("Œ"),Un[151]=g("Š"),Un[152]=g("Ÿ"),Un[153]=g("Ž"),Un[154]=g("ı"),Un[155]=g("ł"),Un[156]=g("œ"),Un[157]=g("š"),Un[158]=g("ž"),Un[159]=g("�"),Un[160]=g("€"),Un[173]=g("�");var Wn,qn=function(t){for(var e=new Array(t.length),n=0,r=t.length;n=0;)t[e]=0}var xr=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],kr=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Fr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],Sr=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Cr=new Array(576);wr(Cr);var Ar=new Array(60);wr(Ar);var Tr=new Array(512);wr(Tr);var Pr=new Array(256);wr(Pr);var zr=new Array(29);wr(zr);var Rr,Or,Dr,Br=new Array(30);function Nr(t,e,n,r,i){this.static_tree=t,this.extra_bits=e,this.extra_base=n,this.elems=r,this.max_length=i,this.has_stree=t&&t.length}function Er(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function jr(t){return t<256?Tr[t]:Tr[256+(t>>>7)]}function Mr(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function Ir(t,e,n){t.bi_valid>16-n?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=n-16):(t.bi_buf|=e<>>=1,n<<=1}while(--e>0);return n>>>1}function Wr(t,e,n){var r,i,o=new Array(16),a=0;for(r=1;r<=15;r++)o[r]=a=a+n[r-1]<<1;for(i=0;i<=e;i++){var s=t[2*i+1];0!==s&&(t[2*i]=Vr(o[s]++,s))}}function qr(t){var e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function Lr(t){t.bi_valid>8?Mr(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function Kr(t,e,n,r){var i=2*e,o=2*n;return t[i]>1;n>=1;n--)Gr(t,o,n);i=l;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],Gr(t,o,1),r=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=r,o[2*i]=o[2*n]+o[2*r],t.depth[i]=(t.depth[n]>=t.depth[r]?t.depth[n]:t.depth[r])+1,o[2*n+1]=o[2*r+1]=i,t.heap[1]=i++,Gr(t,o,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var n,r,i,o,a,s,l=e.dyn_tree,h=e.max_code,u=e.stat_desc.static_tree,c=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(o=0;o<=15;o++)t.bl_count[o]=0;for(l[2*t.heap[t.heap_max]+1]=0,n=t.heap_max+1;n<573;n++)(o=l[2*l[2*(r=t.heap[n])+1]+1]+1)>p&&(o=p,g++),l[2*r+1]=o,r>h||(t.bl_count[o]++,a=0,r>=f&&(a=d[r-f]),s=l[2*r],t.opt_len+=s*(o+a),c&&(t.static_len+=s*(u[2*r+1]+a)));if(0!==g){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(o=p;0!==o;o--)for(r=t.bl_count[o];0!==r;)(i=t.heap[--n])>h||(l[2*i+1]!==o&&(t.opt_len+=(o-l[2*i+1])*l[2*i],l[2*i+1]=o),r--)}}(t,e),Wr(o,h,t.bl_count)}function Xr(t,e,n){var r,i,o=-1,a=e[1],s=0,l=7,h=4;for(0===a&&(l=138,h=3),e[2*(n+1)+1]=65535,r=0;r<=n;r++)i=a,a=e[2*(r+1)+1],++s>=7;r<30;r++)for(Br[r]=i<<7,t=0;t<1<0?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,n=4093624447;for(e=0;e<=31;e++,n>>>=1)if(1&n&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0}(t)),_r(t,t.l_desc),_r(t,t.d_desc),a=function(t){var e;for(Xr(t,t.dyn_ltree,t.l_desc.max_code),Xr(t,t.dyn_dtree,t.d_desc.max_code),_r(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*Sr[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),i=t.opt_len+3+7>>>3,(o=t.static_len+3+7>>>3)<=i&&(i=o)):i=o=n+5,n+4<=i&&-1!==e?Jr(t,e,n,r):4===t.strategy||o===i?(Ir(t,2+(r?1:0),3),Hr(t,Cr,Ar)):(Ir(t,4+(r?1:0),3),function(t,e,n,r){var i;for(Ir(t,e-257,5),Ir(t,n-1,5),Ir(t,r-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&n,t.last_lit++,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(Pr[n]+256+1)]++,t.dyn_dtree[2*jr(e)]++),t.last_lit===t.lit_bufsize-1},_tr_align:function(t){Ir(t,2,3),Ur(t,256,Cr),function(t){16===t.bi_valid?(Mr(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}};var $r=function(t,e,n,r){for(var i=65535&t|0,o=t>>>16&65535|0,a=0;0!==n;){n-=a=n>2e3?2e3:n;do{o=o+(i=i+e[r++]|0)|0}while(--a);i%=65521,o%=65521}return i|o<<16|0};var ti=function(){for(var t,e=[],n=0;n<256;n++){t=n;for(var r=0;r<8;r++)t=1&t?3988292384^t>>>1:t>>>1;e[n]=t}return e}();var ei,ni=function(t,e,n,r){var i=ti,o=r+n;t^=-1;for(var a=r;a>>8^i[255&(t^e[a])];return-1^t},ri={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};function ii(t,e){return t.msg=ri[e],e}function oi(t){return(t<<1)-(t>4?9:0)}function ai(t){for(var e=t.length;--e>=0;)t[e]=0}function si(t){var e=t.state,n=e.pending;n>t.avail_out&&(n=t.avail_out),0!==n&&(br.arraySet(t.output,e.pending_buf,e.pending_out,n,t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,0===e.pending&&(e.pending_out=0))}function li(t,e){Qr._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,si(t.strm)}function hi(t,e){t.pending_buf[t.pending++]=e}function ui(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function ci(t,e,n,r){var i=t.avail_in;return i>r&&(i=r),0===i?0:(t.avail_in-=i,br.arraySet(e,t.input,t.next_in,i,n),1===t.state.wrap?t.adler=$r(t.adler,e,i,n):2===t.state.wrap&&(t.adler=ni(t.adler,e,i,n)),t.next_in+=i,t.total_in+=i,i)}function di(t,e){var n,r,i=t.max_chain_length,o=t.strstart,a=t.prev_length,s=t.nice_match,l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,h=t.window,u=t.w_mask,c=t.prev,d=t.strstart+258,f=h[o+a-1],p=h[o+a];t.prev_length>=t.good_match&&(i>>=2),s>t.lookahead&&(s=t.lookahead);do{if(h[(n=e)+a]===p&&h[n+a-1]===f&&h[n]===h[o]&&h[++n]===h[o+1]){o+=2,n++;do{}while(h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&oa){if(t.match_start=e,a=r,r>=s)break;f=h[o+a-1],p=h[o+a]}}}while((e=c[e&u])>l&&0!=--i);return a<=t.lookahead?a:t.lookahead}function fi(t){var e,n,r,i,o,a=t.w_size;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=a+(a-262)){br.arraySet(t.window,t.window,a,a,0),t.match_start-=a,t.strstart-=a,t.block_start-=a,e=n=t.hash_size;do{r=t.head[--e],t.head[e]=r>=a?r-a:0}while(--n);e=n=a;do{r=t.prev[--e],t.prev[e]=r>=a?r-a:0}while(--n);i+=a}if(0===t.strm.avail_in)break;if(n=ci(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(o=t.strstart-t.insert,t.ins_h=t.window[o],t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<=3)if(r=Qr._tr_tally(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,r=Qr._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=(t.ins_h<15&&(a=2,r-=16),i<1||i>9||8!==n||r<8||r>15||e<0||e>9||o<0||o>4)return ii(t,-2);8===r&&(r=9);var s=new yi;return t.state=s,s.strm=t,s.wrap=a,s.gzhead=null,s.w_bits=r,s.w_size=1<t.pending_buf_size-5&&(n=t.pending_buf_size-5);;){if(t.lookahead<=1){if(fi(t),0===t.lookahead&&0===e)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var r=t.block_start+n;if((0===t.strstart||t.strstart>=r)&&(t.lookahead=t.strstart-r,t.strstart=r,li(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&(li(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(li(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&(li(t,!1),t.strm.avail_out),1)})),new vi(4,4,8,4,pi),new vi(4,5,16,8,pi),new vi(4,6,32,32,pi),new vi(4,4,16,16,gi),new vi(8,16,32,32,gi),new vi(8,16,128,128,gi),new vi(8,32,128,256,gi),new vi(32,128,258,1024,gi),new vi(32,258,258,4096,gi)];var xi={deflateInit:function(t,e){return wi(t,e,8,15,8,0)},deflateInit2:wi,deflateReset:bi,deflateResetKeep:mi,deflateSetHeader:function(t,e){return t&&t.state?2!==t.state.wrap?-2:(t.state.gzhead=e,0):-2},deflate:function(t,e){var n,r,i,o;if(!t||!t.state||e>5||e<0)return t?ii(t,-2):-2;if(r=t.state,!t.output||!t.input&&0!==t.avail_in||666===r.status&&4!==e)return ii(t,0===t.avail_out?-5:-2);if(r.strm=t,n=r.last_flush,r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,hi(r,31),hi(r,139),hi(r,8),r.gzhead?(hi(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),hi(r,255&r.gzhead.time),hi(r,r.gzhead.time>>8&255),hi(r,r.gzhead.time>>16&255),hi(r,r.gzhead.time>>24&255),hi(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),hi(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(hi(r,255&r.gzhead.extra.length),hi(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=ni(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(hi(r,0),hi(r,0),hi(r,0),hi(r,0),hi(r,0),hi(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),hi(r,3),r.status=113);else{var a=8+(r.w_bits-8<<4)<<8;a|=(r.strategy>=2||r.level<2?0:r.level<6?1:6===r.level?2:3)<<6,0!==r.strstart&&(a|=32),a+=31-a%31,r.status=113,ui(r,a),0!==r.strstart&&(ui(r,t.adler>>>16),ui(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(i=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>i&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),si(t),i=r.pending,r.pending!==r.pending_buf_size));)hi(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),si(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),si(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=ni(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&si(t),r.pending+2<=r.pending_buf_size&&(hi(r,255&t.adler),hi(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(si(t),0===t.avail_out)return r.last_flush=-1,0}else if(0===t.avail_in&&oi(e)<=oi(n)&&4!==e)return ii(t,-5);if(666===r.status&&0!==t.avail_in)return ii(t,-5);if(0!==t.avail_in||0!==r.lookahead||0!==e&&666!==r.status){var s=2===r.strategy?function(t,e){for(var n;;){if(0===t.lookahead&&(fi(t),0===t.lookahead)){if(0===e)return 1;break}if(t.match_length=0,n=Qr._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&(li(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(li(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(li(t,!1),0===t.strm.avail_out)?1:2}(r,e):3===r.strategy?function(t,e){for(var n,r,i,o,a=t.window;;){if(t.lookahead<=258){if(fi(t),t.lookahead<=258&&0===e)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=a[i=t.strstart-1])===a[++i]&&r===a[++i]&&r===a[++i]){o=t.strstart+258;do{}while(r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(n=Qr._tr_tally(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=Qr._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&(li(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?(li(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&(li(t,!1),0===t.strm.avail_out)?1:2}(r,e):ei[r.level].func(r,e);if(3!==s&&4!==s||(r.status=666),1===s||3===s)return 0===t.avail_out&&(r.last_flush=-1),0;if(2===s&&(1===e?Qr._tr_align(r):5!==e&&(Qr._tr_stored_block(r,0,0,!1),3===e&&(ai(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),si(t),0===t.avail_out))return r.last_flush=-1,0}return 4!==e?0:r.wrap<=0?1:(2===r.wrap?(hi(r,255&t.adler),hi(r,t.adler>>8&255),hi(r,t.adler>>16&255),hi(r,t.adler>>24&255),hi(r,255&t.total_in),hi(r,t.total_in>>8&255),hi(r,t.total_in>>16&255),hi(r,t.total_in>>24&255)):(ui(r,t.adler>>>16),ui(r,65535&t.adler)),si(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?0:1)},deflateEnd:function(t){var e;return t&&t.state?42!==(e=t.state.status)&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?ii(t,-2):(t.state=null,113===e?ii(t,-3):0):-2},deflateSetDictionary:function(t,e){var n,r,i,o,a,s,l,h,u=e.length;if(!t||!t.state)return-2;if(2===(o=(n=t.state).wrap)||1===o&&42!==n.status||n.lookahead)return-2;for(1===o&&(t.adler=$r(t.adler,e,u,0)),n.wrap=0,u>=n.w_size&&(0===o&&(ai(n.head),n.strstart=0,n.block_start=0,n.insert=0),h=new br.Buf8(n.w_size),br.arraySet(h,e,u-n.w_size,n.w_size,0),e=h,u=n.w_size),a=t.avail_in,s=t.next_in,l=t.input,t.avail_in=u,t.next_in=0,t.input=e,fi(n);n.lookahead>=3;){r=n.strstart,i=n.lookahead-2;do{n.ins_h=(n.ins_h<=252?6:Ci>=248?5:Ci>=240?4:Ci>=224?3:Ci>=192?2:1;Si[254]=Si[254]=1;function Ai(t,e){if(e<65534&&(t.subarray&&Fi||!t.subarray&&ki))return String.fromCharCode.apply(null,br.shrinkBuf(t,e));for(var n="",r=0;r>>6,e[o++]=128|63&n):n<65536?(e[o++]=224|n>>>12,e[o++]=128|n>>>6&63,e[o++]=128|63&n):(e[o++]=240|n>>>18,e[o++]=128|n>>>12&63,e[o++]=128|n>>>6&63,e[o++]=128|63&n);return e},Pi=function(t){return Ai(t,t.length)},zi=function(t){for(var e=new br.Buf8(t.length),n=0,r=e.length;n4)s[r++]=65533,n+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&n1?s[r++]=65533:i<65536?s[r++]=i:(i-=65536,s[r++]=55296|i>>10&1023,s[r++]=56320|1023&i)}return Ai(s,r)},Oi=function(t,e){var n;for((e=e||t.length)>t.length&&(e=t.length),n=e-1;n>=0&&128==(192&t[n]);)n--;return n<0||0===n?e:n+Si[t[n]]>e?n:e};var Di=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},Bi=Object.prototype.toString;function Ni(t){if(!(this instanceof Ni))return new Ni(t);this.options=br.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Di,this.strm.avail_out=0;var n=xi.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(0!==n)throw new Error(ri[n]);if(e.header&&xi.deflateSetHeader(this.strm,e.header),e.dictionary){var r;if(r="string"==typeof e.dictionary?Ti(e.dictionary):"[object ArrayBuffer]"===Bi.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,0!==(n=xi.deflateSetDictionary(this.strm,r)))throw new Error(ri[n]);this._dict_set=!0}}function Ei(t,e){var n=new Ni(e);if(n.push(t,!0),n.err)throw n.msg||ri[n.err];return n.result}Ni.prototype.push=function(t,e){var n,r,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;r=e===~~e?e:!0===e?4:0,"string"==typeof t?i.input=Ti(t):"[object ArrayBuffer]"===Bi.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new br.Buf8(o),i.next_out=0,i.avail_out=o),1!==(n=xi.deflate(i,r))&&0!==n)return this.onEnd(n),this.ended=!0,!1;0!==i.avail_out&&(0!==i.avail_in||4!==r&&2!==r)||("string"===this.options.to?this.onData(Pi(br.shrinkBuf(i.output,i.next_out))):this.onData(br.shrinkBuf(i.output,i.next_out)))}while((i.avail_in>0||0===i.avail_out)&&1!==n);return 4===r?(n=xi.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,0===n):2!==r||(this.onEnd(0),i.avail_out=0,!0)},Ni.prototype.onData=function(t){this.chunks.push(t)},Ni.prototype.onEnd=function(t){0===t&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=br.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ji={Deflate:Ni,deflate:Ei,deflateRaw:function(t,e){return(e=e||{}).raw=!0,Ei(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,Ei(t,e)}},Mi=function(t,e){var n,r,i,o,a,s,l,h,u,c,d,f,p,g,v,y,m,b,w,x,k,F,S,C,A;n=t.state,r=t.next_in,C=t.input,i=r+(t.avail_in-5),o=t.next_out,A=t.output,a=o-(e-t.avail_out),s=o+(t.avail_out-257),l=n.dmax,h=n.wsize,u=n.whave,c=n.wnext,d=n.window,f=n.hold,p=n.bits,g=n.lencode,v=n.distcode,y=(1<>>=w=b>>>24,p-=w,0===(w=b>>>16&255))A[o++]=65535&b;else{if(!(16&w)){if(0==(64&w)){b=g[(65535&b)+(f&(1<>>=w,p-=w),p<15&&(f+=C[r++]<>>=w=b>>>24,p-=w,!(16&(w=b>>>16&255))){if(0==(64&w)){b=v[(65535&b)+(f&(1<l){t.msg="invalid distance too far back",n.mode=30;break t}if(f>>>=w,p-=w,k>(w=o-a)){if((w=k-w)>u&&n.sane){t.msg="invalid distance too far back",n.mode=30;break t}if(F=0,S=d,0===c){if(F+=h-w,w2;)A[o++]=S[F++],A[o++]=S[F++],A[o++]=S[F++],x-=3;x&&(A[o++]=S[F++],x>1&&(A[o++]=S[F++]))}else{F=o-k;do{A[o++]=A[F++],A[o++]=A[F++],A[o++]=A[F++],x-=3}while(x>2);x&&(A[o++]=A[F++],x>1&&(A[o++]=A[F++]))}break}}break}}while(r>3,f&=(1<<(p-=x<<3))-1,t.next_in=r,t.next_out=o,t.avail_in=r=1&&0===R[x];x--);if(k>x&&(k=x),0===x)return i[o++]=20971520,i[o++]=20971520,s.bits=1,0;for(w=1;w0&&(0===t||1!==x))return-1;for(O[1]=0,m=1;m<15;m++)O[m+1]=O[m]+R[m];for(b=0;b852||2===t&&A>592)return 1;for(;;){p=m-S,a[b]f?(g=D[B+a[b]],v=P[z+a[b]]):(g=96,v=0),l=1<>S)+(h-=l)]=p<<24|g<<16|v|0}while(0!==h);for(l=1<>=1;if(0!==l?(T&=l-1,T+=l):T=0,b++,0==--R[m]){if(m===x)break;m=e[n+a[b]]}if(m>k&&(T&c)!==u){for(0===S&&(S=k),d+=w,C=1<<(F=m-S);F+S852||2===t&&A>592)return 1;i[u=T&c]=k<<24|F<<16|d-o|0}}return 0!==T&&(i[d+T]=m-S<<24|64<<16|0),s.bits=k,0};function Li(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function Ki(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new br.Buf16(320),this.work=new br.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function Gi(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new br.Buf32(852),e.distcode=e.distdyn=new br.Buf32(592),e.sane=1,e.back=-1,0):-2}function Hi(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,Gi(t)):-2}function _i(t,e){var n,r;return t&&t.state?(r=t.state,e<0?(n=0,e=-e):(n=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?-2:(null!==r.window&&r.wbits!==e&&(r.window=null),r.wrap=n,r.wbits=e,Hi(t))):-2}function Xi(t,e){var n,r;return t?(r=new Ki,t.state=r,r.window=null,0!==(n=_i(t,e))&&(t.state=null),n):-2}var Zi,Yi,Ji=!0;function Qi(t){if(Ji){var e;for(Zi=new br.Buf32(512),Yi=new br.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(qi(1,t.lens,0,288,Zi,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;qi(2,t.lens,0,32,Yi,0,t.work,{bits:5}),Ji=!1}t.lencode=Zi,t.lenbits=9,t.distcode=Yi,t.distbits=5}function $i(t,e,n,r){var i,o=t.state;return null===o.window&&(o.wsize=1<=o.wsize?(br.arraySet(o.window,e,n-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((i=o.wsize-o.wnext)>r&&(i=r),br.arraySet(o.window,e,n-r,i,o.wnext),(r-=i)?(br.arraySet(o.window,e,n-r,r,0),o.wnext=r,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,n.check=ni(n.check,T,2,0),h=0,u=0,n.mode=2;break}if(n.flags=0,n.head&&(n.head.done=!1),!(1&n.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",n.mode=30;break}if(8!=(15&h)){t.msg="unknown compression method",n.mode=30;break}if(u-=4,k=8+(15&(h>>>=4)),0===n.wbits)n.wbits=k;else if(k>n.wbits){t.msg="invalid window size",n.mode=30;break}n.dmax=1<>8&1),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=ni(n.check,T,2,0)),h=0,u=0,n.mode=3;case 3:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>8&255,T[2]=h>>>16&255,T[3]=h>>>24&255,n.check=ni(n.check,T,4,0)),h=0,u=0,n.mode=4;case 4:for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>8),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=ni(n.check,T,2,0)),h=0,u=0,n.mode=5;case 5:if(1024&n.flags){for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>>8&255,n.check=ni(n.check,T,2,0)),h=0,u=0}else n.head&&(n.head.extra=null);n.mode=6;case 6:if(1024&n.flags&&((f=n.length)>s&&(f=s),f&&(n.head&&(k=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Array(n.head.extra_len)),br.arraySet(n.head.extra,r,o,f,k)),512&n.flags&&(n.check=ni(n.check,r,f,o)),s-=f,o+=f,n.length-=f),n.length))break t;n.length=0,n.mode=7;case 7:if(2048&n.flags){if(0===s)break t;f=0;do{k=r[o+f++],n.head&&k&&n.length<65536&&(n.head.name+=String.fromCharCode(k))}while(k&&f>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=12;break;case 10:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>=7&u,u-=7&u,n.mode=27;break}for(;u<3;){if(0===s)break t;s--,h+=r[o++]<>>=1)){case 0:n.mode=14;break;case 1:if(Qi(n),n.mode=20,6===e){h>>>=2,u-=2;break t}break;case 2:n.mode=17;break;case 3:t.msg="invalid block type",n.mode=30}h>>>=2,u-=2;break;case 14:for(h>>>=7&u,u-=7&u;u<32;){if(0===s)break t;s--,h+=r[o++]<>>16^65535)){t.msg="invalid stored block lengths",n.mode=30;break}if(n.length=65535&h,h=0,u=0,n.mode=15,6===e)break t;case 15:n.mode=16;case 16:if(f=n.length){if(f>s&&(f=s),f>l&&(f=l),0===f)break t;br.arraySet(i,r,o,f,a),s-=f,o+=f,l-=f,a+=f,n.length-=f;break}n.mode=12;break;case 17:for(;u<14;){if(0===s)break t;s--,h+=r[o++]<>>=5,u-=5,n.ndist=1+(31&h),h>>>=5,u-=5,n.ncode=4+(15&h),h>>>=4,u-=4,n.nlen>286||n.ndist>30){t.msg="too many length or distance symbols",n.mode=30;break}n.have=0,n.mode=18;case 18:for(;n.have>>=3,u-=3}for(;n.have<19;)n.lens[P[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,S={bits:n.lenbits},F=qi(0,n.lens,0,19,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid code lengths set",n.mode=30;break}n.have=0,n.mode=19;case 19:for(;n.have>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=v,u-=v,n.lens[n.have++]=m;else{if(16===m){for(C=v+2;u>>=v,u-=v,0===n.have){t.msg="invalid bit length repeat",n.mode=30;break}k=n.lens[n.have-1],f=3+(3&h),h>>>=2,u-=2}else if(17===m){for(C=v+3;u>>=v)),h>>>=3,u-=3}else{for(C=v+7;u>>=v)),h>>>=7,u-=7}if(n.have+f>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=30;break}for(;f--;)n.lens[n.have++]=k}}if(30===n.mode)break;if(0===n.lens[256]){t.msg="invalid code -- missing end-of-block",n.mode=30;break}if(n.lenbits=9,S={bits:n.lenbits},F=qi(1,n.lens,0,n.nlen,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid literal/lengths set",n.mode=30;break}if(n.distbits=6,n.distcode=n.distdyn,S={bits:n.distbits},F=qi(2,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,S),n.distbits=S.bits,F){t.msg="invalid distances set",n.mode=30;break}if(n.mode=20,6===e)break t;case 20:n.mode=21;case 21:if(s>=6&&l>=258){t.next_out=a,t.avail_out=l,t.next_in=o,t.avail_in=s,n.hold=h,n.bits=u,Mi(t,d),a=t.next_out,i=t.output,l=t.avail_out,o=t.next_in,r=t.input,s=t.avail_in,h=n.hold,u=n.bits,12===n.mode&&(n.back=-1);break}for(n.back=0;y=(A=n.lencode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,n.length=m,0===y){n.mode=26;break}if(32&y){n.back=-1,n.mode=12;break}if(64&y){t.msg="invalid literal/length code",n.mode=30;break}n.extra=15&y,n.mode=22;case 22:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;y=(A=n.distcode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,64&y){t.msg="invalid distance code",n.mode=30;break}n.offset=m,n.extra=15&y,n.mode=24;case 24:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=30;break}n.mode=25;case 25:if(0===l)break t;if(f=d-l,n.offset>f){if((f=n.offset-f)>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=30;break}f>n.wnext?(f-=n.wnext,p=n.wsize-f):p=n.wnext-f,f>n.length&&(f=n.length),g=n.window}else g=i,p=a-n.offset,f=n.length;f>l&&(f=l),l-=f,n.length-=f;do{i[a++]=g[p++]}while(--f);0===n.length&&(n.mode=21);break;case 26:if(0===l)break t;i[a++]=n.length,l--,n.mode=21;break;case 27:if(n.wrap){for(;u<32;){if(0===s)break t;s--,h|=r[o++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Di,this.strm.avail_out=0;var n=to.inflateInit2(this.strm,e.windowBits);if(n!==eo.Z_OK)throw new Error(ri[n]);if(this.header=new no,to.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=Ti(e.dictionary):"[object ArrayBuffer]"===ro.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=to.inflateSetDictionary(this.strm,e.dictionary))!==eo.Z_OK))throw new Error(ri[n])}function oo(t,e){var n=new io(e);if(n.push(t,!0),n.err)throw n.msg||ri[n.err];return n.result}io.prototype.push=function(t,e){var n,r,i,o,a,s=this.strm,l=this.options.chunkSize,h=this.options.dictionary,u=!1;if(this.ended)return!1;r=e===~~e?e:!0===e?eo.Z_FINISH:eo.Z_NO_FLUSH,"string"==typeof t?s.input=zi(t):"[object ArrayBuffer]"===ro.call(t)?s.input=new Uint8Array(t):s.input=t,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new br.Buf8(l),s.next_out=0,s.avail_out=l),(n=to.inflate(s,eo.Z_NO_FLUSH))===eo.Z_NEED_DICT&&h&&(n=to.inflateSetDictionary(this.strm,h)),n===eo.Z_BUF_ERROR&&!0===u&&(n=eo.Z_OK,u=!1),n!==eo.Z_STREAM_END&&n!==eo.Z_OK)return this.onEnd(n),this.ended=!0,!1;s.next_out&&(0!==s.avail_out&&n!==eo.Z_STREAM_END&&(0!==s.avail_in||r!==eo.Z_FINISH&&r!==eo.Z_SYNC_FLUSH)||("string"===this.options.to?(i=Oi(s.output,s.next_out),o=s.next_out-i,a=Ri(s.output,i),s.next_out=o,s.avail_out=l-o,o&&br.arraySet(s.output,s.output,i,o,0),this.onData(a)):this.onData(br.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(u=!0)}while((s.avail_in>0||0===s.avail_out)&&n!==eo.Z_STREAM_END);return n===eo.Z_STREAM_END&&(r=eo.Z_FINISH),r===eo.Z_FINISH?(n=to.inflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===eo.Z_OK):r!==eo.Z_SYNC_FLUSH||(this.onEnd(eo.Z_OK),s.avail_out=0,!0)},io.prototype.onData=function(t){this.chunks.push(t)},io.prototype.onEnd=function(t){t===eo.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=br.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var ao={Inflate:io,inflate:oo,inflateRaw:function(t,e){return(e=e||{}).raw=!0,oo(t,e)},ungzip:oo},so={};(0,br.assign)(so,ji,ao,eo);var lo=so,ho=function(){function t(t,e){this.major=String(t),this.minor=String(e)}return t.prototype.toString=function(){var t=b(129);return"%PDF-"+this.major+"."+this.minor+"\n%"+t+t+t+t},t.prototype.sizeInBytes=function(){return 12+this.major.length+this.minor.length},t.prototype.copyBytesInto=function(t,e){var n=e;return t[e++]=mr.Percent,t[e++]=mr.P,t[e++]=mr.D,t[e++]=mr.F,t[e++]=mr.Dash,e+=k(this.major,t,e),t[e++]=mr.Period,e+=k(this.minor,t,e),t[e++]=mr.Newline,t[e++]=mr.Percent,t[e++]=129,t[e++]=129,t[e++]=129,t[e++]=129,e-n},t.forVersion=function(e,n){return new t(e,n)},t}(),uo=function(){function t(){}return t.prototype.clone=function(t){throw new Kn(this.constructor.name,"clone")},t.prototype.toString=function(){throw new Kn(this.constructor.name,"toString")},t.prototype.sizeInBytes=function(){throw new Kn(this.constructor.name,"sizeInBytes")},t.prototype.copyBytesInto=function(t,e){throw new Kn(this.constructor.name,"copyBytesInto")},t}(),co=function(t){function e(e){var n=t.call(this)||this;return n.numberValue=e,n.stringValue=ht(e),n}return n(e,t),e.prototype.asNumber=function(){return this.numberValue},e.prototype.value=function(){return this.numberValue},e.prototype.clone=function(){return e.of(this.numberValue)},e.prototype.toString=function(){return this.stringValue},e.prototype.sizeInBytes=function(){return this.stringValue.length},e.prototype.copyBytesInto=function(t,e){return e+=k(this.stringValue,t,e),this.stringValue.length},e.of=function(t){return new e(t)},e}(uo),fo=function(t){function e(e){var n=t.call(this)||this;return n.array=[],n.context=e,n}return n(e,t),e.prototype.size=function(){return this.array.length},e.prototype.push=function(t){this.array.push(t)},e.prototype.insert=function(t,e){this.array.splice(t,0,e)},e.prototype.indexOf=function(t){var e=this.array.indexOf(t);return-1===e?void 0:e},e.prototype.remove=function(t){this.array.splice(t,1)},e.prototype.set=function(t,e){this.array[t]=e},e.prototype.get=function(t){return this.array[t]},e.prototype.lookupMaybe=function(t){for(var e,n=[],r=1;r=mr.ExclamationPoint&&i<=mr.Tilde&&!mo[i]?l:"#"+m(h)}return r.encodedName=o,r}return n(e,t),e.prototype.asBytes=function(){for(var t=[],e="",n=!1,r=function(e){void 0!==e&&t.push(e),n=!1},i=1,o=this.encodedName.length;i=mr.Zero&&s<=mr.Nine||s>=mr.a&&s<=mr.f||s>=mr.A&&s<=mr.F?2!==(e+=a).length&&(l>="0"&&l<="9"||l>="a"&&l<="f"||l>="A"&&l<="F")||(r(parseInt(e,16)),e=""):r(s):s===mr.Hash?n=!0:r(s)}return new Uint8Array(t)},e.prototype.decodeText=function(){var t=this.asBytes();return String.fromCharCode.apply(String,Array.from(t))},e.prototype.asString=function(){return this.encodedName},e.prototype.value=function(){return this.encodedName},e.prototype.clone=function(){return this},e.prototype.toString=function(){return this.encodedName},e.prototype.sizeInBytes=function(){return this.encodedName.length},e.prototype.copyBytesInto=function(t,e){return e+=k(this.encodedName,t,e),this.encodedName.length},e.of=function(t){var n=function(t){return t.replace(/#([\dABCDEF]{2})/g,(function(t,e){return w(e)}))}(t),r=ko.get(n);return r||(r=new e(xo,n),ko.set(n,r)),r},e.Length=e.of("Length"),e.FlateDecode=e.of("FlateDecode"),e.Resources=e.of("Resources"),e.Font=e.of("Font"),e.XObject=e.of("XObject"),e.ExtGState=e.of("ExtGState"),e.Contents=e.of("Contents"),e.Type=e.of("Type"),e.Parent=e.of("Parent"),e.MediaBox=e.of("MediaBox"),e.Page=e.of("Page"),e.Annots=e.of("Annots"),e.TrimBox=e.of("TrimBox"),e.ArtBox=e.of("ArtBox"),e.BleedBox=e.of("BleedBox"),e.CropBox=e.of("CropBox"),e.Rotate=e.of("Rotate"),e.Title=e.of("Title"),e.Author=e.of("Author"),e.Subject=e.of("Subject"),e.Creator=e.of("Creator"),e.Keywords=e.of("Keywords"),e.Producer=e.of("Producer"),e.CreationDate=e.of("CreationDate"),e.ModDate=e.of("ModDate"),e}(uo),So=new(function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.asNull=function(){return null},e.prototype.clone=function(){return this},e.prototype.toString=function(){return"null"},e.prototype.sizeInBytes=function(){return 4},e.prototype.copyBytesInto=function(t,e){return t[e++]=mr.n,t[e++]=mr.u,t[e++]=mr.l,t[e++]=mr.l,4},e}(uo)),Co=function(t){function e(e,n){var r=t.call(this)||this;return r.dict=e,r.context=n,r}return n(e,t),e.prototype.keys=function(){return Array.from(this.dict.keys())},e.prototype.values=function(){return Array.from(this.dict.values())},e.prototype.entries=function(){return Array.from(this.dict.entries())},e.prototype.set=function(t,e){this.dict.set(t,e)},e.prototype.get=function(t,e){void 0===e&&(e=!1);var n=this.dict.get(t);if(n!==So||e)return n},e.prototype.has=function(t){var e=this.dict.get(t);return void 0!==e&&e!==So},e.prototype.lookupMaybe=function(t){for(var e,n=[],r=1;rthis.largestObjectNumber&&(this.largestObjectNumber=t.objectNumber)},t.prototype.nextRef=function(){return this.largestObjectNumber+=1,Ro.of(this.largestObjectNumber)},t.prototype.register=function(t){var e=this.nextRef();return this.assign(e,t),e},t.prototype.delete=function(t){return this.indirectObjects.delete(t)},t.prototype.lookupMaybe=function(t){for(var e=[],n=1;n1?(this.subsections.push([t]),this.chunkIdx+=1,this.chunkLength=1):(e.push(t),this.chunkLength+=1)},t.create=function(){return new t({ref:Ro.of(0,65535),offset:0,deleted:!0})},t.createEmpty=function(){return new t},t}(),qo=function(){function t(t){this.lastXRefOffset=String(t)}return t.prototype.toString=function(){return"startxref\n"+this.lastXRefOffset+"\n%%EOF"},t.prototype.sizeInBytes=function(){return 16+this.lastXRefOffset.length},t.prototype.copyBytesInto=function(t,e){var n=e;return t[e++]=mr.s,t[e++]=mr.t,t[e++]=mr.a,t[e++]=mr.r,t[e++]=mr.t,t[e++]=mr.x,t[e++]=mr.r,t[e++]=mr.e,t[e++]=mr.f,t[e++]=mr.Newline,e+=k(this.lastXRefOffset,t,e),t[e++]=mr.Newline,t[e++]=mr.Percent,t[e++]=mr.Percent,t[e++]=mr.E,t[e++]=mr.O,t[e++]=mr.F,e-n},t.forLastCrossRefSectionOffset=function(e){return new t(e)},t}(),Lo=function(){function t(t){this.dict=t}return t.prototype.toString=function(){return"trailer\n"+this.dict.toString()},t.prototype.sizeInBytes=function(){return 8+this.dict.sizeInBytes()},t.prototype.copyBytesInto=function(t,e){var n=e;return t[e++]=mr.t,t[e++]=mr.r,t[e++]=mr.a,t[e++]=mr.i,t[e++]=mr.l,t[e++]=mr.e,t[e++]=mr.r,t[e++]=mr.Newline,(e+=this.dict.copyBytesInto(t,e))-n},t.of=function(e){return new t(e)},t}(),Ko=function(t){function e(e,n,r){void 0===r&&(r=!0);var i=t.call(this,e.obj({}),r)||this;return i.objects=n,i.offsets=i.computeObjectOffsets(),i.offsetsString=i.computeOffsetsString(),i.dict.set(Fo.of("Type"),Fo.of("ObjStm")),i.dict.set(Fo.of("N"),co.of(i.objects.length)),i.dict.set(Fo.of("First"),co.of(i.offsetsString.length)),i}return n(e,t),e.prototype.getObjectsCount=function(){return this.objects.length},e.prototype.clone=function(t){return e.withContextAndObjects(t||this.dict.context,this.objects.slice(),this.encode)},e.prototype.getContentsString=function(){for(var t=this.offsetsString,e=0,n=this.objects.length;e1&&(t.push(e),t.push(o.ref.objectNumber),e=0),e+=1}return t.push(e),t},i.computeEntryTuples=function(){for(var t=new Array(i.entries.length),e=0,n=i.entries.length;ee[0]&&(e[0]=h),u>e[1]&&(e[1]=u),c>e[2]&&(e[2]=c)}return e},i.entries=n||[],i.entryTuplesCache=Ln.populatedBy(i.computeEntryTuples),i.maxByteWidthsCache=Ln.populatedBy(i.computeMaxEntryByteWidths),i.indexCache=Ln.populatedBy(i.computeIndex),e.set(Fo.of("Type"),Fo.of("XRef")),i}return n(e,t),e.prototype.addDeletedEntry=function(t,e){var n=Do.Deleted;this.entries.push({type:n,ref:t,nextFreeObjectNumber:e}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},e.prototype.addUncompressedEntry=function(t,e){var n=Do.Uncompressed;this.entries.push({type:n,ref:t,offset:e}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},e.prototype.addCompressedEntry=function(t,e,n){var r=Do.Compressed;this.entries.push({type:r,ref:t,objectStreamRef:e,index:n}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},e.prototype.clone=function(t){var n=this.dict,r=this.entries,i=this.encode;return e.of(n.clone(t),r.slice(),i)},e.prototype.getContentsString=function(){for(var t=this.entryTuplesCache.access(),e=this.maxByteWidthsCache.access(),n="",r=0,i=t.length;r=0;d--)n+=(h[d]||0).toString(2);for(d=e[1]-1;d>=0;d--)n+=(u[d]||0).toString(2);for(d=e[2]-1;d>=0;d--)n+=(c[d]||0).toString(2)}return n},e.prototype.getUnencodedContents=function(){for(var t=this.entryTuplesCache.access(),e=this.maxByteWidthsCache.access(),n=new Uint8Array(this.getUnencodedContentsSize()),r=0,i=0,o=t.length;i=0;f--)n[r++]=u[f]||0;for(f=e[1]-1;f>=0;f--)n[r++]=c[f]||0;for(f=e[2]-1;f>=0;f--)n[r++]=d[f]||0}return n},e.prototype.getUnencodedContentsSize=function(){var t=this.maxByteWidthsCache.access();return L(t)*this.entries.length},e.prototype.updateDict=function(){t.prototype.updateDict.call(this);var e=this.maxByteWidthsCache.access(),n=this.indexCache.access(),r=this.dict.context;this.dict.set(Fo.of("W"),r.obj(e)),this.dict.set(Fo.of("Index"),r.obj(n))},e.create=function(t,n){void 0===n&&(n=!0);var r=new e(t,[],n);return r.addDeletedEntry(Ro.of(0,65535),0),r},e.of=function(t,n,r){return void 0===r&&(r=!0),new e(t,n,r)},e}(No),Zo=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.encodeStreams=r,o.objectsPerStream=i,o}return n(e,t),e.prototype.computeBufferSize=function(){return i(this,void 0,void 0,(function(){var t,e,n,r,i,a,s,l,h,u,c,d,f,p,g,v,y,m,b;return o(this,(function(o){switch(o.label){case 0:t=this.context.largestObjectNumber+1,e=ho.forVersion(1,7),n=e.sizeInBytes()+2,r=Xo.create(this.createTrailerDict(),this.encodeStreams),i=[],a=[],s=[],l=this.context.enumerateIndirectObjects(),d=0,f=l.length,o.label=1;case 1:return d"},e.prototype.sizeInBytes=function(){return this.value.length+2},e.prototype.copyBytesInto=function(t,e){return t[e++]=mr.LessThan,e+=k(this.value,t,e),t[e++]=mr.GreaterThan,this.value.length+2},e.of=function(t){return new e(t)},e.fromText=function(t){for(var n=Z(t),r="",i=0,o=n.length;i> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000>\nendcodespacerange\n"+t.length+" beginbfchar\n"+t.map((function(t){return t[0]+" "+t[1]})).join("\n")+"\nendbfchar\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend"},$o=function(){for(var t=[],e=0;e"},ta=function(t){return y(t,4)},ea=function(t){if(Y(t))return ta(t);if(J(t)){var e=Q(t),n=$(t);return""+ta(e)+ta(n)}var r=m(t);throw new Error("0x"+r+" is not a valid UTF-8 or UTF-16 codepoint.")},na=function(t){function e(e){var n=t.call(this)||this;return n.value=e,n}return n(e,t),e.prototype.asBytes=function(){for(var t=[],e="",n=!1,r=function(e){void 0!==e&&t.push(e),n=!1},i=0,o=this.value.length;i=mr.Zero&&s<=mr.Seven?3!==(e+=a).length&&l>="0"&&l<="7"||(r(parseInt(e,8)),e=""):r(s):s===mr.BackSlash?n=!0:r(s)}return new Uint8Array(t)},e.prototype.decodeText=function(){var t=this.asBytes();return lt(t)?et(t):qn(t)},e.prototype.decodeDate=function(){var t=this.decodeText(),e=B(t);if(!e)throw new tr(t);return e},e.prototype.asString=function(){return this.value},e.prototype.clone=function(){return e.of(this.value)},e.prototype.toString=function(){return"("+this.value+")"},e.prototype.sizeInBytes=function(){return this.value.length+2},e.prototype.copyBytesInto=function(t,e){return t[e++]=mr.LeftParen,e+=k(this.value,t,e),t[e++]=mr.RightParen,this.value.length+2},e.of=function(t){return new e(t)},e.fromDate=function(t){return new e("D:"+x(String(t.getUTCFullYear()),4,"0")+x(String(t.getUTCMonth()+1),2,"0")+x(String(t.getUTCDate()),2,"0")+x(String(t.getUTCHours()),2,"0")+x(String(t.getUTCMinutes()),2,"0")+x(String(t.getUTCSeconds()),2,"0")+"Z")},e}(uo),ra=function(){function t(t,e,n,r){var i=this;this.allGlyphsInFontSortedById=function(){for(var t=new Array(i.font.characterSet.length),e=0,n=t.length;e=0;)t[e]=0}var da=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],fa=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],pa=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ga=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],va=new Array(576);ca(va);var ya=new Array(60);ca(ya);var ma=new Array(512);ca(ma);var ba=new Array(256);ca(ba);var wa=new Array(29);ca(wa);var xa,ka,Fa,Sa=new Array(30);function Ca(t,e,n,r,i){this.static_tree=t,this.extra_bits=e,this.extra_base=n,this.elems=r,this.max_length=i,this.has_stree=t&&t.length}function Aa(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}function Ta(t){return t<256?ma[t]:ma[256+(t>>>7)]}function Pa(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function za(t,e,n){t.bi_valid>16-n?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=n-16):(t.bi_buf|=e<>>=1,n<<=1}while(--e>0);return n>>>1}function Da(t,e,n){var r,i,o=new Array(16),a=0;for(r=1;r<=15;r++)o[r]=a=a+n[r-1]<<1;for(i=0;i<=e;i++){var s=t[2*i+1];0!==s&&(t[2*i]=Oa(o[s]++,s))}}function Ba(t){var e;for(e=0;e<286;e++)t.dyn_ltree[2*e]=0;for(e=0;e<30;e++)t.dyn_dtree[2*e]=0;for(e=0;e<19;e++)t.bl_tree[2*e]=0;t.dyn_ltree[512]=1,t.opt_len=t.static_len=0,t.last_lit=t.matches=0}function Na(t){t.bi_valid>8?Pa(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0}function Ea(t,e,n,r){var i=2*e,o=2*n;return t[i]>1;n>=1;n--)ja(t,o,n);i=l;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],ja(t,o,1),r=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=r,o[2*i]=o[2*n]+o[2*r],t.depth[i]=(t.depth[n]>=t.depth[r]?t.depth[n]:t.depth[r])+1,o[2*n+1]=o[2*r+1]=i,t.heap[1]=i++,ja(t,o,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],function(t,e){var n,r,i,o,a,s,l=e.dyn_tree,h=e.max_code,u=e.stat_desc.static_tree,c=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,f=e.stat_desc.extra_base,p=e.stat_desc.max_length,g=0;for(o=0;o<=15;o++)t.bl_count[o]=0;for(l[2*t.heap[t.heap_max]+1]=0,n=t.heap_max+1;n<573;n++)(o=l[2*l[2*(r=t.heap[n])+1]+1]+1)>p&&(o=p,g++),l[2*r+1]=o,r>h||(t.bl_count[o]++,a=0,r>=f&&(a=d[r-f]),s=l[2*r],t.opt_len+=s*(o+a),c&&(t.static_len+=s*(u[2*r+1]+a)));if(0!==g){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,g-=2}while(g>0);for(o=p;0!==o;o--)for(r=t.bl_count[o];0!==r;)(i=t.heap[--n])>h||(l[2*i+1]!==o&&(t.opt_len+=(o-l[2*i+1])*l[2*i],l[2*i+1]=o),r--)}}(t,e),Da(o,h,t.bl_count)}function Ua(t,e,n){var r,i,o=-1,a=e[1],s=0,l=7,h=4;for(0===a&&(l=138,h=3),e[2*(n+1)+1]=65535,r=0;r<=n;r++)i=a,a=e[2*(r+1)+1],++s>=7;r<30;r++)for(Sa[r]=i<<7,t=0;t<1<0?(2===t.strm.data_type&&(t.strm.data_type=function(t){var e,n=4093624447;for(e=0;e<=31;e++,n>>>=1)if(1&n&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e<256;e++)if(0!==t.dyn_ltree[2*e])return 1;return 0}(t)),Ia(t,t.l_desc),Ia(t,t.d_desc),a=function(t){var e;for(Ua(t,t.dyn_ltree,t.l_desc.max_code),Ua(t,t.dyn_dtree,t.d_desc.max_code),Ia(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*ga[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e}(t),i=t.opt_len+3+7>>>3,(o=t.static_len+3+7>>>3)<=i&&(i=o)):i=o=n+5,n+4<=i&&-1!==e?qa(t,e,n,r):4===t.strategy||o===i?(za(t,2+(r?1:0),3),Ma(t,va,ya)):(za(t,4+(r?1:0),3),function(t,e,n,r){var i;for(za(t,e-257,5),za(t,n-1,5),za(t,r-4,4),i=0;i>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&n,t.last_lit++,0===e?t.dyn_ltree[2*n]++:(t.matches++,e--,t.dyn_ltree[2*(ba[n]+256+1)]++,t.dyn_dtree[2*Ta(e)]++),t.last_lit===t.lit_bufsize-1},_tr_align:function(t){za(t,2,3),Ra(t,256,va),function(t){16===t.bi_valid?(Pa(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}};var Ka=function(t,e,n,r){for(var i=65535&t|0,o=t>>>16&65535|0,a=0;0!==n;){n-=a=n>2e3?2e3:n;do{o=o+(i=i+e[r++]|0)|0}while(--a);i%=65521,o%=65521}return i|o<<16|0};var Ga=function(){for(var t,e=[],n=0;n<256;n++){t=n;for(var r=0;r<8;r++)t=1&t?3988292384^t>>>1:t>>>1;e[n]=t}return e}();var Ha,_a=function(t,e,n,r){var i=Ga,o=r+n;t^=-1;for(var a=r;a>>8^i[255&(t^e[a])];return-1^t},Xa={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};function Za(t,e){return t.msg=Xa[e],e}function Ya(t){return(t<<1)-(t>4?9:0)}function Ja(t){for(var e=t.length;--e>=0;)t[e]=0}function Qa(t){var e=t.state,n=e.pending;n>t.avail_out&&(n=t.avail_out),0!==n&&(ua.arraySet(t.output,e.pending_buf,e.pending_out,n,t.next_out),t.next_out+=n,e.pending_out+=n,t.total_out+=n,t.avail_out-=n,e.pending-=n,0===e.pending&&(e.pending_out=0))}function $a(t,e){La._tr_flush_block(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Qa(t.strm)}function ts(t,e){t.pending_buf[t.pending++]=e}function es(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function ns(t,e,n,r){var i=t.avail_in;return i>r&&(i=r),0===i?0:(t.avail_in-=i,ua.arraySet(e,t.input,t.next_in,i,n),1===t.state.wrap?t.adler=Ka(t.adler,e,i,n):2===t.state.wrap&&(t.adler=_a(t.adler,e,i,n)),t.next_in+=i,t.total_in+=i,i)}function rs(t,e){var n,r,i=t.max_chain_length,o=t.strstart,a=t.prev_length,s=t.nice_match,l=t.strstart>t.w_size-262?t.strstart-(t.w_size-262):0,h=t.window,u=t.w_mask,c=t.prev,d=t.strstart+258,f=h[o+a-1],p=h[o+a];t.prev_length>=t.good_match&&(i>>=2),s>t.lookahead&&(s=t.lookahead);do{if(h[(n=e)+a]===p&&h[n+a-1]===f&&h[n]===h[o]&&h[++n]===h[o+1]){o+=2,n++;do{}while(h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&h[++o]===h[++n]&&oa){if(t.match_start=e,a=r,r>=s)break;f=h[o+a-1],p=h[o+a]}}}while((e=c[e&u])>l&&0!=--i);return a<=t.lookahead?a:t.lookahead}function is(t){var e,n,r,i,o,a=t.w_size;do{if(i=t.window_size-t.lookahead-t.strstart,t.strstart>=a+(a-262)){ua.arraySet(t.window,t.window,a,a,0),t.match_start-=a,t.strstart-=a,t.block_start-=a,e=n=t.hash_size;do{r=t.head[--e],t.head[e]=r>=a?r-a:0}while(--n);e=n=a;do{r=t.prev[--e],t.prev[e]=r>=a?r-a:0}while(--n);i+=a}if(0===t.strm.avail_in)break;if(n=ns(t.strm,t.window,t.strstart+t.lookahead,i),t.lookahead+=n,t.lookahead+t.insert>=3)for(o=t.strstart-t.insert,t.ins_h=t.window[o],t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<=3)if(r=La._tr_tally(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,t.ins_h=(t.ins_h<=3&&(t.ins_h=(t.ins_h<4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){i=t.strstart+t.lookahead-3,r=La._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=i&&(t.ins_h=(t.ins_h<15&&(a=2,r-=16),i<1||i>9||8!==n||r<8||r>15||e<0||e>9||o<0||o>4)return Za(t,-2);8===r&&(r=9);var s=new ls;return t.state=s,s.strm=t,s.wrap=a,s.gzhead=null,s.w_bits=r,s.w_size=1<t.pending_buf_size-5&&(n=t.pending_buf_size-5);;){if(t.lookahead<=1){if(is(t),0===t.lookahead&&0===e)return 1;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var r=t.block_start+n;if((0===t.strstart||t.strstart>=r)&&(t.lookahead=t.strstart-r,t.strstart=r,$a(t,!1),0===t.strm.avail_out))return 1;if(t.strstart-t.block_start>=t.w_size-262&&($a(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?($a(t,!0),0===t.strm.avail_out?3:4):(t.strstart>t.block_start&&($a(t,!1),t.strm.avail_out),1)})),new ss(4,4,8,4,os),new ss(4,5,16,8,os),new ss(4,6,32,32,os),new ss(4,4,16,16,as),new ss(8,16,32,32,as),new ss(8,16,128,128,as),new ss(8,32,128,256,as),new ss(32,128,258,1024,as),new ss(32,258,258,4096,as)];var ds={deflateInit:function(t,e){return cs(t,e,8,15,8,0)},deflateInit2:cs,deflateReset:us,deflateResetKeep:hs,deflateSetHeader:function(t,e){return t&&t.state?2!==t.state.wrap?-2:(t.state.gzhead=e,0):-2},deflate:function(t,e){var n,r,i,o;if(!t||!t.state||e>5||e<0)return t?Za(t,-2):-2;if(r=t.state,!t.output||!t.input&&0!==t.avail_in||666===r.status&&4!==e)return Za(t,0===t.avail_out?-5:-2);if(r.strm=t,n=r.last_flush,r.last_flush=e,42===r.status)if(2===r.wrap)t.adler=0,ts(r,31),ts(r,139),ts(r,8),r.gzhead?(ts(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),ts(r,255&r.gzhead.time),ts(r,r.gzhead.time>>8&255),ts(r,r.gzhead.time>>16&255),ts(r,r.gzhead.time>>24&255),ts(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),ts(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(ts(r,255&r.gzhead.extra.length),ts(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(t.adler=_a(t.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(ts(r,0),ts(r,0),ts(r,0),ts(r,0),ts(r,0),ts(r,9===r.level?2:r.strategy>=2||r.level<2?4:0),ts(r,3),r.status=113);else{var a=8+(r.w_bits-8<<4)<<8;a|=(r.strategy>=2||r.level<2?0:r.level<6?1:6===r.level?2:3)<<6,0!==r.strstart&&(a|=32),a+=31-a%31,r.status=113,es(r,a),0!==r.strstart&&(es(r,t.adler>>>16),es(r,65535&t.adler)),t.adler=1}if(69===r.status)if(r.gzhead.extra){for(i=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>i&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),Qa(t),i=r.pending,r.pending!==r.pending_buf_size));)ts(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),Qa(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),Qa(t),i=r.pending,r.pending===r.pending_buf_size)){o=1;break}o=r.gzindexi&&(t.adler=_a(t.adler,r.pending_buf,r.pending-i,i)),0===o&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&Qa(t),r.pending+2<=r.pending_buf_size&&(ts(r,255&t.adler),ts(r,t.adler>>8&255),t.adler=0,r.status=113)):r.status=113),0!==r.pending){if(Qa(t),0===t.avail_out)return r.last_flush=-1,0}else if(0===t.avail_in&&Ya(e)<=Ya(n)&&4!==e)return Za(t,-5);if(666===r.status&&0!==t.avail_in)return Za(t,-5);if(0!==t.avail_in||0!==r.lookahead||0!==e&&666!==r.status){var s=2===r.strategy?function(t,e){for(var n;;){if(0===t.lookahead&&(is(t),0===t.lookahead)){if(0===e)return 1;break}if(t.match_length=0,n=La._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,n&&($a(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?($a(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&($a(t,!1),0===t.strm.avail_out)?1:2}(r,e):3===r.strategy?function(t,e){for(var n,r,i,o,a=t.window;;){if(t.lookahead<=258){if(is(t),t.lookahead<=258&&0===e)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(r=a[i=t.strstart-1])===a[++i]&&r===a[++i]&&r===a[++i]){o=t.strstart+258;do{}while(r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&r===a[++i]&&it.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(n=La._tr_tally(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(n=La._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),n&&($a(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,4===e?($a(t,!0),0===t.strm.avail_out?3:4):t.last_lit&&($a(t,!1),0===t.strm.avail_out)?1:2}(r,e):Ha[r.level].func(r,e);if(3!==s&&4!==s||(r.status=666),1===s||3===s)return 0===t.avail_out&&(r.last_flush=-1),0;if(2===s&&(1===e?La._tr_align(r):5!==e&&(La._tr_stored_block(r,0,0,!1),3===e&&(Ja(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),Qa(t),0===t.avail_out))return r.last_flush=-1,0}return 4!==e?0:r.wrap<=0?1:(2===r.wrap?(ts(r,255&t.adler),ts(r,t.adler>>8&255),ts(r,t.adler>>16&255),ts(r,t.adler>>24&255),ts(r,255&t.total_in),ts(r,t.total_in>>8&255),ts(r,t.total_in>>16&255),ts(r,t.total_in>>24&255)):(es(r,t.adler>>>16),es(r,65535&t.adler)),Qa(t),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?0:1)},deflateEnd:function(t){var e;return t&&t.state?42!==(e=t.state.status)&&69!==e&&73!==e&&91!==e&&103!==e&&113!==e&&666!==e?Za(t,-2):(t.state=null,113===e?Za(t,-3):0):-2},deflateSetDictionary:function(t,e){var n,r,i,o,a,s,l,h,u=e.length;if(!t||!t.state)return-2;if(2===(o=(n=t.state).wrap)||1===o&&42!==n.status||n.lookahead)return-2;for(1===o&&(t.adler=Ka(t.adler,e,u,0)),n.wrap=0,u>=n.w_size&&(0===o&&(Ja(n.head),n.strstart=0,n.block_start=0,n.insert=0),h=new ua.Buf8(n.w_size),ua.arraySet(h,e,u-n.w_size,n.w_size,0),e=h,u=n.w_size),a=t.avail_in,s=t.next_in,l=t.input,t.avail_in=u,t.next_in=0,t.input=e,is(n);n.lookahead>=3;){r=n.strstart,i=n.lookahead-2;do{n.ins_h=(n.ins_h<=252?6:vs>=248?5:vs>=240?4:vs>=224?3:vs>=192?2:1;gs[254]=gs[254]=1;function ys(t,e){if(e<65534&&(t.subarray&&ps||!t.subarray&&fs))return String.fromCharCode.apply(null,ua.shrinkBuf(t,e));for(var n="",r=0;r>>6,e[o++]=128|63&n):n<65536?(e[o++]=224|n>>>12,e[o++]=128|n>>>6&63,e[o++]=128|63&n):(e[o++]=240|n>>>18,e[o++]=128|n>>>12&63,e[o++]=128|n>>>6&63,e[o++]=128|63&n);return e},bs=function(t){return ys(t,t.length)},ws=function(t){for(var e=new ua.Buf8(t.length),n=0,r=e.length;n4)s[r++]=65533,n+=o-1;else{for(i&=2===o?31:3===o?15:7;o>1&&n1?s[r++]=65533:i<65536?s[r++]=i:(i-=65536,s[r++]=55296|i>>10&1023,s[r++]=56320|1023&i)}return ys(s,r)},ks=function(t,e){var n;for((e=e||t.length)>t.length&&(e=t.length),n=e-1;n>=0&&128==(192&t[n]);)n--;return n<0||0===n?e:n+gs[t[n]]>e?n:e};var Fs=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},Ss=Object.prototype.toString;function Cs(t){if(!(this instanceof Cs))return new Cs(t);this.options=ua.assign({level:-1,method:8,chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},t||{});var e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Fs,this.strm.avail_out=0;var n=ds.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy);if(0!==n)throw new Error(Xa[n]);if(e.header&&ds.deflateSetHeader(this.strm,e.header),e.dictionary){var r;if(r="string"==typeof e.dictionary?ms(e.dictionary):"[object ArrayBuffer]"===Ss.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,0!==(n=ds.deflateSetDictionary(this.strm,r)))throw new Error(Xa[n]);this._dict_set=!0}}function As(t,e){var n=new Cs(e);if(n.push(t,!0),n.err)throw n.msg||Xa[n.err];return n.result}Cs.prototype.push=function(t,e){var n,r,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;r=e===~~e?e:!0===e?4:0,"string"==typeof t?i.input=ms(t):"[object ArrayBuffer]"===Ss.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new ua.Buf8(o),i.next_out=0,i.avail_out=o),1!==(n=ds.deflate(i,r))&&0!==n)return this.onEnd(n),this.ended=!0,!1;0!==i.avail_out&&(0!==i.avail_in||4!==r&&2!==r)||("string"===this.options.to?this.onData(bs(ua.shrinkBuf(i.output,i.next_out))):this.onData(ua.shrinkBuf(i.output,i.next_out)))}while((i.avail_in>0||0===i.avail_out)&&1!==n);return 4===r?(n=ds.deflateEnd(this.strm),this.onEnd(n),this.ended=!0,0===n):2!==r||(this.onEnd(0),i.avail_out=0,!0)},Cs.prototype.onData=function(t){this.chunks.push(t)},Cs.prototype.onEnd=function(t){0===t&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=ua.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Ts={Deflate:Cs,deflate:As,deflateRaw:function(t,e){return(e=e||{}).raw=!0,As(t,e)},gzip:function(t,e){return(e=e||{}).gzip=!0,As(t,e)}},Ps=function(t,e){var n,r,i,o,a,s,l,h,u,c,d,f,p,g,v,y,m,b,w,x,k,F,S,C,A;n=t.state,r=t.next_in,C=t.input,i=r+(t.avail_in-5),o=t.next_out,A=t.output,a=o-(e-t.avail_out),s=o+(t.avail_out-257),l=n.dmax,h=n.wsize,u=n.whave,c=n.wnext,d=n.window,f=n.hold,p=n.bits,g=n.lencode,v=n.distcode,y=(1<>>=w=b>>>24,p-=w,0===(w=b>>>16&255))A[o++]=65535&b;else{if(!(16&w)){if(0==(64&w)){b=g[(65535&b)+(f&(1<>>=w,p-=w),p<15&&(f+=C[r++]<>>=w=b>>>24,p-=w,!(16&(w=b>>>16&255))){if(0==(64&w)){b=v[(65535&b)+(f&(1<l){t.msg="invalid distance too far back",n.mode=30;break t}if(f>>>=w,p-=w,k>(w=o-a)){if((w=k-w)>u&&n.sane){t.msg="invalid distance too far back",n.mode=30;break t}if(F=0,S=d,0===c){if(F+=h-w,w2;)A[o++]=S[F++],A[o++]=S[F++],A[o++]=S[F++],x-=3;x&&(A[o++]=S[F++],x>1&&(A[o++]=S[F++]))}else{F=o-k;do{A[o++]=A[F++],A[o++]=A[F++],A[o++]=A[F++],x-=3}while(x>2);x&&(A[o++]=A[F++],x>1&&(A[o++]=A[F++]))}break}}break}}while(r>3,f&=(1<<(p-=x<<3))-1,t.next_in=r,t.next_out=o,t.avail_in=r=1&&0===R[x];x--);if(k>x&&(k=x),0===x)return i[o++]=20971520,i[o++]=20971520,s.bits=1,0;for(w=1;w0&&(0===t||1!==x))return-1;for(O[1]=0,m=1;m<15;m++)O[m+1]=O[m]+R[m];for(b=0;b852||2===t&&A>592)return 1;for(;;){p=m-S,a[b]f?(g=D[B+a[b]],v=P[z+a[b]]):(g=96,v=0),l=1<>S)+(h-=l)]=p<<24|g<<16|v|0}while(0!==h);for(l=1<>=1;if(0!==l?(T&=l-1,T+=l):T=0,b++,0==--R[m]){if(m===x)break;m=e[n+a[b]]}if(m>k&&(T&c)!==u){for(0===S&&(S=k),d+=w,C=1<<(F=m-S);F+S852||2===t&&A>592)return 1;i[u=T&c]=k<<24|F<<16|d-o|0}}return 0!==T&&(i[d+T]=m-S<<24|64<<16|0),s.bits=k,0};function Ns(t){return(t>>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function Es(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new ua.Buf16(320),this.work=new ua.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function js(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=1,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new ua.Buf32(852),e.distcode=e.distdyn=new ua.Buf32(592),e.sane=1,e.back=-1,0):-2}function Ms(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,js(t)):-2}function Is(t,e){var n,r;return t&&t.state?(r=t.state,e<0?(n=0,e=-e):(n=1+(e>>4),e<48&&(e&=15)),e&&(e<8||e>15)?-2:(null!==r.window&&r.wbits!==e&&(r.window=null),r.wrap=n,r.wbits=e,Ms(t))):-2}function Us(t,e){var n,r;return t?(r=new Es,t.state=r,r.window=null,0!==(n=Is(t,e))&&(t.state=null),n):-2}var Vs,Ws,qs=!0;function Ls(t){if(qs){var e;for(Vs=new ua.Buf32(512),Ws=new ua.Buf32(32),e=0;e<144;)t.lens[e++]=8;for(;e<256;)t.lens[e++]=9;for(;e<280;)t.lens[e++]=7;for(;e<288;)t.lens[e++]=8;for(Bs(1,t.lens,0,288,Vs,0,t.work,{bits:9}),e=0;e<32;)t.lens[e++]=5;Bs(2,t.lens,0,32,Ws,0,t.work,{bits:5}),qs=!1}t.lencode=Vs,t.lenbits=9,t.distcode=Ws,t.distbits=5}function Ks(t,e,n,r){var i,o=t.state;return null===o.window&&(o.wsize=1<=o.wsize?(ua.arraySet(o.window,e,n-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):((i=o.wsize-o.wnext)>r&&(i=r),ua.arraySet(o.window,e,n-r,i,o.wnext),(r-=i)?(ua.arraySet(o.window,e,n-r,r,0),o.wnext=r,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whave>>8&255,n.check=_a(n.check,T,2,0),h=0,u=0,n.mode=2;break}if(n.flags=0,n.head&&(n.head.done=!1),!(1&n.wrap)||(((255&h)<<8)+(h>>8))%31){t.msg="incorrect header check",n.mode=30;break}if(8!=(15&h)){t.msg="unknown compression method",n.mode=30;break}if(u-=4,k=8+(15&(h>>>=4)),0===n.wbits)n.wbits=k;else if(k>n.wbits){t.msg="invalid window size",n.mode=30;break}n.dmax=1<>8&1),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=_a(n.check,T,2,0)),h=0,u=0,n.mode=3;case 3:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>8&255,T[2]=h>>>16&255,T[3]=h>>>24&255,n.check=_a(n.check,T,4,0)),h=0,u=0,n.mode=4;case 4:for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>8),512&n.flags&&(T[0]=255&h,T[1]=h>>>8&255,n.check=_a(n.check,T,2,0)),h=0,u=0,n.mode=5;case 5:if(1024&n.flags){for(;u<16;){if(0===s)break t;s--,h+=r[o++]<>>8&255,n.check=_a(n.check,T,2,0)),h=0,u=0}else n.head&&(n.head.extra=null);n.mode=6;case 6:if(1024&n.flags&&((f=n.length)>s&&(f=s),f&&(n.head&&(k=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Array(n.head.extra_len)),ua.arraySet(n.head.extra,r,o,f,k)),512&n.flags&&(n.check=_a(n.check,r,f,o)),s-=f,o+=f,n.length-=f),n.length))break t;n.length=0,n.mode=7;case 7:if(2048&n.flags){if(0===s)break t;f=0;do{k=r[o+f++],n.head&&k&&n.length<65536&&(n.head.name+=String.fromCharCode(k))}while(k&&f>9&1,n.head.done=!0),t.adler=n.check=0,n.mode=12;break;case 10:for(;u<32;){if(0===s)break t;s--,h+=r[o++]<>>=7&u,u-=7&u,n.mode=27;break}for(;u<3;){if(0===s)break t;s--,h+=r[o++]<>>=1)){case 0:n.mode=14;break;case 1:if(Ls(n),n.mode=20,6===e){h>>>=2,u-=2;break t}break;case 2:n.mode=17;break;case 3:t.msg="invalid block type",n.mode=30}h>>>=2,u-=2;break;case 14:for(h>>>=7&u,u-=7&u;u<32;){if(0===s)break t;s--,h+=r[o++]<>>16^65535)){t.msg="invalid stored block lengths",n.mode=30;break}if(n.length=65535&h,h=0,u=0,n.mode=15,6===e)break t;case 15:n.mode=16;case 16:if(f=n.length){if(f>s&&(f=s),f>l&&(f=l),0===f)break t;ua.arraySet(i,r,o,f,a),s-=f,o+=f,l-=f,a+=f,n.length-=f;break}n.mode=12;break;case 17:for(;u<14;){if(0===s)break t;s--,h+=r[o++]<>>=5,u-=5,n.ndist=1+(31&h),h>>>=5,u-=5,n.ncode=4+(15&h),h>>>=4,u-=4,n.nlen>286||n.ndist>30){t.msg="too many length or distance symbols",n.mode=30;break}n.have=0,n.mode=18;case 18:for(;n.have>>=3,u-=3}for(;n.have<19;)n.lens[P[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,S={bits:n.lenbits},F=Bs(0,n.lens,0,19,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid code lengths set",n.mode=30;break}n.have=0,n.mode=19;case 19:for(;n.have>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=v,u-=v,n.lens[n.have++]=m;else{if(16===m){for(C=v+2;u>>=v,u-=v,0===n.have){t.msg="invalid bit length repeat",n.mode=30;break}k=n.lens[n.have-1],f=3+(3&h),h>>>=2,u-=2}else if(17===m){for(C=v+3;u>>=v)),h>>>=3,u-=3}else{for(C=v+7;u>>=v)),h>>>=7,u-=7}if(n.have+f>n.nlen+n.ndist){t.msg="invalid bit length repeat",n.mode=30;break}for(;f--;)n.lens[n.have++]=k}}if(30===n.mode)break;if(0===n.lens[256]){t.msg="invalid code -- missing end-of-block",n.mode=30;break}if(n.lenbits=9,S={bits:n.lenbits},F=Bs(1,n.lens,0,n.nlen,n.lencode,0,n.work,S),n.lenbits=S.bits,F){t.msg="invalid literal/lengths set",n.mode=30;break}if(n.distbits=6,n.distcode=n.distdyn,S={bits:n.distbits},F=Bs(2,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,S),n.distbits=S.bits,F){t.msg="invalid distances set",n.mode=30;break}if(n.mode=20,6===e)break t;case 20:n.mode=21;case 21:if(s>=6&&l>=258){t.next_out=a,t.avail_out=l,t.next_in=o,t.avail_in=s,n.hold=h,n.bits=u,Ps(t,d),a=t.next_out,i=t.output,l=t.avail_out,o=t.next_in,r=t.input,s=t.avail_in,h=n.hold,u=n.bits,12===n.mode&&(n.back=-1);break}for(n.back=0;y=(A=n.lencode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,n.length=m,0===y){n.mode=26;break}if(32&y){n.back=-1,n.mode=12;break}if(64&y){t.msg="invalid literal/length code",n.mode=30;break}n.extra=15&y,n.mode=22;case 22:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=23;case 23:for(;y=(A=n.distcode[h&(1<>>16&255,m=65535&A,!((v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>b)])>>>16&255,m=65535&A,!(b+(v=A>>>24)<=u);){if(0===s)break t;s--,h+=r[o++]<>>=b,u-=b,n.back+=b}if(h>>>=v,u-=v,n.back+=v,64&y){t.msg="invalid distance code",n.mode=30;break}n.offset=m,n.extra=15&y,n.mode=24;case 24:if(n.extra){for(C=n.extra;u>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){t.msg="invalid distance too far back",n.mode=30;break}n.mode=25;case 25:if(0===l)break t;if(f=d-l,n.offset>f){if((f=n.offset-f)>n.whave&&n.sane){t.msg="invalid distance too far back",n.mode=30;break}f>n.wnext?(f-=n.wnext,p=n.wsize-f):p=n.wnext-f,f>n.length&&(f=n.length),g=n.window}else g=i,p=a-n.offset,f=n.length;f>l&&(f=l),l-=f,n.length-=f;do{i[a++]=g[p++]}while(--f);0===n.length&&(n.mode=21);break;case 26:if(0===l)break t;i[a++]=n.length,l--,n.mode=21;break;case 27:if(n.wrap){for(;u<32;){if(0===s)break t;s--,h|=r[o++]<=0&&e.windowBits<16&&(e.windowBits=-e.windowBits,0===e.windowBits&&(e.windowBits=-15)),!(e.windowBits>=0&&e.windowBits<16)||t&&t.windowBits||(e.windowBits+=32),e.windowBits>15&&e.windowBits<48&&0==(15&e.windowBits)&&(e.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Fs,this.strm.avail_out=0;var n=Gs.inflateInit2(this.strm,e.windowBits);if(n!==Hs.Z_OK)throw new Error(Xa[n]);if(this.header=new _s,Gs.inflateGetHeader(this.strm,this.header),e.dictionary&&("string"==typeof e.dictionary?e.dictionary=ms(e.dictionary):"[object ArrayBuffer]"===Xs.call(e.dictionary)&&(e.dictionary=new Uint8Array(e.dictionary)),e.raw&&(n=Gs.inflateSetDictionary(this.strm,e.dictionary))!==Hs.Z_OK))throw new Error(Xa[n])}function Ys(t,e){var n=new Zs(e);if(n.push(t,!0),n.err)throw n.msg||Xa[n.err];return n.result}Zs.prototype.push=function(t,e){var n,r,i,o,a,s=this.strm,l=this.options.chunkSize,h=this.options.dictionary,u=!1;if(this.ended)return!1;r=e===~~e?e:!0===e?Hs.Z_FINISH:Hs.Z_NO_FLUSH,"string"==typeof t?s.input=ws(t):"[object ArrayBuffer]"===Xs.call(t)?s.input=new Uint8Array(t):s.input=t,s.next_in=0,s.avail_in=s.input.length;do{if(0===s.avail_out&&(s.output=new ua.Buf8(l),s.next_out=0,s.avail_out=l),(n=Gs.inflate(s,Hs.Z_NO_FLUSH))===Hs.Z_NEED_DICT&&h&&(n=Gs.inflateSetDictionary(this.strm,h)),n===Hs.Z_BUF_ERROR&&!0===u&&(n=Hs.Z_OK,u=!1),n!==Hs.Z_STREAM_END&&n!==Hs.Z_OK)return this.onEnd(n),this.ended=!0,!1;s.next_out&&(0!==s.avail_out&&n!==Hs.Z_STREAM_END&&(0!==s.avail_in||r!==Hs.Z_FINISH&&r!==Hs.Z_SYNC_FLUSH)||("string"===this.options.to?(i=ks(s.output,s.next_out),o=s.next_out-i,a=xs(s.output,i),s.next_out=o,s.avail_out=l-o,o&&ua.arraySet(s.output,s.output,i,o,0),this.onData(a)):this.onData(ua.shrinkBuf(s.output,s.next_out)))),0===s.avail_in&&0===s.avail_out&&(u=!0)}while((s.avail_in>0||0===s.avail_out)&&n!==Hs.Z_STREAM_END);return n===Hs.Z_STREAM_END&&(r=Hs.Z_FINISH),r===Hs.Z_FINISH?(n=Gs.inflateEnd(this.strm),this.onEnd(n),this.ended=!0,n===Hs.Z_OK):r!==Hs.Z_SYNC_FLUSH||(this.onEnd(Hs.Z_OK),s.avail_out=0,!0)},Zs.prototype.onData=function(t){this.chunks.push(t)},Zs.prototype.onEnd=function(t){t===Hs.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=ua.flattenChunks(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var Js={Inflate:Zs,inflate:Ys,inflateRaw:function(t,e){return(e=e||{}).raw=!0,Ys(t,e)},ungzip:Ys},Qs={};(0,ua.assign)(Qs,Ts,Js,Hs);var $s,tl,el,nl=Qs,rl={};rl.toRGBA8=function(t){var e=t.width,n=t.height;if(null==t.tabs.acTL)return[rl.toRGBA8.decodeImage(t.data,e,n,t).buffer];var r=[];null==t.frames[0].data&&(t.frames[0].data=t.data);for(var i=e*n*4,o=new Uint8Array(i),a=new Uint8Array(i),s=new Uint8Array(i),l=0;l>3)]>>7-((7&f)<<0)&1);s[b]=w[A],s[b+1]=w[A+1],s[b+2]=w[A+2],s[b+3]=T>2)]>>6-((3&f)<<1)&3);s[b]=w[A],s[b+1]=w[A+1],s[b+2]=w[A+2],s[b+3]=T>1)]>>4-((1&f)<<2)&15);s[b]=w[A],s[b+1]=w[A+1],s[b+2]=w[A+2],s[b+3]=T>>3)]>>>7-(7&D)&1))==255*v?0:255;l[O+D]=B<<24|P<<16|P<<8|P}else if(2==u)for(D=0;D>>2)]>>>6-((3&D)<<1)&3))==85*v?0:255;l[O+D]=B<<24|P<<16|P<<8|P}else if(4==u)for(D=0;D>>1)]>>>4-((1&D)<<2)&15))==17*v?0:255;l[O+D]=B<<24|P<<16|P<<8|P}else if(8==u)for(D=0;D>>2<<3));0==o;)if(o=g(t,f,1),a=g(t,f+1,2),f+=3,0!=a){if(k&&(e=el.H.W(e,d+(1<<17))),1==a&&(n=x.J,r=x.h,u=511,c=31),2==a){s=v(t,f,5)+257,l=v(t,f+5,5)+1,h=v(t,f+10,4)+4,f+=14;for(var F=1,S=0;S<38;S+=2)x.Q[S]=0,x.Q[S+1]=0;for(S=0;SF&&(F=C)}f+=3*h,m(x.Q,F),b(x.Q,F,x.u),n=x.w,r=x.d,f=y(x.u,(1<>>4;if(z>>>8==0)e[d++]=z;else{if(256==z)break;var R=d+z-254;if(z>264){var O=x.q[z-257];R=d+(O>>>3)+v(t,f,7&O),f+=7&O}var D=r[w(t,f)&c];f+=15&D;var B=D>>>4,N=x.c[B],E=(N>>>4)+g(t,f,15&N);for(f+=15&N;d>>3),M=t[j-4]|t[j-3]<<8;k&&(e=el.H.W(e,d+M)),e.set(new i(t.buffer,t.byteOffset+j,M),d),f=j+M<<3,d+=M}return e.length==d?e:e.slice(0,d)},el.H.W=function(t,e){var n=t.length;if(e<=n)return t;var r=new Uint8Array(n<<1);return r.set(t,0),r},el.H.R=function(t,e,n,r,i,o){for(var a=el.H.e,s=el.H.Z,l=0;l>>4;if(u<=15)o[l]=u,l++;else{var c=0,d=0;16==u?(d=3+a(r,i,2),i+=2,c=o[l-1]):17==u?(d=3+a(r,i,3),i+=3):18==u&&(d=11+a(r,i,7),i+=7);for(var f=l+d;l>>1;oi&&(i=s),o++}for(;o>1,s=t[o+1],l=a<<4|s,h=e-s,u=t[o]<>>15-e]=l,u++},el.H.l=function(t,e){for(var n=el.H.m.r,r=15-e,i=0;i>>r}},el.H.M=function(t,e,n){n<<=7&e;var r=e>>>3;t[r]|=n,t[r+1]|=n>>>8},el.H.I=function(t,e,n){n<<=7&e;var r=e>>>3;t[r]|=n,t[r+1]|=n>>>8,t[r+2]|=n>>>16},el.H.e=function(t,e,n){return(t[e>>>3]|t[1+(e>>>3)]<<8)>>>(7&e)&(1<>>3]|t[1+(e>>>3)]<<8|t[2+(e>>>3)]<<16)>>>(7&e)&(1<>>3]|t[1+(e>>>3)]<<8|t[2+(e>>>3)]<<16)>>>(7&e)},el.H.i=function(t,e){return(t[e>>>3]|t[1+(e>>>3)]<<8|t[2+(e>>>3)]<<16|t[3+(e>>>3)]<<24)>>>(7&e)},el.H.m=($s=Uint16Array,tl=Uint32Array,{K:new $s(16),j:new $s(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new $s(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new tl(32),J:new $s(512),_:[],h:new $s(32),$:[],w:new $s(32768),C:[],v:[],d:new $s(32768),D:[],u:new $s(512),Q:[],r:new $s(32768),s:new tl(286),Y:new tl(30),a:new tl(19),t:new tl(15e3),k:new $s(65536),g:new $s(32768)}),function(){for(var t=el.H.m,e=0;e<32768;e++){var n=e;n=(4278255360&(n=(4042322160&(n=(3435973836&(n=(2863311530&n)>>>1|(1431655765&n)<<1))>>>2|(858993459&n)<<2))>>>4|(252645135&n)<<4))>>>8|(16711935&n)<<8,t.r[e]=(n>>>16|n<<16)>>>17}function r(t,e,n){for(;0!=e--;)t.push(0,n)}for(e=0;e<32;e++)t.q[e]=t.S[e]<<3|t.T[e],t.c[e]=t.p[e]<<4|t.z[e];r(t._,144,8),r(t._,112,9),r(t._,24,7),r(t._,8,8),el.H.n(t._,9),el.H.A(t._,9,t.J),el.H.l(t._,9),r(t.$,32,5),el.H.n(t.$,5),el.H.A(t.$,5,t.h),el.H.l(t.$,5),r(t.Q,19,0),r(t.C,286,0),r(t.D,30,0),r(t.v,320,0)}(),el.H.N),rl.decode._readInterlace=function(t,e){for(var n=e.width,r=e.height,i=rl.decode._getBPP(e),o=i>>3,a=Math.ceil(n*i/8),s=new Uint8Array(r*a),l=0,h=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],c=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1],f=0;f<7;){for(var p=c[f],g=d[f],v=0,y=0,m=h[f];m>3])>>7-(7&S)&1,s[k*a+(F>>3)]|=C<<7-((7&F)<<0);if(2==i)C=(C=t[S>>3])>>6-(7&S)&3,s[k*a+(F>>2)]|=C<<6-((3&F)<<1);if(4==i)C=(C=t[S>>3])>>4-(7&S)&15,s[k*a+(F>>1)]|=C<<4-((1&F)<<2);if(i>=8)for(var A=k*a+F*o,T=0;T>3)+T];S+=i,F+=g}x++,k+=p}v*y!=0&&(l+=y*(1+w)),f+=1}return s},rl.decode._getBPP=function(t){return[1,null,3,1,2,null,4][t.ctype]*t.depth},rl.decode._filterZero=function(t,e,n,r,i){var o=rl.decode._getBPP(e),a=Math.ceil(r*o/8),s=rl.decode._paeth;o=Math.ceil(o/8);var l=0,h=1,u=t[n],c=0;if(u>1&&(t[n]=[0,0,1][u-2]),3==u)for(c=o;c>>1)&255;for(var d=0;d>>1);for(;c>>1)}else{for(;c>8&255,t[e+1]=255&n},readUint:function(t,e){return 16777216*t[e]+(t[e+1]<<16|t[e+2]<<8|t[e+3])},writeUint:function(t,e,n){t[e]=n>>24&255,t[e+1]=n>>16&255,t[e+2]=n>>8&255,t[e+3]=255&n},readASCII:function(t,e,n){for(var r="",i=0;i=0&&s>=0?(c=f*e+p<<2,d=(s+f)*i+a+p<<2):(c=(-s+f)*e-a+p<<2,d=f*i+p<<2),0==l)r[d]=t[c],r[d+1]=t[c+1],r[d+2]=t[c+2],r[d+3]=t[c+3];else if(1==l){var g=t[c+3]*(1/255),v=t[c]*g,y=t[c+1]*g,m=t[c+2]*g,b=r[d+3]*(1/255),w=r[d]*b,x=r[d+1]*b,k=r[d+2]*b,F=1-g,S=g+b*F,C=0==S?0:1/S;r[d+3]=255*S,r[d+0]=(v+w*F)*C,r[d+1]=(y+x*F)*C,r[d+2]=(m+k*F)*C}else if(2==l){g=t[c+3],v=t[c],y=t[c+1],m=t[c+2],b=r[d+3],w=r[d],x=r[d+1],k=r[d+2];g==b&&v==w&&y==x&&m==k?(r[d]=0,r[d+1]=0,r[d+2]=0,r[d+3]=0):(r[d]=v,r[d+1]=y,r[d+2]=m,r[d+3]=g)}else if(3==l){g=t[c+3],v=t[c],y=t[c+1],m=t[c+2],b=r[d+3],w=r[d],x=r[d+1],k=r[d+2];if(g==b&&v==w&&y==x&&m==k)continue;if(g<220&&b>20)return!1}return!0},rl.encode=function(t,e,n,r,i,o,a){null==r&&(r=0),null==a&&(a=!1);var s=rl.encode.compress(t,e,n,r,[!1,!1,!1,0,a]);return rl.encode.compressPNG(s,-1),rl.encode._main(s,e,n,i,o)},rl.encodeLL=function(t,e,n,r,i,o,a,s){for(var l={ctype:0+(1==r?0:2)+(0==i?0:4),depth:o,frames:[]},h=(r+i)*o,u=h*e,c=0;c1,c=!1,d=33+(u?20:0);if(null!=i.sRGB&&(d+=13),null!=i.pHYs&&(d+=21),3==t.ctype){for(var f=t.plte.length,p=0;p>>24!=255&&(c=!0);d+=8+3*f+4+(c?8+1*f+4:0)}for(var g=0;g>>8&255,k=b>>>16&255;v[h+m+0]=w,v[h+m+1]=x,v[h+m+2]=k}if(a(v,h+=3*f,o(v,h-3*f-4,3*f+4)),h+=4,c){a(v,h,f),l(v,h+=4,"tRNS"),h+=4;for(p=0;p>>24&255;a(v,h+=f,o(v,h-f-4,f+4)),h+=4}}var F=0;for(g=0;g>2,T>>2));for(f=0;fR&&D==z[v-R])O[v]=O[v-R];else{var B=b[D];if(null==B&&(b[D]=B=w.length,w.push(D),w.length>=300))break;O[v]=B}}}var N=w.length;N<=256&&0==h&&(c=N<=2?1:N<=4?2:N<=16?4:8,c=Math.max(c,l));for(f=0;f>1)]|=V[q+L]<<4-4*(1&L);else if(2==c)for(L=0;L>2)]|=V[q+L]<<6-2*(3&L);else if(1==c)for(L=0;L>3)]|=V[q+L]<<7-1*(7&L)}j=U,u=3,I=1}else if(0==y&&1==m.length){U=new Uint8Array(R*E*3);var K=R*E;for(v=0;vS&&(S=T),AC&&(C=A))}-1==S&&(k=F=S=C=0),i&&(1==(1&k)&&k--,1==(1&F)&&F--);var P=(S-k+1)*(C-F+1);Pv&&(v=w),xy&&(y=x))}-1==v&&(p=g=v=y=0),a&&(1==(1&p)&&p--,1==(1&g)&&g--),o={x:p,y:g,width:v-p+1,height:y-g+1};var S=r[i];S.rect=o,S.blend=1,S.img=new Uint8Array(o.width*o.height*4),0==r[i-1].dispose?(rl._copyTile(h,e,n,S.img,o.width,o.height,-o.x,-o.y,0),rl.encode._prepareDiff(d,e,n,S.img,o)):rl._copyTile(d,e,n,S.img,o.width,o.height,-o.x,-o.y,0)},rl.encode._prepareDiff=function(t,e,n,r,i){rl._copyTile(t,e,n,r,i.width,i.height,-i.x,-i.y,2)},rl.encode._filterZero=function(t,e,n,r,i,o,a){var s,l=[],h=[0,1,2,3,4];-1!=o?h=[o]:(e*r>5e5||1==n)&&(h=[0]),a&&(s={level:0});for(var u=a&&null!=UZIP?UZIP:nl,c=0;c>1)+256&255;if(4==o)for(h=i;h>1)&255;for(h=i;h>1)&255}if(4==o){for(h=0;h>>1:n>>>=1;t[e]=n}return t}(),update:function(t,e,n,r){for(var i=0;i>>8;return t},crc:function(t,e,n){return 4294967295^rl.crc.update(4294967295,t,e,n)}},rl.quantize=function(t,e){for(var n=new Uint8Array(t),r=n.slice(0),i=new Uint32Array(r.buffer),o=rl.quantize.getKDtree(r,e),a=o[0],s=o[1],l=(rl.quantize.planeDst,n),h=i,u=l.length,c=new Uint8Array(n.length>>2),d=0;d>2]=y.ind,h[d>>2]=y.est.rgba}return{abuf:r.buffer,inds:c,plte:s}},rl.quantize.getKDtree=function(t,e,n){null==n&&(n=1e-4);var r=new Uint32Array(t.buffer),i={i0:0,i1:t.length,bst:null,est:null,tdst:0,left:null,right:null};i.bst=rl.quantize.stats(t,i.i0,i.i1),i.est=rl.quantize.estats(i.bst);for(var o=[i];o.lengtha&&(a=o[l].est.L,s=l);if(a=u||h.i1<=u)h.est.L=0;else{var c={i0:h.i0,i1:u,bst:null,est:null,tdst:0,left:null,right:null};c.bst=rl.quantize.stats(t,c.i0,c.i1),c.est=rl.quantize.estats(c.bst);var d={i0:u,i1:h.i1,bst:null,est:null,tdst:0,left:null,right:null};d.bst={R:[],m:[],N:h.bst.N-c.bst.N};for(l=0;l<16;l++)d.bst.R[l]=h.bst.R[l]-c.bst.R[l];for(l=0;l<4;l++)d.bst.m[l]=h.bst.m[l]-c.bst.m[l];d.est=rl.quantize.estats(d.bst),h.left=c,h.right=d,o[s]=c,o.push(d)}}o.sort((function(t,e){return e.bst.N-t.bst.N}));for(l=0;l0&&(a=t.right,s=t.left);var l=rl.quantize.getNearest(a,e,n,r,i);if(l.tdst<=o*o)return l;var h=rl.quantize.getNearest(s,e,n,r,i);return h.tdsto;)r-=4;if(n>=r)break;var s=e[n>>2];e[n>>2]=e[r>>2],e[r>>2]=s,n+=4,r-=4}for(;a(t,n,i)>o;)n-=4;return n+4},rl.quantize.vecDot=function(t,e,n){return t[e]*n[0]+t[e+1]*n[1]+t[e+2]*n[2]+t[e+3]*n[3]},rl.quantize.stats=function(t,e,n){for(var r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=[0,0,0,0],o=n-e>>2,a=e;a>>0}},rl.M4={multVec:function(t,e){return[t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3],t[4]*e[0]+t[5]*e[1]+t[6]*e[2]+t[7]*e[3],t[8]*e[0]+t[9]*e[1]+t[10]*e[2]+t[11]*e[3],t[12]*e[0]+t[13]*e[1]+t[14]*e[2]+t[15]*e[3]]},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},sml:function(t,e){return[t*e[0],t*e[1],t*e[2],t*e[3]]}},rl.encode.concatRGBA=function(t){for(var e=0,n=0;n1)throw new Error("Animated PNGs are not supported");var r=function(t){for(var e=Math.floor(t.length/4),n=new Uint8Array(3*e),r=new Uint8Array(1*e),i=0,o=0,a=0;i=this.end?-1:this.bytes[this.pos++]},t.prototype.getUint16=function(){var t=this.getByte(),e=this.getByte();return-1===t||-1===e?-1:(t<<8)+e},t.prototype.getInt32=function(){return(this.getByte()<<24)+(this.getByte()<<16)+(this.getByte()<<8)+this.getByte()},t.prototype.getBytes=function(t,e){void 0===e&&(e=!1);var n=this.bytes,r=this.pos,i=this.end;if(t){var o=r+t;o>i&&(o=i),this.pos=o;a=n.subarray(r,o);return e?new Uint8ClampedArray(a):a}var a=n.subarray(r,i);return e?new Uint8ClampedArray(a):a},t.prototype.peekByte=function(){var t=this.getByte();return this.pos--,t},t.prototype.peekBytes=function(t,e){void 0===e&&(e=!1);var n=this.getBytes(t,e);return this.pos-=n.length,n},t.prototype.skip=function(t){t||(t=1),this.pos+=t},t.prototype.reset=function(){this.pos=this.start},t.prototype.moveStart=function(){this.start=this.pos},t.prototype.makeSubStream=function(e,n){return new t(this.bytes,e,n)},t.prototype.decode=function(){return this.bytes},t}(),dl=new Uint8Array(0),fl=function(){function t(t){if(this.pos=0,this.bufferLength=0,this.eof=!1,this.buffer=dl,this.minBufferLength=512,t)for(;this.minBufferLengthi&&(n=i)}else{for(;!this.eof;)this.readBlock();n=this.bufferLength}this.pos=n;var o=this.buffer.subarray(r,n);return!e||o instanceof Uint8ClampedArray?o:new Uint8ClampedArray(o)},t.prototype.peekByte=function(){var t=this.getByte();return this.pos--,t},t.prototype.peekBytes=function(t,e){void 0===e&&(e=!1);var n=this.getBytes(t,e);return this.pos-=n.length,n},t.prototype.skip=function(t){t||(t=1),this.pos+=t},t.prototype.reset=function(){this.pos=0},t.prototype.makeSubStream=function(t,e){for(var n=t+e;this.bufferLength<=n&&!this.eof;)this.readBlock();return new cl(this.buffer,t,e)},t.prototype.decode=function(){for(;!this.eof;)this.readBlock();return this.buffer.subarray(0,this.bufferLength)},t.prototype.readBlock=function(){throw new Kn(this.constructor.name,"readBlock")},t.prototype.ensureBuffer=function(t){var e=this.buffer;if(t<=e.byteLength)return e;for(var n=this.minBufferLength;n=0;--r)n[i+r]=255&a,a>>=8}}else this.eof=!0},e}(fl),vl=function(t){function e(e,n){var r=t.call(this,n)||this;return r.stream=e,r.firstDigit=-1,n&&(n*=.5),r}return n(e,t),e.prototype.readBlock=function(){var t=this.stream.getBytes(8e3);if(t.length){for(var e=t.length+1>>1,n=this.ensureBuffer(this.bufferLength+e),r=this.bufferLength,i=this.firstDigit,o=0,a=t.length;o=48&&s<=57)l=15&s;else{if(!(s>=65&&s<=70||s>=97&&s<=102)){if(62===s){this.eof=!0;break}continue}l=9+(15&s)}i<0?i=l:(n[r++]=i<<4|l,i=-1)}i>=0&&this.eof&&(n[r++]=i<<4,i=-1),this.firstDigit=i,this.bufferLength=r}else this.eof=!0},e}(fl),yl=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),ml=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]),bl=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]),wl=[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],xl=[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],kl=function(t){function e(e,n){var r=t.call(this,n)||this;r.stream=e;var i=e.getByte(),o=e.getByte();if(-1===i||-1===o)throw new Error("Invalid header in flate stream: "+i+", "+o);if(8!=(15&i))throw new Error("Unknown compression method in flate stream: "+i+", "+o);if(((i<<8)+o)%31!=0)throw new Error("Bad FCHECK in flate stream: "+i+", "+o);if(32&o)throw new Error("FDICT bit set in flate stream: "+i+", "+o);return r.codeSize=0,r.codeBuf=0,r}return n(e,t),e.prototype.readBlock=function(){var t,e,n=this.stream,r=this.getBits(3);if(1&r&&(this.eof=!0),0!==(r>>=1)){var i,o;if(1===r)i=wl,o=xl;else{if(2!==r)throw new Error("Unknown block type in flate stream");var a=this.getBits(5)+257,s=this.getBits(5)+1,l=this.getBits(4)+4,h=new Uint8Array(yl.length),u=void 0;for(u=0;u0;)f[u++]=v}i=this.generateHuffmanTable(f.subarray(0,a)),o=this.generateHuffmanTable(f.subarray(a,d))}for(var b=(t=this.buffer)?t.length:0,w=this.bufferLength;;){var x=this.getCode(i);if(x<256)w+1>=b&&(b=(t=this.ensureBuffer(w+1)).length),t[w++]=x;else{if(256===x)return void(this.bufferLength=w);var k=(x=ml[x-=257])>>16;k>0&&(k=this.getBits(k)),e=(65535&x)+k,x=this.getCode(o),(k=(x=bl[x])>>16)>0&&(k=this.getBits(k));var F=(65535&x)+k;w+e>=b&&(b=(t=this.ensureBuffer(w+e)).length);for(var S=0;S>t,this.codeSize=r-=t,e},e.prototype.getCode=function(t){for(var e,n=this.stream,r=t[0],i=t[1],o=this.codeSize,a=this.codeBuf;o>16,h=65535&s;if(l<1||o>l,this.codeSize=o-l,h},e.prototype.generateHuffmanTable=function(t){var e,n=t.length,r=0;for(e=0;er&&(r=t[e]);for(var i=1<>=1;for(e=u;e0;if(!y||y<256)d[0]=y,f=1;else{if(!(y>=258)){if(256===y){u=9,a=258,f=0;continue}this.eof=!0,delete this.lzwState;break}if(y=0;e--)d[e]=s[n],n=h[n];else d[f++]=d[0]}if(m&&(h[a]=c,l[a]=l[c]+1,s[a]=d[0],u=++a+o&a+o-1?u:0|Math.min(Math.log(a+o)/.6931471805599453+1,12)),c=y,r<(p+=f)){do{r+=512}while(r>>e&(1<0){var i=this.stream.getBytes(r);e.set(i,n),n+=r}}else{r=257-r;var o=t[1];e=this.ensureBuffer(n+r+1);for(var a=0;ae.size())throw new rr(t,0,e.size());e.remove(t)}else{if(0!==t)throw new rr(t,0,0);this.setKids([])}},e.prototype.normalizedEntries=function(){var t=this.Kids();return t||(t=this.dict.context.obj([this.ref]),this.dict.set(Fo.of("Kids"),t)),{Kids:t}},e.fromDict=function(t,n){return new e(t,n)},e}(El),Wl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.Opt=function(){return this.dict.lookupMaybe(Fo.of("Opt"),na,Yo,fo)},e.prototype.setOpt=function(t){this.dict.set(Fo.of("Opt"),this.dict.context.obj(t))},e.prototype.getExportValues=function(){var t=this.Opt();if(t){if(t instanceof na||t instanceof Yo)return[t];for(var e=[],n=0,r=t.size();ne.size())throw new rr(t,0,e.size());e.remove(t)}},e.prototype.normalizeExportValues=function(){for(var t,e,n,r,i=null!==(t=this.getExportValues())&&void 0!==t?t:[],o=[],a=this.getWidgets(),s=0,l=a.length;s1){if(!this.hasFlag(t.AcroChoiceFlags.MultiSelect))throw new or;this.dict.set(Fo.of("V"),this.dict.context.obj(e))}this.updateSelectedIndices(e)},r.prototype.valuesAreValid=function(t){for(var e=this.getOptions(),n=function(n,r){var i=t[n].decodeText();if(!e.find((function(t){return i===(t.display||t.value).decodeText()})))return{value:!1}},r=0,i=t.length;r1){for(var e=new Array(t.length),n=this.getOptions(),r=function(r,i){var o=t[r].decodeText();e[r]=n.findIndex((function(t){return o===(t.display||t.value).decodeText()}))},i=0,o=t.length;i0){var o=i.lookup(0,na,Yo),a=i.lookupMaybe(1,na,Yo);e.push({value:o,display:a||o})}}return e}return[]},r}(Vl),Gl=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.fromDict=function(t,e){return new r(t,e)},r.create=function(e){var n=e.obj({FT:"Ch",Ff:t.AcroChoiceFlags.Combo,Kids:[]});return new r(n,e.register(n))},r}(Kl),Hl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.addField=function(t){var e=this.normalizedEntries().Kids;null==e||e.push(t)},e.prototype.normalizedEntries=function(){var t=this.Kids();return t||(t=this.dict.context.obj([]),this.dict.set(Fo.of("Kids"),t)),{Kids:t}},e.fromDict=function(t,n){return new e(t,n)},e.create=function(t){var n=t.obj({});return new e(n,t.register(n))},e}(El),_l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.fromDict=function(t,n){return new e(t,n)},e}(Vl),Xl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.MaxLen=function(){var t=this.dict.lookup(Fo.of("MaxLen"));if(t instanceof co)return t},e.prototype.Q=function(){var t=this.dict.lookup(Fo.of("Q"));if(t instanceof co)return t},e.prototype.setMaxLength=function(t){this.dict.set(Fo.of("MaxLen"),co.of(t))},e.prototype.removeMaxLength=function(){this.dict.delete(Fo.of("MaxLen"))},e.prototype.getMaxLength=function(){var t;return null===(t=this.MaxLen())||void 0===t?void 0:t.asNumber()},e.prototype.setQuadding=function(t){this.dict.set(Fo.of("Q"),co.of(t))},e.prototype.getQuadding=function(){var t;return null===(t=this.Q())||void 0===t?void 0:t.asNumber()},e.prototype.setValue=function(t){this.dict.set(Fo.of("V"),t)},e.prototype.removeValue=function(){this.dict.delete(Fo.of("V"))},e.prototype.getValue=function(){var t=this.V();if(t instanceof na||t instanceof Yo)return t},e.fromDict=function(t,n){return new e(t,n)},e.create=function(t){var n=t.obj({FT:"Tx",Kids:[]});return new e(n,t.register(n))},e}(Vl),Zl=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.fromDict=function(t,e){return new r(t,e)},r.create=function(e){var n=e.obj({FT:"Btn",Ff:t.AcroButtonFlags.PushButton,Kids:[]});return new r(n,e.register(n))},r}(Wl),Yl=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.setValue=function(t){if(!this.getOnValues().includes(t)&&t!==Fo.of("Off"))throw new ir;this.dict.set(Fo.of("V"),t);for(var e=this.getWidgets(),n=0,r=e.length;ni)throw new er(n,i);for(var o=n,a=0,s=r.size();ao)return h.insertLeafNode(t,o)||l;o-=h.Count().asNumber()}h instanceof Uo&&(o-=1)}if(0!==o)throw new nr(n,"insertLeafNode");this.insertLeafKid(r.size(),t)},e.prototype.removeLeafNode=function(t,n){void 0===n&&(n=!0);var r=this.Kids(),i=this.Count().asNumber();if(t>=i)throw new er(t,i);for(var o=t,a=0,s=r.size();ao)return h.removeLeafNode(o,n),void(n&&0===h.Kids().size()&&r.remove(a));o-=h.Count().asNumber()}if(h instanceof Uo){if(0===o)return void this.removeKid(a);o-=1}}throw new nr(t,"removeLeafNode")},e.prototype.ascend=function(t){t(this);var e=this.Parent();e&&e.ascend(t)},e.prototype.traverse=function(t){for(var n=this.Kids(),r=0,i=n.size();rNumber.MAX_SAFE_INTEGER){if(this.capNumbers){var r="Parsed number that is too large for some PDF readers: "+t+", using Number.MAX_SAFE_INTEGER instead.";return console.warn(r),Number.MAX_SAFE_INTEGER}r="Parsed number that is too large for some PDF readers: "+t+", not capping.";console.warn(r)}return n},t.prototype.skipWhitespace=function(){for(;!this.bytes.done()&&yo[this.bytes.peek()];)this.bytes.next()},t.prototype.skipLine=function(){for(;!this.bytes.done();){var t=this.bytes.peek();if(t===gh||t===vh)return;this.bytes.next()}},t.prototype.skipComment=function(){if(this.bytes.peek()!==mr.Percent)return!1;for(;!this.bytes.done();){var t=this.bytes.peek();if(t===gh||t===vh)return!0;this.bytes.next()}return!0},t.prototype.skipWhitespaceAndComments=function(){for(this.skipWhitespace();this.skipComment();)this.skipWhitespace()},t.prototype.matchKeyword=function(t){for(var e=this.bytes.offset(),n=0,r=t.length;n=this.length},t.prototype.offset=function(){return this.idx},t.prototype.slice=function(t,e){return this.bytes.slice(t,e)},t.prototype.position=function(){return{line:this.line,column:this.column,offset:this.idx}},t.of=function(e){return new t(e)},t.fromPDFRawStream=function(e){return t.of(Al(e).decode())},t}(),bh=mr.Space,wh=mr.CarriageReturn,xh=mr.Newline,kh=[mr.s,mr.t,mr.r,mr.e,mr.a,mr.m],Fh=[mr.e,mr.n,mr.d,mr.s,mr.t,mr.r,mr.e,mr.a,mr.m],Sh={header:[mr.Percent,mr.P,mr.D,mr.F,mr.Dash],eof:[mr.Percent,mr.Percent,mr.E,mr.O,mr.F],obj:[mr.o,mr.b,mr.j],endobj:[mr.e,mr.n,mr.d,mr.o,mr.b,mr.j],xref:[mr.x,mr.r,mr.e,mr.f],trailer:[mr.t,mr.r,mr.a,mr.i,mr.l,mr.e,mr.r],startxref:[mr.s,mr.t,mr.a,mr.r,mr.t,mr.x,mr.r,mr.e,mr.f],true:[mr.t,mr.r,mr.u,mr.e],false:[mr.f,mr.a,mr.l,mr.s,mr.e],null:[mr.n,mr.u,mr.l,mr.l],stream:kh,streamEOF1:a(kh,[bh,wh,xh]),streamEOF2:a(kh,[wh,xh]),streamEOF3:a(kh,[wh]),streamEOF4:a(kh,[xh]),endstream:Fh,EOF1endstream:a([wh,xh],Fh),EOF2endstream:a([wh],Fh),EOF3endstream:a([xh],Fh)},Ch=function(t){function e(e,n,r){void 0===r&&(r=!1);var i=t.call(this,e,r)||this;return i.context=n,i}return n(e,t),e.prototype.parseObject=function(){if(this.skipWhitespaceAndComments(),this.matchKeyword(Sh.true))return go.True;if(this.matchKeyword(Sh.false))return go.False;if(this.matchKeyword(Sh.null))return So;var t=this.bytes.peek();if(t===mr.LessThan&&this.bytes.peekAhead(1)===mr.LessThan)return this.parseDictOrStream();if(t===mr.LessThan)return this.parseHexString();if(t===mr.LeftParen)return this.parseString();if(t===mr.ForwardSlash)return this.parseName();if(t===mr.LeftSquareBracket)return this.parseArray();if(dh[t])return this.parseNumberOrRef();throw new cr(this.bytes.position(),t)},e.prototype.parseNumberOrRef=function(){var t=this.parseRawNumber();this.skipWhitespaceAndComments();var e=this.bytes.offset();if(uh[this.bytes.peek()]){var n=this.parseRawNumber();if(this.skipWhitespaceAndComments(),this.bytes.peek()===mr.R)return this.bytes.assertNext(mr.R),Ro.of(t,n)}return this.bytes.moveTo(e),co.of(t)},e.prototype.parseHexString=function(){var t="";for(this.bytes.assertNext(mr.LessThan);!this.bytes.done()&&this.bytes.peek()!==mr.GreaterThan;)t+=b(this.bytes.next());return this.bytes.assertNext(mr.GreaterThan),Yo.of(t)},e.prototype.parseString=function(){for(var t=0,e=!1,n="";!this.bytes.done();){var r=this.bytes.next();if(n+=b(r),e||(r===mr.LeftParen&&(t+=1),r===mr.RightParen&&(t-=1)),r===mr.BackSlash?e=!e:e&&(e=!1),0===t)return na.of(n.substring(1,n.length-1))}throw new pr(this.bytes.position())},e.prototype.parseName=function(){this.bytes.assertNext(mr.ForwardSlash);for(var t="";!this.bytes.done();){var e=this.bytes.peek();if(yo[e]||vo[e])break;t+=b(e),this.bytes.next()}return Fo.of(t)},e.prototype.parseArray=function(){this.bytes.assertNext(mr.LeftSquareBracket),this.skipWhitespaceAndComments();for(var t=fo.withContext(this.context);this.bytes.peek()!==mr.RightSquareBracket;){var e=this.parseObject();t.push(e),this.skipWhitespaceAndComments()}return this.bytes.assertNext(mr.RightSquareBracket),t},e.prototype.parseDict=function(){this.bytes.assertNext(mr.LessThan),this.bytes.assertNext(mr.LessThan),this.skipWhitespaceAndComments();for(var t=new Map;!this.bytes.done()&&this.bytes.peek()!==mr.GreaterThan&&this.bytes.peekAhead(1)!==mr.GreaterThan;){var e=this.parseName(),n=this.parseObject();t.set(e,n),this.skipWhitespaceAndComments()}this.skipWhitespaceAndComments(),this.bytes.assertNext(mr.GreaterThan),this.bytes.assertNext(mr.GreaterThan);var r=t.get(Fo.of("Type"));return r===Fo.of("Catalog")?lh.fromMapWithContext(t,this.context):r===Fo.of("Pages")?hh.fromMapWithContext(t,this.context):r===Fo.of("Page")?Uo.fromMapWithContext(t,this.context):Co.fromMapWithContext(t,this.context)},e.prototype.parseDictOrStream=function(){var t=this.bytes.position(),e=this.parseDict();if(this.skipWhitespaceAndComments(),!(this.matchKeyword(Sh.streamEOF1)||this.matchKeyword(Sh.streamEOF2)||this.matchKeyword(Sh.streamEOF3)||this.matchKeyword(Sh.streamEOF4)||this.matchKeyword(Sh.stream)))return e;var n,r=this.bytes.offset(),i=e.get(Fo.of("Length"));i instanceof co?(n=r+i.asNumber(),this.bytes.moveTo(n),this.skipWhitespaceAndComments(),this.matchKeyword(Sh.endstream)||(this.bytes.moveTo(r),n=this.findEndOfStreamFallback(t))):n=this.findEndOfStreamFallback(t);var o=this.bytes.slice(r,n);return To.of(e,o)},e.prototype.findEndOfStreamFallback=function(t){for(var e=1,n=this.bytes.offset();!this.bytes.done()&&(n=this.bytes.offset(),this.matchKeyword(Sh.stream)?e+=1:this.matchKeyword(Sh.EOF1endstream)||this.matchKeyword(Sh.EOF2endstream)||this.matchKeyword(Sh.EOF3endstream)||this.matchKeyword(Sh.endstream)?e-=1:this.bytes.next(),0!==e););if(0!==e)throw new fr(t);return n},e.forBytes=function(t,n,r){return new e(mh.of(t),n,r)},e.forByteStream=function(t,n,r){return void 0===r&&(r=!1),new e(t,n,r)},e}(yh),Ah=function(t){function e(e,n){var r=t.call(this,mh.fromPDFRawStream(e),e.dict.context)||this,i=e.dict;return r.alreadyParsed=!1,r.shouldWaitForTick=n||function(){return!1},r.firstOffset=i.lookup(Fo.of("First"),co).asNumber(),r.objectCount=i.lookup(Fo.of("N"),co).asNumber(),r}return n(e,t),e.prototype.parseIntoContext=function(){return i(this,void 0,void 0,(function(){var t,e,n,r,i,a,s,l;return o(this,(function(o){switch(o.label){case 0:if(this.alreadyParsed)throw new Xn("PDFObjectStreamParser","parseIntoContext");this.alreadyParsed=!0,t=this.parseOffsetsAndObjectNumbers(),e=0,n=t.length,o.label=1;case 1:return e=mr.Space&&e<=mr.Tilde&&(this.matchKeyword(Sh.xref)||this.matchKeyword(Sh.trailer)||this.matchKeyword(Sh.startxref)||this.matchIndirectObjectHeader())){this.bytes.moveTo(t);break}this.bytes.next()}},e.prototype.skipBinaryHeaderComment=function(){this.skipWhitespaceAndComments();try{var t=this.bytes.offset();this.parseIndirectObjectHeader(),this.bytes.moveTo(t)}catch(t){this.bytes.next(),this.skipWhitespaceAndComments()}},e.forBytesWithOptions=function(t,n,r,i){return new e(t,n,r,i)},e}(Ch),zh=function(t){return 1<1&&(n*=d=Math.sqrt(d),r*=d);var f=c/n,p=u/n,g=-u/r,v=c/r,y=f*s+p*l,m=g*s+v*l,b=f*t+p*e,w=g*t+v*e,x=1/((b-y)*(b-y)+(w-m)*(w-m))-.25;x<0&&(x=0);var k=Math.sqrt(x);o===i&&(k=-k);var F=.5*(y+b)-k*(w-m),S=.5*(m+w)+k*(b-y),C=Math.atan2(m-S,y-F),A=Math.atan2(w-S,b-F)-C;A<0&&1===o?A+=2*Math.PI:A>0&&0===o&&(A-=2*Math.PI);for(var T=Math.ceil(Math.abs(A/(.5*Math.PI+.001))),P=[],z=0;z0&&(r[r.length]=+i),n[n.length]={cmd:e,args:r},r=[],i="",o=!1),e=h;else if([" ",","].includes(h)||"-"===h&&i.length>0&&"e"!==i[i.length-1]||"."===h&&o){if(0===i.length)continue;r.length===a?(n[n.length]={cmd:e,args:r},r=[+i],"M"===e&&(e="L"),"m"===e&&(e="l")):r[r.length]=+i,o="."===h,i=["-","."].includes(h)?h:""}else i+=h,"."===h&&(o=!0)}return i.length>0&&(r.length===a?(n[n.length]={cmd:e,args:r},r=[+i],"M"===e&&(e="L"),"m"===e&&(e="l")):r[r.length]=+i),n[n.length]={cmd:e,args:r},n}(t))},ac=function(t,e){for(var n=[au(),e.graphicsState&&ou(e.graphicsState),xu(),Ku(e.color),Fu(e.font,e.size),Su(e.lineHeight),Tu(Vh(e.rotate),Vh(e.xSkew),Vh(e.ySkew),e.x,e.y)].filter(Boolean),r=0,i=t.length;rt.length)return i-1;var p=e.heightAtSize(i);if((p+.2*p)*o>Math.abs(n.height))return i-1;i+=1}return i},Uc=function(t){for(var e=t.length;e>0;e--)if(/\s/.test(t[e]))return e},Vc=function(t,e,n,r){for(var i,o=t.length;o>0;){var a=t.substring(0,o),s=n.encodeText(a),l=n.widthOfTextAtSize(a,r);if(lf&&(f=C+k),g+l>p&&(p=g+l),u.push({text:w,encoded:x,width:k,height:l,x:C,y:g}),m=null==F?void 0:F.trim()}return{fontSize:i,lineHeight:h,lines:u,bounds:{x:c,y:d,width:f-c,height:p-d}}},qc=function(t,e){var n=e.fontSize,r=e.font,i=e.bounds,o=e.cellCount,a=P(S(t));if(a.length>o)throw new Nc(a.length,o);void 0!==n&&0!==n||(n=function(t,e,n,r){for(var i=n.width/r,o=n.height,a=4,s=R(t);a<500;){for(var l=0,h=s.length;l.75*i)return a-1}if(e.heightAtSize(a,{descender:!1})>o)return a-1;a+=1}return a}(a,r,i,o));for(var s=i.width/o,l=r.heightAtSize(n,{descender:!1}),h=i.y+(i.height/2-l/2),u=[],c=i.x,d=i.y,f=i.x+i.width,p=i.y+i.height,g=0,v=0;gf&&(f=k+x),h+l>p&&(p=h+l),u.push({text:a,encoded:w,width:x,height:l,x:k,y:h}),g+=1,v+=b}return{fontSize:n,cells:u,bounds:{x:c,y:d,width:f-c,height:p-d}}},Lc=function(e,n){var r=n.alignment,i=n.fontSize,o=n.font,a=n.bounds,s=P(S(e));void 0!==i&&0!==i||(i=Ic([s],o,a));var l=o.encodeText(s),h=o.widthOfTextAtSize(s,i),u=o.heightAtSize(i,{descender:!1}),c=r===t.TextAlignment.Left?a.x:r===t.TextAlignment.Center?a.x+a.width/2-h/2:r===t.TextAlignment.Right?a.x+a.width-h:a.x,d=a.y+(a.height/2-u/2);return{fontSize:i,line:{text:s,encoded:l,width:h,height:u,x:c,y:d},bounds:{x:c,y:d,width:h,height:u}}},Kc=function(t){return"normal"in t?t:{normal:t}},Gc=/\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]+(\d*\.\d+|\d+)[\0\t\n\f\r\ ]+Tf/,Hc=function(t){var e,n,r=null!==(e=t.getDefaultAppearance())&&void 0!==e?e:"",i=null!==(n=N(r,Gc).match)&&void 0!==n?n:[],o=Number(i[2]);return isFinite(o)?o:void 0},_c=/(\d*\.\d+|\d+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+(g|rg|k)/,Xc=function(t){var e,n=null!==(e=t.getDefaultAppearance())&&void 0!==e?e:"",r=N(n,_c).match,i=null!=r?r:[],o=i[1],a=i[2],s=i[3],l=i[4],h=i[5];return"g"===h&&o?Iu(Number(o)):"rg"===h&&o&&a&&s?Uu(Number(o),Number(a),Number(s)):"k"===h&&o&&a&&s&&l?Vu(Number(o),Number(a),Number(s),Number(l)):void 0},Zc=function(t,e,n,r){var i;void 0===r&&(r=0);var o=[Ku(e).toString(),Fu(null!==(i=null==n?void 0:n.name)&&void 0!==i?i:"dummy__noop",r).toString()].join("\n");t.setDefaultAppearance(o)},Yc=function(t,e){var n,i,o,s=Xc(e),l=Xc(t.acroField),h=e.getRectangle(),u=e.getAppearanceCharacteristics(),c=e.getBorderStyle(),d=null!==(n=null==c?void 0:c.getWidth())&&void 0!==n?n:0,f=qh(null==u?void 0:u.getRotation()),p=Lh(h,f),g=p.width,v=p.height,y=vc(r(r({},h),{rotation:f})),m=Uu(0,0,0),b=null!==(i=Hu(null==u?void 0:u.getBorderColor()))&&void 0!==i?i:m,w=Hu(null==u?void 0:u.getBackgroundColor()),x=Hu(null==u?void 0:u.getBackgroundColor(),.8),k=null!==(o=null!=s?s:l)&&void 0!==o?o:m;Zc(s?e:t.acroField,k);var F={x:0+d/2,y:0+d/2,width:g-d,height:v-d,thickness:1.5,borderWidth:d,borderColor:b,markColor:k};return{normal:{on:a(y,yc(r(r({},F),{color:w,filled:!0}))),off:a(y,yc(r(r({},F),{color:w,filled:!1})))},down:{on:a(y,yc(r(r({},F),{color:x,filled:!0}))),off:a(y,yc(r(r({},F),{color:x,filled:!1})))}}},Jc=function(t,e){var n,i,o,s=Xc(e),l=Xc(t.acroField),h=e.getRectangle(),u=e.getAppearanceCharacteristics(),c=e.getBorderStyle(),d=null!==(n=null==c?void 0:c.getWidth())&&void 0!==n?n:0,f=qh(null==u?void 0:u.getRotation()),p=Lh(h,f),g=p.width,v=p.height,y=vc(r(r({},h),{rotation:f})),m=Uu(0,0,0),b=null!==(i=Hu(null==u?void 0:u.getBorderColor()))&&void 0!==i?i:m,w=Hu(null==u?void 0:u.getBackgroundColor()),x=Hu(null==u?void 0:u.getBackgroundColor(),.8),k=null!==(o=null!=s?s:l)&&void 0!==o?o:m;Zc(s?e:t.acroField,k);var F={x:g/2,y:v/2,width:g-d,height:v-d,borderWidth:d,borderColor:b,dotColor:k};return{normal:{on:a(y,mc(r(r({},F),{color:w,filled:!0}))),off:a(y,mc(r(r({},F),{color:w,filled:!1})))},down:{on:a(y,mc(r(r({},F),{color:x,filled:!0}))),off:a(y,mc(r(r({},F),{color:x,filled:!1})))}}},Qc=function(e,n,i){var o,s,l,h,u,c=Xc(n),d=Xc(e.acroField),f=Hc(n),p=Hc(e.acroField),g=n.getRectangle(),v=n.getAppearanceCharacteristics(),y=n.getBorderStyle(),m=null==v?void 0:v.getCaptions(),b=null!==(o=null==m?void 0:m.normal)&&void 0!==o?o:"",w=null!==(l=null!==(s=null==m?void 0:m.down)&&void 0!==s?s:b)&&void 0!==l?l:"",x=null!==(h=null==y?void 0:y.getWidth())&&void 0!==h?h:0,k=qh(null==v?void 0:v.getRotation()),F=Lh(g,k),S=F.width,C=F.height,A=vc(r(r({},g),{rotation:k})),T=Uu(0,0,0),P=Hu(null==v?void 0:v.getBorderColor()),z=Hu(null==v?void 0:v.getBackgroundColor()),R=Hu(null==v?void 0:v.getBackgroundColor(),.8),O={x:x,y:x,width:S-2*x,height:C-2*x},D=Lc(b,{alignment:t.TextAlignment.Center,fontSize:null!=f?f:p,font:i,bounds:O}),B=Lc(w,{alignment:t.TextAlignment.Center,fontSize:null!=f?f:p,font:i,bounds:O}),N=Math.min(D.fontSize,B.fontSize),E=null!==(u=null!=c?c:d)&&void 0!==u?u:T;Zc(c||void 0!==f?n:e.acroField,E,i,N);var j={x:0+x/2,y:0+x/2,width:S-x,height:C-x,borderWidth:x,borderColor:P,textColor:E,font:i.name,fontSize:N};return{normal:a(A,bc(r(r({},j),{color:z,textLines:[D.line]}))),down:a(A,bc(r(r({},j),{color:R,textLines:[B.line]})))}},$c=function(t,e,n){var i,o,s,l,h,u,c=Xc(e),d=Xc(t.acroField),f=Hc(e),p=Hc(t.acroField),g=e.getRectangle(),v=e.getAppearanceCharacteristics(),y=e.getBorderStyle(),m=null!==(i=t.getText())&&void 0!==i?i:"",b=null!==(o=null==y?void 0:y.getWidth())&&void 0!==o?o:0,w=qh(null==v?void 0:v.getRotation()),x=Lh(g,w),k=x.width,F=x.height,S=vc(r(r({},g),{rotation:w})),C=Uu(0,0,0),A=Hu(null==v?void 0:v.getBorderColor()),T=Hu(null==v?void 0:v.getBackgroundColor()),P=t.isCombed()?0:1,z={x:b+P,y:b+P,width:k-2*(b+P),height:F-2*(b+P)};if(t.isMultiline())h=(R=Wc(m,{alignment:t.getAlignment(),fontSize:null!=f?f:p,font:n,bounds:z})).lines,u=R.fontSize;else if(t.isCombed()){h=(R=qc(m,{fontSize:null!=f?f:p,font:n,bounds:z,cellCount:null!==(s=t.getMaxLength())&&void 0!==s?s:0})).cells,u=R.fontSize}else{var R;h=[(R=Lc(m,{alignment:t.getAlignment(),fontSize:null!=f?f:p,font:n,bounds:z})).line],u=R.fontSize}var O=null!==(l=null!=c?c:d)&&void 0!==l?l:C;Zc(c||void 0!==f?e:t.acroField,O,n,u);var D={x:0+b/2,y:0+b/2,width:k-b,height:F-b,borderWidth:null!=b?b:0,borderColor:A,textColor:O,font:n.name,fontSize:u,color:T,textLines:h,padding:P};return a(S,xc(D))},td=function(e,n,i){var o,s,l,h=Xc(n),u=Xc(e.acroField),c=Hc(n),d=Hc(e.acroField),f=n.getRectangle(),p=n.getAppearanceCharacteristics(),g=n.getBorderStyle(),v=null!==(o=e.getSelected()[0])&&void 0!==o?o:"",y=null!==(s=null==g?void 0:g.getWidth())&&void 0!==s?s:0,m=qh(null==p?void 0:p.getRotation()),b=Lh(f,m),w=b.width,x=b.height,k=vc(r(r({},f),{rotation:m})),F=Uu(0,0,0),S=Hu(null==p?void 0:p.getBorderColor()),C=Hu(null==p?void 0:p.getBackgroundColor()),A={x:y+1,y:y+1,width:w-2*(y+1),height:x-2*(y+1)},T=Lc(v,{alignment:t.TextAlignment.Left,fontSize:null!=c?c:d,font:i,bounds:A}),P=T.line,z=T.fontSize,R=null!==(l=null!=h?h:u)&&void 0!==l?l:F;Zc(h||void 0!==c?n:e.acroField,R,i,z);var O={x:0+y/2,y:0+y/2,width:w-y,height:x-y,borderWidth:null!=y?y:0,borderColor:S,textColor:R,font:i.name,fontSize:z,color:C,textLines:[P],padding:1};return a(k,xc(O))},ed=function(e,n,i){var o,s,l=Xc(n),h=Xc(e.acroField),u=Hc(n),c=Hc(e.acroField),d=n.getRectangle(),f=n.getAppearanceCharacteristics(),p=n.getBorderStyle(),g=null!==(o=null==p?void 0:p.getWidth())&&void 0!==o?o:0,v=qh(null==f?void 0:f.getRotation()),y=Lh(d,v),m=y.width,b=y.height,w=vc(r(r({},d),{rotation:v})),x=Uu(0,0,0),k=Hu(null==f?void 0:f.getBorderColor()),F=Hu(null==f?void 0:f.getBackgroundColor()),S=e.getOptions(),C=e.getSelected();e.isSorted()&&S.sort();for(var A="",T=0,P=S.length;T1||1===n.length&&e)&&this.enableMultiselect();for(var i=new Array(n.length),o=0,a=n.length;o1||1===n.length&&e)&&this.enableMultiselect();for(var i=new Array(n.length),o=0,a=n.length;oe)throw new Ec(t.length,e,this.getName());this.markAsDirty(),this.disableRichFormatting(),t?this.acroField.setValue(Yo.fromText(t)):this.acroField.removeValue()},r.prototype.getAlignment=function(){var e=this.acroField.getQuadding();return 0===e?t.TextAlignment.Left:1===e?t.TextAlignment.Center:2===e?t.TextAlignment.Right:t.TextAlignment.Left},r.prototype.setAlignment=function(e){Cn(e,"alignment",t.TextAlignment),this.markAsDirty(),this.acroField.setQuadding(e)},r.prototype.getMaxLength=function(){return this.acroField.getMaxLength()},r.prototype.setMaxLength=function(t){if(En(t,"maxLength",0,Number.MAX_SAFE_INTEGER),this.markAsDirty(),void 0===t)this.acroField.removeMaxLength();else{var e=this.getText();if(e&&e.length>t)throw new jc(e.length,t,this.getName());this.acroField.setMaxLength(t)}},r.prototype.removeMaxLength=function(){this.markAsDirty(),this.acroField.removeMaxLength()},r.prototype.setImage=function(e){for(var n=this.getAlignment(),r=n===t.TextAlignment.Center?t.ImageAlignment.Center:n===t.TextAlignment.Right?t.ImageAlignment.Right:t.ImageAlignment.Left,i=this.acroField.getWidgets(),o=0,a=i.length;o>6&31|192;var s=63&o|128;n.push(a,s),r+=1}else if(o<65536){a=o>>12&15|224,s=o>>6&63|128;var l=63&o|128;n.push(a,s,l),r+=1}else{if(!(o<1114112))throw new Error("Invalid code point: 0x"+m(o));a=o>>18&7|240,s=o>>12&63|128,l=o>>6&63|128;var h=o>>0&63|128;n.push(a,s,l,h),r+=2}}return new Uint8Array(n)},t.values=yn,t.waitForTick=X,Object.defineProperty(t,"__esModule",{value:!0})})); -//# sourceMappingURL=pdf-lib.min.js.map diff --git a/src/main/resources/static/js/thirdParty/popper.min.js b/src/main/resources/static/js/thirdParty/popper.min.js deleted file mode 100644 index 23122ccc..00000000 --- a/src/main/resources/static/js/thirdParty/popper.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @popperjs/core v2.9.2 - MIT License - */ - -"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return null==e?window:"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function o(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function r(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return"undefined"!=typeof ShadowRoot&&(e instanceof n(e).ShadowRoot||e instanceof ShadowRoot)}function s(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((r(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return t(f(e)).left+o(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function l(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function u(e,r,a){void 0===a&&(a=!1);var c=f(r);e=t(e);var u=i(r),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!a)&&(("body"!==s(r)||l(c))&&(d=r!==n(r)&&i(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:o(r)),i(r)?((m=t(r)).x+=r.clientLeft,m.y+=r.clientTop):c&&(m.x=p(c))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function d(e){var n=t(e),o=e.offsetWidth,r=e.offsetHeight;return 1>=Math.abs(n.width-o)&&(o=n.width),1>=Math.abs(n.height-r)&&(r=n.height),{x:e.offsetLeft,y:e.offsetTop,width:o,height:r}}function m(e){return"html"===s(e)?e:e.assignedSlot||e.parentNode||(a(e)?e.host:null)||f(e)}function h(e){return 0<=["html","body","#document"].indexOf(s(e))?e.ownerDocument.body:i(e)&&l(e)?e:h(m(e))}function v(e,t){var o;void 0===t&&(t=[]);var r=h(e);return e=r===(null==(o=e.ownerDocument)?void 0:o.body),o=n(r),r=e?[o].concat(o.visualViewport||[],l(r)?r:[]):r,t=t.concat(r),e?t:t.concat(v(m(r)))}function g(e){return i(e)&&"fixed"!==c(e).position?e.offsetParent:null}function y(e){for(var t=n(e),o=g(e);o&&0<=["table","td","th"].indexOf(s(o))&&"static"===c(o).position;)o=g(o);if(o&&("html"===s(o)||"body"===s(o)&&"static"===c(o).position))return t;if(!o)e:{if(o=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),-1===navigator.userAgent.indexOf("Trident")||!i(e)||"fixed"!==c(e).position)for(e=m(e);i(e)&&0>["html","body"].indexOf(s(e));){var r=c(e);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||o&&"filter"===r.willChange||o&&r.filter&&"none"!==r.filter){o=e;break e}e=e.parentNode}o=null}return o||t}function b(e){function t(e){o.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){o.has(e)||(e=n.get(e))&&t(e)})),r.push(e)}var n=new Map,o=new Set,r=[];return e.forEach((function(e){n.set(e.name,e)})),e.forEach((function(e){o.has(e.name)||t(e)})),r}function w(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function x(e){return e.split("-")[0]}function O(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&a(n))do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function j(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function E(e,r){if("viewport"===r){r=n(e);var a=f(e);r=r.visualViewport;var s=a.clientWidth;a=a.clientHeight;var l=0,u=0;r&&(s=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=r.offsetLeft,u=r.offsetTop)),e=j(e={width:s,height:a,x:l+p(e),y:u})}else i(r)?((e=t(r)).top+=r.clientTop,e.left+=r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top):(u=f(e),e=f(u),s=o(u),r=null==(a=u.ownerDocument)?void 0:a.body,a=_(e.scrollWidth,e.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),l=_(e.scrollHeight,e.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),u=-s.scrollLeft+p(u),s=-s.scrollTop,"rtl"===c(r||e).direction&&(u+=_(e.clientWidth,r?r.clientWidth:0)-a),e=j({width:a,height:l,x:u,y:s}));return e}function D(e,t,n){return t="clippingParents"===t?function(e){var t=v(m(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?y(e):e;return r(n)?t.filter((function(e){return r(e)&&O(e,n)&&"body"!==s(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=E(e,n),t.top=_(n.top,t.top),t.right=U(n.right,t.right),t.bottom=U(n.bottom,t.bottom),t.left=_(n.left,t.left),t}),E(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function L(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function P(e){var t=e.reference,n=e.element,o=(e=e.placement)?x(e):null;e=e?e.split("-")[1]:null;var r=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(o){case"top":r={x:r,y:t.y-n.height};break;case"bottom":r={x:r,y:t.y+t.height};break;case"right":r={x:t.x+t.width,y:i};break;case"left":r={x:t.x-n.width,y:i};break;default:r={x:t.x,y:t.y}}if(null!=(o=o?L(o):null))switch(i="y"===o?"height":"width",e){case"start":r[o]-=t[i]/2-n[i]/2;break;case"end":r[o]+=t[i]/2-n[i]/2}return r}function M(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function k(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function A(e,n){void 0===n&&(n={});var o=n;n=void 0===(n=o.placement)?e.placement:n;var i=o.boundary,a=void 0===i?"clippingParents":i,s=void 0===(i=o.rootBoundary)?"viewport":i;i=void 0===(i=o.elementContext)?"popper":i;var p=o.altBoundary,c=void 0!==p&&p;o=M("number"!=typeof(o=void 0===(o=o.padding)?0:o)?o:k(o,C));var l=e.elements.reference;p=e.rects.popper,a=D(r(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||f(e.elements.popper),a,s),c=P({reference:s=t(l),element:p,strategy:"absolute",placement:n}),p=j(Object.assign({},p,c)),s="popper"===i?p:s;var u={top:a.top-s.top+o.top,bottom:s.bottom-a.bottom+o.bottom,left:a.left-s.left+o.left,right:s.right-a.right+o.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function W(){for(var e=arguments.length,t=Array(e),n=0;n(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",m)):Object.assign({},o,((t={})[v]=a?u+"px":"",t[h]=d?e+"px":"",t.transform="",t))}function H(e){return e.replace(/left|right|bottom|top/g,(function(e){return $[e]}))}function R(e){return e.replace(/start|end/g,(function(e){return ee[e]}))}function S(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function q(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var C=["top","bottom","right","left"],N=C.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),V=[].concat(C,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),I="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),_=Math.max,U=Math.min,z=Math.round,F={placement:"bottom",modifiers:[],strategy:"absolute"},X={passive:!0},Y={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,o=e.instance,r=(e=e.options).scroll,i=void 0===r||r,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",o.update,X)})),a&&s.addEventListener("resize",o.update,X),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",o.update,X)})),a&&s.removeEventListener("resize",o.update,X)}},data:{}},G={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=P({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},J={top:"auto",right:"auto",bottom:"auto",left:"auto"},K={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var o=n.adaptive;o=void 0===o||o,n=void 0===(n=n.roundOffsets)||n,e={placement:x(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,T(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,T(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];i(r)&&s(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(o)&&s(o)&&(Object.assign(o.style,e),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},Z={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,o=void 0===(e=e.options.offset)?[0,0]:e,r=(e=V.reduce((function(e,n){var r=t.rects,i=x(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof o?o(Object.assign({},r,{placement:n})):o;return r=(r=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:r}:{x:r,y:s},e[n]=i,e}),{}))[t.placement],i=r.x;r=r.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=r),t.modifiersData[n]=e}},$={left:"right",right:"left",bottom:"top",top:"bottom"},ee={start:"end",end:"start"},te={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var o=n.mainAxis;o=void 0===o||o;var r=n.altAxis;r=void 0===r||r;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,l=void 0===c||c,u=n.allowedAutoPlacements;c=x(n=t.options.placement),i=i||(c!==n&&l?function(e){if("auto"===x(e))return[];var t=H(e);return[R(e),t,R(t)]}(n):[H(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===x(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,o=t.rootBoundary,r=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?V:a,f=t.placement.split("-")[1];0===(i=(t=f?i?N:N.filter((function(e){return e.split("-")[1]===f})):C).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var p=i.reduce((function(t,i){return t[i]=A(e,{placement:i,boundary:n,rootBoundary:o,padding:r})[x(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=d[0],v=0;vi[O]&&(b=H(b)),O=H(b),w=[],o&&w.push(0>=j[y]),r&&w.push(0>=j[b],0>=j[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(o=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},r=l?3:1;0=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; diff --git a/src/main/resources/static/js/thirdParty/signature_pad.umd.min.js b/src/main/resources/static/js/thirdParty/signature_pad.umd.min.js deleted file mode 100644 index a895fd11..00000000 --- a/src/main/resources/static/js/thirdParty/signature_pad.umd.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Signature Pad v4.1.5 | https://github.com/szimek/signature_pad - * (c) 2023 Szymon Nowak | Released under the MIT license - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).SignaturePad=e()}(this,(function(){"use strict";class t{constructor(t,e,i,s){if(isNaN(t)||isNaN(e))throw new Error(`Point is invalid: (${t}, ${e})`);this.x=+t,this.y=+e,this.pressure=i||0,this.time=s||Date.now()}distanceTo(t){return Math.sqrt(Math.pow(this.x-t.x,2)+Math.pow(this.y-t.y,2))}equals(t){return this.x===t.x&&this.y===t.y&&this.pressure===t.pressure&&this.time===t.time}velocityFrom(t){return this.time!==t.time?this.distanceTo(t)/(this.time-t.time):0}}class e{constructor(t,e,i,s,n,o){this.startPoint=t,this.control2=e,this.control1=i,this.endPoint=s,this.startWidth=n,this.endWidth=o}static fromPoints(t,i){const s=this.calculateControlPoints(t[0],t[1],t[2]).c2,n=this.calculateControlPoints(t[1],t[2],t[3]).c1;return new e(t[1],s,n,t[2],i.start,i.end)}static calculateControlPoints(e,i,s){const n=e.x-i.x,o=e.y-i.y,h=i.x-s.x,r=i.y-s.y,a=(e.x+i.x)/2,d=(e.y+i.y)/2,c=(i.x+s.x)/2,l=(i.y+s.y)/2,u=Math.sqrt(n*n+o*o),v=Math.sqrt(h*h+r*r),_=v/(u+v),m=c+(a-c)*_,p=l+(d-l)*_,g=i.x-m,w=i.y-p;return{c1:new t(a+g,d+w),c2:new t(c+g,l+w)}}length(){let t,e,i=0;for(let s=0;s<=10;s+=1){const n=s/10,o=this.point(n,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),h=this.point(n,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(s>0){const s=o-t,n=h-e;i+=Math.sqrt(s*s+n*n)}t=o,e=h}return i}point(t,e,i,s,n){return e*(1-t)*(1-t)*(1-t)+3*i*(1-t)*(1-t)*t+3*s*(1-t)*t*t+n*t*t*t}}class i{constructor(){try{this._et=new EventTarget}catch(t){this._et=document}}addEventListener(t,e,i){this._et.addEventListener(t,e,i)}dispatchEvent(t){return this._et.dispatchEvent(t)}removeEventListener(t,e,i){this._et.removeEventListener(t,e,i)}}class s extends i{constructor(t,e={}){super(),this.canvas=t,this._drawningStroke=!1,this._isEmpty=!0,this._lastPoints=[],this._data=[],this._lastVelocity=0,this._lastWidth=0,this._handleMouseDown=t=>{1===t.buttons&&(this._drawningStroke=!0,this._strokeBegin(t))},this._handleMouseMove=t=>{this._drawningStroke&&this._strokeMoveUpdate(t)},this._handleMouseUp=t=>{1===t.buttons&&this._drawningStroke&&(this._drawningStroke=!1,this._strokeEnd(t))},this._handleTouchStart=t=>{if(t.cancelable&&t.preventDefault(),1===t.targetTouches.length){const e=t.changedTouches[0];this._strokeBegin(e)}},this._handleTouchMove=t=>{t.cancelable&&t.preventDefault();const e=t.targetTouches[0];this._strokeMoveUpdate(e)},this._handleTouchEnd=t=>{if(t.target===this.canvas){t.cancelable&&t.preventDefault();const e=t.changedTouches[0];this._strokeEnd(e)}},this._handlePointerStart=t=>{this._drawningStroke=!0,t.preventDefault(),this._strokeBegin(t)},this._handlePointerMove=t=>{this._drawningStroke&&(t.preventDefault(),this._strokeMoveUpdate(t))},this._handlePointerEnd=t=>{this._drawningStroke&&(t.preventDefault(),this._drawningStroke=!1,this._strokeEnd(t))},this.velocityFilterWeight=e.velocityFilterWeight||.7,this.minWidth=e.minWidth||.5,this.maxWidth=e.maxWidth||2.5,this.throttle="throttle"in e?e.throttle:16,this.minDistance="minDistance"in e?e.minDistance:5,this.dotSize=e.dotSize||0,this.penColor=e.penColor||"black",this.backgroundColor=e.backgroundColor||"rgba(0,0,0,0)",this._strokeMoveUpdate=this.throttle?function(t,e=250){let i,s,n,o=0,h=null;const r=()=>{o=Date.now(),h=null,i=t.apply(s,n),h||(s=null,n=[])};return function(...a){const d=Date.now(),c=e-(d-o);return s=this,n=a,c<=0||c>e?(h&&(clearTimeout(h),h=null),o=d,i=t.apply(s,n),h||(s=null,n=[])):h||(h=window.setTimeout(r,c)),i}}(s.prototype._strokeUpdate,this.throttle):s.prototype._strokeUpdate,this._ctx=t.getContext("2d"),this.clear(),this.on()}clear(){const{_ctx:t,canvas:e}=this;t.fillStyle=this.backgroundColor,t.clearRect(0,0,e.width,e.height),t.fillRect(0,0,e.width,e.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0}fromDataURL(t,e={}){return new Promise(((i,s)=>{const n=new Image,o=e.ratio||window.devicePixelRatio||1,h=e.width||this.canvas.width/o,r=e.height||this.canvas.height/o,a=e.xOffset||0,d=e.yOffset||0;this._reset(this._getPointGroupOptions()),n.onload=()=>{this._ctx.drawImage(n,a,d,h,r),i()},n.onerror=t=>{s(t)},n.crossOrigin="anonymous",n.src=t,this._isEmpty=!1}))}toDataURL(t="image/png",e){return"image/svg+xml"===t?("object"!=typeof e&&(e=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(e))}`):("number"!=typeof e&&(e=void 0),this.canvas.toDataURL(t,e))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none";const t=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!t?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerStart),this.canvas.removeEventListener("pointermove",this._handlePointerMove),this.canvas.ownerDocument.removeEventListener("pointerup",this._handlePointerEnd),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("mousemove",this._handleMouseMove),this.canvas.ownerDocument.removeEventListener("mouseup",this._handleMouseUp),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this.canvas.removeEventListener("touchmove",this._handleTouchMove),this.canvas.removeEventListener("touchend",this._handleTouchEnd)}isEmpty(){return this._isEmpty}fromData(t,{clear:e=!0}={}){e&&this.clear(),this._fromData(t,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(t)}toData(){return this._data}_getPointGroupOptions(t){return{penColor:t&&"penColor"in t?t.penColor:this.penColor,dotSize:t&&"dotSize"in t?t.dotSize:this.dotSize,minWidth:t&&"minWidth"in t?t.minWidth:this.minWidth,maxWidth:t&&"maxWidth"in t?t.maxWidth:this.maxWidth,velocityFilterWeight:t&&"velocityFilterWeight"in t?t.velocityFilterWeight:this.velocityFilterWeight}}_strokeBegin(t){this.dispatchEvent(new CustomEvent("beginStroke",{detail:t}));const e=this._getPointGroupOptions(),i=Object.assign(Object.assign({},e),{points:[]});this._data.push(i),this._reset(e),this._strokeUpdate(t)}_strokeUpdate(t){if(0===this._data.length)return void this._strokeBegin(t);this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:t}));const e=t.clientX,i=t.clientY,s=void 0!==t.pressure?t.pressure:void 0!==t.force?t.force:0,n=this._createPoint(e,i,s),o=this._data[this._data.length-1],h=o.points,r=h.length>0&&h[h.length-1],a=!!r&&n.distanceTo(r)<=this.minDistance,d=this._getPointGroupOptions(o);if(!r||!r||!a){const t=this._addPoint(n,d);r?t&&this._drawCurve(t,d):this._drawDot(n,d),h.push({time:n.time,x:n.x,y:n.y,pressure:n.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:t}))}_strokeEnd(t){this._strokeUpdate(t),this.dispatchEvent(new CustomEvent("endStroke",{detail:t}))}_handlePointerEvents(){this._drawningStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerStart),this.canvas.addEventListener("pointermove",this._handlePointerMove),this.canvas.ownerDocument.addEventListener("pointerup",this._handlePointerEnd)}_handleMouseEvents(){this._drawningStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown),this.canvas.addEventListener("mousemove",this._handleMouseMove),this.canvas.ownerDocument.addEventListener("mouseup",this._handleMouseUp)}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart),this.canvas.addEventListener("touchmove",this._handleTouchMove),this.canvas.addEventListener("touchend",this._handleTouchEnd)}_reset(t){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(t.minWidth+t.maxWidth)/2,this._ctx.fillStyle=t.penColor}_createPoint(e,i,s){const n=this.canvas.getBoundingClientRect();return new t(e-n.left,i-n.top,s,(new Date).getTime())}_addPoint(t,i){const{_lastPoints:s}=this;if(s.push(t),s.length>2){3===s.length&&s.unshift(s[0]);const t=this._calculateCurveWidths(s[1],s[2],i),n=e.fromPoints(s,t);return s.shift(),n}return null}_calculateCurveWidths(t,e,i){const s=i.velocityFilterWeight*e.velocityFrom(t)+(1-i.velocityFilterWeight)*this._lastVelocity,n=this._strokeWidth(s,i),o={end:n,start:this._lastWidth};return this._lastVelocity=s,this._lastWidth=n,o}_strokeWidth(t,e){return Math.max(e.maxWidth/(t+1),e.minWidth)}_drawCurveSegment(t,e,i){const s=this._ctx;s.moveTo(t,e),s.arc(t,e,i,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(t,e){const i=this._ctx,s=t.endWidth-t.startWidth,n=2*Math.ceil(t.length());i.beginPath(),i.fillStyle=e.penColor;for(let i=0;i0?e.dotSize:(e.minWidth+e.maxWidth)/2;i.beginPath(),this._drawCurveSegment(t.x,t.y,s),i.closePath(),i.fillStyle=e.penColor,i.fill()}_fromData(e,i,s){for(const n of e){const{points:e}=n,o=this._getPointGroupOptions(n);if(e.length>1)for(let s=0;s{const i=document.createElement("path");if(!(isNaN(t.control1.x)||isNaN(t.control1.y)||isNaN(t.control2.x)||isNaN(t.control2.y))){const s=`M ${t.startPoint.x.toFixed(3)},${t.startPoint.y.toFixed(3)} C ${t.control1.x.toFixed(3)},${t.control1.y.toFixed(3)} ${t.control2.x.toFixed(3)},${t.control2.y.toFixed(3)} ${t.endPoint.x.toFixed(3)},${t.endPoint.y.toFixed(3)}`;i.setAttribute("d",s),i.setAttribute("stroke-width",(2.25*t.endWidth).toFixed(3)),i.setAttribute("stroke",e),i.setAttribute("fill","none"),i.setAttribute("stroke-linecap","round"),o.appendChild(i)}}),((t,{penColor:e,dotSize:i,minWidth:s,maxWidth:n})=>{const h=document.createElement("circle"),r=i>0?i:(s+n)/2;h.setAttribute("r",r.toString()),h.setAttribute("cx",t.x.toString()),h.setAttribute("cy",t.y.toString()),h.setAttribute("fill",e),o.appendChild(h)})),o.outerHTML}}return s})); -//# sourceMappingURL=signature_pad.umd.min.js.map diff --git a/src/main/resources/static/manifest.json b/src/main/resources/static/manifest.json deleted file mode 100644 index a02fd87c..00000000 --- a/src/main/resources/static/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Stirling-PDF", - "short_name": "Stirling-PDF", - "icons": [ - { - "src": "/android-icon-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-icon-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "start_url": "/", - "display": "standalone", - "background_color": "#ffffff", - "theme_color": "#000000" -} diff --git a/src/main/resources/static/moon.svg b/src/main/resources/static/moon.svg deleted file mode 100644 index 4cd88202..00000000 --- a/src/main/resources/static/moon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/main/resources/static/mstile-150x150.png b/src/main/resources/static/mstile-150x150.png deleted file mode 100644 index 5aaa69ab..00000000 Binary files a/src/main/resources/static/mstile-150x150.png and /dev/null differ diff --git a/src/main/resources/static/pdfjs/pdf.js b/src/main/resources/static/pdfjs/pdf.js deleted file mode 100644 index 71bd285e..00000000 --- a/src/main/resources/static/pdfjs/pdf.js +++ /dev/null @@ -1,15821 +0,0 @@ -/** - * @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 - */ - -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define("pdfjs-dist/build/pdf", [], factory); - else if(typeof exports === 'object') - exports["pdfjs-dist/build/pdf"] = factory(); - else - root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory(); -})(globalThis, () => { -return /******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ([ -/* 0 */, -/* 1 */ -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.VerbosityLevel = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.UNSUPPORTED_FEATURES = exports.TextRenderingMode = exports.RenderingIntentFlag = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.PageActionEventType = exports.OPS = exports.MissingPDFException = exports.LINE_FACTOR = exports.LINE_DESCENT_FACTOR = exports.InvalidPDFException = exports.ImageKind = exports.IDENTITY_MATRIX = exports.FormatError = exports.FeatureTest = exports.FONT_IDENTITY_MATRIX = exports.DocumentActionEventType = exports.CMapCompressionType = exports.BaseException = exports.BASELINE_FACTOR = exports.AnnotationType = exports.AnnotationStateModelType = exports.AnnotationReviewState = exports.AnnotationReplyType = exports.AnnotationMode = exports.AnnotationMarkedState = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationEditorType = exports.AnnotationEditorPrefix = exports.AnnotationEditorParamsType = exports.AnnotationBorderStyleType = exports.AnnotationActionEventType = exports.AbortException = void 0; -exports.arrayByteLength = arrayByteLength; -exports.arraysToBytes = arraysToBytes; -exports.assert = assert; -exports.bytesToString = bytesToString; -exports.createPromiseCapability = createPromiseCapability; -exports.createValidAbsoluteUrl = createValidAbsoluteUrl; -exports.getModificationDate = getModificationDate; -exports.getVerbosityLevel = getVerbosityLevel; -exports.info = info; -exports.isArrayBuffer = isArrayBuffer; -exports.isArrayEqual = isArrayEqual; -exports.objectFromMap = objectFromMap; -exports.objectSize = objectSize; -exports.setVerbosityLevel = setVerbosityLevel; -exports.shadow = shadow; -exports.string32 = string32; -exports.stringToBytes = stringToBytes; -exports.stringToPDFString = stringToPDFString; -exports.stringToUTF8String = stringToUTF8String; -exports.unreachable = unreachable; -exports.utf8StringToString = utf8StringToString; -exports.warn = warn; -; -const IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; -exports.IDENTITY_MATRIX = IDENTITY_MATRIX; -const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; -exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; -const LINE_FACTOR = 1.35; -exports.LINE_FACTOR = LINE_FACTOR; -const LINE_DESCENT_FACTOR = 0.35; -exports.LINE_DESCENT_FACTOR = LINE_DESCENT_FACTOR; -const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; -exports.BASELINE_FACTOR = BASELINE_FACTOR; -const RenderingIntentFlag = { - ANY: 0x01, - DISPLAY: 0x02, - PRINT: 0x04, - SAVE: 0x08, - ANNOTATIONS_FORMS: 0x10, - ANNOTATIONS_STORAGE: 0x20, - ANNOTATIONS_DISABLE: 0x40, - OPLIST: 0x100 -}; -exports.RenderingIntentFlag = RenderingIntentFlag; -const AnnotationMode = { - DISABLE: 0, - ENABLE: 1, - ENABLE_FORMS: 2, - ENABLE_STORAGE: 3 -}; -exports.AnnotationMode = AnnotationMode; -const AnnotationEditorPrefix = "pdfjs_internal_editor_"; -exports.AnnotationEditorPrefix = AnnotationEditorPrefix; -const AnnotationEditorType = { - DISABLE: -1, - NONE: 0, - FREETEXT: 3, - INK: 15 -}; -exports.AnnotationEditorType = AnnotationEditorType; -const AnnotationEditorParamsType = { - FREETEXT_SIZE: 1, - FREETEXT_COLOR: 2, - FREETEXT_OPACITY: 3, - INK_COLOR: 11, - INK_THICKNESS: 12, - INK_OPACITY: 13 -}; -exports.AnnotationEditorParamsType = AnnotationEditorParamsType; -const PermissionFlag = { - PRINT: 0x04, - MODIFY_CONTENTS: 0x08, - COPY: 0x10, - MODIFY_ANNOTATIONS: 0x20, - FILL_INTERACTIVE_FORMS: 0x100, - COPY_FOR_ACCESSIBILITY: 0x200, - ASSEMBLE: 0x400, - PRINT_HIGH_QUALITY: 0x800 -}; -exports.PermissionFlag = PermissionFlag; -const TextRenderingMode = { - FILL: 0, - STROKE: 1, - FILL_STROKE: 2, - INVISIBLE: 3, - FILL_ADD_TO_PATH: 4, - STROKE_ADD_TO_PATH: 5, - FILL_STROKE_ADD_TO_PATH: 6, - ADD_TO_PATH: 7, - FILL_STROKE_MASK: 3, - ADD_TO_PATH_FLAG: 4 -}; -exports.TextRenderingMode = TextRenderingMode; -const ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; -exports.ImageKind = ImageKind; -const AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; -exports.AnnotationType = AnnotationType; -const AnnotationStateModelType = { - MARKED: "Marked", - REVIEW: "Review" -}; -exports.AnnotationStateModelType = AnnotationStateModelType; -const AnnotationMarkedState = { - MARKED: "Marked", - UNMARKED: "Unmarked" -}; -exports.AnnotationMarkedState = AnnotationMarkedState; -const AnnotationReviewState = { - ACCEPTED: "Accepted", - REJECTED: "Rejected", - CANCELLED: "Cancelled", - COMPLETED: "Completed", - NONE: "None" -}; -exports.AnnotationReviewState = AnnotationReviewState; -const AnnotationReplyType = { - GROUP: "Group", - REPLY: "R" -}; -exports.AnnotationReplyType = AnnotationReplyType; -const AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; -exports.AnnotationFlag = AnnotationFlag; -const AnnotationFieldFlag = { - READONLY: 0x0000001, - REQUIRED: 0x0000002, - NOEXPORT: 0x0000004, - MULTILINE: 0x0001000, - PASSWORD: 0x0002000, - NOTOGGLETOOFF: 0x0004000, - RADIO: 0x0008000, - PUSHBUTTON: 0x0010000, - COMBO: 0x0020000, - EDIT: 0x0040000, - SORT: 0x0080000, - FILESELECT: 0x0100000, - MULTISELECT: 0x0200000, - DONOTSPELLCHECK: 0x0400000, - DONOTSCROLL: 0x0800000, - COMB: 0x1000000, - RICHTEXT: 0x2000000, - RADIOSINUNISON: 0x2000000, - COMMITONSELCHANGE: 0x4000000 -}; -exports.AnnotationFieldFlag = AnnotationFieldFlag; -const AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; -exports.AnnotationBorderStyleType = AnnotationBorderStyleType; -const AnnotationActionEventType = { - E: "Mouse Enter", - X: "Mouse Exit", - D: "Mouse Down", - U: "Mouse Up", - Fo: "Focus", - Bl: "Blur", - PO: "PageOpen", - PC: "PageClose", - PV: "PageVisible", - PI: "PageInvisible", - K: "Keystroke", - F: "Format", - V: "Validate", - C: "Calculate" -}; -exports.AnnotationActionEventType = AnnotationActionEventType; -const DocumentActionEventType = { - WC: "WillClose", - WS: "WillSave", - DS: "DidSave", - WP: "WillPrint", - DP: "DidPrint" -}; -exports.DocumentActionEventType = DocumentActionEventType; -const PageActionEventType = { - O: "PageOpen", - C: "PageClose" -}; -exports.PageActionEventType = PageActionEventType; -const VerbosityLevel = { - ERRORS: 0, - WARNINGS: 1, - INFOS: 5 -}; -exports.VerbosityLevel = VerbosityLevel; -const CMapCompressionType = { - NONE: 0, - BINARY: 1 -}; -exports.CMapCompressionType = CMapCompressionType; -const OPS = { - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotation: 80, - endAnnotation: 81, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; -exports.OPS = OPS; -const UNSUPPORTED_FEATURES = { - forms: "forms", - javaScript: "javaScript", - signatures: "signatures", - smask: "smask", - shadingPattern: "shadingPattern", - errorTilingPattern: "errorTilingPattern", - errorExtGState: "errorExtGState", - errorXObject: "errorXObject", - errorFontLoadType3: "errorFontLoadType3", - errorFontState: "errorFontState", - errorFontMissing: "errorFontMissing", - errorFontTranslate: "errorFontTranslate", - errorColorSpace: "errorColorSpace", - errorOperatorList: "errorOperatorList", - errorFontToUnicode: "errorFontToUnicode", - errorFontLoadNative: "errorFontLoadNative", - errorFontBuildPath: "errorFontBuildPath", - errorFontGetPath: "errorFontGetPath", - errorMarkedContent: "errorMarkedContent", - errorContentSubStream: "errorContentSubStream" -}; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; -const PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; -exports.PasswordResponses = PasswordResponses; -let verbosity = VerbosityLevel.WARNINGS; -function setVerbosityLevel(level) { - if (Number.isInteger(level)) { - verbosity = level; - } -} -function getVerbosityLevel() { - return verbosity; -} -function info(msg) { - if (verbosity >= VerbosityLevel.INFOS) { - console.log(`Info: ${msg}`); - } -} -function warn(msg) { - if (verbosity >= VerbosityLevel.WARNINGS) { - console.log(`Warning: ${msg}`); - } -} -function unreachable(msg) { - throw new Error(msg); -} -function assert(cond, msg) { - if (!cond) { - unreachable(msg); - } -} -function _isValidProtocol(url) { - if (!url) { - return false; - } - switch (url.protocol) { - case "http:": - case "https:": - case "ftp:": - case "mailto:": - case "tel:": - return true; - default: - return false; - } -} -function createValidAbsoluteUrl(url, baseUrl = null, options = null) { - if (!url) { - return null; - } - try { - if (options && typeof url === "string") { - if (options.addDefaultProtocol && url.startsWith("www.")) { - const dots = url.match(/\./g); - if (dots && dots.length >= 2) { - url = `http://${url}`; - } - } - if (options.tryConvertEncoding) { - try { - url = stringToUTF8String(url); - } catch (ex) {} - } - } - const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url); - if (_isValidProtocol(absoluteUrl)) { - return absoluteUrl; - } - } catch (ex) {} - return null; -} -function shadow(obj, prop, value, nonSerializable = false) { - Object.defineProperty(obj, prop, { - value, - enumerable: !nonSerializable, - configurable: true, - writable: false - }); - return value; -} -const BaseException = function BaseExceptionClosure() { - function BaseException(message, name) { - if (this.constructor === BaseException) { - unreachable("Cannot initialize BaseException."); - } - this.message = message; - this.name = name; - } - BaseException.prototype = new Error(); - BaseException.constructor = BaseException; - return BaseException; -}(); -exports.BaseException = BaseException; -class PasswordException extends BaseException { - constructor(msg, code) { - super(msg, "PasswordException"); - this.code = code; - } -} -exports.PasswordException = PasswordException; -class UnknownErrorException extends BaseException { - constructor(msg, details) { - super(msg, "UnknownErrorException"); - this.details = details; - } -} -exports.UnknownErrorException = UnknownErrorException; -class InvalidPDFException extends BaseException { - constructor(msg) { - super(msg, "InvalidPDFException"); - } -} -exports.InvalidPDFException = InvalidPDFException; -class MissingPDFException extends BaseException { - constructor(msg) { - super(msg, "MissingPDFException"); - } -} -exports.MissingPDFException = MissingPDFException; -class UnexpectedResponseException extends BaseException { - constructor(msg, status) { - super(msg, "UnexpectedResponseException"); - this.status = status; - } -} -exports.UnexpectedResponseException = UnexpectedResponseException; -class FormatError extends BaseException { - constructor(msg) { - super(msg, "FormatError"); - } -} -exports.FormatError = FormatError; -class AbortException extends BaseException { - constructor(msg) { - super(msg, "AbortException"); - } -} -exports.AbortException = AbortException; -function bytesToString(bytes) { - if (typeof bytes !== "object" || bytes === null || bytes.length === undefined) { - unreachable("Invalid argument for bytesToString"); - } - const length = bytes.length; - const MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - const strBuf = []; - for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - const chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(""); -} -function stringToBytes(str) { - if (typeof str !== "string") { - unreachable("Invalid argument for stringToBytes"); - } - const length = str.length; - const bytes = new Uint8Array(length); - for (let i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xff; - } - return bytes; -} -function arrayByteLength(arr) { - if (arr.length !== undefined) { - return arr.length; - } - if (arr.byteLength !== undefined) { - return arr.byteLength; - } - unreachable("Invalid argument for arrayByteLength"); -} -function arraysToBytes(arr) { - const length = arr.length; - if (length === 1 && arr[0] instanceof Uint8Array) { - return arr[0]; - } - let resultLength = 0; - for (let i = 0; i < length; i++) { - resultLength += arrayByteLength(arr[i]); - } - let pos = 0; - const data = new Uint8Array(resultLength); - for (let i = 0; i < length; i++) { - let item = arr[i]; - if (!(item instanceof Uint8Array)) { - if (typeof item === "string") { - item = stringToBytes(item); - } else { - item = new Uint8Array(item); - } - } - const itemLength = item.byteLength; - data.set(item, pos); - pos += itemLength; - } - return data; -} -function string32(value) { - return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); -} -function objectSize(obj) { - return Object.keys(obj).length; -} -function objectFromMap(map) { - const obj = Object.create(null); - for (const [key, value] of map) { - obj[key] = value; - } - return obj; -} -function isLittleEndian() { - const buffer8 = new Uint8Array(4); - buffer8[0] = 1; - const view32 = new Uint32Array(buffer8.buffer, 0, 1); - return view32[0] === 1; -} -function isEvalSupported() { - try { - new Function(""); - return true; - } catch (e) { - return false; - } -} -class FeatureTest { - static get isLittleEndian() { - return shadow(this, "isLittleEndian", isLittleEndian()); - } - static get isEvalSupported() { - return shadow(this, "isEvalSupported", isEvalSupported()); - } - static get isOffscreenCanvasSupported() { - return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); - } - static get platform() { - if (typeof navigator === "undefined") { - return shadow(this, "platform", { - isWin: false, - isMac: false - }); - } - return shadow(this, "platform", { - isWin: navigator.platform.includes("Win"), - isMac: navigator.platform.includes("Mac") - }); - } -} -exports.FeatureTest = FeatureTest; -const hexNumbers = [...Array(256).keys()].map(n => n.toString(16).padStart(2, "0")); -class Util { - static makeHexColor(r, g, b) { - return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; - } - static scaleMinMax(transform, minMax) { - let temp; - if (transform[0]) { - if (transform[0] < 0) { - temp = minMax[0]; - minMax[0] = minMax[1]; - minMax[1] = temp; - } - minMax[0] *= transform[0]; - minMax[1] *= transform[0]; - if (transform[3] < 0) { - temp = minMax[2]; - minMax[2] = minMax[3]; - minMax[3] = temp; - } - minMax[2] *= transform[3]; - minMax[3] *= transform[3]; - } else { - temp = minMax[0]; - minMax[0] = minMax[2]; - minMax[2] = temp; - temp = minMax[1]; - minMax[1] = minMax[3]; - minMax[3] = temp; - if (transform[1] < 0) { - temp = minMax[2]; - minMax[2] = minMax[3]; - minMax[3] = temp; - } - minMax[2] *= transform[1]; - minMax[3] *= transform[1]; - if (transform[2] < 0) { - temp = minMax[0]; - minMax[0] = minMax[1]; - minMax[1] = temp; - } - minMax[0] *= transform[2]; - minMax[1] *= transform[2]; - } - minMax[0] += transform[4]; - minMax[1] += transform[4]; - minMax[2] += transform[5]; - minMax[3] += transform[5]; - } - static transform(m1, m2) { - return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; - } - static applyTransform(p, m) { - const xt = p[0] * m[0] + p[1] * m[2] + m[4]; - const yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - } - static applyInverseTransform(p, m) { - const d = m[0] * m[3] - m[1] * m[2]; - const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - } - static getAxialAlignedBoundingBox(r, m) { - const p1 = Util.applyTransform(r, m); - const p2 = Util.applyTransform(r.slice(2, 4), m); - const p3 = Util.applyTransform([r[0], r[3]], m); - const p4 = Util.applyTransform([r[2], r[1]], m); - return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])]; - } - static inverseTransform(m) { - const d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - } - static singularValueDecompose2dScale(m) { - const transpose = [m[0], m[2], m[1], m[3]]; - const a = m[0] * transpose[0] + m[1] * transpose[2]; - const b = m[0] * transpose[1] + m[1] * transpose[3]; - const c = m[2] * transpose[0] + m[3] * transpose[2]; - const d = m[2] * transpose[1] + m[3] * transpose[3]; - const first = (a + d) / 2; - const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2; - const sx = first + second || 1; - const sy = first - second || 1; - return [Math.sqrt(sx), Math.sqrt(sy)]; - } - static normalizeRect(rect) { - const r = rect.slice(0); - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - } - static intersect(rect1, rect2) { - const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); - const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); - if (xLow > xHigh) { - return null; - } - const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); - const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); - if (yLow > yHigh) { - return null; - } - return [xLow, yLow, xHigh, yHigh]; - } - static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3) { - const tvalues = [], - bounds = [[], []]; - let a, b, c, t, t1, t2, b2ac, sqrtb2ac; - for (let i = 0; i < 2; ++i) { - if (i === 0) { - b = 6 * x0 - 12 * x1 + 6 * x2; - a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; - c = 3 * x1 - 3 * x0; - } else { - b = 6 * y0 - 12 * y1 + 6 * y2; - a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; - c = 3 * y1 - 3 * y0; - } - if (Math.abs(a) < 1e-12) { - if (Math.abs(b) < 1e-12) { - continue; - } - t = -c / b; - if (0 < t && t < 1) { - tvalues.push(t); - } - continue; - } - b2ac = b * b - 4 * c * a; - sqrtb2ac = Math.sqrt(b2ac); - if (b2ac < 0) { - continue; - } - t1 = (-b + sqrtb2ac) / (2 * a); - if (0 < t1 && t1 < 1) { - tvalues.push(t1); - } - t2 = (-b - sqrtb2ac) / (2 * a); - if (0 < t2 && t2 < 1) { - tvalues.push(t2); - } - } - let j = tvalues.length, - mt; - const jlen = j; - while (j--) { - t = tvalues[j]; - mt = 1 - t; - bounds[0][j] = mt * mt * mt * x0 + 3 * mt * mt * t * x1 + 3 * mt * t * t * x2 + t * t * t * x3; - bounds[1][j] = mt * mt * mt * y0 + 3 * mt * mt * t * y1 + 3 * mt * t * t * y2 + t * t * t * y3; - } - bounds[0][jlen] = x0; - bounds[1][jlen] = y0; - bounds[0][jlen + 1] = x3; - bounds[1][jlen + 1] = y3; - bounds[0].length = bounds[1].length = jlen + 2; - return [Math.min(...bounds[0]), Math.min(...bounds[1]), Math.max(...bounds[0]), Math.max(...bounds[1])]; - } -} -exports.Util = Util; -const PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac]; -function stringToPDFString(str) { - if (str[0] >= "\xEF") { - let encoding; - if (str[0] === "\xFE" && str[1] === "\xFF") { - encoding = "utf-16be"; - } else if (str[0] === "\xFF" && str[1] === "\xFE") { - encoding = "utf-16le"; - } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { - encoding = "utf-8"; - } - if (encoding) { - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = stringToBytes(str); - return decoder.decode(buffer); - } catch (ex) { - warn(`stringToPDFString: "${ex}".`); - } - } - } - const strBuf = []; - for (let i = 0, ii = str.length; i < ii; i++) { - const code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - return strBuf.join(""); -} -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} -function isArrayBuffer(v) { - return typeof v === "object" && v !== null && v.byteLength !== undefined; -} -function isArrayEqual(arr1, arr2) { - if (arr1.length !== arr2.length) { - return false; - } - for (let i = 0, ii = arr1.length; i < ii; i++) { - if (arr1[i] !== arr2[i]) { - return false; - } - } - return true; -} -function getModificationDate(date = new Date()) { - const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; - return buffer.join(""); -} -function createPromiseCapability() { - const capability = Object.create(null); - let isSettled = false; - Object.defineProperty(capability, "settled", { - get() { - return isSettled; - } - }); - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = function (data) { - isSettled = true; - resolve(data); - }; - capability.reject = function (reason) { - isSettled = true; - reject(reason); - }; - }); - return capability; -} - -/***/ }), -/* 2 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.build = exports.RenderTask = exports.PDFWorkerUtil = exports.PDFWorker = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFDocumentLoadingTask = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.DefaultStandardFontDataFactory = exports.DefaultCanvasFactory = exports.DefaultCMapReaderFactory = void 0; -exports.getDocument = getDocument; -exports.version = void 0; -var _util = __w_pdfjs_require__(1); -var _annotation_storage = __w_pdfjs_require__(3); -var _display_utils = __w_pdfjs_require__(6); -var _font_loader = __w_pdfjs_require__(9); -var _canvas = __w_pdfjs_require__(11); -var _worker_options = __w_pdfjs_require__(14); -var _is_node = __w_pdfjs_require__(10); -var _message_handler = __w_pdfjs_require__(15); -var _metadata = __w_pdfjs_require__(16); -var _optional_content_config = __w_pdfjs_require__(17); -var _transport_stream = __w_pdfjs_require__(18); -var _xfa_text = __w_pdfjs_require__(19); -const DEFAULT_RANGE_CHUNK_SIZE = 65536; -const RENDERING_CANCELLED_TIMEOUT = 100; -let DefaultCanvasFactory = _display_utils.DOMCanvasFactory; -exports.DefaultCanvasFactory = DefaultCanvasFactory; -let DefaultCMapReaderFactory = _display_utils.DOMCMapReaderFactory; -exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory; -let DefaultStandardFontDataFactory = _display_utils.DOMStandardFontDataFactory; -exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory; -if (_is_node.isNodeJS) { - const { - NodeCanvasFactory, - NodeCMapReaderFactory, - NodeStandardFontDataFactory - } = __w_pdfjs_require__(20); - exports.DefaultCanvasFactory = DefaultCanvasFactory = NodeCanvasFactory; - exports.DefaultCMapReaderFactory = DefaultCMapReaderFactory = NodeCMapReaderFactory; - exports.DefaultStandardFontDataFactory = DefaultStandardFontDataFactory = NodeStandardFontDataFactory; -} -let createPDFNetworkStream; -{ - if (_is_node.isNodeJS) { - const { - PDFNodeStream - } = __w_pdfjs_require__(21); - createPDFNetworkStream = params => { - return new PDFNodeStream(params); - }; - } else { - const { - PDFNetworkStream - } = __w_pdfjs_require__(24); - const { - PDFFetchStream - } = __w_pdfjs_require__(25); - createPDFNetworkStream = params => { - return (0, _display_utils.isValidFetchUrl)(params.url) ? new PDFFetchStream(params) : new PDFNetworkStream(params); - }; - } -} -function getDocument(src) { - if (typeof src === "string" || src instanceof URL) { - src = { - url: src - }; - } else if ((0, _util.isArrayBuffer)(src)) { - src = { - data: src - }; - } else if (src instanceof PDFDataRangeTransport) { - (0, _display_utils.deprecated)("`PDFDataRangeTransport`-instance, " + "please use a parameter object with `range`-property instead."); - src = { - range: src - }; - } else { - if (typeof src !== "object") { - throw new Error("Invalid parameter in getDocument, " + "need either string, URL, TypedArray, or parameter object."); - } - } - if (!src.url && !src.data && !src.range) { - throw new Error("Invalid parameter object: need either .data, .range or .url"); - } - const task = new PDFDocumentLoadingTask(); - const params = Object.create(null); - let rangeTransport = null, - worker = null; - for (const key in src) { - const val = src[key]; - switch (key) { - case "url": - if (val instanceof URL) { - params[key] = val.href; - continue; - } - try { - params[key] = new URL(val, window.location).href; - continue; - } catch (ex) { - if (_is_node.isNodeJS && typeof val === "string") { - break; - } - } - throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); - case "range": - rangeTransport = val; - continue; - case "worker": - worker = val; - continue; - case "data": - if (_is_node.isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { - params[key] = new Uint8Array(val); - } else if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { - break; - } else if (typeof val === "string") { - params[key] = (0, _util.stringToBytes)(val); - } else if (typeof val === "object" && val !== null && !isNaN(val.length) || (0, _util.isArrayBuffer)(val)) { - params[key] = new Uint8Array(val); - } else { - throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); - } - continue; - } - params[key] = val; - } - params.CMapReaderFactory = params.CMapReaderFactory || DefaultCMapReaderFactory; - params.StandardFontDataFactory = params.StandardFontDataFactory || DefaultStandardFontDataFactory; - params.ignoreErrors = params.stopAtErrors !== true; - params.fontExtraProperties = params.fontExtraProperties === true; - params.pdfBug = params.pdfBug === true; - params.enableXfa = params.enableXfa === true; - if (!Number.isInteger(params.rangeChunkSize) || params.rangeChunkSize < 1) { - params.rangeChunkSize = DEFAULT_RANGE_CHUNK_SIZE; - } - if (typeof params.docBaseUrl !== "string" || (0, _display_utils.isDataScheme)(params.docBaseUrl)) { - params.docBaseUrl = null; - } - if (!Number.isInteger(params.maxImageSize) || params.maxImageSize < -1) { - params.maxImageSize = -1; - } - if (typeof params.cMapUrl !== "string") { - params.cMapUrl = null; - } - if (typeof params.standardFontDataUrl !== "string") { - params.standardFontDataUrl = null; - } - if (typeof params.useWorkerFetch !== "boolean") { - params.useWorkerFetch = params.CMapReaderFactory === _display_utils.DOMCMapReaderFactory && params.StandardFontDataFactory === _display_utils.DOMStandardFontDataFactory && (0, _display_utils.isValidFetchUrl)(params.cMapUrl, document.baseURI) && (0, _display_utils.isValidFetchUrl)(params.standardFontDataUrl, document.baseURI); - } - if (typeof params.isEvalSupported !== "boolean") { - params.isEvalSupported = true; - } - if (typeof params.isOffscreenCanvasSupported !== "boolean") { - params.isOffscreenCanvasSupported = !_is_node.isNodeJS; - } - if (typeof params.disableFontFace !== "boolean") { - params.disableFontFace = _is_node.isNodeJS; - } - if (typeof params.useSystemFonts !== "boolean") { - params.useSystemFonts = !_is_node.isNodeJS && !params.disableFontFace; - } - if (typeof params.ownerDocument !== "object" || params.ownerDocument === null) { - params.ownerDocument = globalThis.document; - } - if (typeof params.disableRange !== "boolean") { - params.disableRange = false; - } - if (typeof params.disableStream !== "boolean") { - params.disableStream = false; - } - if (typeof params.disableAutoFetch !== "boolean") { - params.disableAutoFetch = false; - } - (0, _util.setVerbosityLevel)(params.verbosity); - if (!worker) { - const workerParams = { - verbosity: params.verbosity, - port: _worker_options.GlobalWorkerOptions.workerPort - }; - worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams); - task._worker = worker; - } - const docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error("Loading aborted"); - } - const workerIdPromise = _fetchDocument(worker, params, rangeTransport, docId); - const networkStreamPromise = new Promise(function (resolve) { - let networkStream; - if (rangeTransport) { - networkStream = new _transport_stream.PDFDataTransportStream({ - length: params.length, - initialData: params.initialData, - progressiveDone: params.progressiveDone, - contentDispositionFilename: params.contentDispositionFilename, - disableRange: params.disableRange, - disableStream: params.disableStream - }, rangeTransport); - } else if (!params.data) { - networkStream = createPDFNetworkStream({ - url: params.url, - length: params.length, - httpHeaders: params.httpHeaders, - withCredentials: params.withCredentials, - rangeChunkSize: params.rangeChunkSize, - disableRange: params.disableRange, - disableStream: params.disableStream - }); - } - resolve(networkStream); - }); - return Promise.all([workerIdPromise, networkStreamPromise]).then(function ([workerId, networkStream]) { - if (task.destroyed) { - throw new Error("Loading aborted"); - } - const messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port); - const transport = new WorkerTransport(messageHandler, task, networkStream, params); - task._transport = transport; - messageHandler.send("Ready", null); - }); - }).catch(task._capability.reject); - return task; -} -async function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - throw new Error("Worker was destroyed"); - } - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - source.progressiveDone = pdfDataRangeTransport.progressiveDone; - source.contentDispositionFilename = pdfDataRangeTransport.contentDispositionFilename; - } - const transfers = source.data ? [source.data.buffer] : null; - const workerId = await worker.messageHandler.sendWithPromise("GetDocRequest", { - docId, - apiVersion: '3.3.122', - data: source.data, - password: source.password, - disableAutoFetch: source.disableAutoFetch, - rangeChunkSize: source.rangeChunkSize, - length: source.length, - docBaseUrl: source.docBaseUrl, - enableXfa: source.enableXfa, - evaluatorOptions: { - maxImageSize: source.maxImageSize, - disableFontFace: source.disableFontFace, - ignoreErrors: source.ignoreErrors, - isEvalSupported: source.isEvalSupported, - isOffscreenCanvasSupported: source.isOffscreenCanvasSupported, - fontExtraProperties: source.fontExtraProperties, - useSystemFonts: source.useSystemFonts, - cMapUrl: source.useWorkerFetch ? source.cMapUrl : null, - standardFontDataUrl: source.useWorkerFetch ? source.standardFontDataUrl : null - } - }, transfers); - if (worker.destroyed) { - throw new Error("Worker was destroyed"); - } - return workerId; -} -class PDFDocumentLoadingTask { - static #docId = 0; - #onUnsupportedFeature = null; - constructor() { - this._capability = (0, _util.createPromiseCapability)(); - this._transport = null; - this._worker = null; - this.docId = `d${PDFDocumentLoadingTask.#docId++}`; - this.destroyed = false; - this.onPassword = null; - this.onProgress = null; - } - get onUnsupportedFeature() { - return this.#onUnsupportedFeature; - } - set onUnsupportedFeature(callback) { - (0, _display_utils.deprecated)("The PDFDocumentLoadingTask onUnsupportedFeature property will be removed in the future."); - this.#onUnsupportedFeature = callback; - } - get promise() { - return this._capability.promise; - } - async destroy() { - this.destroyed = true; - await this._transport?.destroy(); - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - } -} -exports.PDFDocumentLoadingTask = PDFDocumentLoadingTask; -class PDFDataRangeTransport { - constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { - this.length = length; - this.initialData = initialData; - this.progressiveDone = progressiveDone; - this.contentDispositionFilename = contentDispositionFilename; - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._progressiveDoneListeners = []; - this._readyCapability = (0, _util.createPromiseCapability)(); - } - addRangeListener(listener) { - this._rangeListeners.push(listener); - } - addProgressListener(listener) { - this._progressListeners.push(listener); - } - addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); - } - addProgressiveDoneListener(listener) { - this._progressiveDoneListeners.push(listener); - } - onDataRange(begin, chunk) { - for (const listener of this._rangeListeners) { - listener(begin, chunk); - } - } - onDataProgress(loaded, total) { - this._readyCapability.promise.then(() => { - for (const listener of this._progressListeners) { - listener(loaded, total); - } - }); - } - onDataProgressiveRead(chunk) { - this._readyCapability.promise.then(() => { - for (const listener of this._progressiveReadListeners) { - listener(chunk); - } - }); - } - onDataProgressiveDone() { - this._readyCapability.promise.then(() => { - for (const listener of this._progressiveDoneListeners) { - listener(); - } - }); - } - transportReady() { - this._readyCapability.resolve(); - } - requestDataRange(begin, end) { - (0, _util.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange"); - } - abort() {} -} -exports.PDFDataRangeTransport = PDFDataRangeTransport; -class PDFDocumentProxy { - constructor(pdfInfo, transport) { - this._pdfInfo = pdfInfo; - this._transport = transport; - } - get annotationStorage() { - return this._transport.annotationStorage; - } - get numPages() { - return this._pdfInfo.numPages; - } - get fingerprints() { - return this._pdfInfo.fingerprints; - } - get isPureXfa() { - return (0, _util.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); - } - get allXfaHtml() { - return this._transport._htmlForXfa; - } - getPage(pageNumber) { - return this._transport.getPage(pageNumber); - } - getPageIndex(ref) { - return this._transport.getPageIndex(ref); - } - getDestinations() { - return this._transport.getDestinations(); - } - getDestination(id) { - return this._transport.getDestination(id); - } - getPageLabels() { - return this._transport.getPageLabels(); - } - getPageLayout() { - return this._transport.getPageLayout(); - } - getPageMode() { - return this._transport.getPageMode(); - } - getViewerPreferences() { - return this._transport.getViewerPreferences(); - } - getOpenAction() { - return this._transport.getOpenAction(); - } - getAttachments() { - return this._transport.getAttachments(); - } - getJavaScript() { - return this._transport.getJavaScript(); - } - getJSActions() { - return this._transport.getDocJSActions(); - } - getOutline() { - return this._transport.getOutline(); - } - getOptionalContentConfig() { - return this._transport.getOptionalContentConfig(); - } - getPermissions() { - return this._transport.getPermissions(); - } - getMetadata() { - return this._transport.getMetadata(); - } - getMarkInfo() { - return this._transport.getMarkInfo(); - } - getData() { - return this._transport.getData(); - } - saveDocument() { - return this._transport.saveDocument(); - } - getDownloadInfo() { - return this._transport.downloadInfoCapability.promise; - } - cleanup(keepLoadedFonts = false) { - return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa); - } - destroy() { - return this.loadingTask.destroy(); - } - get loadingParams() { - return this._transport.loadingParams; - } - get loadingTask() { - return this._transport.loadingTask; - } - getFieldObjects() { - return this._transport.getFieldObjects(); - } - hasJSActions() { - return this._transport.hasJSActions(); - } - getCalculationOrderIds() { - return this._transport.getCalculationOrderIds(); - } -} -exports.PDFDocumentProxy = PDFDocumentProxy; -class PDFPageProxy { - constructor(pageIndex, pageInfo, transport, ownerDocument, pdfBug = false) { - this._pageIndex = pageIndex; - this._pageInfo = pageInfo; - this._ownerDocument = ownerDocument; - this._transport = transport; - this._stats = pdfBug ? new _display_utils.StatTimer() : null; - this._pdfBug = pdfBug; - this.commonObjs = transport.commonObjs; - this.objs = new PDFObjects(); - this._bitmaps = new Set(); - this.cleanupAfterRender = false; - this.pendingCleanup = false; - this._intentStates = new Map(); - this.destroyed = false; - } - get pageNumber() { - return this._pageIndex + 1; - } - get rotate() { - return this._pageInfo.rotate; - } - get ref() { - return this._pageInfo.ref; - } - get userUnit() { - return this._pageInfo.userUnit; - } - get view() { - return this._pageInfo.view; - } - getViewport({ - scale, - rotation = this.rotate, - offsetX = 0, - offsetY = 0, - dontFlip = false - } = {}) { - return new _display_utils.PageViewport({ - viewBox: this.view, - scale, - rotation, - offsetX, - offsetY, - dontFlip - }); - } - getAnnotations({ - intent = "display" - } = {}) { - const intentArgs = this._transport.getRenderingIntent(intent); - return this._transport.getAnnotations(this._pageIndex, intentArgs.renderingIntent); - } - getJSActions() { - return this._transport.getPageJSActions(this._pageIndex); - } - get isPureXfa() { - return (0, _util.shadow)(this, "isPureXfa", !!this._transport._htmlForXfa); - } - async getXfa() { - return this._transport._htmlForXfa?.children[this._pageIndex] || null; - } - render({ - canvasContext, - viewport, - intent = "display", - annotationMode = _util.AnnotationMode.ENABLE, - transform = null, - canvasFactory = null, - background = null, - optionalContentConfigPromise = null, - annotationCanvasMap = null, - pageColors = null, - printAnnotationStorage = null - }) { - this._stats?.time("Overall"); - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage); - this.pendingCleanup = false; - if (!optionalContentConfigPromise) { - optionalContentConfigPromise = this._transport.getOptionalContentConfig(); - } - let intentState = this._intentStates.get(intentArgs.cacheKey); - if (!intentState) { - intentState = Object.create(null); - this._intentStates.set(intentArgs.cacheKey, intentState); - } - if (intentState.streamReaderCancelTimeout) { - clearTimeout(intentState.streamReaderCancelTimeout); - intentState.streamReaderCancelTimeout = null; - } - const canvasFactoryInstance = canvasFactory || new DefaultCanvasFactory({ - ownerDocument: this._ownerDocument - }); - const intentPrint = !!(intentArgs.renderingIntent & _util.RenderingIntentFlag.PRINT); - if (!intentState.displayReadyCapability) { - intentState.displayReadyCapability = (0, _util.createPromiseCapability)(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false, - separateAnnots: null - }; - this._stats?.time("Page Request"); - this._pumpOperatorList(intentArgs); - } - const complete = error => { - intentState.renderTasks.delete(internalRenderTask); - if (this.cleanupAfterRender || intentPrint) { - this.pendingCleanup = true; - } - this._tryCleanup(); - if (error) { - internalRenderTask.capability.reject(error); - this._abortOperatorList({ - intentState, - reason: error instanceof Error ? error : new Error(error) - }); - } else { - internalRenderTask.capability.resolve(); - } - this._stats?.timeEnd("Rendering"); - this._stats?.timeEnd("Overall"); - }; - const internalRenderTask = new InternalRenderTask({ - callback: complete, - params: { - canvasContext, - viewport, - transform, - background - }, - objs: this.objs, - commonObjs: this.commonObjs, - annotationCanvasMap, - operatorList: intentState.operatorList, - pageIndex: this._pageIndex, - canvasFactory: canvasFactoryInstance, - useRequestAnimationFrame: !intentPrint, - pdfBug: this._pdfBug, - pageColors - }); - (intentState.renderTasks ||= new Set()).add(internalRenderTask); - const renderTask = internalRenderTask.task; - Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { - if (this.pendingCleanup) { - complete(); - return; - } - this._stats?.time("Rendering"); - internalRenderTask.initializeGraphics({ - transparency, - optionalContentConfig - }); - internalRenderTask.operatorListChanged(); - }).catch(complete); - return renderTask; - } - getOperatorList({ - intent = "display", - annotationMode = _util.AnnotationMode.ENABLE, - printAnnotationStorage = null - } = {}) { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - intentState.renderTasks.delete(opListTask); - } - } - const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, true); - let intentState = this._intentStates.get(intentArgs.cacheKey); - if (!intentState) { - intentState = Object.create(null); - this._intentStates.set(intentArgs.cacheKey, intentState); - } - let opListTask; - if (!intentState.opListReadCapability) { - opListTask = Object.create(null); - opListTask.operatorListChanged = operatorListChanged; - intentState.opListReadCapability = (0, _util.createPromiseCapability)(); - (intentState.renderTasks ||= new Set()).add(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false, - separateAnnots: null - }; - this._stats?.time("Page Request"); - this._pumpOperatorList(intentArgs); - } - return intentState.opListReadCapability.promise; - } - streamTextContent({ - disableCombineTextItems = false, - includeMarkedContent = false - } = {}) { - const TEXT_CONTENT_CHUNK_SIZE = 100; - return this._transport.messageHandler.sendWithStream("GetTextContent", { - pageIndex: this._pageIndex, - combineTextItems: disableCombineTextItems !== true, - includeMarkedContent: includeMarkedContent === true - }, { - highWaterMark: TEXT_CONTENT_CHUNK_SIZE, - size(textContent) { - return textContent.items.length; - } - }); - } - getTextContent(params = {}) { - if (this._transport._htmlForXfa) { - return this.getXfa().then(xfa => { - return _xfa_text.XfaText.textContent(xfa); - }); - } - const readableStream = this.streamTextContent(params); - return new Promise(function (resolve, reject) { - function pump() { - reader.read().then(function ({ - value, - done - }) { - if (done) { - resolve(textContent); - return; - } - Object.assign(textContent.styles, value.styles); - textContent.items.push(...value.items); - pump(); - }, reject); - } - const reader = readableStream.getReader(); - const textContent = { - items: [], - styles: Object.create(null) - }; - pump(); - }); - } - getStructTree() { - return this._transport.getStructTree(this._pageIndex); - } - _destroy() { - this.destroyed = true; - const waitOn = []; - for (const intentState of this._intentStates.values()) { - this._abortOperatorList({ - intentState, - reason: new Error("Page was destroyed."), - force: true - }); - if (intentState.opListReadCapability) { - continue; - } - for (const internalRenderTask of intentState.renderTasks) { - waitOn.push(internalRenderTask.completed); - internalRenderTask.cancel(); - } - } - this.objs.clear(); - for (const bitmap of this._bitmaps) { - bitmap.close(); - } - this._bitmaps.clear(); - this.pendingCleanup = false; - return Promise.all(waitOn); - } - cleanup(resetStats = false) { - this.pendingCleanup = true; - return this._tryCleanup(resetStats); - } - _tryCleanup(resetStats = false) { - if (!this.pendingCleanup) { - return false; - } - for (const { - renderTasks, - operatorList - } of this._intentStates.values()) { - if (renderTasks.size > 0 || !operatorList.lastChunk) { - return false; - } - } - this._intentStates.clear(); - this.objs.clear(); - if (resetStats && this._stats) { - this._stats = new _display_utils.StatTimer(); - } - for (const bitmap of this._bitmaps) { - bitmap.close(); - } - this._bitmaps.clear(); - this.pendingCleanup = false; - return true; - } - _startRenderPage(transparency, cacheKey) { - const intentState = this._intentStates.get(cacheKey); - if (!intentState) { - return; - } - this._stats?.timeEnd("Page Request"); - intentState.displayReadyCapability?.resolve(transparency); - } - _renderPageChunk(operatorListChunk, intentState) { - for (let i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots; - for (const internalRenderTask of intentState.renderTasks) { - internalRenderTask.operatorListChanged(); - } - if (operatorListChunk.lastChunk) { - this._tryCleanup(); - } - } - _pumpOperatorList({ - renderingIntent, - cacheKey, - annotationStorageMap - }) { - const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { - pageIndex: this._pageIndex, - intent: renderingIntent, - cacheKey, - annotationStorage: annotationStorageMap - }); - const reader = readableStream.getReader(); - const intentState = this._intentStates.get(cacheKey); - intentState.streamReader = reader; - const pump = () => { - reader.read().then(({ - value, - done - }) => { - if (done) { - intentState.streamReader = null; - return; - } - if (this._transport.destroyed) { - return; - } - this._renderPageChunk(value, intentState); - pump(); - }, reason => { - intentState.streamReader = null; - if (this._transport.destroyed) { - return; - } - if (intentState.operatorList) { - intentState.operatorList.lastChunk = true; - for (const internalRenderTask of intentState.renderTasks) { - internalRenderTask.operatorListChanged(); - } - this._tryCleanup(); - } - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(reason); - } else if (intentState.opListReadCapability) { - intentState.opListReadCapability.reject(reason); - } else { - throw reason; - } - }); - }; - pump(); - } - _abortOperatorList({ - intentState, - reason, - force = false - }) { - if (!intentState.streamReader) { - return; - } - if (intentState.streamReaderCancelTimeout) { - clearTimeout(intentState.streamReaderCancelTimeout); - intentState.streamReaderCancelTimeout = null; - } - if (!force) { - if (intentState.renderTasks.size > 0) { - return; - } - if (reason instanceof _display_utils.RenderingCancelledException) { - let delay = RENDERING_CANCELLED_TIMEOUT; - if (reason.extraDelay > 0 && reason.extraDelay < 1000) { - delay += reason.extraDelay; - } - intentState.streamReaderCancelTimeout = setTimeout(() => { - intentState.streamReaderCancelTimeout = null; - this._abortOperatorList({ - intentState, - reason, - force: true - }); - }, delay); - return; - } - } - intentState.streamReader.cancel(new _util.AbortException(reason.message)).catch(() => {}); - intentState.streamReader = null; - if (this._transport.destroyed) { - return; - } - for (const [curCacheKey, curIntentState] of this._intentStates) { - if (curIntentState === intentState) { - this._intentStates.delete(curCacheKey); - break; - } - } - this.cleanup(); - } - get stats() { - return this._stats; - } -} -exports.PDFPageProxy = PDFPageProxy; -class LoopbackPort { - #listeners = []; - #deferred = Promise.resolve(); - postMessage(obj, transfers) { - const event = { - data: structuredClone(obj, transfers) - }; - this.#deferred.then(() => { - for (const listener of this.#listeners) { - listener.call(this, event); - } - }); - } - addEventListener(name, listener) { - this.#listeners.push(listener); - } - removeEventListener(name, listener) { - const i = this.#listeners.indexOf(listener); - this.#listeners.splice(i, 1); - } - terminate() { - this.#listeners.length = 0; - } -} -exports.LoopbackPort = LoopbackPort; -const PDFWorkerUtil = { - isWorkerDisabled: false, - fallbackWorkerSrc: null, - fakeWorkerId: 0 -}; -exports.PDFWorkerUtil = PDFWorkerUtil; -{ - if (_is_node.isNodeJS && typeof require === "function") { - PDFWorkerUtil.isWorkerDisabled = true; - PDFWorkerUtil.fallbackWorkerSrc = "./pdf.worker.js"; - } else if (typeof document === "object") { - const pdfjsFilePath = document?.currentScript?.src; - if (pdfjsFilePath) { - PDFWorkerUtil.fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, ".worker$1$2"); - } - } - PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) { - let base; - try { - base = new URL(baseUrl); - if (!base.origin || base.origin === "null") { - return false; - } - } catch (e) { - return false; - } - const other = new URL(otherUrl, base); - return base.origin === other.origin; - }; - PDFWorkerUtil.createCDNWrapper = function (url) { - const wrapper = `importScripts("${url}");`; - return URL.createObjectURL(new Blob([wrapper])); - }; -} -class PDFWorker { - static #workerPorts = new WeakMap(); - constructor({ - name = null, - port = null, - verbosity = (0, _util.getVerbosityLevel)() - } = {}) { - if (port && PDFWorker.#workerPorts.has(port)) { - throw new Error("Cannot use more than one PDFWorker per port."); - } - this.name = name; - this.destroyed = false; - this.verbosity = verbosity; - this._readyCapability = (0, _util.createPromiseCapability)(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - if (port) { - PDFWorker.#workerPorts.set(port, this); - this._initializeFromPort(port); - return; - } - this._initialize(); - } - get promise() { - return this._readyCapability.promise; - } - get port() { - return this._port; - } - get messageHandler() { - return this._messageHandler; - } - _initializeFromPort(port) { - this._port = port; - this._messageHandler = new _message_handler.MessageHandler("main", "worker", port); - this._messageHandler.on("ready", function () {}); - this._readyCapability.resolve(); - this._messageHandler.send("configure", { - verbosity: this.verbosity - }); - } - _initialize() { - if (!PDFWorkerUtil.isWorkerDisabled && !PDFWorker._mainThreadWorkerMessageHandler) { - let { - workerSrc - } = PDFWorker; - try { - if (!PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)) { - workerSrc = PDFWorkerUtil.createCDNWrapper(new URL(workerSrc, window.location).href); - } - const worker = new Worker(workerSrc); - const messageHandler = new _message_handler.MessageHandler("main", "worker", worker); - const terminateEarly = () => { - worker.removeEventListener("error", onWorkerError); - messageHandler.destroy(); - worker.terminate(); - if (this.destroyed) { - this._readyCapability.reject(new Error("Worker was destroyed")); - } else { - this._setupFakeWorker(); - } - }; - const onWorkerError = () => { - if (!this._webWorker) { - terminateEarly(); - } - }; - worker.addEventListener("error", onWorkerError); - messageHandler.on("test", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - if (data) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }); - messageHandler.on("ready", data => { - worker.removeEventListener("error", onWorkerError); - if (this.destroyed) { - terminateEarly(); - return; - } - try { - sendTest(); - } catch (e) { - this._setupFakeWorker(); - } - }); - const sendTest = () => { - const testObj = new Uint8Array(); - messageHandler.send("test", testObj, [testObj.buffer]); - }; - sendTest(); - return; - } catch (e) { - (0, _util.info)("The worker has been disabled."); - } - } - this._setupFakeWorker(); - } - _setupFakeWorker() { - if (!PDFWorkerUtil.isWorkerDisabled) { - (0, _util.warn)("Setting up fake worker."); - PDFWorkerUtil.isWorkerDisabled = true; - } - PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { - if (this.destroyed) { - this._readyCapability.reject(new Error("Worker was destroyed")); - return; - } - const port = new LoopbackPort(); - this._port = port; - const id = `fake${PDFWorkerUtil.fakeWorkerId++}`; - const workerHandler = new _message_handler.MessageHandler(id + "_worker", id, port); - WorkerMessageHandler.setup(workerHandler, port); - const messageHandler = new _message_handler.MessageHandler(id, id + "_worker", port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - messageHandler.send("configure", { - verbosity: this.verbosity - }); - }).catch(reason => { - this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); - }); - } - destroy() { - this.destroyed = true; - if (this._webWorker) { - this._webWorker.terminate(); - this._webWorker = null; - } - PDFWorker.#workerPorts.delete(this._port); - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - static fromPort(params) { - if (!params?.port) { - throw new Error("PDFWorker.fromPort - invalid method signature."); - } - if (this.#workerPorts.has(params.port)) { - return this.#workerPorts.get(params.port); - } - return new PDFWorker(params); - } - static get workerSrc() { - if (_worker_options.GlobalWorkerOptions.workerSrc) { - return _worker_options.GlobalWorkerOptions.workerSrc; - } - if (PDFWorkerUtil.fallbackWorkerSrc !== null) { - if (!_is_node.isNodeJS) { - (0, _display_utils.deprecated)('No "GlobalWorkerOptions.workerSrc" specified.'); - } - return PDFWorkerUtil.fallbackWorkerSrc; - } - throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); - } - static get _mainThreadWorkerMessageHandler() { - try { - return globalThis.pdfjsWorker?.WorkerMessageHandler || null; - } catch (ex) { - return null; - } - } - static get _setupFakeWorkerGlobal() { - const loader = async () => { - const mainWorkerMessageHandler = this._mainThreadWorkerMessageHandler; - if (mainWorkerMessageHandler) { - return mainWorkerMessageHandler; - } - if (_is_node.isNodeJS && typeof require === "function") { - const worker = eval("require")(this.workerSrc); - return worker.WorkerMessageHandler; - } - await (0, _display_utils.loadScript)(this.workerSrc); - return window.pdfjsWorker.WorkerMessageHandler; - }; - return (0, _util.shadow)(this, "_setupFakeWorkerGlobal", loader()); - } -} -exports.PDFWorker = PDFWorker; -class WorkerTransport { - #pageCache = new Map(); - #pagePromises = new Map(); - #metadataPromise = null; - constructor(messageHandler, loadingTask, networkStream, params) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.commonObjs = new PDFObjects(); - this.fontLoader = new _font_loader.FontLoader({ - onUnsupportedFeature: this._onUnsupportedFeature.bind(this), - ownerDocument: params.ownerDocument, - styleElement: params.styleElement - }); - this._params = params; - if (!params.useWorkerFetch) { - this.CMapReaderFactory = new params.CMapReaderFactory({ - baseUrl: params.cMapUrl, - isCompressed: params.cMapPacked - }); - this.StandardFontDataFactory = new params.StandardFontDataFactory({ - baseUrl: params.standardFontDataUrl - }); - } - this.destroyed = false; - this.destroyCapability = null; - this._passwordCapability = null; - this._networkStream = networkStream; - this._fullReader = null; - this._lastProgress = null; - this.downloadInfoCapability = (0, _util.createPromiseCapability)(); - this.setupMessageHandler(); - } - get annotationStorage() { - return (0, _util.shadow)(this, "annotationStorage", new _annotation_storage.AnnotationStorage()); - } - getRenderingIntent(intent, annotationMode = _util.AnnotationMode.ENABLE, printAnnotationStorage = null, isOpList = false) { - let renderingIntent = _util.RenderingIntentFlag.DISPLAY; - let annotationMap = null; - switch (intent) { - case "any": - renderingIntent = _util.RenderingIntentFlag.ANY; - break; - case "display": - break; - case "print": - renderingIntent = _util.RenderingIntentFlag.PRINT; - break; - default: - (0, _util.warn)(`getRenderingIntent - invalid intent: ${intent}`); - } - switch (annotationMode) { - case _util.AnnotationMode.DISABLE: - renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_DISABLE; - break; - case _util.AnnotationMode.ENABLE: - break; - case _util.AnnotationMode.ENABLE_FORMS: - renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_FORMS; - break; - case _util.AnnotationMode.ENABLE_STORAGE: - renderingIntent += _util.RenderingIntentFlag.ANNOTATIONS_STORAGE; - const annotationStorage = renderingIntent & _util.RenderingIntentFlag.PRINT && printAnnotationStorage instanceof _annotation_storage.PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; - annotationMap = annotationStorage.serializable; - break; - default: - (0, _util.warn)(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); - } - if (isOpList) { - renderingIntent += _util.RenderingIntentFlag.OPLIST; - } - return { - renderingIntent, - cacheKey: `${renderingIntent}_${_annotation_storage.AnnotationStorage.getHash(annotationMap)}`, - annotationStorageMap: annotationMap - }; - } - destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; - } - this.destroyed = true; - this.destroyCapability = (0, _util.createPromiseCapability)(); - if (this._passwordCapability) { - this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback")); - } - const waitOn = []; - for (const page of this.#pageCache.values()) { - waitOn.push(page._destroy()); - } - this.#pageCache.clear(); - this.#pagePromises.clear(); - if (this.hasOwnProperty("annotationStorage")) { - this.annotationStorage.resetModified(); - } - const terminated = this.messageHandler.sendWithPromise("Terminate", null); - waitOn.push(terminated); - Promise.all(waitOn).then(() => { - this.commonObjs.clear(); - this.fontLoader.clear(); - this.#metadataPromise = null; - this._getFieldObjectsPromise = null; - this._hasJSActionsPromise = null; - if (this._networkStream) { - this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated.")); - } - if (this.messageHandler) { - this.messageHandler.destroy(); - this.messageHandler = null; - } - this.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - } - setupMessageHandler() { - const { - messageHandler, - loadingTask - } = this; - messageHandler.on("GetReader", (data, sink) => { - (0, _util.assert)(this._networkStream, "GetReader - no `IPDFStream` instance available."); - this._fullReader = this._networkStream.getFullReader(); - this._fullReader.onProgress = evt => { - this._lastProgress = { - loaded: evt.loaded, - total: evt.total - }; - }; - sink.onPull = () => { - this._fullReader.read().then(function ({ - value, - done - }) { - if (done) { - sink.close(); - return; - } - (0, _util.assert)(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer."); - sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(reason => { - sink.error(reason); - }); - }; - sink.onCancel = reason => { - this._fullReader.cancel(reason); - sink.ready.catch(readyReason => { - if (this.destroyed) { - return; - } - throw readyReason; - }); - }; - }); - messageHandler.on("ReaderHeadersReady", data => { - const headersCapability = (0, _util.createPromiseCapability)(); - const fullReader = this._fullReader; - fullReader.headersReady.then(() => { - if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { - if (this._lastProgress) { - loadingTask.onProgress?.(this._lastProgress); - } - fullReader.onProgress = evt => { - loadingTask.onProgress?.({ - loaded: evt.loaded, - total: evt.total - }); - }; - } - headersCapability.resolve({ - isStreamingSupported: fullReader.isStreamingSupported, - isRangeSupported: fullReader.isRangeSupported, - contentLength: fullReader.contentLength - }); - }, headersCapability.reject); - return headersCapability.promise; - }); - messageHandler.on("GetRangeReader", (data, sink) => { - (0, _util.assert)(this._networkStream, "GetRangeReader - no `IPDFStream` instance available."); - const rangeReader = this._networkStream.getRangeReader(data.begin, data.end); - if (!rangeReader) { - sink.close(); - return; - } - sink.onPull = () => { - rangeReader.read().then(function ({ - value, - done - }) { - if (done) { - sink.close(); - return; - } - (0, _util.assert)(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer."); - sink.enqueue(new Uint8Array(value), 1, [value]); - }).catch(reason => { - sink.error(reason); - }); - }; - sink.onCancel = reason => { - rangeReader.cancel(reason); - sink.ready.catch(readyReason => { - if (this.destroyed) { - return; - } - throw readyReason; - }); - }; - }); - messageHandler.on("GetDoc", ({ - pdfInfo - }) => { - this._numPages = pdfInfo.numPages; - this._htmlForXfa = pdfInfo.htmlForXfa; - delete pdfInfo.htmlForXfa; - loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this)); - }); - messageHandler.on("DocException", function (ex) { - let reason; - switch (ex.name) { - case "PasswordException": - reason = new _util.PasswordException(ex.message, ex.code); - break; - case "InvalidPDFException": - reason = new _util.InvalidPDFException(ex.message); - break; - case "MissingPDFException": - reason = new _util.MissingPDFException(ex.message); - break; - case "UnexpectedResponseException": - reason = new _util.UnexpectedResponseException(ex.message, ex.status); - break; - case "UnknownErrorException": - reason = new _util.UnknownErrorException(ex.message, ex.details); - break; - default: - (0, _util.unreachable)("DocException - expected a valid Error."); - } - loadingTask._capability.reject(reason); - }); - messageHandler.on("PasswordRequest", exception => { - this._passwordCapability = (0, _util.createPromiseCapability)(); - if (loadingTask.onPassword) { - const updatePassword = password => { - if (password instanceof Error) { - this._passwordCapability.reject(password); - } else { - this._passwordCapability.resolve({ - password - }); - } - }; - try { - loadingTask.onPassword(updatePassword, exception.code); - } catch (ex) { - this._passwordCapability.reject(ex); - } - } else { - this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code)); - } - return this._passwordCapability.promise; - }); - messageHandler.on("DataLoaded", data => { - loadingTask.onProgress?.({ - loaded: data.length, - total: data.length - }); - this.downloadInfoCapability.resolve(data); - }); - messageHandler.on("StartRenderPage", data => { - if (this.destroyed) { - return; - } - const page = this.#pageCache.get(data.pageIndex); - page._startRenderPage(data.transparency, data.cacheKey); - }); - messageHandler.on("commonobj", ([id, type, exportedData]) => { - if (this.destroyed) { - return; - } - if (this.commonObjs.has(id)) { - return; - } - switch (type) { - case "Font": - const params = this._params; - if ("error" in exportedData) { - const exportedError = exportedData.error; - (0, _util.warn)(`Error during font loading: ${exportedError}`); - this.commonObjs.resolve(id, exportedError); - break; - } - let fontRegistry = null; - if (params.pdfBug && globalThis.FontInspector?.enabled) { - fontRegistry = { - registerFont(font, url) { - globalThis.FontInspector.fontAdded(font, url); - } - }; - } - const font = new _font_loader.FontFaceObject(exportedData, { - isEvalSupported: params.isEvalSupported, - disableFontFace: params.disableFontFace, - ignoreErrors: params.ignoreErrors, - onUnsupportedFeature: this._onUnsupportedFeature.bind(this), - fontRegistry - }); - this.fontLoader.bind(font).catch(reason => { - return messageHandler.sendWithPromise("FontFallback", { - id - }); - }).finally(() => { - if (!params.fontExtraProperties && font.data) { - font.data = null; - } - this.commonObjs.resolve(id, font); - }); - break; - case "FontPath": - case "Image": - this.commonObjs.resolve(id, exportedData); - break; - default: - throw new Error(`Got unknown common object type ${type}`); - } - }); - messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { - if (this.destroyed) { - return; - } - const pageProxy = this.#pageCache.get(pageIndex); - if (pageProxy.objs.has(id)) { - return; - } - switch (type) { - case "Image": - pageProxy.objs.resolve(id, imageData); - const MAX_IMAGE_SIZE_TO_STORE = 8000000; - if (imageData) { - let length; - if (imageData.bitmap) { - const { - bitmap, - width, - height - } = imageData; - length = width * height * 4; - pageProxy._bitmaps.add(bitmap); - } else { - length = imageData.data?.length || 0; - } - if (length > MAX_IMAGE_SIZE_TO_STORE) { - pageProxy.cleanupAfterRender = true; - } - } - break; - case "Pattern": - pageProxy.objs.resolve(id, imageData); - break; - default: - throw new Error(`Got unknown object type ${type}`); - } - }); - messageHandler.on("DocProgress", data => { - if (this.destroyed) { - return; - } - loadingTask.onProgress?.({ - loaded: data.loaded, - total: data.total - }); - }); - messageHandler.on("UnsupportedFeature", this._onUnsupportedFeature.bind(this)); - messageHandler.on("FetchBuiltInCMap", data => { - if (this.destroyed) { - return Promise.reject(new Error("Worker was destroyed.")); - } - if (!this.CMapReaderFactory) { - return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter.")); - } - return this.CMapReaderFactory.fetch(data); - }); - messageHandler.on("FetchStandardFontData", data => { - if (this.destroyed) { - return Promise.reject(new Error("Worker was destroyed.")); - } - if (!this.StandardFontDataFactory) { - return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter.")); - } - return this.StandardFontDataFactory.fetch(data); - }); - } - _onUnsupportedFeature({ - featureId - }) { - if (this.destroyed) { - return; - } - this.loadingTask.onUnsupportedFeature?.(featureId); - } - getData() { - return this.messageHandler.sendWithPromise("GetData", null); - } - saveDocument() { - if (this.annotationStorage.size <= 0) { - (0, _util.warn)("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); - } - return this.messageHandler.sendWithPromise("SaveDocument", { - isPureXfa: !!this._htmlForXfa, - numPages: this._numPages, - annotationStorage: this.annotationStorage.serializable, - filename: this._fullReader?.filename ?? null - }).finally(() => { - this.annotationStorage.resetModified(); - }); - } - getPage(pageNumber) { - if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) { - return Promise.reject(new Error("Invalid page request.")); - } - const pageIndex = pageNumber - 1, - cachedPromise = this.#pagePromises.get(pageIndex); - if (cachedPromise) { - return cachedPromise; - } - const promise = this.messageHandler.sendWithPromise("GetPage", { - pageIndex - }).then(pageInfo => { - if (this.destroyed) { - throw new Error("Transport destroyed"); - } - const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.ownerDocument, this._params.pdfBug); - this.#pageCache.set(pageIndex, page); - return page; - }); - this.#pagePromises.set(pageIndex, promise); - return promise; - } - getPageIndex(ref) { - if (typeof ref !== "object" || ref === null || !Number.isInteger(ref.num) || ref.num < 0 || !Number.isInteger(ref.gen) || ref.gen < 0) { - return Promise.reject(new Error("Invalid pageIndex request.")); - } - return this.messageHandler.sendWithPromise("GetPageIndex", { - num: ref.num, - gen: ref.gen - }); - } - getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise("GetAnnotations", { - pageIndex, - intent - }); - } - getFieldObjects() { - return this._getFieldObjectsPromise ||= this.messageHandler.sendWithPromise("GetFieldObjects", null); - } - hasJSActions() { - return this._hasJSActionsPromise ||= this.messageHandler.sendWithPromise("HasJSActions", null); - } - getCalculationOrderIds() { - return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null); - } - getDestinations() { - return this.messageHandler.sendWithPromise("GetDestinations", null); - } - getDestination(id) { - if (typeof id !== "string") { - return Promise.reject(new Error("Invalid destination request.")); - } - return this.messageHandler.sendWithPromise("GetDestination", { - id - }); - } - getPageLabels() { - return this.messageHandler.sendWithPromise("GetPageLabels", null); - } - getPageLayout() { - return this.messageHandler.sendWithPromise("GetPageLayout", null); - } - getPageMode() { - return this.messageHandler.sendWithPromise("GetPageMode", null); - } - getViewerPreferences() { - return this.messageHandler.sendWithPromise("GetViewerPreferences", null); - } - getOpenAction() { - return this.messageHandler.sendWithPromise("GetOpenAction", null); - } - getAttachments() { - return this.messageHandler.sendWithPromise("GetAttachments", null); - } - getJavaScript() { - return this.messageHandler.sendWithPromise("GetJavaScript", null); - } - getDocJSActions() { - return this.messageHandler.sendWithPromise("GetDocJSActions", null); - } - getPageJSActions(pageIndex) { - return this.messageHandler.sendWithPromise("GetPageJSActions", { - pageIndex - }); - } - getStructTree(pageIndex) { - return this.messageHandler.sendWithPromise("GetStructTree", { - pageIndex - }); - } - getOutline() { - return this.messageHandler.sendWithPromise("GetOutline", null); - } - getOptionalContentConfig() { - return this.messageHandler.sendWithPromise("GetOptionalContentConfig", null).then(results => { - return new _optional_content_config.OptionalContentConfig(results); - }); - } - getPermissions() { - return this.messageHandler.sendWithPromise("GetPermissions", null); - } - getMetadata() { - return this.#metadataPromise ||= this.messageHandler.sendWithPromise("GetMetadata", null).then(results => { - return { - info: results[0], - metadata: results[1] ? new _metadata.Metadata(results[1]) : null, - contentDispositionFilename: this._fullReader?.filename ?? null, - contentLength: this._fullReader?.contentLength ?? null - }; - }); - } - getMarkInfo() { - return this.messageHandler.sendWithPromise("GetMarkInfo", null); - } - async startCleanup(keepLoadedFonts = false) { - if (this.destroyed) { - return; - } - await this.messageHandler.sendWithPromise("Cleanup", null); - for (const page of this.#pageCache.values()) { - const cleanupSuccessful = page.cleanup(); - if (!cleanupSuccessful) { - throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`); - } - } - this.commonObjs.clear(); - if (!keepLoadedFonts) { - this.fontLoader.clear(); - } - this.#metadataPromise = null; - this._getFieldObjectsPromise = null; - this._hasJSActionsPromise = null; - } - get loadingParams() { - const params = this._params; - return (0, _util.shadow)(this, "loadingParams", { - disableAutoFetch: params.disableAutoFetch, - enableXfa: params.enableXfa - }); - } -} -class PDFObjects { - #objs = Object.create(null); - #ensureObj(objId) { - const obj = this.#objs[objId]; - if (obj) { - return obj; - } - return this.#objs[objId] = { - capability: (0, _util.createPromiseCapability)(), - data: null - }; - } - get(objId, callback = null) { - if (callback) { - const obj = this.#ensureObj(objId); - obj.capability.promise.then(() => callback(obj.data)); - return null; - } - const obj = this.#objs[objId]; - if (!obj?.capability.settled) { - throw new Error(`Requesting object that isn't resolved yet ${objId}.`); - } - return obj.data; - } - has(objId) { - const obj = this.#objs[objId]; - return obj?.capability.settled || false; - } - resolve(objId, data = null) { - const obj = this.#ensureObj(objId); - obj.data = data; - obj.capability.resolve(); - } - clear() { - this.#objs = Object.create(null); - } -} -class RenderTask { - #internalRenderTask = null; - constructor(internalRenderTask) { - this.#internalRenderTask = internalRenderTask; - this.onContinue = null; - } - get promise() { - return this.#internalRenderTask.capability.promise; - } - cancel(extraDelay = 0) { - this.#internalRenderTask.cancel(null, extraDelay); - } - get separateAnnots() { - const { - separateAnnots - } = this.#internalRenderTask.operatorList; - if (!separateAnnots) { - return false; - } - const { - annotationCanvasMap - } = this.#internalRenderTask; - return separateAnnots.form || separateAnnots.canvas && annotationCanvasMap?.size > 0; - } -} -exports.RenderTask = RenderTask; -class InternalRenderTask { - static #canvasInUse = new WeakSet(); - constructor({ - callback, - params, - objs, - commonObjs, - annotationCanvasMap, - operatorList, - pageIndex, - canvasFactory, - useRequestAnimationFrame = false, - pdfBug = false, - pageColors = null - }) { - this.callback = callback; - this.params = params; - this.objs = objs; - this.commonObjs = commonObjs; - this.annotationCanvasMap = annotationCanvasMap; - this.operatorListIdx = null; - this.operatorList = operatorList; - this._pageIndex = pageIndex; - this.canvasFactory = canvasFactory; - this._pdfBug = pdfBug; - this.pageColors = pageColors; - this.running = false; - this.graphicsReadyCallback = null; - this.graphicsReady = false; - this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined"; - this.cancelled = false; - this.capability = (0, _util.createPromiseCapability)(); - this.task = new RenderTask(this); - this._cancelBound = this.cancel.bind(this); - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - this._canvas = params.canvasContext.canvas; - } - get completed() { - return this.capability.promise.catch(function () {}); - } - initializeGraphics({ - transparency = false, - optionalContentConfig - }) { - if (this.cancelled) { - return; - } - if (this._canvas) { - if (InternalRenderTask.#canvasInUse.has(this._canvas)) { - throw new Error("Cannot use the same canvas during multiple render() operations. " + "Use different canvas or ensure previous operations were " + "cancelled or completed."); - } - InternalRenderTask.#canvasInUse.add(this._canvas); - } - if (this._pdfBug && globalThis.StepperManager?.enabled) { - this.stepper = globalThis.StepperManager.create(this._pageIndex); - this.stepper.init(this.operatorList); - this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); - } - const { - canvasContext, - viewport, - transform, - background - } = this.params; - this.gfx = new _canvas.CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, { - optionalContentConfig - }, this.annotationCanvasMap, this.pageColors); - this.gfx.beginDrawing({ - transform, - viewport, - transparency, - background - }); - this.operatorListIdx = 0; - this.graphicsReady = true; - this.graphicsReadyCallback?.(); - } - cancel(error = null, extraDelay = 0) { - this.running = false; - this.cancelled = true; - this.gfx?.endDrawing(); - if (this._canvas) { - InternalRenderTask.#canvasInUse.delete(this._canvas); - } - this.callback(error || new _display_utils.RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, "canvas", extraDelay)); - } - operatorListChanged() { - if (!this.graphicsReady) { - if (!this.graphicsReadyCallback) { - this.graphicsReadyCallback = this._continueBound; - } - return; - } - this.stepper?.updateOperatorList(this.operatorList); - if (this.running) { - return; - } - this._continue(); - } - _continue() { - this.running = true; - if (this.cancelled) { - return; - } - if (this.task.onContinue) { - this.task.onContinue(this._scheduleNextBound); - } else { - this._scheduleNext(); - } - } - _scheduleNext() { - if (this._useRequestAnimationFrame) { - window.requestAnimationFrame(() => { - this._nextBound().catch(this._cancelBound); - }); - } else { - Promise.resolve().then(this._nextBound).catch(this._cancelBound); - } - } - async _next() { - if (this.cancelled) { - return; - } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - if (this._canvas) { - InternalRenderTask.#canvasInUse.delete(this._canvas); - } - this.callback(); - } - } - } -} -const version = '3.3.122'; -exports.version = version; -const build = '562045607'; -exports.build = build; - -/***/ }), -/* 3 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.PrintAnnotationStorage = exports.AnnotationStorage = void 0; -var _util = __w_pdfjs_require__(1); -var _editor = __w_pdfjs_require__(4); -var _murmurhash = __w_pdfjs_require__(8); -class AnnotationStorage { - #modified = false; - #storage = new Map(); - constructor() { - this.onSetModified = null; - this.onResetModified = null; - this.onAnnotationEditor = null; - } - getValue(key, defaultValue) { - const value = this.#storage.get(key); - if (value === undefined) { - return defaultValue; - } - return Object.assign(defaultValue, value); - } - getRawValue(key) { - return this.#storage.get(key); - } - remove(key) { - this.#storage.delete(key); - if (this.#storage.size === 0) { - this.resetModified(); - } - if (typeof this.onAnnotationEditor === "function") { - for (const value of this.#storage.values()) { - if (value instanceof _editor.AnnotationEditor) { - return; - } - } - this.onAnnotationEditor(null); - } - } - setValue(key, value) { - const obj = this.#storage.get(key); - let modified = false; - if (obj !== undefined) { - for (const [entry, val] of Object.entries(value)) { - if (obj[entry] !== val) { - modified = true; - obj[entry] = val; - } - } - } else { - modified = true; - this.#storage.set(key, value); - } - if (modified) { - this.#setModified(); - } - if (value instanceof _editor.AnnotationEditor && typeof this.onAnnotationEditor === "function") { - this.onAnnotationEditor(value.constructor._type); - } - } - has(key) { - return this.#storage.has(key); - } - getAll() { - return this.#storage.size > 0 ? (0, _util.objectFromMap)(this.#storage) : null; - } - get size() { - return this.#storage.size; - } - #setModified() { - if (!this.#modified) { - this.#modified = true; - if (typeof this.onSetModified === "function") { - this.onSetModified(); - } - } - } - resetModified() { - if (this.#modified) { - this.#modified = false; - if (typeof this.onResetModified === "function") { - this.onResetModified(); - } - } - } - get print() { - return new PrintAnnotationStorage(this); - } - get serializable() { - if (this.#storage.size === 0) { - return null; - } - const clone = new Map(); - for (const [key, val] of this.#storage) { - const serialized = val instanceof _editor.AnnotationEditor ? val.serialize() : val; - if (serialized) { - clone.set(key, serialized); - } - } - return clone; - } - static getHash(map) { - if (!map) { - return ""; - } - const hash = new _murmurhash.MurmurHash3_64(); - for (const [key, val] of map) { - hash.update(`${key}:${JSON.stringify(val)}`); - } - return hash.hexdigest(); - } -} -exports.AnnotationStorage = AnnotationStorage; -class PrintAnnotationStorage extends AnnotationStorage { - #serializable = null; - constructor(parent) { - super(); - this.#serializable = structuredClone(parent.serializable); - } - get print() { - (0, _util.unreachable)("Should not call PrintAnnotationStorage.print"); - } - get serializable() { - return this.#serializable; - } -} -exports.PrintAnnotationStorage = PrintAnnotationStorage; - -/***/ }), -/* 4 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AnnotationEditor = void 0; -var _tools = __w_pdfjs_require__(5); -var _util = __w_pdfjs_require__(1); -class AnnotationEditor { - #boundFocusin = this.focusin.bind(this); - #boundFocusout = this.focusout.bind(this); - #hasBeenSelected = false; - #isEditing = false; - #isInEditMode = false; - _uiManager = null; - #zIndex = AnnotationEditor._zIndex++; - static _colorManager = new _tools.ColorManager(); - static _zIndex = 1; - constructor(parameters) { - if (this.constructor === AnnotationEditor) { - (0, _util.unreachable)("Cannot initialize AnnotationEditor."); - } - this.parent = parameters.parent; - this.id = parameters.id; - this.width = this.height = null; - this.pageIndex = parameters.parent.pageIndex; - this.name = parameters.name; - this.div = null; - this._uiManager = parameters.uiManager; - const { - rotation, - rawDims: { - pageWidth, - pageHeight, - pageX, - pageY - } - } = this.parent.viewport; - this.rotation = rotation; - this.pageDimensions = [pageWidth, pageHeight]; - this.pageTranslation = [pageX, pageY]; - const [width, height] = this.parentDimensions; - this.x = parameters.x / width; - this.y = parameters.y / height; - this.isAttachedToDOM = false; - } - static get _defaultLineColor() { - return (0, _util.shadow)(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); - } - addCommands(params) { - this._uiManager.addCommands(params); - } - get currentLayer() { - return this._uiManager.currentLayer; - } - setInBackground() { - this.div.style.zIndex = 0; - } - setInForeground() { - this.div.style.zIndex = this.#zIndex; - } - setParent(parent) { - if (parent !== null) { - this.pageIndex = parent.pageIndex; - this.pageDimensions = parent.pageDimensions; - } - this.parent = parent; - } - focusin(event) { - if (!this.#hasBeenSelected) { - this.parent.setSelected(this); - } else { - this.#hasBeenSelected = false; - } - } - focusout(event) { - if (!this.isAttachedToDOM) { - return; - } - const target = event.relatedTarget; - if (target?.closest(`#${this.id}`)) { - return; - } - event.preventDefault(); - if (!this.parent?.isMultipleSelection) { - this.commitOrRemove(); - } - } - commitOrRemove() { - if (this.isEmpty()) { - this.remove(); - } else { - this.commit(); - } - } - commit() { - this.addToAnnotationStorage(); - } - addToAnnotationStorage() { - this._uiManager.addToAnnotationStorage(this); - } - dragstart(event) { - const rect = this.parent.div.getBoundingClientRect(); - this.startX = event.clientX - rect.x; - this.startY = event.clientY - rect.y; - event.dataTransfer.setData("text/plain", this.id); - event.dataTransfer.effectAllowed = "move"; - } - setAt(x, y, tx, ty) { - const [width, height] = this.parentDimensions; - [tx, ty] = this.screenToPageTranslation(tx, ty); - this.x = (x + tx) / width; - this.y = (y + ty) / height; - this.div.style.left = `${100 * this.x}%`; - this.div.style.top = `${100 * this.y}%`; - } - translate(x, y) { - const [width, height] = this.parentDimensions; - [x, y] = this.screenToPageTranslation(x, y); - this.x += x / width; - this.y += y / height; - this.div.style.left = `${100 * this.x}%`; - this.div.style.top = `${100 * this.y}%`; - } - screenToPageTranslation(x, y) { - switch (this.parentRotation) { - case 90: - return [y, -x]; - case 180: - return [-x, -y]; - case 270: - return [-y, x]; - default: - return [x, y]; - } - } - get parentScale() { - return this._uiManager.viewParameters.realScale; - } - get parentRotation() { - return this._uiManager.viewParameters.rotation; - } - get parentDimensions() { - const { - realScale - } = this._uiManager.viewParameters; - const [pageWidth, pageHeight] = this.pageDimensions; - return [pageWidth * realScale, pageHeight * realScale]; - } - setDims(width, height) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.div.style.width = `${100 * width / parentWidth}%`; - this.div.style.height = `${100 * height / parentHeight}%`; - } - fixDims() { - const { - style - } = this.div; - const { - height, - width - } = style; - const widthPercent = width.endsWith("%"); - const heightPercent = height.endsWith("%"); - if (widthPercent && heightPercent) { - return; - } - const [parentWidth, parentHeight] = this.parentDimensions; - if (!widthPercent) { - style.width = `${100 * parseFloat(width) / parentWidth}%`; - } - if (!heightPercent) { - style.height = `${100 * parseFloat(height) / parentHeight}%`; - } - } - getInitialTranslation() { - return [0, 0]; - } - render() { - this.div = document.createElement("div"); - this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); - this.div.className = this.name; - this.div.setAttribute("id", this.id); - this.div.setAttribute("tabIndex", 0); - this.setInForeground(); - this.div.addEventListener("focusin", this.#boundFocusin); - this.div.addEventListener("focusout", this.#boundFocusout); - const [tx, ty] = this.getInitialTranslation(); - this.translate(tx, ty); - (0, _tools.bindEvents)(this, this.div, ["dragstart", "pointerdown"]); - return this.div; - } - pointerdown(event) { - const { - isMac - } = _util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { - event.preventDefault(); - return; - } - if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { - this.parent.toggleSelected(this); - } else { - this.parent.setSelected(this); - } - this.#hasBeenSelected = true; - } - getRect(tx, ty) { - const scale = this.parentScale; - const [pageWidth, pageHeight] = this.pageDimensions; - const [pageX, pageY] = this.pageTranslation; - const shiftX = tx / scale; - const shiftY = ty / scale; - const x = this.x * pageWidth; - const y = this.y * pageHeight; - const width = this.width * pageWidth; - const height = this.height * pageHeight; - switch (this.rotation) { - case 0: - return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY]; - case 90: - return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY]; - case 180: - return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY]; - case 270: - return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY]; - default: - throw new Error("Invalid rotation"); - } - } - getRectInCurrentCoords(rect, pageHeight) { - const [x1, y1, x2, y2] = rect; - const width = x2 - x1; - const height = y2 - y1; - switch (this.rotation) { - case 0: - return [x1, pageHeight - y2, width, height]; - case 90: - return [x1, pageHeight - y1, height, width]; - case 180: - return [x2, pageHeight - y1, width, height]; - case 270: - return [x2, pageHeight - y2, height, width]; - default: - throw new Error("Invalid rotation"); - } - } - onceAdded() {} - isEmpty() { - return false; - } - enableEditMode() { - this.#isInEditMode = true; - } - disableEditMode() { - this.#isInEditMode = false; - } - isInEditMode() { - return this.#isInEditMode; - } - shouldGetKeyboardEvents() { - return false; - } - needsToBeRebuilt() { - return this.div && !this.isAttachedToDOM; - } - rebuild() { - this.div?.addEventListener("focusin", this.#boundFocusin); - } - serialize() { - (0, _util.unreachable)("An editor must be serializable"); - } - static deserialize(data, parent, uiManager) { - const editor = new this.prototype.constructor({ - parent, - id: parent.getNextId(), - uiManager - }); - editor.rotation = data.rotation; - const [pageWidth, pageHeight] = editor.pageDimensions; - const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight); - editor.x = x / pageWidth; - editor.y = y / pageHeight; - editor.width = width / pageWidth; - editor.height = height / pageHeight; - return editor; - } - remove() { - this.div.removeEventListener("focusin", this.#boundFocusin); - this.div.removeEventListener("focusout", this.#boundFocusout); - if (!this.isEmpty()) { - this.commit(); - } - this.parent.remove(this); - } - select() { - this.div?.classList.add("selectedEditor"); - } - unselect() { - this.div?.classList.remove("selectedEditor"); - } - updateParams(type, value) {} - disableEditing() {} - enableEditing() {} - get propertiesToUpdate() { - return {}; - } - get contentDiv() { - return this.div; - } - get isEditing() { - return this.#isEditing; - } - set isEditing(value) { - this.#isEditing = value; - if (value) { - this.parent.setSelected(this); - this.parent.setActiveEditor(this); - } else { - this.parent.setActiveEditor(null); - } - } -} -exports.AnnotationEditor = AnnotationEditor; - -/***/ }), -/* 5 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.KeyboardManager = exports.CommandManager = exports.ColorManager = exports.AnnotationEditorUIManager = void 0; -exports.bindEvents = bindEvents; -exports.opacityToHex = opacityToHex; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -function bindEvents(obj, element, names) { - for (const name of names) { - element.addEventListener(name, obj[name].bind(obj)); - } -} -function opacityToHex(opacity) { - return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0"); -} -class IdManager { - #id = 0; - getId() { - return `${_util.AnnotationEditorPrefix}${this.#id++}`; - } -} -class CommandManager { - #commands = []; - #locked = false; - #maxSize; - #position = -1; - constructor(maxSize = 128) { - this.#maxSize = maxSize; - } - add({ - cmd, - undo, - mustExec, - type = NaN, - overwriteIfSameType = false, - keepUndo = false - }) { - if (mustExec) { - cmd(); - } - if (this.#locked) { - return; - } - const save = { - cmd, - undo, - type - }; - if (this.#position === -1) { - if (this.#commands.length > 0) { - this.#commands.length = 0; - } - this.#position = 0; - this.#commands.push(save); - return; - } - if (overwriteIfSameType && this.#commands[this.#position].type === type) { - if (keepUndo) { - save.undo = this.#commands[this.#position].undo; - } - this.#commands[this.#position] = save; - return; - } - const next = this.#position + 1; - if (next === this.#maxSize) { - this.#commands.splice(0, 1); - } else { - this.#position = next; - if (next < this.#commands.length) { - this.#commands.splice(next); - } - } - this.#commands.push(save); - } - undo() { - if (this.#position === -1) { - return; - } - this.#locked = true; - this.#commands[this.#position].undo(); - this.#locked = false; - this.#position -= 1; - } - redo() { - if (this.#position < this.#commands.length - 1) { - this.#position += 1; - this.#locked = true; - this.#commands[this.#position].cmd(); - this.#locked = false; - } - } - hasSomethingToUndo() { - return this.#position !== -1; - } - hasSomethingToRedo() { - return this.#position < this.#commands.length - 1; - } - destroy() { - this.#commands = null; - } -} -exports.CommandManager = CommandManager; -class KeyboardManager { - constructor(callbacks) { - this.buffer = []; - this.callbacks = new Map(); - this.allKeys = new Set(); - const { - isMac - } = _util.FeatureTest.platform; - for (const [keys, callback] of callbacks) { - for (const key of keys) { - const isMacKey = key.startsWith("mac+"); - if (isMac && isMacKey) { - this.callbacks.set(key.slice(4), callback); - this.allKeys.add(key.split("+").at(-1)); - } else if (!isMac && !isMacKey) { - this.callbacks.set(key, callback); - this.allKeys.add(key.split("+").at(-1)); - } - } - } - } - #serialize(event) { - if (event.altKey) { - this.buffer.push("alt"); - } - if (event.ctrlKey) { - this.buffer.push("ctrl"); - } - if (event.metaKey) { - this.buffer.push("meta"); - } - if (event.shiftKey) { - this.buffer.push("shift"); - } - this.buffer.push(event.key); - const str = this.buffer.join("+"); - this.buffer.length = 0; - return str; - } - exec(self, event) { - if (!this.allKeys.has(event.key)) { - return; - } - const callback = this.callbacks.get(this.#serialize(event)); - if (!callback) { - return; - } - callback.bind(self)(); - event.stopPropagation(); - event.preventDefault(); - } -} -exports.KeyboardManager = KeyboardManager; -class ColorManager { - static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); - get _colors() { - const colors = new Map([["CanvasText", null], ["Canvas", null]]); - (0, _display_utils.getColorValues)(colors); - return (0, _util.shadow)(this, "_colors", colors); - } - convert(color) { - const rgb = (0, _display_utils.getRGB)(color); - if (!window.matchMedia("(forced-colors: active)").matches) { - return rgb; - } - for (const [name, RGB] of this._colors) { - if (RGB.every((x, i) => x === rgb[i])) { - return ColorManager._colorsMapping.get(name); - } - } - return rgb; - } - getHexCode(name) { - const rgb = this._colors.get(name); - if (!rgb) { - return name; - } - return _util.Util.makeHexColor(...rgb); - } -} -exports.ColorManager = ColorManager; -class AnnotationEditorUIManager { - #activeEditor = null; - #allEditors = new Map(); - #allLayers = new Map(); - #annotationStorage = null; - #commandManager = new CommandManager(); - #currentPageIndex = 0; - #editorTypes = null; - #editorsToRescale = new Set(); - #eventBus = null; - #idManager = new IdManager(); - #isEnabled = false; - #mode = _util.AnnotationEditorType.NONE; - #selectedEditors = new Set(); - #boundCopy = this.copy.bind(this); - #boundCut = this.cut.bind(this); - #boundPaste = this.paste.bind(this); - #boundKeydown = this.keydown.bind(this); - #boundOnEditingAction = this.onEditingAction.bind(this); - #boundOnPageChanging = this.onPageChanging.bind(this); - #boundOnScaleChanging = this.onScaleChanging.bind(this); - #boundOnRotationChanging = this.onRotationChanging.bind(this); - #previousStates = { - isEditing: false, - isEmpty: true, - hasSomethingToUndo: false, - hasSomethingToRedo: false, - hasSelectedEditor: false - }; - #container = null; - static _keyboardManager = new KeyboardManager([[["ctrl+a", "mac+meta+a"], AnnotationEditorUIManager.prototype.selectAll], [["ctrl+z", "mac+meta+z"], AnnotationEditorUIManager.prototype.undo], [["ctrl+y", "ctrl+shift+Z", "mac+meta+shift+Z"], AnnotationEditorUIManager.prototype.redo], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete"], AnnotationEditorUIManager.prototype.delete], [["Escape", "mac+Escape"], AnnotationEditorUIManager.prototype.unselectAll]]); - constructor(container, eventBus, annotationStorage) { - this.#container = container; - this.#eventBus = eventBus; - this.#eventBus._on("editingaction", this.#boundOnEditingAction); - this.#eventBus._on("pagechanging", this.#boundOnPageChanging); - this.#eventBus._on("scalechanging", this.#boundOnScaleChanging); - this.#eventBus._on("rotationchanging", this.#boundOnRotationChanging); - this.#annotationStorage = annotationStorage; - this.viewParameters = { - realScale: _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS, - rotation: 0 - }; - } - destroy() { - this.#removeKeyboardManager(); - this.#eventBus._off("editingaction", this.#boundOnEditingAction); - this.#eventBus._off("pagechanging", this.#boundOnPageChanging); - this.#eventBus._off("scalechanging", this.#boundOnScaleChanging); - this.#eventBus._off("rotationchanging", this.#boundOnRotationChanging); - for (const layer of this.#allLayers.values()) { - layer.destroy(); - } - this.#allLayers.clear(); - this.#allEditors.clear(); - this.#editorsToRescale.clear(); - this.#activeEditor = null; - this.#selectedEditors.clear(); - this.#commandManager.destroy(); - } - onPageChanging({ - pageNumber - }) { - this.#currentPageIndex = pageNumber - 1; - } - focusMainContainer() { - this.#container.focus(); - } - addShouldRescale(editor) { - this.#editorsToRescale.add(editor); - } - removeShouldRescale(editor) { - this.#editorsToRescale.delete(editor); - } - onScaleChanging({ - scale - }) { - this.commitOrRemove(); - this.viewParameters.realScale = scale * _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS; - for (const editor of this.#editorsToRescale) { - editor.onScaleChanging(); - } - } - onRotationChanging({ - pagesRotation - }) { - this.commitOrRemove(); - this.viewParameters.rotation = pagesRotation; - } - addToAnnotationStorage(editor) { - if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { - this.#annotationStorage.setValue(editor.id, editor); - } - } - #addKeyboardManager() { - this.#container.addEventListener("keydown", this.#boundKeydown); - } - #removeKeyboardManager() { - this.#container.removeEventListener("keydown", this.#boundKeydown); - } - #addCopyPasteListeners() { - document.addEventListener("copy", this.#boundCopy); - document.addEventListener("cut", this.#boundCut); - document.addEventListener("paste", this.#boundPaste); - } - #removeCopyPasteListeners() { - document.removeEventListener("copy", this.#boundCopy); - document.removeEventListener("cut", this.#boundCut); - document.removeEventListener("paste", this.#boundPaste); - } - copy(event) { - event.preventDefault(); - if (this.#activeEditor) { - this.#activeEditor.commitOrRemove(); - } - if (!this.hasSelection) { - return; - } - const editors = []; - for (const editor of this.#selectedEditors) { - if (!editor.isEmpty()) { - editors.push(editor.serialize()); - } - } - if (editors.length === 0) { - return; - } - event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); - } - cut(event) { - this.copy(event); - this.delete(); - } - paste(event) { - event.preventDefault(); - let data = event.clipboardData.getData("application/pdfjs"); - if (!data) { - return; - } - try { - data = JSON.parse(data); - } catch (ex) { - (0, _util.warn)(`paste: "${ex.message}".`); - return; - } - if (!Array.isArray(data)) { - return; - } - this.unselectAll(); - const layer = this.#allLayers.get(this.#currentPageIndex); - try { - const newEditors = []; - for (const editor of data) { - const deserializedEditor = layer.deserialize(editor); - if (!deserializedEditor) { - return; - } - newEditors.push(deserializedEditor); - } - const cmd = () => { - for (const editor of newEditors) { - this.#addEditorToLayer(editor); - } - this.#selectEditors(newEditors); - }; - const undo = () => { - for (const editor of newEditors) { - editor.remove(); - } - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); - } catch (ex) { - (0, _util.warn)(`paste: "${ex.message}".`); - } - } - keydown(event) { - if (!this.getActive()?.shouldGetKeyboardEvents()) { - AnnotationEditorUIManager._keyboardManager.exec(this, event); - } - } - onEditingAction(details) { - if (["undo", "redo", "delete", "selectAll"].includes(details.name)) { - this[details.name](); - } - } - #dispatchUpdateStates(details) { - const hasChanged = Object.entries(details).some(([key, value]) => this.#previousStates[key] !== value); - if (hasChanged) { - this.#eventBus.dispatch("annotationeditorstateschanged", { - source: this, - details: Object.assign(this.#previousStates, details) - }); - } - } - #dispatchUpdateUI(details) { - this.#eventBus.dispatch("annotationeditorparamschanged", { - source: this, - details - }); - } - setEditingState(isEditing) { - if (isEditing) { - this.#addKeyboardManager(); - this.#addCopyPasteListeners(); - this.#dispatchUpdateStates({ - isEditing: this.#mode !== _util.AnnotationEditorType.NONE, - isEmpty: this.#isEmpty(), - hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), - hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), - hasSelectedEditor: false - }); - } else { - this.#removeKeyboardManager(); - this.#removeCopyPasteListeners(); - this.#dispatchUpdateStates({ - isEditing: false - }); - } - } - registerEditorTypes(types) { - if (this.#editorTypes) { - return; - } - this.#editorTypes = types; - for (const editorType of this.#editorTypes) { - this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); - } - } - getId() { - return this.#idManager.getId(); - } - get currentLayer() { - return this.#allLayers.get(this.#currentPageIndex); - } - get currentPageIndex() { - return this.#currentPageIndex; - } - addLayer(layer) { - this.#allLayers.set(layer.pageIndex, layer); - if (this.#isEnabled) { - layer.enable(); - } else { - layer.disable(); - } - } - removeLayer(layer) { - this.#allLayers.delete(layer.pageIndex); - } - updateMode(mode) { - this.#mode = mode; - if (mode === _util.AnnotationEditorType.NONE) { - this.setEditingState(false); - this.#disableAll(); - } else { - this.setEditingState(true); - this.#enableAll(); - for (const layer of this.#allLayers.values()) { - layer.updateMode(mode); - } - } - } - updateToolbar(mode) { - if (mode === this.#mode) { - return; - } - this.#eventBus.dispatch("switchannotationeditormode", { - source: this, - mode - }); - } - updateParams(type, value) { - if (!this.#editorTypes) { - return; - } - for (const editor of this.#selectedEditors) { - editor.updateParams(type, value); - } - for (const editorType of this.#editorTypes) { - editorType.updateDefaultParams(type, value); - } - } - #enableAll() { - if (!this.#isEnabled) { - this.#isEnabled = true; - for (const layer of this.#allLayers.values()) { - layer.enable(); - } - } - } - #disableAll() { - this.unselectAll(); - if (this.#isEnabled) { - this.#isEnabled = false; - for (const layer of this.#allLayers.values()) { - layer.disable(); - } - } - } - getEditors(pageIndex) { - const editors = []; - for (const editor of this.#allEditors.values()) { - if (editor.pageIndex === pageIndex) { - editors.push(editor); - } - } - return editors; - } - getEditor(id) { - return this.#allEditors.get(id); - } - addEditor(editor) { - this.#allEditors.set(editor.id, editor); - } - removeEditor(editor) { - this.#allEditors.delete(editor.id); - this.unselect(editor); - this.#annotationStorage?.remove(editor.id); - } - #addEditorToLayer(editor) { - const layer = this.#allLayers.get(editor.pageIndex); - if (layer) { - layer.addOrRebuild(editor); - } else { - this.addEditor(editor); - } - } - setActiveEditor(editor) { - if (this.#activeEditor === editor) { - return; - } - this.#activeEditor = editor; - if (editor) { - this.#dispatchUpdateUI(editor.propertiesToUpdate); - } - } - toggleSelected(editor) { - if (this.#selectedEditors.has(editor)) { - this.#selectedEditors.delete(editor); - editor.unselect(); - this.#dispatchUpdateStates({ - hasSelectedEditor: this.hasSelection - }); - return; - } - this.#selectedEditors.add(editor); - editor.select(); - this.#dispatchUpdateUI(editor.propertiesToUpdate); - this.#dispatchUpdateStates({ - hasSelectedEditor: true - }); - } - setSelected(editor) { - for (const ed of this.#selectedEditors) { - if (ed !== editor) { - ed.unselect(); - } - } - this.#selectedEditors.clear(); - this.#selectedEditors.add(editor); - editor.select(); - this.#dispatchUpdateUI(editor.propertiesToUpdate); - this.#dispatchUpdateStates({ - hasSelectedEditor: true - }); - } - isSelected(editor) { - return this.#selectedEditors.has(editor); - } - unselect(editor) { - editor.unselect(); - this.#selectedEditors.delete(editor); - this.#dispatchUpdateStates({ - hasSelectedEditor: this.hasSelection - }); - } - get hasSelection() { - return this.#selectedEditors.size !== 0; - } - undo() { - this.#commandManager.undo(); - this.#dispatchUpdateStates({ - hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), - hasSomethingToRedo: true, - isEmpty: this.#isEmpty() - }); - } - redo() { - this.#commandManager.redo(); - this.#dispatchUpdateStates({ - hasSomethingToUndo: true, - hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), - isEmpty: this.#isEmpty() - }); - } - addCommands(params) { - this.#commandManager.add(params); - this.#dispatchUpdateStates({ - hasSomethingToUndo: true, - hasSomethingToRedo: false, - isEmpty: this.#isEmpty() - }); - } - #isEmpty() { - if (this.#allEditors.size === 0) { - return true; - } - if (this.#allEditors.size === 1) { - for (const editor of this.#allEditors.values()) { - return editor.isEmpty(); - } - } - return false; - } - delete() { - this.commitOrRemove(); - if (!this.hasSelection) { - return; - } - const editors = [...this.#selectedEditors]; - const cmd = () => { - for (const editor of editors) { - editor.remove(); - } - }; - const undo = () => { - for (const editor of editors) { - this.#addEditorToLayer(editor); - } - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); - } - commitOrRemove() { - this.#activeEditor?.commitOrRemove(); - } - #selectEditors(editors) { - this.#selectedEditors.clear(); - for (const editor of editors) { - if (editor.isEmpty()) { - continue; - } - this.#selectedEditors.add(editor); - editor.select(); - } - this.#dispatchUpdateStates({ - hasSelectedEditor: true - }); - } - selectAll() { - for (const editor of this.#selectedEditors) { - editor.commit(); - } - this.#selectEditors(this.#allEditors.values()); - } - unselectAll() { - if (this.#activeEditor) { - this.#activeEditor.commitOrRemove(); - return; - } - if (this.#selectedEditors.size === 0) { - return; - } - for (const editor of this.#selectedEditors) { - editor.unselect(); - } - this.#selectedEditors.clear(); - this.#dispatchUpdateStates({ - hasSelectedEditor: false - }); - } - isActive(editor) { - return this.#activeEditor === editor; - } - getActive() { - return this.#activeEditor; - } - getMode() { - return this.#mode; - } -} -exports.AnnotationEditorUIManager = AnnotationEditorUIManager; - -/***/ }), -/* 6 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StatTimer = exports.RenderingCancelledException = exports.PixelsPerInch = exports.PageViewport = exports.PDFDateString = exports.DOMStandardFontDataFactory = exports.DOMSVGFactory = exports.DOMCanvasFactory = exports.DOMCMapReaderFactory = exports.AnnotationPrefix = void 0; -exports.deprecated = deprecated; -exports.getColorValues = getColorValues; -exports.getCurrentTransform = getCurrentTransform; -exports.getCurrentTransformInverse = getCurrentTransformInverse; -exports.getFilenameFromUrl = getFilenameFromUrl; -exports.getPdfFilenameFromUrl = getPdfFilenameFromUrl; -exports.getRGB = getRGB; -exports.getXfaPageViewport = getXfaPageViewport; -exports.isDataScheme = isDataScheme; -exports.isPdfFile = isPdfFile; -exports.isValidFetchUrl = isValidFetchUrl; -exports.loadScript = loadScript; -exports.setLayerDimensions = setLayerDimensions; -var _base_factory = __w_pdfjs_require__(7); -var _util = __w_pdfjs_require__(1); -const SVG_NS = "http://www.w3.org/2000/svg"; -const AnnotationPrefix = "pdfjs_internal_id_"; -exports.AnnotationPrefix = AnnotationPrefix; -class PixelsPerInch { - static CSS = 96.0; - static PDF = 72.0; - static PDF_TO_CSS_UNITS = this.CSS / this.PDF; -} -exports.PixelsPerInch = PixelsPerInch; -class DOMCanvasFactory extends _base_factory.BaseCanvasFactory { - constructor({ - ownerDocument = globalThis.document - } = {}) { - super(); - this._document = ownerDocument; - } - _createCanvas(width, height) { - const canvas = this._document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - return canvas; - } -} -exports.DOMCanvasFactory = DOMCanvasFactory; -async function fetchData(url, asTypedArray = false) { - if (isValidFetchUrl(url, document.baseURI)) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(response.statusText); - } - return asTypedArray ? new Uint8Array(await response.arrayBuffer()) : (0, _util.stringToBytes)(await response.text()); - } - return new Promise((resolve, reject) => { - const request = new XMLHttpRequest(); - request.open("GET", url, true); - if (asTypedArray) { - request.responseType = "arraybuffer"; - } - request.onreadystatechange = () => { - if (request.readyState !== XMLHttpRequest.DONE) { - return; - } - if (request.status === 200 || request.status === 0) { - let data; - if (asTypedArray && request.response) { - data = new Uint8Array(request.response); - } else if (!asTypedArray && request.responseText) { - data = (0, _util.stringToBytes)(request.responseText); - } - if (data) { - resolve(data); - return; - } - } - reject(new Error(request.statusText)); - }; - request.send(null); - }); -} -class DOMCMapReaderFactory extends _base_factory.BaseCMapReaderFactory { - _fetchData(url, compressionType) { - return fetchData(url, this.isCompressed).then(data => { - return { - cMapData: data, - compressionType - }; - }); - } -} -exports.DOMCMapReaderFactory = DOMCMapReaderFactory; -class DOMStandardFontDataFactory extends _base_factory.BaseStandardFontDataFactory { - _fetchData(url) { - return fetchData(url, true); - } -} -exports.DOMStandardFontDataFactory = DOMStandardFontDataFactory; -class DOMSVGFactory extends _base_factory.BaseSVGFactory { - _createSVG(type) { - return document.createElementNS(SVG_NS, type); - } -} -exports.DOMSVGFactory = DOMSVGFactory; -class PageViewport { - constructor({ - viewBox, - scale, - rotation, - offsetX = 0, - offsetY = 0, - dontFlip = false - }) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - const centerX = (viewBox[2] + viewBox[0]) / 2; - const centerY = (viewBox[3] + viewBox[1]) / 2; - let rotateA, rotateB, rotateC, rotateD; - rotation %= 360; - if (rotation < 0) { - rotation += 360; - } - switch (rotation) { - case 180: - rotateA = -1; - rotateB = 0; - rotateC = 0; - rotateD = 1; - break; - case 90: - rotateA = 0; - rotateB = 1; - rotateC = 1; - rotateD = 0; - break; - case 270: - rotateA = 0; - rotateB = -1; - rotateC = -1; - rotateD = 0; - break; - case 0: - rotateA = 1; - rotateB = 0; - rotateC = 0; - rotateD = -1; - break; - default: - throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees."); - } - if (dontFlip) { - rotateC = -rotateC; - rotateD = -rotateD; - } - let offsetCanvasX, offsetCanvasY; - let width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = (viewBox[3] - viewBox[1]) * scale; - height = (viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = (viewBox[2] - viewBox[0]) * scale; - height = (viewBox[3] - viewBox[1]) * scale; - } - this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY]; - this.width = width; - this.height = height; - } - get rawDims() { - const { - viewBox - } = this; - return (0, _util.shadow)(this, "rawDims", { - pageWidth: viewBox[2] - viewBox[0], - pageHeight: viewBox[3] - viewBox[1], - pageX: viewBox[0], - pageY: viewBox[1] - }); - } - clone({ - scale = this.scale, - rotation = this.rotation, - offsetX = this.offsetX, - offsetY = this.offsetY, - dontFlip = false - } = {}) { - return new PageViewport({ - viewBox: this.viewBox.slice(), - scale, - rotation, - offsetX, - offsetY, - dontFlip - }); - } - convertToViewportPoint(x, y) { - return _util.Util.applyTransform([x, y], this.transform); - } - convertToViewportRectangle(rect) { - const topLeft = _util.Util.applyTransform([rect[0], rect[1]], this.transform); - const bottomRight = _util.Util.applyTransform([rect[2], rect[3]], this.transform); - return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; - } - convertToPdfPoint(x, y) { - return _util.Util.applyInverseTransform([x, y], this.transform); - } -} -exports.PageViewport = PageViewport; -class RenderingCancelledException extends _util.BaseException { - constructor(msg, type, extraDelay = 0) { - super(msg, "RenderingCancelledException"); - this.type = type; - this.extraDelay = extraDelay; - } -} -exports.RenderingCancelledException = RenderingCancelledException; -function isDataScheme(url) { - const ii = url.length; - let i = 0; - while (i < ii && url[i].trim() === "") { - i++; - } - return url.substring(i, i + 5).toLowerCase() === "data:"; -} -function isPdfFile(filename) { - return typeof filename === "string" && /\.pdf$/i.test(filename); -} -function getFilenameFromUrl(url, onlyStripPath = false) { - if (!onlyStripPath) { - [url] = url.split(/[#?]/, 1); - } - return url.substring(url.lastIndexOf("/") + 1); -} -function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") { - if (typeof url !== "string") { - return defaultFilename; - } - if (isDataScheme(url)) { - (0, _util.warn)('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); - return defaultFilename; - } - const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; - const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; - const splitURI = reURI.exec(url); - let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); - if (suggestedFilename) { - suggestedFilename = suggestedFilename[0]; - if (suggestedFilename.includes("%")) { - try { - suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; - } catch (ex) {} - } - } - return suggestedFilename || defaultFilename; -} -class StatTimer { - started = Object.create(null); - times = []; - time(name) { - if (name in this.started) { - (0, _util.warn)(`Timer is already running for ${name}`); - } - this.started[name] = Date.now(); - } - timeEnd(name) { - if (!(name in this.started)) { - (0, _util.warn)(`Timer has not been started for ${name}`); - } - this.times.push({ - name, - start: this.started[name], - end: Date.now() - }); - delete this.started[name]; - } - toString() { - const outBuf = []; - let longest = 0; - for (const { - name - } of this.times) { - longest = Math.max(name.length, longest); - } - for (const { - name, - start, - end - } of this.times) { - outBuf.push(`${name.padEnd(longest)} ${end - start}ms\n`); - } - return outBuf.join(""); - } -} -exports.StatTimer = StatTimer; -function isValidFetchUrl(url, baseUrl) { - try { - const { - protocol - } = baseUrl ? new URL(url, baseUrl) : new URL(url); - return protocol === "http:" || protocol === "https:"; - } catch (ex) { - return false; - } -} -function loadScript(src, removeScriptElement = false) { - return new Promise((resolve, reject) => { - const script = document.createElement("script"); - script.src = src; - script.onload = function (evt) { - if (removeScriptElement) { - script.remove(); - } - resolve(evt); - }; - script.onerror = function () { - reject(new Error(`Cannot load script at: ${script.src}`)); - }; - (document.head || document.documentElement).append(script); - }); -} -function deprecated(details) { - console.log("Deprecated API usage: " + details); -} -let pdfDateStringRegex; -class PDFDateString { - static toDateObject(input) { - if (!input || typeof input !== "string") { - return null; - } - if (!pdfDateStringRegex) { - pdfDateStringRegex = new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); - } - const matches = pdfDateStringRegex.exec(input); - if (!matches) { - return null; - } - const year = parseInt(matches[1], 10); - let month = parseInt(matches[2], 10); - month = month >= 1 && month <= 12 ? month - 1 : 0; - let day = parseInt(matches[3], 10); - day = day >= 1 && day <= 31 ? day : 1; - let hour = parseInt(matches[4], 10); - hour = hour >= 0 && hour <= 23 ? hour : 0; - let minute = parseInt(matches[5], 10); - minute = minute >= 0 && minute <= 59 ? minute : 0; - let second = parseInt(matches[6], 10); - second = second >= 0 && second <= 59 ? second : 0; - const universalTimeRelation = matches[7] || "Z"; - let offsetHour = parseInt(matches[8], 10); - offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0; - let offsetMinute = parseInt(matches[9], 10) || 0; - offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0; - if (universalTimeRelation === "-") { - hour += offsetHour; - minute += offsetMinute; - } else if (universalTimeRelation === "+") { - hour -= offsetHour; - minute -= offsetMinute; - } - return new Date(Date.UTC(year, month, day, hour, minute, second)); - } -} -exports.PDFDateString = PDFDateString; -function getXfaPageViewport(xfaPage, { - scale = 1, - rotation = 0 -}) { - const { - width, - height - } = xfaPage.attributes.style; - const viewBox = [0, 0, parseInt(width), parseInt(height)]; - return new PageViewport({ - viewBox, - scale, - rotation - }); -} -function getRGB(color) { - if (color.startsWith("#")) { - const colorRGB = parseInt(color.slice(1), 16); - return [(colorRGB & 0xff0000) >> 16, (colorRGB & 0x00ff00) >> 8, colorRGB & 0x0000ff]; - } - if (color.startsWith("rgb(")) { - return color.slice(4, -1).split(",").map(x => parseInt(x)); - } - if (color.startsWith("rgba(")) { - return color.slice(5, -1).split(",").map(x => parseInt(x)).slice(0, 3); - } - (0, _util.warn)(`Not a valid color format: "${color}"`); - return [0, 0, 0]; -} -function getColorValues(colors) { - const span = document.createElement("span"); - span.style.visibility = "hidden"; - document.body.append(span); - for (const name of colors.keys()) { - span.style.color = name; - const computedColor = window.getComputedStyle(span).color; - colors.set(name, getRGB(computedColor)); - } - span.remove(); -} -function getCurrentTransform(ctx) { - const { - a, - b, - c, - d, - e, - f - } = ctx.getTransform(); - return [a, b, c, d, e, f]; -} -function getCurrentTransformInverse(ctx) { - const { - a, - b, - c, - d, - e, - f - } = ctx.getTransform().invertSelf(); - return [a, b, c, d, e, f]; -} -function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) { - if (viewport instanceof PageViewport) { - const { - pageWidth, - pageHeight - } = viewport.rawDims; - const { - style - } = div; - const widthStr = `calc(var(--scale-factor) * ${pageWidth}px)`; - const heightStr = `calc(var(--scale-factor) * ${pageHeight}px)`; - if (!mustFlip || viewport.rotation % 180 === 0) { - style.width = widthStr; - style.height = heightStr; - } else { - style.width = heightStr; - style.height = widthStr; - } - } - if (mustRotate) { - div.setAttribute("data-main-rotation", viewport.rotation); - } -} - -/***/ }), -/* 7 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.BaseStandardFontDataFactory = exports.BaseSVGFactory = exports.BaseCanvasFactory = exports.BaseCMapReaderFactory = void 0; -var _util = __w_pdfjs_require__(1); -class BaseCanvasFactory { - constructor() { - if (this.constructor === BaseCanvasFactory) { - (0, _util.unreachable)("Cannot initialize BaseCanvasFactory."); - } - } - create(width, height) { - if (width <= 0 || height <= 0) { - throw new Error("Invalid canvas size"); - } - const canvas = this._createCanvas(width, height); - return { - canvas, - context: canvas.getContext("2d") - }; - } - reset(canvasAndContext, width, height) { - if (!canvasAndContext.canvas) { - throw new Error("Canvas is not specified"); - } - if (width <= 0 || height <= 0) { - throw new Error("Invalid canvas size"); - } - canvasAndContext.canvas.width = width; - canvasAndContext.canvas.height = height; - } - destroy(canvasAndContext) { - if (!canvasAndContext.canvas) { - throw new Error("Canvas is not specified"); - } - canvasAndContext.canvas.width = 0; - canvasAndContext.canvas.height = 0; - canvasAndContext.canvas = null; - canvasAndContext.context = null; - } - _createCanvas(width, height) { - (0, _util.unreachable)("Abstract method `_createCanvas` called."); - } -} -exports.BaseCanvasFactory = BaseCanvasFactory; -class BaseCMapReaderFactory { - constructor({ - baseUrl = null, - isCompressed = false - }) { - if (this.constructor === BaseCMapReaderFactory) { - (0, _util.unreachable)("Cannot initialize BaseCMapReaderFactory."); - } - this.baseUrl = baseUrl; - this.isCompressed = isCompressed; - } - async fetch({ - name - }) { - if (!this.baseUrl) { - throw new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'); - } - if (!name) { - throw new Error("CMap name must be specified."); - } - const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : ""); - const compressionType = this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE; - return this._fetchData(url, compressionType).catch(reason => { - throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); - }); - } - _fetchData(url, compressionType) { - (0, _util.unreachable)("Abstract method `_fetchData` called."); - } -} -exports.BaseCMapReaderFactory = BaseCMapReaderFactory; -class BaseStandardFontDataFactory { - constructor({ - baseUrl = null - }) { - if (this.constructor === BaseStandardFontDataFactory) { - (0, _util.unreachable)("Cannot initialize BaseStandardFontDataFactory."); - } - this.baseUrl = baseUrl; - } - async fetch({ - filename - }) { - if (!this.baseUrl) { - throw new Error('The standard font "baseUrl" parameter must be specified, ensure that ' + 'the "standardFontDataUrl" API parameter is provided.'); - } - if (!filename) { - throw new Error("Font filename must be specified."); - } - const url = `${this.baseUrl}${filename}`; - return this._fetchData(url).catch(reason => { - throw new Error(`Unable to load font data at: ${url}`); - }); - } - _fetchData(url) { - (0, _util.unreachable)("Abstract method `_fetchData` called."); - } -} -exports.BaseStandardFontDataFactory = BaseStandardFontDataFactory; -class BaseSVGFactory { - constructor() { - if (this.constructor === BaseSVGFactory) { - (0, _util.unreachable)("Cannot initialize BaseSVGFactory."); - } - } - create(width, height, skipDimensions = false) { - if (width <= 0 || height <= 0) { - throw new Error("Invalid SVG dimensions"); - } - const svg = this._createSVG("svg:svg"); - svg.setAttribute("version", "1.1"); - if (!skipDimensions) { - svg.setAttribute("width", `${width}px`); - svg.setAttribute("height", `${height}px`); - } - svg.setAttribute("preserveAspectRatio", "none"); - svg.setAttribute("viewBox", `0 0 ${width} ${height}`); - return svg; - } - createElement(type) { - if (typeof type !== "string") { - throw new Error("Invalid SVG element type"); - } - return this._createSVG(type); - } - _createSVG(type) { - (0, _util.unreachable)("Abstract method `_createSVG` called."); - } -} -exports.BaseSVGFactory = BaseSVGFactory; - -/***/ }), -/* 8 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.MurmurHash3_64 = void 0; -var _util = __w_pdfjs_require__(1); -const SEED = 0xc3d2e1f0; -const MASK_HIGH = 0xffff0000; -const MASK_LOW = 0xffff; -class MurmurHash3_64 { - constructor(seed) { - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - update(input) { - let data, length; - if (typeof input === "string") { - data = new Uint8Array(input.length * 2); - length = 0; - for (let i = 0, ii = input.length; i < ii; i++) { - const code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if ((0, _util.isArrayBuffer)(input)) { - data = input.slice(); - length = data.byteLength; - } else { - throw new Error("Wrong data format in MurmurHash3_64_update. " + "Input must be a string or array."); - } - const blockCounts = length >> 2; - const tailLength = length - blockCounts * 4; - const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); - let k1 = 0, - k2 = 0; - let h1 = this.h1, - h2 = this.h2; - const C1 = 0xcc9e2d51, - C2 = 0x1b873593; - const C1_LOW = C1 & MASK_LOW, - C2_LOW = C2 & MASK_LOW; - for (let i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; - k2 = k2 << 15 | k2 >>> 17; - k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - k1 = 0; - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - case 1: - k1 ^= data[blockCounts * 4]; - k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; - k1 = k1 << 15 | k1 >>> 17; - k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - this.h1 = h1; - this.h2 = h2; - } - hexdigest() { - let h1 = this.h1, - h2 = this.h2; - h1 ^= h2 >>> 1; - h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; - h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; - h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; - h1 ^= h2 >>> 1; - return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); - } -} -exports.MurmurHash3_64 = MurmurHash3_64; - -/***/ }), -/* 9 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.FontLoader = exports.FontFaceObject = void 0; -var _util = __w_pdfjs_require__(1); -var _is_node = __w_pdfjs_require__(10); -class FontLoader { - constructor({ - onUnsupportedFeature, - ownerDocument = globalThis.document, - styleElement = null - }) { - this._onUnsupportedFeature = onUnsupportedFeature; - this._document = ownerDocument; - this.nativeFontFaces = []; - this.styleElement = null; - this.loadingRequests = []; - this.loadTestFontId = 0; - } - addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.push(nativeFontFace); - this._document.fonts.add(nativeFontFace); - } - insertRule(rule) { - if (!this.styleElement) { - this.styleElement = this._document.createElement("style"); - this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement); - } - const styleSheet = this.styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); - } - clear() { - for (const nativeFontFace of this.nativeFontFaces) { - this._document.fonts.delete(nativeFontFace); - } - this.nativeFontFaces.length = 0; - if (this.styleElement) { - this.styleElement.remove(); - this.styleElement = null; - } - } - async bind(font) { - if (font.attached || font.missingFile) { - return; - } - font.attached = true; - if (this.isFontLoadingAPISupported) { - const nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - try { - await nativeFontFace.loaded; - } catch (ex) { - this._onUnsupportedFeature({ - featureId: _util.UNSUPPORTED_FEATURES.errorFontLoadNative - }); - (0, _util.warn)(`Failed to load font '${nativeFontFace.family}': '${ex}'.`); - font.disableFontFace = true; - throw ex; - } - } - return; - } - const rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - if (this.isSyncFontLoadingSupported) { - return; - } - await new Promise(resolve => { - const request = this._queueLoadingCallback(resolve); - this._prepareFontLoadEvent(font, request); - }); - } - } - get isFontLoadingAPISupported() { - const hasFonts = !!this._document?.fonts; - return (0, _util.shadow)(this, "isFontLoadingAPISupported", hasFonts); - } - get isSyncFontLoadingSupported() { - let supported = false; - if (_is_node.isNodeJS) { - supported = true; - } else if (typeof navigator !== "undefined" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) { - supported = true; - } - return (0, _util.shadow)(this, "isSyncFontLoadingSupported", supported); - } - _queueLoadingCallback(callback) { - function completeRequest() { - (0, _util.assert)(!request.done, "completeRequest() cannot be called twice."); - request.done = true; - while (loadingRequests.length > 0 && loadingRequests[0].done) { - const otherRequest = loadingRequests.shift(); - setTimeout(otherRequest.callback, 0); - } - } - const { - loadingRequests - } = this; - const request = { - done: false, - complete: completeRequest, - callback - }; - loadingRequests.push(request); - return request; - } - get _loadTestFont() { - const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA" + "FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA" + "ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA" + "AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1" + "AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD" + "6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM" + "AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D" + "IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA" + "AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA" + "AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB" + "AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY" + "AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA" + "AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA" + "AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC" + "AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3" + "Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj" + "FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="); - return (0, _util.shadow)(this, "_loadTestFont", testFont); - } - _prepareFontLoadEvent(font, request) { - function int32(data, offset) { - return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff; - } - function spliceString(s, offset, remove, insert) { - const chunk1 = s.substring(0, offset); - const chunk2 = s.substring(offset + remove); - return chunk1 + insert + chunk2; - } - let i, ii; - const canvas = this._document.createElement("canvas"); - canvas.width = 1; - canvas.height = 1; - const ctx = canvas.getContext("2d"); - let called = 0; - function isFontReady(name, callback) { - if (++called > 30) { - (0, _util.warn)("Load test font never loaded."); - callback(); - return; - } - ctx.font = "30px " + name; - ctx.fillText(".", 0, 20); - const imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); - } - const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`; - let data = this._loadTestFont; - const COMMENT_OFFSET = 976; - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId); - const CFF_CHECKSUM_OFFSET = 16; - const XXXX_VALUE = 0x58585858; - let checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0; - } - if (i < loadTestFontId.length) { - checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0; - } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum)); - const url = `url(data:font/opentype;base64,${btoa(data)});`; - const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`; - this.insertRule(rule); - const div = this._document.createElement("div"); - div.style.visibility = "hidden"; - div.style.width = div.style.height = "10px"; - div.style.position = "absolute"; - div.style.top = div.style.left = "0px"; - for (const name of [font.loadedName, loadTestFontId]) { - const span = this._document.createElement("span"); - span.textContent = "Hi"; - span.style.fontFamily = name; - div.append(span); - } - this._document.body.append(div); - isFontReady(loadTestFontId, () => { - div.remove(); - request.complete(); - }); - } -} -exports.FontLoader = FontLoader; -class FontFaceObject { - constructor(translatedData, { - isEvalSupported = true, - disableFontFace = false, - ignoreErrors = false, - onUnsupportedFeature, - fontRegistry = null - }) { - this.compiledGlyphs = Object.create(null); - for (const i in translatedData) { - this[i] = translatedData[i]; - } - this.isEvalSupported = isEvalSupported !== false; - this.disableFontFace = disableFontFace === true; - this.ignoreErrors = ignoreErrors === true; - this._onUnsupportedFeature = onUnsupportedFeature; - this.fontRegistry = fontRegistry; - } - createNativeFontFace() { - if (!this.data || this.disableFontFace) { - return null; - } - let nativeFontFace; - if (!this.cssFontInfo) { - nativeFontFace = new FontFace(this.loadedName, this.data, {}); - } else { - const css = { - weight: this.cssFontInfo.fontWeight - }; - if (this.cssFontInfo.italicAngle) { - css.style = `oblique ${this.cssFontInfo.italicAngle}deg`; - } - nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css); - } - this.fontRegistry?.registerFont(this); - return nativeFontFace; - } - createFontFaceRule() { - if (!this.data || this.disableFontFace) { - return null; - } - const data = (0, _util.bytesToString)(this.data); - const url = `url(data:${this.mimetype};base64,${btoa(data)});`; - let rule; - if (!this.cssFontInfo) { - rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`; - } else { - let css = `font-weight: ${this.cssFontInfo.fontWeight};`; - if (this.cssFontInfo.italicAngle) { - css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`; - } - rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`; - } - this.fontRegistry?.registerFont(this, url); - return rule; - } - getPathGenerator(objs, character) { - if (this.compiledGlyphs[character] !== undefined) { - return this.compiledGlyphs[character]; - } - let cmds; - try { - cmds = objs.get(this.loadedName + "_path_" + character); - } catch (ex) { - if (!this.ignoreErrors) { - throw ex; - } - this._onUnsupportedFeature({ - featureId: _util.UNSUPPORTED_FEATURES.errorFontGetPath - }); - (0, _util.warn)(`getPathGenerator - ignoring character: "${ex}".`); - return this.compiledGlyphs[character] = function (c, size) {}; - } - if (this.isEvalSupported && _util.FeatureTest.isEvalSupported) { - const jsBuf = []; - for (const current of cmds) { - const args = current.args !== undefined ? current.args.join(",") : ""; - jsBuf.push("c.", current.cmd, "(", args, ");\n"); - } - return this.compiledGlyphs[character] = new Function("c", "size", jsBuf.join("")); - } - return this.compiledGlyphs[character] = function (c, size) { - for (const current of cmds) { - if (current.cmd === "scale") { - current.args = [size, -size]; - } - c[current.cmd].apply(c, current.args); - } - }; - } -} -exports.FontFaceObject = FontFaceObject; - -/***/ }), -/* 10 */ -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isNodeJS = void 0; -const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); -exports.isNodeJS = isNodeJS; - -/***/ }), -/* 11 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.CanvasGraphics = void 0; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -var _pattern_helper = __w_pdfjs_require__(12); -var _image_utils = __w_pdfjs_require__(13); -const MIN_FONT_SIZE = 16; -const MAX_FONT_SIZE = 100; -const MAX_GROUP_SIZE = 4096; -const EXECUTION_TIME = 15; -const EXECUTION_STEPS = 10; -const MAX_SIZE_TO_COMPILE = 1000; -const FULL_CHUNK_HEIGHT = 16; -function mirrorContextOperations(ctx, destCtx) { - if (ctx._removeMirroring) { - throw new Error("Context is already forwarding operations."); - } - ctx.__originalSave = ctx.save; - ctx.__originalRestore = ctx.restore; - ctx.__originalRotate = ctx.rotate; - ctx.__originalScale = ctx.scale; - ctx.__originalTranslate = ctx.translate; - ctx.__originalTransform = ctx.transform; - ctx.__originalSetTransform = ctx.setTransform; - ctx.__originalResetTransform = ctx.resetTransform; - ctx.__originalClip = ctx.clip; - ctx.__originalMoveTo = ctx.moveTo; - ctx.__originalLineTo = ctx.lineTo; - ctx.__originalBezierCurveTo = ctx.bezierCurveTo; - ctx.__originalRect = ctx.rect; - ctx.__originalClosePath = ctx.closePath; - ctx.__originalBeginPath = ctx.beginPath; - ctx._removeMirroring = () => { - ctx.save = ctx.__originalSave; - ctx.restore = ctx.__originalRestore; - ctx.rotate = ctx.__originalRotate; - ctx.scale = ctx.__originalScale; - ctx.translate = ctx.__originalTranslate; - ctx.transform = ctx.__originalTransform; - ctx.setTransform = ctx.__originalSetTransform; - ctx.resetTransform = ctx.__originalResetTransform; - ctx.clip = ctx.__originalClip; - ctx.moveTo = ctx.__originalMoveTo; - ctx.lineTo = ctx.__originalLineTo; - ctx.bezierCurveTo = ctx.__originalBezierCurveTo; - ctx.rect = ctx.__originalRect; - ctx.closePath = ctx.__originalClosePath; - ctx.beginPath = ctx.__originalBeginPath; - delete ctx._removeMirroring; - }; - ctx.save = function ctxSave() { - destCtx.save(); - this.__originalSave(); - }; - ctx.restore = function ctxRestore() { - destCtx.restore(); - this.__originalRestore(); - }; - ctx.translate = function ctxTranslate(x, y) { - destCtx.translate(x, y); - this.__originalTranslate(x, y); - }; - ctx.scale = function ctxScale(x, y) { - destCtx.scale(x, y); - this.__originalScale(x, y); - }; - ctx.transform = function ctxTransform(a, b, c, d, e, f) { - destCtx.transform(a, b, c, d, e, f); - this.__originalTransform(a, b, c, d, e, f); - }; - ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { - destCtx.setTransform(a, b, c, d, e, f); - this.__originalSetTransform(a, b, c, d, e, f); - }; - ctx.resetTransform = function ctxResetTransform() { - destCtx.resetTransform(); - this.__originalResetTransform(); - }; - ctx.rotate = function ctxRotate(angle) { - destCtx.rotate(angle); - this.__originalRotate(angle); - }; - ctx.clip = function ctxRotate(rule) { - destCtx.clip(rule); - this.__originalClip(rule); - }; - ctx.moveTo = function (x, y) { - destCtx.moveTo(x, y); - this.__originalMoveTo(x, y); - }; - ctx.lineTo = function (x, y) { - destCtx.lineTo(x, y); - this.__originalLineTo(x, y); - }; - ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) { - destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); - this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y); - }; - ctx.rect = function (x, y, width, height) { - destCtx.rect(x, y, width, height); - this.__originalRect(x, y, width, height); - }; - ctx.closePath = function () { - destCtx.closePath(); - this.__originalClosePath(); - }; - ctx.beginPath = function () { - destCtx.beginPath(); - this.__originalBeginPath(); - }; -} -class CachedCanvases { - constructor(canvasFactory) { - this.canvasFactory = canvasFactory; - this.cache = Object.create(null); - } - getCanvas(id, width, height) { - let canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - this.canvasFactory.reset(canvasEntry, width, height); - } else { - canvasEntry = this.canvasFactory.create(width, height); - this.cache[id] = canvasEntry; - } - return canvasEntry; - } - delete(id) { - delete this.cache[id]; - } - clear() { - for (const id in this.cache) { - const canvasEntry = this.cache[id]; - this.canvasFactory.destroy(canvasEntry); - delete this.cache[id]; - } - } -} -function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) { - const [a, b, c, d, tx, ty] = (0, _display_utils.getCurrentTransform)(ctx); - if (b === 0 && c === 0) { - const tlX = destX * a + tx; - const rTlX = Math.round(tlX); - const tlY = destY * d + ty; - const rTlY = Math.round(tlY); - const brX = (destX + destW) * a + tx; - const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; - const brY = (destY + destH) * d + ty; - const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; - ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY); - ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight); - ctx.setTransform(a, b, c, d, tx, ty); - return [rWidth, rHeight]; - } - if (a === 0 && d === 0) { - const tlX = destY * c + tx; - const rTlX = Math.round(tlX); - const tlY = destX * b + ty; - const rTlY = Math.round(tlY); - const brX = (destY + destH) * c + tx; - const rWidth = Math.abs(Math.round(brX) - rTlX) || 1; - const brY = (destX + destW) * b + ty; - const rHeight = Math.abs(Math.round(brY) - rTlY) || 1; - ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY); - ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth); - ctx.setTransform(a, b, c, d, tx, ty); - return [rHeight, rWidth]; - } - ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH); - const scaleX = Math.hypot(a, b); - const scaleY = Math.hypot(c, d); - return [scaleX * destW, scaleY * destH]; -} -function compileType3Glyph(imgData) { - const { - width, - height - } = imgData; - if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) { - return null; - } - const POINT_TO_PROCESS_LIMIT = 1000; - const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); - const width1 = width + 1; - let points = new Uint8Array(width1 * (height + 1)); - let i, j, j0; - const lineSize = width + 7 & ~7; - let data = new Uint8Array(lineSize * height), - pos = 0; - for (const elem of imgData.data) { - let mask = 128; - while (mask > 0) { - data[pos++] = elem & mask ? 0 : 255; - mask >>= 1; - } - } - let count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - j0 = i * width1; - if (data[pos - lineSize] !== data[pos]) { - points[j0] = data[pos] ? 1 : 8; - ++count; - } - let sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); - for (j = 1; j < width; j++) { - sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j0 + j] = 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); - const path = new Path2D(); - for (i = 0; count && i <= height; i++) { - let p = i * width1; - const end = p + width; - while (p < end && !points[p]) { - p++; - } - if (p === end) { - continue; - } - path.moveTo(p % width1, i); - const p0 = p; - let type = points[p]; - do { - const step = steps[type]; - do { - p += step; - } while (!points[p]); - const pp = points[p]; - if (pp !== 5 && pp !== 10) { - type = pp; - points[p] = 0; - } else { - type = pp & 0x33 * type >> 4; - points[p] &= type >> 2 | type << 2; - } - path.lineTo(p % width1, p / width1 | 0); - if (!points[p]) { - --count; - } - } while (p0 !== p); - --i; - } - data = null; - points = null; - const drawOutline = function (c) { - c.save(); - c.scale(1 / width, -1 / height); - c.translate(0, -height); - c.fill(path); - c.beginPath(); - c.restore(); - }; - return drawOutline; -} -class CanvasExtraState { - constructor(width, height) { - this.alphaIsShape = false; - this.fontSize = 0; - this.fontSizeScale = 1; - this.textMatrix = _util.IDENTITY_MATRIX; - this.textMatrixScale = 1; - this.fontMatrix = _util.FONT_IDENTITY_MATRIX; - this.leading = 0; - this.x = 0; - this.y = 0; - this.lineX = 0; - this.lineY = 0; - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRenderingMode = _util.TextRenderingMode.FILL; - this.textRise = 0; - this.fillColor = "#000000"; - this.strokeColor = "#000000"; - this.patternFill = false; - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; - this.transferMaps = null; - this.startNewPathAndClipBox([0, 0, width, height]); - } - clone() { - const clone = Object.create(this); - clone.clipBox = this.clipBox.slice(); - return clone; - } - setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - updatePathMinMax(transform, x, y) { - [x, y] = _util.Util.applyTransform([x, y], transform); - this.minX = Math.min(this.minX, x); - this.minY = Math.min(this.minY, y); - this.maxX = Math.max(this.maxX, x); - this.maxY = Math.max(this.maxY, y); - } - updateRectMinMax(transform, rect) { - const p1 = _util.Util.applyTransform(rect, transform); - const p2 = _util.Util.applyTransform(rect.slice(2), transform); - this.minX = Math.min(this.minX, p1[0], p2[0]); - this.minY = Math.min(this.minY, p1[1], p2[1]); - this.maxX = Math.max(this.maxX, p1[0], p2[0]); - this.maxY = Math.max(this.maxY, p1[1], p2[1]); - } - updateScalingPathMinMax(transform, minMax) { - _util.Util.scaleMinMax(transform, minMax); - this.minX = Math.min(this.minX, minMax[0]); - this.maxX = Math.max(this.maxX, minMax[1]); - this.minY = Math.min(this.minY, minMax[2]); - this.maxY = Math.max(this.maxY, minMax[3]); - } - updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) { - const box = _util.Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3); - if (minMax) { - minMax[0] = Math.min(minMax[0], box[0], box[2]); - minMax[1] = Math.max(minMax[1], box[0], box[2]); - minMax[2] = Math.min(minMax[2], box[1], box[3]); - minMax[3] = Math.max(minMax[3], box[1], box[3]); - return; - } - this.updateRectMinMax(transform, box); - } - getPathBoundingBox(pathType = _pattern_helper.PathType.FILL, transform = null) { - const box = [this.minX, this.minY, this.maxX, this.maxY]; - if (pathType === _pattern_helper.PathType.STROKE) { - if (!transform) { - (0, _util.unreachable)("Stroke bounding box must include transform."); - } - const scale = _util.Util.singularValueDecompose2dScale(transform); - const xStrokePad = scale[0] * this.lineWidth / 2; - const yStrokePad = scale[1] * this.lineWidth / 2; - box[0] -= xStrokePad; - box[1] -= yStrokePad; - box[2] += xStrokePad; - box[3] += yStrokePad; - } - return box; - } - updateClipFromPath() { - const intersect = _util.Util.intersect(this.clipBox, this.getPathBoundingBox()); - this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); - } - isEmptyClip() { - return this.minX === Infinity; - } - startNewPathAndClipBox(box) { - this.clipBox = box; - this.minX = Infinity; - this.minY = Infinity; - this.maxX = 0; - this.maxY = 0; - } - getClippedPathBoundingBox(pathType = _pattern_helper.PathType.FILL, transform = null) { - return _util.Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); - } -} -function putBinaryImageData(ctx, imgData, transferMaps = null) { - if (typeof ImageData !== "undefined" && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - const height = imgData.height, - width = imgData.width; - const partialChunkHeight = height % FULL_CHUNK_HEIGHT; - const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - let srcPos = 0, - destPos; - const src = imgData.data; - const dest = chunkImgData.data; - let i, j, thisChunkHeight, elemsInThisChunk; - let transferMapRed, transferMapGreen, transferMapBlue, transferMapGray; - if (transferMaps) { - switch (transferMaps.length) { - case 1: - transferMapRed = transferMaps[0]; - transferMapGreen = transferMaps[0]; - transferMapBlue = transferMaps[0]; - transferMapGray = transferMaps[0]; - break; - case 4: - transferMapRed = transferMaps[0]; - transferMapGreen = transferMaps[1]; - transferMapBlue = transferMaps[2]; - transferMapGray = transferMaps[3]; - break; - } - } - if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) { - const srcLength = src.byteLength; - const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2); - const dest32DataLength = dest32.length; - const fullSrcDiff = width + 7 >> 3; - let white = 0xffffffff; - let black = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - if (transferMapGray) { - if (transferMapGray[0] === 0xff && transferMapGray[0xff] === 0) { - [white, black] = [black, white]; - } - } - for (i = 0; i < totalChunks; i++) { - thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - const srcDiff = srcLength - srcPos; - let k = 0; - const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7; - const kEndUnrolled = kEnd & ~7; - let mask = 0; - let srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = srcByte & 128 ? white : black; - dest32[destPos++] = srcByte & 64 ? white : black; - dest32[destPos++] = srcByte & 32 ? white : black; - dest32[destPos++] = srcByte & 16 ? white : black; - dest32[destPos++] = srcByte & 8 ? white : black; - dest32[destPos++] = srcByte & 4 ? white : black; - dest32[destPos++] = srcByte & 2 ? white : black; - dest32[destPos++] = srcByte & 1 ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - dest32[destPos++] = srcByte & mask ? white : black; - mask >>= 1; - } - } - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) { - const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; - for (i = 0; i < fullChunks; i++) { - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - srcPos += elemsInThisChunk; - if (hasTransferMaps) { - for (let k = 0; k < elemsInThisChunk; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } - ctx.putImageData(chunkImgData, 0, j); - j += FULL_CHUNK_HEIGHT; - } - if (i < totalChunks) { - elemsInThisChunk = width * partialChunkHeight * 4; - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - if (hasTransferMaps) { - for (let k = 0; k < elemsInThisChunk; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } - ctx.putImageData(chunkImgData, 0, j); - } - } else if (imgData.kind === _util.ImageKind.RGB_24BPP) { - const hasTransferMaps = !!(transferMapRed || transferMapGreen || transferMapBlue); - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; - for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } - if (hasTransferMaps) { - for (let k = 0; k < destPos; k += 4) { - if (transferMapRed) { - dest[k + 0] = transferMapRed[dest[k + 0]]; - } - if (transferMapGreen) { - dest[k + 1] = transferMapGreen[dest[k + 1]]; - } - if (transferMapBlue) { - dest[k + 2] = transferMapBlue[dest[k + 2]]; - } - } - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else { - throw new Error(`bad image kind: ${imgData.kind}`); - } -} -function putBinaryImageMask(ctx, imgData) { - if (imgData.bitmap) { - ctx.drawImage(imgData.bitmap, 0, 0); - return; - } - const height = imgData.height, - width = imgData.width; - const partialChunkHeight = height % FULL_CHUNK_HEIGHT; - const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - let srcPos = 0; - const src = imgData.data; - const dest = chunkImgData.data; - for (let i = 0; i < totalChunks; i++) { - const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight; - ({ - srcPos - } = (0, _image_utils.applyMaskImageData)({ - src, - srcPos, - dest, - width, - height: thisChunkHeight - })); - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } -} -function copyCtxState(sourceCtx, destCtx) { - const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font"]; - for (const property of properties) { - if (sourceCtx[property] !== undefined) { - destCtx[property] = sourceCtx[property]; - } - } - if (sourceCtx.setLineDash !== undefined) { - destCtx.setLineDash(sourceCtx.getLineDash()); - destCtx.lineDashOffset = sourceCtx.lineDashOffset; - } -} -function resetCtxToDefault(ctx, foregroundColor) { - ctx.strokeStyle = ctx.fillStyle = foregroundColor || "#000000"; - ctx.fillRule = "nonzero"; - ctx.globalAlpha = 1; - ctx.lineWidth = 1; - ctx.lineCap = "butt"; - ctx.lineJoin = "miter"; - ctx.miterLimit = 10; - ctx.globalCompositeOperation = "source-over"; - ctx.font = "10px sans-serif"; - if (ctx.setLineDash !== undefined) { - ctx.setLineDash([]); - ctx.lineDashOffset = 0; - } -} -function composeSMaskBackdrop(bytes, r0, g0, b0) { - const length = bytes.length; - for (let i = 3; i < length; i += 4) { - const alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - const alpha_ = 255 - alpha; - bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8; - bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8; - bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8; - } - } -} -function composeSMaskAlpha(maskData, layerData, transferMap) { - const length = maskData.length; - const scale = 1 / 255; - for (let i = 3; i < length; i += 4) { - const alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = layerData[i] * alpha * scale | 0; - } -} -function composeSMaskLuminosity(maskData, layerData, transferMap) { - const length = maskData.length; - for (let i = 3; i < length; i += 4) { - const y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28; - layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16; - } -} -function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { - const hasBackdrop = !!backdrop; - const r0 = hasBackdrop ? backdrop[0] : 0; - const g0 = hasBackdrop ? backdrop[1] : 0; - const b0 = hasBackdrop ? backdrop[2] : 0; - let composeFn; - if (subtype === "Luminosity") { - composeFn = composeSMaskLuminosity; - } else { - composeFn = composeSMaskAlpha; - } - const PIXELS_TO_PROCESS = 1048576; - const chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (let row = 0; row < height; row += chunkSize) { - const chunkHeight = Math.min(chunkSize, height - row); - const maskData = maskCtx.getImageData(layerOffsetX - maskOffsetX, row + (layerOffsetY - maskOffsetY), width, chunkHeight); - const layerData = layerCtx.getImageData(layerOffsetX, row + layerOffsetY, width, chunkHeight); - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - layerCtx.putImageData(layerData, layerOffsetX, row + layerOffsetY); - } -} -function composeSMask(ctx, smask, layerCtx, layerBox) { - const layerOffsetX = layerBox[0]; - const layerOffsetY = layerBox[1]; - const layerWidth = layerBox[2] - layerOffsetX; - const layerHeight = layerBox[3] - layerOffsetY; - if (layerWidth === 0 || layerHeight === 0) { - return; - } - genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY); - ctx.save(); - ctx.globalAlpha = 1; - ctx.globalCompositeOperation = "source-over"; - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(layerCtx.canvas, 0, 0); - ctx.restore(); -} -function getImageSmoothingEnabled(transform, interpolate) { - const scale = _util.Util.singularValueDecompose2dScale(transform); - scale[0] = Math.fround(scale[0]); - scale[1] = Math.fround(scale[1]); - const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * _display_utils.PixelsPerInch.PDF_TO_CSS_UNITS); - if (interpolate !== undefined) { - return interpolate; - } else if (scale[0] <= actualScale || scale[1] <= actualScale) { - return true; - } - return false; -} -const LINE_CAP_STYLES = ["butt", "round", "square"]; -const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; -const NORMAL_CLIP = {}; -const EO_CLIP = {}; -class CanvasGraphics { - constructor(canvasCtx, commonObjs, objs, canvasFactory, { - optionalContentConfig, - markedContentStack = null - }, annotationCanvasMap, pageColors) { - this.ctx = canvasCtx; - this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); - this.stateStack = []; - this.pendingClip = null; - this.pendingEOFill = false; - this.res = null; - this.xobjs = null; - this.commonObjs = commonObjs; - this.objs = objs; - this.canvasFactory = canvasFactory; - this.groupStack = []; - this.processingType3 = null; - this.baseTransform = null; - this.baseTransformStack = []; - this.groupLevel = 0; - this.smaskStack = []; - this.smaskCounter = 0; - this.tempSMask = null; - this.suspendedCtx = null; - this.contentVisible = true; - this.markedContentStack = markedContentStack || []; - this.optionalContentConfig = optionalContentConfig; - this.cachedCanvases = new CachedCanvases(this.canvasFactory); - this.cachedPatterns = new Map(); - this.annotationCanvasMap = annotationCanvasMap; - this.viewportScale = 1; - this.outputScaleX = 1; - this.outputScaleY = 1; - this.backgroundColor = pageColors?.background || null; - this.foregroundColor = pageColors?.foreground || null; - this._cachedScaleForStroking = null; - this._cachedGetSinglePixelWidth = null; - this._cachedBitmapsMap = new Map(); - } - getObject(data, fallback = null) { - if (typeof data === "string") { - return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); - } - return fallback; - } - beginDrawing({ - transform, - viewport, - transparency = false, - background = null - }) { - const width = this.ctx.canvas.width; - const height = this.ctx.canvas.height; - const defaultBackgroundColor = background || "#ffffff"; - this.ctx.save(); - if (this.foregroundColor && this.backgroundColor) { - this.ctx.fillStyle = this.foregroundColor; - const fg = this.foregroundColor = this.ctx.fillStyle; - this.ctx.fillStyle = this.backgroundColor; - const bg = this.backgroundColor = this.ctx.fillStyle; - let isValidDefaultBg = true; - let defaultBg = defaultBackgroundColor; - this.ctx.fillStyle = defaultBackgroundColor; - defaultBg = this.ctx.fillStyle; - isValidDefaultBg = typeof defaultBg === "string" && /^#[0-9A-Fa-f]{6}$/.test(defaultBg); - if (fg === "#000000" && bg === "#ffffff" || fg === bg || !isValidDefaultBg) { - this.foregroundColor = this.backgroundColor = null; - } else { - const [rB, gB, bB] = (0, _display_utils.getRGB)(defaultBg); - const newComp = x => { - x /= 255; - return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; - }; - const lumB = Math.round(0.2126 * newComp(rB) + 0.7152 * newComp(gB) + 0.0722 * newComp(bB)); - this.selectColor = (r, g, b) => { - const lumC = 0.2126 * newComp(r) + 0.7152 * newComp(g) + 0.0722 * newComp(b); - return Math.round(lumC) === lumB ? bg : fg; - }; - } - } - this.ctx.fillStyle = this.backgroundColor || defaultBackgroundColor; - this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); - if (transparency) { - const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height); - this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; - this.ctx.save(); - this.ctx.transform(...(0, _display_utils.getCurrentTransform)(this.compositeCtx)); - } - this.ctx.save(); - resetCtxToDefault(this.ctx, this.foregroundColor); - if (transform) { - this.ctx.transform(...transform); - this.outputScaleX = transform[0]; - this.outputScaleY = transform[0]; - } - this.ctx.transform(...viewport.transform); - this.viewportScale = viewport.scale; - this.baseTransform = (0, _display_utils.getCurrentTransform)(this.ctx); - } - executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) { - const argsArray = operatorList.argsArray; - const fnArray = operatorList.fnArray; - let i = executionStartIdx || 0; - const argsArrayLen = argsArray.length; - if (argsArrayLen === i) { - return i; - } - const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function"; - const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - let steps = 0; - const commonObjs = this.commonObjs; - const objs = this.objs; - let fnId; - while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - fnId = fnArray[i]; - if (fnId !== _util.OPS.dependency) { - this[fnId].apply(this, argsArray[i]); - } else { - for (const depObjId of argsArray[i]) { - const objsPool = depObjId.startsWith("g_") ? commonObjs : objs; - if (!objsPool.has(depObjId)) { - objsPool.get(depObjId, continueCallback); - return i; - } - } - } - i++; - if (i === argsArrayLen) { - return i; - } - if (chunkOperations && ++steps > EXECUTION_STEPS) { - if (Date.now() > endTime) { - continueCallback(); - return i; - } - steps = 0; - } - } - } - #restoreInitialState() { - while (this.stateStack.length || this.inSMaskMode) { - this.restore(); - } - this.ctx.restore(); - if (this.transparentCanvas) { - this.ctx = this.compositeCtx; - this.ctx.save(); - this.ctx.setTransform(1, 0, 0, 1, 0, 0); - this.ctx.drawImage(this.transparentCanvas, 0, 0); - this.ctx.restore(); - this.transparentCanvas = null; - } - } - endDrawing() { - this.#restoreInitialState(); - this.cachedCanvases.clear(); - this.cachedPatterns.clear(); - for (const cache of this._cachedBitmapsMap.values()) { - for (const canvas of cache.values()) { - if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) { - canvas.width = canvas.height = 0; - } - } - cache.clear(); - } - this._cachedBitmapsMap.clear(); - } - _scaleImage(img, inverseTransform) { - const width = img.width; - const height = img.height; - let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1); - let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1); - let paintWidth = width, - paintHeight = height; - let tmpCanvasId = "prescale1"; - let tmpCanvas, tmpCtx; - while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) { - let newWidth = paintWidth, - newHeight = paintHeight; - if (widthScale > 2 && paintWidth > 1) { - newWidth = Math.ceil(paintWidth / 2); - widthScale /= paintWidth / newWidth; - } - if (heightScale > 2 && paintHeight > 1) { - newHeight = Math.ceil(paintHeight / 2); - heightScale /= paintHeight / newHeight; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight); - img = tmpCanvas.canvas; - paintWidth = newWidth; - paintHeight = newHeight; - tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1"; - } - return { - img, - paintWidth, - paintHeight - }; - } - _createMaskCanvas(img) { - const ctx = this.ctx; - const { - width, - height - } = img; - const fillColor = this.current.fillColor; - const isPatternFill = this.current.patternFill; - const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); - let cache, cacheKey, scaled, maskCanvas; - if ((img.bitmap || img.data) && img.count > 1) { - const mainKey = img.bitmap || img.data.buffer; - cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]); - cache = this._cachedBitmapsMap.get(mainKey); - if (!cache) { - cache = new Map(); - this._cachedBitmapsMap.set(mainKey, cache); - } - const cachedImage = cache.get(cacheKey); - if (cachedImage && !isPatternFill) { - const offsetX = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]); - const offsetY = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]); - return { - canvas: cachedImage, - offsetX, - offsetY - }; - } - scaled = cachedImage; - } - if (!scaled) { - maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); - putBinaryImageMask(maskCanvas.context, img); - } - let maskToCanvas = _util.Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); - maskToCanvas = _util.Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); - const cord1 = _util.Util.applyTransform([0, 0], maskToCanvas); - const cord2 = _util.Util.applyTransform([width, height], maskToCanvas); - const rect = _util.Util.normalizeRect([cord1[0], cord1[1], cord2[0], cord2[1]]); - const drawnWidth = Math.round(rect[2] - rect[0]) || 1; - const drawnHeight = Math.round(rect[3] - rect[1]) || 1; - const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); - const fillCtx = fillCanvas.context; - const offsetX = Math.min(cord1[0], cord2[0]); - const offsetY = Math.min(cord1[1], cord2[1]); - fillCtx.translate(-offsetX, -offsetY); - fillCtx.transform(...maskToCanvas); - if (!scaled) { - scaled = this._scaleImage(maskCanvas.canvas, (0, _display_utils.getCurrentTransformInverse)(fillCtx)); - scaled = scaled.img; - if (cache && isPatternFill) { - cache.set(cacheKey, scaled); - } - } - fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled((0, _display_utils.getCurrentTransform)(fillCtx), img.interpolate); - drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); - fillCtx.globalCompositeOperation = "source-in"; - const inverse = _util.Util.transform((0, _display_utils.getCurrentTransformInverse)(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); - fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, _pattern_helper.PathType.FILL) : fillColor; - fillCtx.fillRect(0, 0, width, height); - if (cache && !isPatternFill) { - this.cachedCanvases.delete("fillCanvas"); - cache.set(cacheKey, fillCanvas.canvas); - } - return { - canvas: fillCanvas.canvas, - offsetX: Math.round(offsetX), - offsetY: Math.round(offsetY) - }; - } - setLineWidth(width) { - if (width !== this.current.lineWidth) { - this._cachedScaleForStroking = null; - } - this.current.lineWidth = width; - this.ctx.lineWidth = width; - } - setLineCap(style) { - this.ctx.lineCap = LINE_CAP_STYLES[style]; - } - setLineJoin(style) { - this.ctx.lineJoin = LINE_JOIN_STYLES[style]; - } - setMiterLimit(limit) { - this.ctx.miterLimit = limit; - } - setDash(dashArray, dashPhase) { - const ctx = this.ctx; - if (ctx.setLineDash !== undefined) { - ctx.setLineDash(dashArray); - ctx.lineDashOffset = dashPhase; - } - } - setRenderingIntent(intent) {} - setFlatness(flatness) {} - setGState(states) { - for (const [key, value] of states) { - switch (key) { - case "LW": - this.setLineWidth(value); - break; - case "LC": - this.setLineCap(value); - break; - case "LJ": - this.setLineJoin(value); - break; - case "ML": - this.setMiterLimit(value); - break; - case "D": - this.setDash(value[0], value[1]); - break; - case "RI": - this.setRenderingIntent(value); - break; - case "FL": - this.setFlatness(value); - break; - case "Font": - this.setFont(value[0], value[1]); - break; - case "CA": - this.current.strokeAlpha = value; - break; - case "ca": - this.current.fillAlpha = value; - this.ctx.globalAlpha = value; - break; - case "BM": - this.ctx.globalCompositeOperation = value; - break; - case "SMask": - this.current.activeSMask = value ? this.tempSMask : null; - this.tempSMask = null; - this.checkSMaskState(); - break; - case "TR": - this.current.transferMaps = value; - } - } - } - get inSMaskMode() { - return !!this.suspendedCtx; - } - checkSMaskState() { - const inSMaskMode = this.inSMaskMode; - if (this.current.activeSMask && !inSMaskMode) { - this.beginSMaskMode(); - } else if (!this.current.activeSMask && inSMaskMode) { - this.endSMaskMode(); - } - } - beginSMaskMode() { - if (this.inSMaskMode) { - throw new Error("beginSMaskMode called while already in smask mode"); - } - const drawnWidth = this.ctx.canvas.width; - const drawnHeight = this.ctx.canvas.height; - const cacheId = "smaskGroupAt" + this.groupLevel; - const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); - this.suspendedCtx = this.ctx; - this.ctx = scratchCanvas.context; - const ctx = this.ctx; - ctx.setTransform(...(0, _display_utils.getCurrentTransform)(this.suspendedCtx)); - copyCtxState(this.suspendedCtx, ctx); - mirrorContextOperations(ctx, this.suspendedCtx); - this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); - } - endSMaskMode() { - if (!this.inSMaskMode) { - throw new Error("endSMaskMode called while not in smask mode"); - } - this.ctx._removeMirroring(); - copyCtxState(this.ctx, this.suspendedCtx); - this.ctx = this.suspendedCtx; - this.suspendedCtx = null; - } - compose(dirtyBox) { - if (!this.current.activeSMask) { - return; - } - if (!dirtyBox) { - dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height]; - } else { - dirtyBox[0] = Math.floor(dirtyBox[0]); - dirtyBox[1] = Math.floor(dirtyBox[1]); - dirtyBox[2] = Math.ceil(dirtyBox[2]); - dirtyBox[3] = Math.ceil(dirtyBox[3]); - } - const smask = this.current.activeSMask; - const suspendedCtx = this.suspendedCtx; - composeSMask(suspendedCtx, smask, this.ctx, dirtyBox); - this.ctx.save(); - this.ctx.setTransform(1, 0, 0, 1, 0, 0); - this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); - this.ctx.restore(); - } - save() { - if (this.inSMaskMode) { - copyCtxState(this.ctx, this.suspendedCtx); - this.suspendedCtx.save(); - } else { - this.ctx.save(); - } - const old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - } - restore() { - if (this.stateStack.length === 0 && this.inSMaskMode) { - this.endSMaskMode(); - } - if (this.stateStack.length !== 0) { - this.current = this.stateStack.pop(); - if (this.inSMaskMode) { - this.suspendedCtx.restore(); - copyCtxState(this.suspendedCtx, this.ctx); - } else { - this.ctx.restore(); - } - this.checkSMaskState(); - this.pendingClip = null; - this._cachedScaleForStroking = null; - this._cachedGetSinglePixelWidth = null; - } - } - transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - this._cachedScaleForStroking = null; - this._cachedGetSinglePixelWidth = null; - } - constructPath(ops, args, minMax) { - const ctx = this.ctx; - const current = this.current; - let x = current.x, - y = current.y; - let startX, startY; - const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); - const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0; - const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null; - for (let i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case _util.OPS.rectangle: - x = args[j++]; - y = args[j++]; - const width = args[j++]; - const height = args[j++]; - const xw = x + width; - const yh = y + height; - ctx.moveTo(x, y); - if (width === 0 || height === 0) { - ctx.lineTo(xw, yh); - } else { - ctx.lineTo(xw, y); - ctx.lineTo(xw, yh); - ctx.lineTo(x, yh); - } - if (!isScalingMatrix) { - current.updateRectMinMax(currentTransform, [x, y, xw, yh]); - } - ctx.closePath(); - break; - case _util.OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - if (!isScalingMatrix) { - current.updatePathMinMax(currentTransform, x, y); - } - break; - case _util.OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - if (!isScalingMatrix) { - current.updatePathMinMax(currentTransform, x, y); - } - break; - case _util.OPS.curveTo: - startX = x; - startY = y; - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y); - current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier); - j += 6; - break; - case _util.OPS.curveTo2: - startX = x; - startY = y; - ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]); - current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case _util.OPS.curveTo3: - startX = x; - startY = y; - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier); - j += 4; - break; - case _util.OPS.closePath: - ctx.closePath(); - break; - } - } - if (isScalingMatrix) { - current.updateScalingPathMinMax(currentTransform, minMaxForBezier); - } - current.setCurrentPoint(x, y); - } - closePath() { - this.ctx.closePath(); - } - stroke(consumePath = true) { - const ctx = this.ctx; - const strokeColor = this.current.strokeColor; - ctx.globalAlpha = this.current.strokeAlpha; - if (this.contentVisible) { - if (typeof strokeColor === "object" && strokeColor?.getPattern) { - ctx.save(); - ctx.strokeStyle = strokeColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.STROKE); - this.rescaleAndStroke(false); - ctx.restore(); - } else { - this.rescaleAndStroke(true); - } - } - if (consumePath) { - this.consumePath(this.current.getClippedPathBoundingBox()); - } - ctx.globalAlpha = this.current.fillAlpha; - } - closeStroke() { - this.closePath(); - this.stroke(); - } - fill(consumePath = true) { - const ctx = this.ctx; - const fillColor = this.current.fillColor; - const isPatternFill = this.current.patternFill; - let needRestore = false; - if (isPatternFill) { - ctx.save(); - ctx.fillStyle = fillColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL); - needRestore = true; - } - const intersect = this.current.getClippedPathBoundingBox(); - if (this.contentVisible && intersect !== null) { - if (this.pendingEOFill) { - ctx.fill("evenodd"); - this.pendingEOFill = false; - } else { - ctx.fill(); - } - } - if (needRestore) { - ctx.restore(); - } - if (consumePath) { - this.consumePath(intersect); - } - } - eoFill() { - this.pendingEOFill = true; - this.fill(); - } - fillStroke() { - this.fill(false); - this.stroke(false); - this.consumePath(); - } - eoFillStroke() { - this.pendingEOFill = true; - this.fillStroke(); - } - closeFillStroke() { - this.closePath(); - this.fillStroke(); - } - closeEOFillStroke() { - this.pendingEOFill = true; - this.closePath(); - this.fillStroke(); - } - endPath() { - this.consumePath(); - } - clip() { - this.pendingClip = NORMAL_CLIP; - } - eoClip() { - this.pendingClip = EO_CLIP; - } - beginText() { - this.current.textMatrix = _util.IDENTITY_MATRIX; - this.current.textMatrixScale = 1; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - } - endText() { - const paths = this.pendingTextPaths; - const ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; - } - ctx.save(); - ctx.beginPath(); - for (const path of paths) { - ctx.setTransform(...path.transform); - ctx.translate(path.x, path.y); - path.addToPath(ctx, path.fontSize); - } - ctx.restore(); - ctx.clip(); - ctx.beginPath(); - delete this.pendingTextPaths; - } - setCharSpacing(spacing) { - this.current.charSpacing = spacing; - } - setWordSpacing(spacing) { - this.current.wordSpacing = spacing; - } - setHScale(scale) { - this.current.textHScale = scale / 100; - } - setLeading(leading) { - this.current.leading = -leading; - } - setFont(fontRefName, size) { - const fontObj = this.commonObjs.get(fontRefName); - const current = this.current; - if (!fontObj) { - throw new Error(`Can't find font for ${fontRefName}`); - } - current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; - if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { - (0, _util.warn)("Invalid font matrix for font " + fontRefName); - } - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - this.current.font = fontObj; - this.current.fontSize = size; - if (fontObj.isType3Font) { - return; - } - const name = fontObj.loadedName || "sans-serif"; - let bold = "normal"; - if (fontObj.black) { - bold = "900"; - } else if (fontObj.bold) { - bold = "bold"; - } - const italic = fontObj.italic ? "italic" : "normal"; - const typeface = `"${name}", ${fontObj.fallbackName}`; - let browserFontSize = size; - if (size < MIN_FONT_SIZE) { - browserFontSize = MIN_FONT_SIZE; - } else if (size > MAX_FONT_SIZE) { - browserFontSize = MAX_FONT_SIZE; - } - this.current.fontSizeScale = size / browserFontSize; - this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`; - } - setTextRenderingMode(mode) { - this.current.textRenderingMode = mode; - } - setTextRise(rise) { - this.current.textRise = rise; - } - moveText(x, y) { - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - } - setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - } - setTextMatrix(a, b, c, d, e, f) { - this.current.textMatrix = [a, b, c, d, e, f]; - this.current.textMatrixScale = Math.hypot(a, b); - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - } - nextLine() { - this.moveText(0, this.current.leading); - } - paintChar(character, x, y, patternTransform) { - const ctx = this.ctx; - const current = this.current; - const font = current.font; - const textRenderingMode = current.textRenderingMode; - const fontSize = current.fontSize / current.fontSizeScale; - const fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; - const isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG); - const patternFill = current.patternFill && !font.missingFile; - let addToPath; - if (font.disableFontFace || isAddToPathSet || patternFill) { - addToPath = font.getPathGenerator(this.commonObjs, character); - } - if (font.disableFontFace || patternFill) { - ctx.save(); - ctx.translate(x, y); - ctx.beginPath(); - addToPath(ctx, fontSize); - if (patternTransform) { - ctx.setTransform(...patternTransform); - } - if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - ctx.fill(); - } - if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - ctx.stroke(); - } - ctx.restore(); - } else { - if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - ctx.fillText(character, x, y); - } - if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - ctx.strokeText(character, x, y); - } - } - if (isAddToPathSet) { - const paths = this.pendingTextPaths || (this.pendingTextPaths = []); - paths.push({ - transform: (0, _display_utils.getCurrentTransform)(ctx), - x, - y, - fontSize, - addToPath - }); - } - } - get isFontSubpixelAAEnabled() { - const { - context: ctx - } = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10); - ctx.scale(1.5, 1); - ctx.fillText("I", 0, 10); - const data = ctx.getImageData(0, 0, 10, 10).data; - let enabled = false; - for (let i = 3; i < data.length; i += 4) { - if (data[i] > 0 && data[i] < 255) { - enabled = true; - break; - } - } - return (0, _util.shadow)(this, "isFontSubpixelAAEnabled", enabled); - } - showText(glyphs) { - const current = this.current; - const font = current.font; - if (font.isType3Font) { - return this.showType3Text(glyphs); - } - const fontSize = current.fontSize; - if (fontSize === 0) { - return undefined; - } - const ctx = this.ctx; - const fontSizeScale = current.fontSizeScale; - const charSpacing = current.charSpacing; - const wordSpacing = current.wordSpacing; - const fontDirection = current.fontDirection; - const textHScale = current.textHScale * fontDirection; - const glyphsLength = glyphs.length; - const vertical = font.vertical; - const spacingDir = vertical ? 1 : -1; - const defaultVMetrics = font.defaultVMetrics; - const widthAdvanceScale = fontSize * current.fontMatrix[0]; - const simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; - ctx.save(); - ctx.transform(...current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - if (fontDirection > 0) { - ctx.scale(textHScale, -1); - } else { - ctx.scale(textHScale, 1); - } - let patternTransform; - if (current.patternFill) { - ctx.save(); - const pattern = current.fillColor.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL); - patternTransform = (0, _display_utils.getCurrentTransform)(ctx); - ctx.restore(); - ctx.fillStyle = pattern; - } - let lineWidth = current.lineWidth; - const scale = current.textMatrixScale; - if (scale === 0 || lineWidth === 0) { - const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - lineWidth = this.getSinglePixelWidth(); - } - } else { - lineWidth /= scale; - } - if (fontSizeScale !== 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - ctx.lineWidth = lineWidth; - if (font.isInvalidPDFjsFont) { - const chars = []; - let width = 0; - for (const glyph of glyphs) { - chars.push(glyph.unicode); - width += glyph.width; - } - ctx.fillText(chars.join(""), 0, 0); - current.x += width * widthAdvanceScale * textHScale; - ctx.restore(); - this.compose(); - return undefined; - } - let x = 0, - i; - for (i = 0; i < glyphsLength; ++i) { - const glyph = glyphs[i]; - if (typeof glyph === "number") { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - let restoreNeeded = false; - const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - const character = glyph.fontChar; - const accent = glyph.accent; - let scaledX, scaledY; - let width = glyph.width; - if (vertical) { - const vmetric = glyph.vmetric || defaultVMetrics; - const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale; - const vy = vmetric[2] * widthAdvanceScale; - width = vmetric ? -vmetric[0] : width; - scaledX = vx / fontSizeScale; - scaledY = (x + vy) / fontSizeScale; - } else { - scaledX = x / fontSizeScale; - scaledY = 0; - } - if (font.remeasure && width > 0) { - const measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale; - if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - const characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - } else if (width !== measuredWidth) { - scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale; - } - } - if (this.contentVisible && (glyph.isInFont || font.missingFile)) { - if (simpleFillText && !accent) { - ctx.fillText(character, scaledX, scaledY); - } else { - this.paintChar(character, scaledX, scaledY, patternTransform); - if (accent) { - const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; - const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform); - } - } - } - let charWidth; - if (vertical) { - charWidth = width * widthAdvanceScale - spacing * fontDirection; - } else { - charWidth = width * widthAdvanceScale + spacing * fontDirection; - } - x += charWidth; - if (restoreNeeded) { - ctx.restore(); - } - } - if (vertical) { - current.y -= x; - } else { - current.x += x * textHScale; - } - ctx.restore(); - this.compose(); - return undefined; - } - showType3Text(glyphs) { - const ctx = this.ctx; - const current = this.current; - const font = current.font; - const fontSize = current.fontSize; - const fontDirection = current.fontDirection; - const spacingDir = font.vertical ? 1 : -1; - const charSpacing = current.charSpacing; - const wordSpacing = current.wordSpacing; - const textHScale = current.textHScale * fontDirection; - const fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX; - const glyphsLength = glyphs.length; - const isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE; - let i, glyph, width, spacingLength; - if (isTextInvisible || fontSize === 0) { - return; - } - this._cachedScaleForStroking = null; - this._cachedGetSinglePixelWidth = null; - ctx.save(); - ctx.transform(...current.textMatrix); - ctx.translate(current.x, current.y); - ctx.scale(textHScale, fontDirection); - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (typeof glyph === "number") { - spacingLength = spacingDir * glyph * fontSize / 1000; - this.ctx.translate(spacingLength, 0); - current.x += spacingLength * textHScale; - continue; - } - const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - const operatorList = font.charProcOperatorList[glyph.operatorListId]; - if (!operatorList) { - (0, _util.warn)(`Type3 character "${glyph.operatorListId}" is not available.`); - continue; - } - if (this.contentVisible) { - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform(...fontMatrix); - this.executeOperatorList(operatorList); - this.restore(); - } - const transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; - ctx.translate(width, 0); - current.x += width * textHScale; - } - ctx.restore(); - this.processingType3 = null; - } - setCharWidth(xWidth, yWidth) {} - setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) { - this.ctx.rect(llx, lly, urx - llx, ury - lly); - this.ctx.clip(); - this.endPath(); - } - getColorN_Pattern(IR) { - let pattern; - if (IR[0] === "TilingPattern") { - const color = IR[1]; - const baseTransform = this.baseTransform || (0, _display_utils.getCurrentTransform)(this.ctx); - const canvasGraphicsFactory = { - createCanvasGraphics: ctx => { - return new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, { - optionalContentConfig: this.optionalContentConfig, - markedContentStack: this.markedContentStack - }); - } - }; - pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform); - } else { - pattern = this._getPattern(IR[1], IR[2]); - } - return pattern; - } - setStrokeColorN() { - this.current.strokeColor = this.getColorN_Pattern(arguments); - } - setFillColorN() { - this.current.fillColor = this.getColorN_Pattern(arguments); - this.current.patternFill = true; - } - setStrokeRGBColor(r, g, b) { - const color = this.selectColor?.(r, g, b) || _util.Util.makeHexColor(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - } - setFillRGBColor(r, g, b) { - const color = this.selectColor?.(r, g, b) || _util.Util.makeHexColor(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - this.current.patternFill = false; - } - _getPattern(objId, matrix = null) { - let pattern; - if (this.cachedPatterns.has(objId)) { - pattern = this.cachedPatterns.get(objId); - } else { - pattern = (0, _pattern_helper.getShadingPattern)(this.objs.get(objId)); - this.cachedPatterns.set(objId, pattern); - } - if (matrix) { - pattern.matrix = matrix; - } - return pattern; - } - shadingFill(objId) { - if (!this.contentVisible) { - return; - } - const ctx = this.ctx; - this.save(); - const pattern = this._getPattern(objId); - ctx.fillStyle = pattern.getPattern(ctx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.SHADING); - const inv = (0, _display_utils.getCurrentTransformInverse)(ctx); - if (inv) { - const canvas = ctx.canvas; - const width = canvas.width; - const height = canvas.height; - const bl = _util.Util.applyTransform([0, 0], inv); - const br = _util.Util.applyTransform([0, height], inv); - const ul = _util.Util.applyTransform([width, 0], inv); - const ur = _util.Util.applyTransform([width, height], inv); - const x0 = Math.min(bl[0], br[0], ul[0], ur[0]); - const y0 = Math.min(bl[1], br[1], ul[1], ur[1]); - const x1 = Math.max(bl[0], br[0], ul[0], ur[0]); - const y1 = Math.max(bl[1], br[1], ul[1], ur[1]); - this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); - } else { - this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); - } - this.compose(this.current.getClippedPathBoundingBox()); - this.restore(); - } - beginInlineImage() { - (0, _util.unreachable)("Should not call beginInlineImage"); - } - beginImageData() { - (0, _util.unreachable)("Should not call beginImageData"); - } - paintFormXObjectBegin(matrix, bbox) { - if (!this.contentVisible) { - return; - } - this.save(); - this.baseTransformStack.push(this.baseTransform); - if (Array.isArray(matrix) && matrix.length === 6) { - this.transform(...matrix); - } - this.baseTransform = (0, _display_utils.getCurrentTransform)(this.ctx); - if (bbox) { - const width = bbox[2] - bbox[0]; - const height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.current.updateRectMinMax((0, _display_utils.getCurrentTransform)(this.ctx), bbox); - this.clip(); - this.endPath(); - } - } - paintFormXObjectEnd() { - if (!this.contentVisible) { - return; - } - this.restore(); - this.baseTransform = this.baseTransformStack.pop(); - } - beginGroup(group) { - if (!this.contentVisible) { - return; - } - this.save(); - if (this.inSMaskMode) { - this.endSMaskMode(); - this.current.activeSMask = null; - } - const currentCtx = this.ctx; - if (!group.isolated) { - (0, _util.info)("TODO: Support non-isolated groups."); - } - if (group.knockout) { - (0, _util.warn)("Knockout groups not supported."); - } - const currentTransform = (0, _display_utils.getCurrentTransform)(currentCtx); - if (group.matrix) { - currentCtx.transform(...group.matrix); - } - if (!group.bbox) { - throw new Error("Bounding box is required."); - } - let bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, (0, _display_utils.getCurrentTransform)(currentCtx)); - const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; - bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - const offsetX = Math.floor(bounds[0]); - const offsetY = Math.floor(bounds[1]); - let drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - let drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - let scaleX = 1, - scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } - this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]); - let cacheId = "groupAt" + this.groupLevel; - if (group.smask) { - cacheId += "_smask_" + this.smaskCounter++ % 2; - } - const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight); - const groupCtx = scratchCanvas.context; - groupCtx.scale(1 / scaleX, 1 / scaleY); - groupCtx.translate(-offsetX, -offsetY); - groupCtx.transform(...currentTransform); - if (group.smask) { - this.smaskStack.push({ - canvas: scratchCanvas.canvas, - context: groupCtx, - offsetX, - offsetY, - scaleX, - scaleY, - subtype: group.smask.subtype, - backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null, - startTransformInverse: null - }); - } else { - currentCtx.setTransform(1, 0, 0, 1, 0, 0); - currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); - currentCtx.save(); - } - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]); - this.groupStack.push(currentCtx); - this.groupLevel++; - } - endGroup(group) { - if (!this.contentVisible) { - return; - } - this.groupLevel--; - const groupCtx = this.ctx; - const ctx = this.groupStack.pop(); - this.ctx = ctx; - this.ctx.imageSmoothingEnabled = false; - if (group.smask) { - this.tempSMask = this.smaskStack.pop(); - this.restore(); - } else { - this.ctx.restore(); - const currentMtx = (0, _display_utils.getCurrentTransform)(this.ctx); - this.restore(); - this.ctx.save(); - this.ctx.setTransform(...currentMtx); - const dirtyBox = _util.Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx); - this.ctx.drawImage(groupCtx.canvas, 0, 0); - this.ctx.restore(); - this.compose(dirtyBox); - } - } - beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) { - this.#restoreInitialState(); - resetCtxToDefault(this.ctx, this.foregroundColor); - this.ctx.save(); - this.save(); - if (this.baseTransform) { - this.ctx.setTransform(...this.baseTransform); - } - if (Array.isArray(rect) && rect.length === 4) { - const width = rect[2] - rect[0]; - const height = rect[3] - rect[1]; - if (hasOwnCanvas && this.annotationCanvasMap) { - transform = transform.slice(); - transform[4] -= rect[0]; - transform[5] -= rect[1]; - rect = rect.slice(); - rect[0] = rect[1] = 0; - rect[2] = width; - rect[3] = height; - const [scaleX, scaleY] = _util.Util.singularValueDecompose2dScale((0, _display_utils.getCurrentTransform)(this.ctx)); - const { - viewportScale - } = this; - const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale); - const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale); - this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight); - const { - canvas, - context - } = this.annotationCanvas; - this.annotationCanvasMap.set(id, canvas); - this.annotationCanvas.savedCtx = this.ctx; - this.ctx = context; - this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY); - resetCtxToDefault(this.ctx, this.foregroundColor); - } else { - resetCtxToDefault(this.ctx, this.foregroundColor); - this.ctx.rect(rect[0], rect[1], width, height); - this.ctx.clip(); - this.endPath(); - } - } - this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); - this.transform(...transform); - this.transform(...matrix); - } - endAnnotation() { - if (this.annotationCanvas) { - this.ctx = this.annotationCanvas.savedCtx; - delete this.annotationCanvas.savedCtx; - delete this.annotationCanvas; - } - } - paintImageMaskXObject(img) { - if (!this.contentVisible) { - return; - } - const count = img.count; - img = this.getObject(img.data, img); - img.count = count; - const ctx = this.ctx; - const glyph = this.processingType3; - if (glyph) { - if (glyph.compiled === undefined) { - glyph.compiled = compileType3Glyph(img); - } - if (glyph.compiled) { - glyph.compiled(ctx); - return; - } - } - const mask = this._createMaskCanvas(img); - const maskCanvas = mask.canvas; - ctx.save(); - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); - ctx.restore(); - this.compose(); - } - paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { - if (!this.contentVisible) { - return; - } - img = this.getObject(img.data, img); - const ctx = this.ctx; - ctx.save(); - const currentTransform = (0, _display_utils.getCurrentTransform)(ctx); - ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); - const mask = this._createMaskCanvas(img); - ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); - for (let i = 0, ii = positions.length; i < ii; i += 2) { - const trans = _util.Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); - const [x, y] = _util.Util.applyTransform([0, 0], trans); - ctx.drawImage(mask.canvas, x, y); - } - ctx.restore(); - this.compose(); - } - paintImageMaskXObjectGroup(images) { - if (!this.contentVisible) { - return; - } - const ctx = this.ctx; - const fillColor = this.current.fillColor; - const isPatternFill = this.current.patternFill; - for (const image of images) { - const { - data, - width, - height, - transform - } = image; - const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); - const maskCtx = maskCanvas.context; - maskCtx.save(); - const img = this.getObject(data, image); - putBinaryImageMask(maskCtx, img); - maskCtx.globalCompositeOperation = "source-in"; - maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, (0, _display_utils.getCurrentTransformInverse)(ctx), _pattern_helper.PathType.FILL) : fillColor; - maskCtx.fillRect(0, 0, width, height); - maskCtx.restore(); - ctx.save(); - ctx.transform(...transform); - ctx.scale(1, -1); - drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1); - ctx.restore(); - } - this.compose(); - } - paintImageXObject(objId) { - if (!this.contentVisible) { - return; - } - const imgData = this.getObject(objId); - if (!imgData) { - (0, _util.warn)("Dependent image isn't ready yet"); - return; - } - this.paintInlineImageXObject(imgData); - } - paintImageXObjectRepeat(objId, scaleX, scaleY, positions) { - if (!this.contentVisible) { - return; - } - const imgData = this.getObject(objId); - if (!imgData) { - (0, _util.warn)("Dependent image isn't ready yet"); - return; - } - const width = imgData.width; - const height = imgData.height; - const map = []; - for (let i = 0, ii = positions.length; i < ii; i += 2) { - map.push({ - transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]], - x: 0, - y: 0, - w: width, - h: height - }); - } - this.paintInlineImageXObjectGroup(imgData, map); - } - paintInlineImageXObject(imgData) { - if (!this.contentVisible) { - return; - } - const width = imgData.width; - const height = imgData.height; - const ctx = this.ctx; - this.save(); - ctx.scale(1 / width, -1 / height); - let imgToPaint; - if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); - const tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); - imgToPaint = tmpCanvas.canvas; - } - const scaled = this._scaleImage(imgToPaint, (0, _display_utils.getCurrentTransformInverse)(ctx)); - ctx.imageSmoothingEnabled = getImageSmoothingEnabled((0, _display_utils.getCurrentTransform)(ctx), imgData.interpolate); - drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); - this.compose(); - this.restore(); - } - paintInlineImageXObjectGroup(imgData, map) { - if (!this.contentVisible) { - return; - } - const ctx = this.ctx; - const w = imgData.width; - const h = imgData.height; - const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); - const tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData, this.current.transferMaps); - for (const entry of map) { - ctx.save(); - ctx.transform(...entry.transform); - ctx.scale(1, -1); - drawImageAtIntegerCoords(ctx, tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); - ctx.restore(); - } - this.compose(); - } - paintSolidColorImageMask() { - if (!this.contentVisible) { - return; - } - this.ctx.fillRect(0, 0, 1, 1); - this.compose(); - } - markPoint(tag) {} - markPointProps(tag, properties) {} - beginMarkedContent(tag) { - this.markedContentStack.push({ - visible: true - }); - } - beginMarkedContentProps(tag, properties) { - if (tag === "OC") { - this.markedContentStack.push({ - visible: this.optionalContentConfig.isVisible(properties) - }); - } else { - this.markedContentStack.push({ - visible: true - }); - } - this.contentVisible = this.isContentVisible(); - } - endMarkedContent() { - this.markedContentStack.pop(); - this.contentVisible = this.isContentVisible(); - } - beginCompat() {} - endCompat() {} - consumePath(clipBox) { - const isEmpty = this.current.isEmptyClip(); - if (this.pendingClip) { - this.current.updateClipFromPath(); - } - if (!this.pendingClip) { - this.compose(clipBox); - } - const ctx = this.ctx; - if (this.pendingClip) { - if (!isEmpty) { - if (this.pendingClip === EO_CLIP) { - ctx.clip("evenodd"); - } else { - ctx.clip(); - } - } - this.pendingClip = null; - } - this.current.startNewPathAndClipBox(this.current.clipBox); - ctx.beginPath(); - } - getSinglePixelWidth() { - if (!this._cachedGetSinglePixelWidth) { - const m = (0, _display_utils.getCurrentTransform)(this.ctx); - if (m[1] === 0 && m[2] === 0) { - this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3])); - } else { - const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); - const normX = Math.hypot(m[0], m[2]); - const normY = Math.hypot(m[1], m[3]); - this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet; - } - } - return this._cachedGetSinglePixelWidth; - } - getScaleForStroking() { - if (!this._cachedScaleForStroking) { - const { - lineWidth - } = this.current; - const m = (0, _display_utils.getCurrentTransform)(this.ctx); - let scaleX, scaleY; - if (m[1] === 0 && m[2] === 0) { - const normX = Math.abs(m[0]); - const normY = Math.abs(m[3]); - if (lineWidth === 0) { - scaleX = 1 / normX; - scaleY = 1 / normY; - } else { - const scaledXLineWidth = normX * lineWidth; - const scaledYLineWidth = normY * lineWidth; - scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1; - scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1; - } - } else { - const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]); - const normX = Math.hypot(m[0], m[1]); - const normY = Math.hypot(m[2], m[3]); - if (lineWidth === 0) { - scaleX = normY / absDet; - scaleY = normX / absDet; - } else { - const baseArea = lineWidth * absDet; - scaleX = normY > baseArea ? normY / baseArea : 1; - scaleY = normX > baseArea ? normX / baseArea : 1; - } - } - this._cachedScaleForStroking = [scaleX, scaleY]; - } - return this._cachedScaleForStroking; - } - rescaleAndStroke(saveRestore) { - const { - ctx - } = this; - const { - lineWidth - } = this.current; - const [scaleX, scaleY] = this.getScaleForStroking(); - ctx.lineWidth = lineWidth || 1; - if (scaleX === 1 && scaleY === 1) { - ctx.stroke(); - return; - } - let savedMatrix, savedDashes, savedDashOffset; - if (saveRestore) { - savedMatrix = (0, _display_utils.getCurrentTransform)(ctx); - savedDashes = ctx.getLineDash().slice(); - savedDashOffset = ctx.lineDashOffset; - } - ctx.scale(scaleX, scaleY); - const scale = Math.max(scaleX, scaleY); - ctx.setLineDash(ctx.getLineDash().map(x => x / scale)); - ctx.lineDashOffset /= scale; - ctx.stroke(); - if (saveRestore) { - ctx.setTransform(...savedMatrix); - ctx.setLineDash(savedDashes); - ctx.lineDashOffset = savedDashOffset; - } - } - isContentVisible() { - for (let i = this.markedContentStack.length - 1; i >= 0; i--) { - if (!this.markedContentStack[i].visible) { - return false; - } - } - return true; - } -} -exports.CanvasGraphics = CanvasGraphics; -for (const op in _util.OPS) { - if (CanvasGraphics.prototype[op] !== undefined) { - CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op]; - } -} - -/***/ }), -/* 12 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.TilingPattern = exports.PathType = void 0; -exports.getShadingPattern = getShadingPattern; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -const PathType = { - FILL: "Fill", - STROKE: "Stroke", - SHADING: "Shading" -}; -exports.PathType = PathType; -function applyBoundingBox(ctx, bbox) { - if (!bbox) { - return; - } - const width = bbox[2] - bbox[0]; - const height = bbox[3] - bbox[1]; - const region = new Path2D(); - region.rect(bbox[0], bbox[1], width, height); - ctx.clip(region); -} -class BaseShadingPattern { - constructor() { - if (this.constructor === BaseShadingPattern) { - (0, _util.unreachable)("Cannot initialize BaseShadingPattern."); - } - } - getPattern() { - (0, _util.unreachable)("Abstract method `getPattern` called."); - } -} -class RadialAxialShadingPattern extends BaseShadingPattern { - constructor(IR) { - super(); - this._type = IR[1]; - this._bbox = IR[2]; - this._colorStops = IR[3]; - this._p0 = IR[4]; - this._p1 = IR[5]; - this._r0 = IR[6]; - this._r1 = IR[7]; - this.matrix = null; - } - _createGradient(ctx) { - let grad; - if (this._type === "axial") { - grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]); - } else if (this._type === "radial") { - grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1); - } - for (const colorStop of this._colorStops) { - grad.addColorStop(colorStop[0], colorStop[1]); - } - return grad; - } - getPattern(ctx, owner, inverse, pathType) { - let pattern; - if (pathType === PathType.STROKE || pathType === PathType.FILL) { - const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, (0, _display_utils.getCurrentTransform)(ctx)) || [0, 0, 0, 0]; - const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1; - const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1; - const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height, true); - const tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); - tmpCtx.beginPath(); - tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height); - tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]); - inverse = _util.Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]); - tmpCtx.transform(...owner.baseTransform); - if (this.matrix) { - tmpCtx.transform(...this.matrix); - } - applyBoundingBox(tmpCtx, this._bbox); - tmpCtx.fillStyle = this._createGradient(tmpCtx); - tmpCtx.fill(); - pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat"); - const domMatrix = new DOMMatrix(inverse); - pattern.setTransform(domMatrix); - } else { - applyBoundingBox(ctx, this._bbox); - pattern = this._createGradient(ctx); - } - return pattern; - } -} -function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - const coords = context.coords, - colors = context.colors; - const bytes = data.data, - rowSize = data.width * 4; - let tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; - p1 = p2; - p2 = tmp; - tmp = c1; - c1 = c2; - c2 = tmp; - } - if (coords[p2 + 1] > coords[p3 + 1]) { - tmp = p2; - p2 = p3; - p3 = tmp; - tmp = c2; - c2 = c3; - c3 = tmp; - } - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; - p1 = p2; - p2 = tmp; - tmp = c1; - c1 = c2; - c2 = tmp; - } - const x1 = (coords[p1] + context.offsetX) * context.scaleX; - const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - const x2 = (coords[p2] + context.offsetX) * context.scaleX; - const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - const x3 = (coords[p3] + context.offsetX) * context.scaleX; - const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; - if (y1 >= y3) { - return; - } - const c1r = colors[c1], - c1g = colors[c1 + 1], - c1b = colors[c1 + 2]; - const c2r = colors[c2], - c2g = colors[c2 + 1], - c2b = colors[c2 + 2]; - const c3r = colors[c3], - c3g = colors[c3 + 1], - c3b = colors[c3 + 2]; - const minY = Math.round(y1), - maxY = Math.round(y3); - let xa, car, cag, cab; - let xb, cbr, cbg, cbb; - for (let y = minY; y <= maxY; y++) { - if (y < y2) { - let k; - if (y < y1) { - k = 0; - } else { - k = (y1 - y) / (y1 - y2); - } - xa = x1 - (x1 - x2) * k; - car = c1r - (c1r - c2r) * k; - cag = c1g - (c1g - c2g) * k; - cab = c1b - (c1b - c2b) * k; - } else { - let k; - if (y > y3) { - k = 1; - } else if (y2 === y3) { - k = 0; - } else { - k = (y2 - y) / (y2 - y3); - } - xa = x2 - (x2 - x3) * k; - car = c2r - (c2r - c3r) * k; - cag = c2g - (c2g - c3g) * k; - cab = c2b - (c2b - c3b) * k; - } - let k; - if (y < y1) { - k = 0; - } else if (y > y3) { - k = 1; - } else { - k = (y1 - y) / (y1 - y3); - } - xb = x1 - (x1 - x3) * k; - cbr = c1r - (c1r - c3r) * k; - cbg = c1g - (c1g - c3g) * k; - cbb = c1b - (c1b - c3b) * k; - const x1_ = Math.round(Math.min(xa, xb)); - const x2_ = Math.round(Math.max(xa, xb)); - let j = rowSize * y + x1_ * 4; - for (let x = x1_; x <= x2_; x++) { - k = (xa - x) / (xa - xb); - if (k < 0) { - k = 0; - } else if (k > 1) { - k = 1; - } - bytes[j++] = car - (car - cbr) * k | 0; - bytes[j++] = cag - (cag - cbg) * k | 0; - bytes[j++] = cab - (cab - cbb) * k | 0; - bytes[j++] = 255; - } - } -} -function drawFigure(data, figure, context) { - const ps = figure.coords; - const cs = figure.colors; - let i, ii; - switch (figure.type) { - case "lattice": - const verticesPerRow = figure.verticesPerRow; - const rows = Math.floor(ps.length / verticesPerRow) - 1; - const cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - let q = i * verticesPerRow; - for (let j = 0; j < cols; j++, q++) { - drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case "triangles": - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - throw new Error("illegal figure"); - } -} -class MeshShadingPattern extends BaseShadingPattern { - constructor(IR) { - super(); - this._coords = IR[2]; - this._colors = IR[3]; - this._figures = IR[4]; - this._bounds = IR[5]; - this._bbox = IR[7]; - this._background = IR[8]; - this.matrix = null; - } - _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) { - const EXPECTED_SCALE = 1.1; - const MAX_PATTERN_SIZE = 3000; - const BORDER_SIZE = 2; - const offsetX = Math.floor(this._bounds[0]); - const offsetY = Math.floor(this._bounds[1]); - const boundsWidth = Math.ceil(this._bounds[2]) - offsetX; - const boundsHeight = Math.ceil(this._bounds[3]) - offsetY; - const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE); - const scaleX = boundsWidth / width; - const scaleY = boundsHeight / height; - const context = { - coords: this._coords, - colors: this._colors, - offsetX: -offsetX, - offsetY: -offsetY, - scaleX: 1 / scaleX, - scaleY: 1 / scaleY - }; - const paddedWidth = width + BORDER_SIZE * 2; - const paddedHeight = height + BORDER_SIZE * 2; - const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false); - const tmpCtx = tmpCanvas.context; - const data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - const bytes = data.data; - for (let i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; - } - } - for (const figure of this._figures) { - drawFigure(data, figure, context); - } - tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE); - const canvas = tmpCanvas.canvas; - return { - canvas, - offsetX: offsetX - BORDER_SIZE * scaleX, - offsetY: offsetY - BORDER_SIZE * scaleY, - scaleX, - scaleY - }; - } - getPattern(ctx, owner, inverse, pathType) { - applyBoundingBox(ctx, this._bbox); - let scale; - if (pathType === PathType.SHADING) { - scale = _util.Util.singularValueDecompose2dScale((0, _display_utils.getCurrentTransform)(ctx)); - } else { - scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform); - if (this.matrix) { - const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); - scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]]; - } - } - const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases); - if (pathType !== PathType.SHADING) { - ctx.setTransform(...owner.baseTransform); - if (this.matrix) { - ctx.transform(...this.matrix); - } - } - ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); - ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY); - return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat"); - } -} -class DummyShadingPattern extends BaseShadingPattern { - getPattern() { - return "hotpink"; - } -} -function getShadingPattern(IR) { - switch (IR[0]) { - case "RadialAxial": - return new RadialAxialShadingPattern(IR); - case "Mesh": - return new MeshShadingPattern(IR); - case "Dummy": - return new DummyShadingPattern(); - } - throw new Error(`Unknown IR type: ${IR[0]}`); -} -const PaintType = { - COLORED: 1, - UNCOLORED: 2 -}; -class TilingPattern { - static get MAX_PATTERN_SIZE() { - return (0, _util.shadow)(this, "MAX_PATTERN_SIZE", 3000); - } - constructor(IR, color, ctx, canvasGraphicsFactory, baseTransform) { - this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; - this.bbox = IR[4]; - this.xstep = IR[5]; - this.ystep = IR[6]; - this.paintType = IR[7]; - this.tilingType = IR[8]; - this.color = color; - this.ctx = ctx; - this.canvasGraphicsFactory = canvasGraphicsFactory; - this.baseTransform = baseTransform; - } - createPatternCanvas(owner) { - const operatorList = this.operatorList; - const bbox = this.bbox; - const xstep = this.xstep; - const ystep = this.ystep; - const paintType = this.paintType; - const tilingType = this.tilingType; - const color = this.color; - const canvasGraphicsFactory = this.canvasGraphicsFactory; - (0, _util.info)("TilingType: " + tilingType); - const x0 = bbox[0], - y0 = bbox[1], - x1 = bbox[2], - y1 = bbox[3]; - const matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix); - const curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform); - const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]]; - const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]); - const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]); - const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true); - const tmpCtx = tmpCanvas.context; - const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); - graphics.groupLevel = owner.groupLevel; - this.setFillAndStrokeStyleToContext(graphics, paintType, color); - let adjustedX0 = x0; - let adjustedY0 = y0; - let adjustedX1 = x1; - let adjustedY1 = y1; - if (x0 < 0) { - adjustedX0 = 0; - adjustedX1 += Math.abs(x0); - } - if (y0 < 0) { - adjustedY0 = 0; - adjustedY1 += Math.abs(y0); - } - tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0)); - graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0); - tmpCtx.save(); - this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1); - graphics.baseTransform = (0, _display_utils.getCurrentTransform)(graphics.ctx); - graphics.executeOperatorList(operatorList); - graphics.endDrawing(); - return { - canvas: tmpCanvas.canvas, - scaleX: dimx.scale, - scaleY: dimy.scale, - offsetX: adjustedX0, - offsetY: adjustedY0 - }; - } - getSizeAndScale(step, realOutputSize, scale) { - step = Math.abs(step); - const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize); - let size = Math.ceil(step * scale); - if (size >= maxSize) { - size = maxSize; - } else { - scale = size / step; - } - return { - scale, - size - }; - } - clipBbox(graphics, x0, y0, x1, y1) { - const bboxWidth = x1 - x0; - const bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.current.updateRectMinMax((0, _display_utils.getCurrentTransform)(graphics.ctx), [x0, y0, x1, y1]); - graphics.clip(); - graphics.endPath(); - } - setFillAndStrokeStyleToContext(graphics, paintType, color) { - const context = graphics.ctx, - current = graphics.current; - switch (paintType) { - case PaintType.COLORED: - const ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - current.fillColor = ctx.fillStyle; - current.strokeColor = ctx.strokeStyle; - break; - case PaintType.UNCOLORED: - const cssColor = _util.Util.makeHexColor(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - current.fillColor = cssColor; - current.strokeColor = cssColor; - break; - default: - throw new _util.FormatError(`Unsupported paint type: ${paintType}`); - } - } - getPattern(ctx, owner, inverse, pathType) { - let matrix = inverse; - if (pathType !== PathType.SHADING) { - matrix = _util.Util.transform(matrix, owner.baseTransform); - if (this.matrix) { - matrix = _util.Util.transform(matrix, this.matrix); - } - } - const temporaryPatternCanvas = this.createPatternCanvas(owner); - let domMatrix = new DOMMatrix(matrix); - domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY); - domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY); - const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat"); - pattern.setTransform(domMatrix); - return pattern; - } -} -exports.TilingPattern = TilingPattern; - -/***/ }), -/* 13 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.applyMaskImageData = applyMaskImageData; -var _util = __w_pdfjs_require__(1); -function applyMaskImageData({ - src, - srcPos = 0, - dest, - destPos = 0, - width, - height, - inverseDecode = false -}) { - const opaque = _util.FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; - const [zeroMapping, oneMapping] = !inverseDecode ? [opaque, 0] : [0, opaque]; - const widthInSource = width >> 3; - const widthRemainder = width & 7; - const srcLength = src.length; - dest = new Uint32Array(dest.buffer); - for (let i = 0; i < height; i++) { - for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { - const elem = srcPos < srcLength ? src[srcPos] : 255; - dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; - dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; - } - if (widthRemainder === 0) { - continue; - } - const elem = srcPos < srcLength ? src[srcPos++] : 255; - for (let j = 0; j < widthRemainder; j++) { - dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; - } - } - return { - srcPos, - destPos - }; -} - -/***/ }), -/* 14 */ -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.GlobalWorkerOptions = void 0; -const GlobalWorkerOptions = Object.create(null); -exports.GlobalWorkerOptions = GlobalWorkerOptions; -GlobalWorkerOptions.workerPort = null; -GlobalWorkerOptions.workerSrc = ""; - -/***/ }), -/* 15 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.MessageHandler = void 0; -var _util = __w_pdfjs_require__(1); -const CallbackKind = { - UNKNOWN: 0, - DATA: 1, - ERROR: 2 -}; -const StreamKind = { - UNKNOWN: 0, - CANCEL: 1, - CANCEL_COMPLETE: 2, - CLOSE: 3, - ENQUEUE: 4, - ERROR: 5, - PULL: 6, - PULL_COMPLETE: 7, - START_COMPLETE: 8 -}; -function wrapReason(reason) { - if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) { - (0, _util.unreachable)('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); - } - switch (reason.name) { - case "AbortException": - return new _util.AbortException(reason.message); - case "MissingPDFException": - return new _util.MissingPDFException(reason.message); - case "PasswordException": - return new _util.PasswordException(reason.message, reason.code); - case "UnexpectedResponseException": - return new _util.UnexpectedResponseException(reason.message, reason.status); - case "UnknownErrorException": - return new _util.UnknownErrorException(reason.message, reason.details); - default: - return new _util.UnknownErrorException(reason.message, reason.toString()); - } -} -class MessageHandler { - constructor(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackId = 1; - this.streamId = 1; - this.streamSinks = Object.create(null); - this.streamControllers = Object.create(null); - this.callbackCapabilities = Object.create(null); - this.actionHandler = Object.create(null); - this._onComObjOnMessage = event => { - const data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.stream) { - this._processStreamMessage(data); - return; - } - if (data.callback) { - const callbackId = data.callbackId; - const capability = this.callbackCapabilities[callbackId]; - if (!capability) { - throw new Error(`Cannot resolve callback ${callbackId}`); - } - delete this.callbackCapabilities[callbackId]; - if (data.callback === CallbackKind.DATA) { - capability.resolve(data.data); - } else if (data.callback === CallbackKind.ERROR) { - capability.reject(wrapReason(data.reason)); - } else { - throw new Error("Unexpected callback case"); - } - return; - } - const action = this.actionHandler[data.action]; - if (!action) { - throw new Error(`Unknown action from worker: ${data.action}`); - } - if (data.callbackId) { - const cbSourceName = this.sourceName; - const cbTargetName = data.sourceName; - new Promise(function (resolve) { - resolve(action(data.data)); - }).then(function (result) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.DATA, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - comObj.postMessage({ - sourceName: cbSourceName, - targetName: cbTargetName, - callback: CallbackKind.ERROR, - callbackId: data.callbackId, - reason: wrapReason(reason) - }); - }); - return; - } - if (data.streamId) { - this._createStreamSink(data); - return; - } - action(data.data); - }; - comObj.addEventListener("message", this._onComObjOnMessage); - } - on(actionName, handler) { - const ah = this.actionHandler; - if (ah[actionName]) { - throw new Error(`There is already an actionName called "${actionName}"`); - } - ah[actionName] = handler; - } - send(actionName, data, transfers) { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data - }, transfers); - } - sendWithPromise(actionName, data, transfers) { - const callbackId = this.callbackId++; - const capability = (0, _util.createPromiseCapability)(); - this.callbackCapabilities[callbackId] = capability; - try { - this.comObj.postMessage({ - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - callbackId, - data - }, transfers); - } catch (ex) { - capability.reject(ex); - } - return capability.promise; - } - sendWithStream(actionName, data, queueingStrategy, transfers) { - const streamId = this.streamId++, - sourceName = this.sourceName, - targetName = this.targetName, - comObj = this.comObj; - return new ReadableStream({ - start: controller => { - const startCapability = (0, _util.createPromiseCapability)(); - this.streamControllers[streamId] = { - controller, - startCall: startCapability, - pullCall: null, - cancelCall: null, - isClosed: false - }; - comObj.postMessage({ - sourceName, - targetName, - action: actionName, - streamId, - data, - desiredSize: controller.desiredSize - }, transfers); - return startCapability.promise; - }, - pull: controller => { - const pullCapability = (0, _util.createPromiseCapability)(); - this.streamControllers[streamId].pullCall = pullCapability; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL, - streamId, - desiredSize: controller.desiredSize - }); - return pullCapability.promise; - }, - cancel: reason => { - (0, _util.assert)(reason instanceof Error, "cancel must have a valid reason"); - const cancelCapability = (0, _util.createPromiseCapability)(); - this.streamControllers[streamId].cancelCall = cancelCapability; - this.streamControllers[streamId].isClosed = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL, - streamId, - reason: wrapReason(reason) - }); - return cancelCapability.promise; - } - }, queueingStrategy); - } - _createStreamSink(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const self = this, - action = this.actionHandler[data.action]; - const streamSink = { - enqueue(chunk, size = 1, transfers) { - if (this.isCancelled) { - return; - } - const lastDesiredSize = this.desiredSize; - this.desiredSize -= size; - if (lastDesiredSize > 0 && this.desiredSize <= 0) { - this.sinkCapability = (0, _util.createPromiseCapability)(); - this.ready = this.sinkCapability.promise; - } - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ENQUEUE, - streamId, - chunk - }, transfers); - }, - close() { - if (this.isCancelled) { - return; - } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CLOSE, - streamId - }); - delete self.streamSinks[streamId]; - }, - error(reason) { - (0, _util.assert)(reason instanceof Error, "error must have a valid reason"); - if (this.isCancelled) { - return; - } - this.isCancelled = true; - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.ERROR, - streamId, - reason: wrapReason(reason) - }); - }, - sinkCapability: (0, _util.createPromiseCapability)(), - onPull: null, - onCancel: null, - isCancelled: false, - desiredSize: data.desiredSize, - ready: null - }; - streamSink.sinkCapability.resolve(); - streamSink.ready = streamSink.sinkCapability.promise; - this.streamSinks[streamId] = streamSink; - new Promise(function (resolve) { - resolve(action(data.data, streamSink)); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.START_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - } - _processStreamMessage(data) { - const streamId = data.streamId, - sourceName = this.sourceName, - targetName = data.sourceName, - comObj = this.comObj; - const streamController = this.streamControllers[streamId], - streamSink = this.streamSinks[streamId]; - switch (data.stream) { - case StreamKind.START_COMPLETE: - if (data.success) { - streamController.startCall.resolve(); - } else { - streamController.startCall.reject(wrapReason(data.reason)); - } - break; - case StreamKind.PULL_COMPLETE: - if (data.success) { - streamController.pullCall.resolve(); - } else { - streamController.pullCall.reject(wrapReason(data.reason)); - } - break; - case StreamKind.PULL: - if (!streamSink) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - break; - } - if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { - streamSink.sinkCapability.resolve(); - } - streamSink.desiredSize = data.desiredSize; - new Promise(function (resolve) { - resolve(streamSink.onPull && streamSink.onPull()); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.PULL_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - break; - case StreamKind.ENQUEUE: - (0, _util.assert)(streamController, "enqueue should have stream controller"); - if (streamController.isClosed) { - break; - } - streamController.controller.enqueue(data.chunk); - break; - case StreamKind.CLOSE: - (0, _util.assert)(streamController, "close should have stream controller"); - if (streamController.isClosed) { - break; - } - streamController.isClosed = true; - streamController.controller.close(); - this._deleteStreamController(streamController, streamId); - break; - case StreamKind.ERROR: - (0, _util.assert)(streamController, "error should have stream controller"); - streamController.controller.error(wrapReason(data.reason)); - this._deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL_COMPLETE: - if (data.success) { - streamController.cancelCall.resolve(); - } else { - streamController.cancelCall.reject(wrapReason(data.reason)); - } - this._deleteStreamController(streamController, streamId); - break; - case StreamKind.CANCEL: - if (!streamSink) { - break; - } - new Promise(function (resolve) { - resolve(streamSink.onCancel && streamSink.onCancel(wrapReason(data.reason))); - }).then(function () { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - success: true - }); - }, function (reason) { - comObj.postMessage({ - sourceName, - targetName, - stream: StreamKind.CANCEL_COMPLETE, - streamId, - reason: wrapReason(reason) - }); - }); - streamSink.sinkCapability.reject(wrapReason(data.reason)); - streamSink.isCancelled = true; - delete this.streamSinks[streamId]; - break; - default: - throw new Error("Unexpected stream case"); - } - } - async _deleteStreamController(streamController, streamId) { - await Promise.allSettled([streamController.startCall && streamController.startCall.promise, streamController.pullCall && streamController.pullCall.promise, streamController.cancelCall && streamController.cancelCall.promise]); - delete this.streamControllers[streamId]; - } - destroy() { - this.comObj.removeEventListener("message", this._onComObjOnMessage); - } -} -exports.MessageHandler = MessageHandler; - -/***/ }), -/* 16 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.Metadata = void 0; -var _util = __w_pdfjs_require__(1); -class Metadata { - #metadataMap; - #data; - constructor({ - parsedData, - rawData - }) { - this.#metadataMap = parsedData; - this.#data = rawData; - } - getRaw() { - return this.#data; - } - get(name) { - return this.#metadataMap.get(name) ?? null; - } - getAll() { - return (0, _util.objectFromMap)(this.#metadataMap); - } - has(name) { - return this.#metadataMap.has(name); - } -} -exports.Metadata = Metadata; - -/***/ }), -/* 17 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.OptionalContentConfig = void 0; -var _util = __w_pdfjs_require__(1); -var _murmurhash = __w_pdfjs_require__(8); -const INTERNAL = Symbol("INTERNAL"); -class OptionalContentGroup { - #visible = true; - constructor(name, intent) { - this.name = name; - this.intent = intent; - } - get visible() { - return this.#visible; - } - _setVisible(internal, visible) { - if (internal !== INTERNAL) { - (0, _util.unreachable)("Internal method `_setVisible` called."); - } - this.#visible = visible; - } -} -class OptionalContentConfig { - #cachedGetHash = null; - #groups = new Map(); - #initialHash = null; - #order = null; - constructor(data) { - this.name = null; - this.creator = null; - if (data === null) { - return; - } - this.name = data.name; - this.creator = data.creator; - this.#order = data.order; - for (const group of data.groups) { - this.#groups.set(group.id, new OptionalContentGroup(group.name, group.intent)); - } - if (data.baseState === "OFF") { - for (const group of this.#groups.values()) { - group._setVisible(INTERNAL, false); - } - } - for (const on of data.on) { - this.#groups.get(on)._setVisible(INTERNAL, true); - } - for (const off of data.off) { - this.#groups.get(off)._setVisible(INTERNAL, false); - } - this.#initialHash = this.getHash(); - } - #evaluateVisibilityExpression(array) { - const length = array.length; - if (length < 2) { - return true; - } - const operator = array[0]; - for (let i = 1; i < length; i++) { - const element = array[i]; - let state; - if (Array.isArray(element)) { - state = this.#evaluateVisibilityExpression(element); - } else if (this.#groups.has(element)) { - state = this.#groups.get(element).visible; - } else { - (0, _util.warn)(`Optional content group not found: ${element}`); - return true; - } - switch (operator) { - case "And": - if (!state) { - return false; - } - break; - case "Or": - if (state) { - return true; - } - break; - case "Not": - return !state; - default: - return true; - } - } - return operator === "And"; - } - isVisible(group) { - if (this.#groups.size === 0) { - return true; - } - if (!group) { - (0, _util.warn)("Optional content group not defined."); - return true; - } - if (group.type === "OCG") { - if (!this.#groups.has(group.id)) { - (0, _util.warn)(`Optional content group not found: ${group.id}`); - return true; - } - return this.#groups.get(group.id).visible; - } else if (group.type === "OCMD") { - if (group.expression) { - return this.#evaluateVisibilityExpression(group.expression); - } - if (!group.policy || group.policy === "AnyOn") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0, _util.warn)(`Optional content group not found: ${id}`); - return true; - } - if (this.#groups.get(id).visible) { - return true; - } - } - return false; - } else if (group.policy === "AllOn") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0, _util.warn)(`Optional content group not found: ${id}`); - return true; - } - if (!this.#groups.get(id).visible) { - return false; - } - } - return true; - } else if (group.policy === "AnyOff") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0, _util.warn)(`Optional content group not found: ${id}`); - return true; - } - if (!this.#groups.get(id).visible) { - return true; - } - } - return false; - } else if (group.policy === "AllOff") { - for (const id of group.ids) { - if (!this.#groups.has(id)) { - (0, _util.warn)(`Optional content group not found: ${id}`); - return true; - } - if (this.#groups.get(id).visible) { - return false; - } - } - return true; - } - (0, _util.warn)(`Unknown optional content policy ${group.policy}.`); - return true; - } - (0, _util.warn)(`Unknown group type ${group.type}.`); - return true; - } - setVisibility(id, visible = true) { - if (!this.#groups.has(id)) { - (0, _util.warn)(`Optional content group not found: ${id}`); - return; - } - this.#groups.get(id)._setVisible(INTERNAL, !!visible); - this.#cachedGetHash = null; - } - get hasInitialVisibility() { - return this.getHash() === this.#initialHash; - } - getOrder() { - if (!this.#groups.size) { - return null; - } - if (this.#order) { - return this.#order.slice(); - } - return [...this.#groups.keys()]; - } - getGroups() { - return this.#groups.size > 0 ? (0, _util.objectFromMap)(this.#groups) : null; - } - getGroup(id) { - return this.#groups.get(id) || null; - } - getHash() { - if (this.#cachedGetHash !== null) { - return this.#cachedGetHash; - } - const hash = new _murmurhash.MurmurHash3_64(); - for (const [id, group] of this.#groups) { - hash.update(`${id}:${group.visible}`); - } - return this.#cachedGetHash = hash.hexdigest(); - } -} -exports.OptionalContentConfig = OptionalContentConfig; - -/***/ }), -/* 18 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.PDFDataTransportStream = void 0; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -class PDFDataTransportStream { - constructor({ - length, - initialData, - progressiveDone = false, - contentDispositionFilename = null, - disableRange = false, - disableStream = false - }, pdfDataRangeTransport) { - (0, _util.assert)(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); - this._queuedChunks = []; - this._progressiveDone = progressiveDone; - this._contentDispositionFilename = contentDispositionFilename; - if (initialData?.length > 0) { - const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer; - this._queuedChunks.push(buffer); - } - this._pdfDataRangeTransport = pdfDataRangeTransport; - this._isStreamingSupported = !disableStream; - this._isRangeSupported = !disableRange; - this._contentLength = length; - this._fullRequestReader = null; - this._rangeReaders = []; - this._pdfDataRangeTransport.addRangeListener((begin, chunk) => { - this._onReceiveData({ - begin, - chunk - }); - }); - this._pdfDataRangeTransport.addProgressListener((loaded, total) => { - this._onProgress({ - loaded, - total - }); - }); - this._pdfDataRangeTransport.addProgressiveReadListener(chunk => { - this._onReceiveData({ - chunk - }); - }); - this._pdfDataRangeTransport.addProgressiveDoneListener(() => { - this._onProgressiveDone(); - }); - this._pdfDataRangeTransport.transportReady(); - } - _onReceiveData({ - begin, - chunk - }) { - const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer; - if (begin === undefined) { - if (this._fullRequestReader) { - this._fullRequestReader._enqueue(buffer); - } else { - this._queuedChunks.push(buffer); - } - } else { - const found = this._rangeReaders.some(function (rangeReader) { - if (rangeReader._begin !== begin) { - return false; - } - rangeReader._enqueue(buffer); - return true; - }); - (0, _util.assert)(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found."); - } - } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } - _onProgress(evt) { - if (evt.total === undefined) { - this._rangeReaders[0]?.onProgress?.({ - loaded: evt.loaded - }); - } else { - this._fullRequestReader?.onProgress?.({ - loaded: evt.loaded, - total: evt.total - }); - } - } - _onProgressiveDone() { - this._fullRequestReader?.progressiveDone(); - this._progressiveDone = true; - } - _removeRangeReader(reader) { - const i = this._rangeReaders.indexOf(reader); - if (i >= 0) { - this._rangeReaders.splice(i, 1); - } - } - getFullReader() { - (0, _util.assert)(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once."); - const queuedChunks = this._queuedChunks; - this._queuedChunks = null; - return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename); - } - getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const reader = new PDFDataTransportStreamRangeReader(this, begin, end); - this._pdfDataRangeTransport.requestDataRange(begin, end); - this._rangeReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeReaders.slice(0)) { - reader.cancel(reason); - } - this._pdfDataRangeTransport.abort(); - } -} -exports.PDFDataTransportStream = PDFDataTransportStream; -class PDFDataTransportStreamReader { - constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { - this._stream = stream; - this._done = progressiveDone || false; - this._filename = (0, _display_utils.isPdfFile)(contentDispositionFilename) ? contentDispositionFilename : null; - this._queuedChunks = queuedChunks || []; - this._loaded = 0; - for (const chunk of this._queuedChunks) { - this._loaded += chunk.byteLength; - } - this._requests = []; - this._headersReady = Promise.resolve(); - stream._fullRequestReader = this; - this.onProgress = null; - } - _enqueue(chunk) { - if (this._done) { - return; - } - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: chunk, - done: false - }); - } else { - this._queuedChunks.push(chunk); - } - this._loaded += chunk.byteLength; - } - get headersReady() { - return this._headersReady; - } - get filename() { - return this._filename; - } - get isRangeSupported() { - return this._stream._isRangeSupported; - } - get isStreamingSupported() { - return this._stream._isStreamingSupported; - } - get contentLength() { - return this._stream._contentLength; - } - async read() { - if (this._queuedChunks.length > 0) { - const chunk = this._queuedChunks.shift(); - return { - value: chunk, - done: false - }; - } - if (this._done) { - return { - value: undefined, - done: true - }; - } - const requestCapability = (0, _util.createPromiseCapability)(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - } - progressiveDone() { - if (this._done) { - return; - } - this._done = true; - } -} -class PDFDataTransportStreamRangeReader { - constructor(stream, begin, end) { - this._stream = stream; - this._begin = begin; - this._end = end; - this._queuedChunk = null; - this._requests = []; - this._done = false; - this.onProgress = null; - } - _enqueue(chunk) { - if (this._done) { - return; - } - if (this._requests.length === 0) { - this._queuedChunk = chunk; - } else { - const requestsCapability = this._requests.shift(); - requestsCapability.resolve({ - value: chunk, - done: false - }); - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - } - this._done = true; - this._stream._removeRangeReader(this); - } - get isStreamingSupported() { - return false; - } - async read() { - if (this._queuedChunk) { - const chunk = this._queuedChunk; - this._queuedChunk = null; - return { - value: chunk, - done: false - }; - } - if (this._done) { - return { - value: undefined, - done: true - }; - } - const requestCapability = (0, _util.createPromiseCapability)(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - this._stream._removeRangeReader(this); - } -} - -/***/ }), -/* 19 */ -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.XfaText = void 0; -class XfaText { - static textContent(xfa) { - const items = []; - const output = { - items, - styles: Object.create(null) - }; - function walk(node) { - if (!node) { - return; - } - let str = null; - const name = node.name; - if (name === "#text") { - str = node.value; - } else if (!XfaText.shouldBuildText(name)) { - return; - } else if (node?.attributes?.textContent) { - str = node.attributes.textContent; - } else if (node.value) { - str = node.value; - } - if (str !== null) { - items.push({ - str - }); - } - if (!node.children) { - return; - } - for (const child of node.children) { - walk(child); - } - } - walk(xfa); - return output; - } - static shouldBuildText(name) { - return !(name === "textarea" || name === "input" || name === "option" || name === "select"); - } -} -exports.XfaText = XfaText; - -/***/ }), -/* 20 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.NodeStandardFontDataFactory = exports.NodeCanvasFactory = exports.NodeCMapReaderFactory = void 0; -var _base_factory = __w_pdfjs_require__(7); -; -const fetchData = function (url) { - return new Promise((resolve, reject) => { - const fs = require("fs"); - fs.readFile(url, (error, data) => { - if (error || !data) { - reject(new Error(error)); - return; - } - resolve(new Uint8Array(data)); - }); - }); -}; -class NodeCanvasFactory extends _base_factory.BaseCanvasFactory { - _createCanvas(width, height) { - const Canvas = require("canvas"); - return Canvas.createCanvas(width, height); - } -} -exports.NodeCanvasFactory = NodeCanvasFactory; -class NodeCMapReaderFactory extends _base_factory.BaseCMapReaderFactory { - _fetchData(url, compressionType) { - return fetchData(url).then(data => { - return { - cMapData: data, - compressionType - }; - }); - } -} -exports.NodeCMapReaderFactory = NodeCMapReaderFactory; -class NodeStandardFontDataFactory extends _base_factory.BaseStandardFontDataFactory { - _fetchData(url) { - return fetchData(url); - } -} -exports.NodeStandardFontDataFactory = NodeStandardFontDataFactory; - -/***/ }), -/* 21 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.PDFNodeStream = void 0; -var _util = __w_pdfjs_require__(1); -var _network_utils = __w_pdfjs_require__(22); -; -const fs = require("fs"); -const http = require("http"); -const https = require("https"); -const url = require("url"); -const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; -function parseUrl(sourceUrl) { - const parsedUrl = url.parse(sourceUrl); - if (parsedUrl.protocol === "file:" || parsedUrl.host) { - return parsedUrl; - } - if (/^[a-z]:[/\\]/i.test(sourceUrl)) { - return url.parse(`file:///${sourceUrl}`); - } - if (!parsedUrl.host) { - parsedUrl.protocol = "file:"; - } - return parsedUrl; -} -class PDFNodeStream { - constructor(source) { - this.source = source; - this.url = parseUrl(source.url); - this.isHttp = this.url.protocol === "http:" || this.url.protocol === "https:"; - this.isFsUrl = this.url.protocol === "file:"; - this.httpHeaders = this.isHttp && source.httpHeaders || {}; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } - getFullReader() { - (0, _util.assert)(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); - this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this); - return this._fullRequestReader; - } - getRangeReader(start, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end); - this._rangeRequestReaders.push(rangeReader); - return rangeReader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} -exports.PDFNodeStream = PDFNodeStream; -class BaseFullReader { - constructor(stream) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - const source = stream.source; - this._contentLength = source.length; - this._loaded = 0; - this._filename = null; - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; - this._readableStream = null; - this._readCapability = (0, _util.createPromiseCapability)(); - this._headersCapability = (0, _util.createPromiseCapability)(); - } - get headersReady() { - return this._headersCapability.promise; - } - get filename() { - return this._filename; - } - get contentLength() { - return this._contentLength; - } - get isRangeSupported() { - return this._isRangeSupported; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - async read() { - await this._readCapability.promise; - if (this._done) { - return { - value: undefined, - done: true - }; - } - if (this._storedError) { - throw this._storedError; - } - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = (0, _util.createPromiseCapability)(); - return this.read(); - } - this._loaded += chunk.length; - this.onProgress?.({ - loaded: this._loaded, - total: this._contentLength - }); - const buffer = new Uint8Array(chunk).buffer; - return { - value: buffer, - done: false - }; - } - cancel(reason) { - if (!this._readableStream) { - this._error(reason); - return; - } - this._readableStream.destroy(reason); - } - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); - } - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); - readableStream.on("end", () => { - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); - readableStream.on("error", reason => { - this._error(reason); - }); - if (!this._isStreamingSupported && this._isRangeSupported) { - this._error(new _util.AbortException("streaming is disabled")); - } - if (this._storedError) { - this._readableStream.destroy(this._storedError); - } - } -} -class BaseRangeReader { - constructor(stream) { - this._url = stream.url; - this._done = false; - this._storedError = null; - this.onProgress = null; - this._loaded = 0; - this._readableStream = null; - this._readCapability = (0, _util.createPromiseCapability)(); - const source = stream.source; - this._isStreamingSupported = !source.disableStream; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - async read() { - await this._readCapability.promise; - if (this._done) { - return { - value: undefined, - done: true - }; - } - if (this._storedError) { - throw this._storedError; - } - const chunk = this._readableStream.read(); - if (chunk === null) { - this._readCapability = (0, _util.createPromiseCapability)(); - return this.read(); - } - this._loaded += chunk.length; - this.onProgress?.({ - loaded: this._loaded - }); - const buffer = new Uint8Array(chunk).buffer; - return { - value: buffer, - done: false - }; - } - cancel(reason) { - if (!this._readableStream) { - this._error(reason); - return; - } - this._readableStream.destroy(reason); - } - _error(reason) { - this._storedError = reason; - this._readCapability.resolve(); - } - _setReadableStream(readableStream) { - this._readableStream = readableStream; - readableStream.on("readable", () => { - this._readCapability.resolve(); - }); - readableStream.on("end", () => { - readableStream.destroy(); - this._done = true; - this._readCapability.resolve(); - }); - readableStream.on("error", reason => { - this._error(reason); - }); - if (this._storedError) { - this._readableStream.destroy(this._storedError); - } - } -} -function createRequestOptions(parsedUrl, headers) { - return { - protocol: parsedUrl.protocol, - auth: parsedUrl.auth, - host: parsedUrl.hostname, - port: parsedUrl.port, - path: parsedUrl.path, - method: "GET", - headers - }; -} -class PDFNodeStreamFullReader extends BaseFullReader { - constructor(stream) { - super(stream); - const handleResponse = response => { - if (response.statusCode === 404) { - const error = new _util.MissingPDFException(`Missing PDF "${this._url}".`); - this._storedError = error; - this._headersCapability.reject(error); - return; - } - this._headersCapability.resolve(); - this._setReadableStream(response); - const getResponseHeader = name => { - return this._readableStream.headers[name.toLowerCase()]; - }; - const { - allowRangeRequests, - suggestedLength - } = (0, _network_utils.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: stream.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - this._isRangeSupported = allowRangeRequests; - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); - }; - this._request = null; - if (this._url.protocol === "http:") { - this._request = http.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); - } else { - this._request = https.request(createRequestOptions(this._url, stream.httpHeaders), handleResponse); - } - this._request.on("error", reason => { - this._storedError = reason; - this._headersCapability.reject(reason); - }); - this._request.end(); - } -} -class PDFNodeStreamRangeReader extends BaseRangeReader { - constructor(stream, start, end) { - super(stream); - this._httpHeaders = {}; - for (const property in stream.httpHeaders) { - const value = stream.httpHeaders[property]; - if (value === undefined) { - continue; - } - this._httpHeaders[property] = value; - } - this._httpHeaders.Range = `bytes=${start}-${end - 1}`; - const handleResponse = response => { - if (response.statusCode === 404) { - const error = new _util.MissingPDFException(`Missing PDF "${this._url}".`); - this._storedError = error; - return; - } - this._setReadableStream(response); - }; - this._request = null; - if (this._url.protocol === "http:") { - this._request = http.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); - } else { - this._request = https.request(createRequestOptions(this._url, this._httpHeaders), handleResponse); - } - this._request.on("error", reason => { - this._storedError = reason; - }); - this._request.end(); - } -} -class PDFNodeStreamFsFullReader extends BaseFullReader { - constructor(stream) { - super(stream); - let path = decodeURIComponent(this._url.path); - if (fileUriRegex.test(this._url.href)) { - path = path.replace(/^\//, ""); - } - fs.lstat(path, (error, stat) => { - if (error) { - if (error.code === "ENOENT") { - error = new _util.MissingPDFException(`Missing PDF "${path}".`); - } - this._storedError = error; - this._headersCapability.reject(error); - return; - } - this._contentLength = stat.size; - this._setReadableStream(fs.createReadStream(path)); - this._headersCapability.resolve(); - }); - } -} -class PDFNodeStreamFsRangeReader extends BaseRangeReader { - constructor(stream, start, end) { - super(stream); - let path = decodeURIComponent(this._url.path); - if (fileUriRegex.test(this._url.href)) { - path = path.replace(/^\//, ""); - } - this._setReadableStream(fs.createReadStream(path, { - start, - end: end - 1 - })); - } -} - -/***/ }), -/* 22 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.createResponseStatusError = createResponseStatusError; -exports.extractFilenameFromHeader = extractFilenameFromHeader; -exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities; -exports.validateResponseStatus = validateResponseStatus; -var _util = __w_pdfjs_require__(1); -var _content_disposition = __w_pdfjs_require__(23); -var _display_utils = __w_pdfjs_require__(6); -function validateRangeRequestCapabilities({ - getResponseHeader, - isHttp, - rangeChunkSize, - disableRange -}) { - const returnValues = { - allowRangeRequests: false, - suggestedLength: undefined - }; - const length = parseInt(getResponseHeader("Content-Length"), 10); - if (!Number.isInteger(length)) { - return returnValues; - } - returnValues.suggestedLength = length; - if (length <= 2 * rangeChunkSize) { - return returnValues; - } - if (disableRange || !isHttp) { - return returnValues; - } - if (getResponseHeader("Accept-Ranges") !== "bytes") { - return returnValues; - } - const contentEncoding = getResponseHeader("Content-Encoding") || "identity"; - if (contentEncoding !== "identity") { - return returnValues; - } - returnValues.allowRangeRequests = true; - return returnValues; -} -function extractFilenameFromHeader(getResponseHeader) { - const contentDisposition = getResponseHeader("Content-Disposition"); - if (contentDisposition) { - let filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition); - if (filename.includes("%")) { - try { - filename = decodeURIComponent(filename); - } catch (ex) {} - } - if ((0, _display_utils.isPdfFile)(filename)) { - return filename; - } - } - return null; -} -function createResponseStatusError(status, url) { - if (status === 404 || status === 0 && url.startsWith("file:")) { - return new _util.MissingPDFException('Missing PDF "' + url + '".'); - } - return new _util.UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status); -} -function validateResponseStatus(status) { - return status === 200 || status === 206; -} - -/***/ }), -/* 23 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader; -var _util = __w_pdfjs_require__(1); -function getFilenameFromContentDispositionHeader(contentDisposition) { - let needsEncodingFixup = true; - let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition); - if (tmp) { - tmp = tmp[1]; - let filename = rfc2616unquote(tmp); - filename = unescape(filename); - filename = rfc5987decode(filename); - filename = rfc2047decode(filename); - return fixupEncoding(filename); - } - tmp = rfc2231getparam(contentDisposition); - if (tmp) { - const filename = rfc2047decode(tmp); - return fixupEncoding(filename); - } - tmp = toParamRegExp("filename", "i").exec(contentDisposition); - if (tmp) { - tmp = tmp[1]; - let filename = rfc2616unquote(tmp); - filename = rfc2047decode(filename); - return fixupEncoding(filename); - } - function toParamRegExp(attributePattern, flags) { - return new RegExp("(?:^|;)\\s*" + attributePattern + "\\s*=\\s*" + "(" + '[^";\\s][^;\\s]*' + "|" + '"(?:[^"\\\\]|\\\\"?)+"?' + ")", flags); - } - function textdecode(encoding, value) { - if (encoding) { - if (!/^[\x00-\xFF]+$/.test(value)) { - return value; - } - try { - const decoder = new TextDecoder(encoding, { - fatal: true - }); - const buffer = (0, _util.stringToBytes)(value); - value = decoder.decode(buffer); - needsEncodingFixup = false; - } catch (e) {} - } - return value; - } - function fixupEncoding(value) { - if (needsEncodingFixup && /[\x80-\xff]/.test(value)) { - value = textdecode("utf-8", value); - if (needsEncodingFixup) { - value = textdecode("iso-8859-1", value); - } - } - return value; - } - function rfc2231getparam(contentDispositionStr) { - const matches = []; - let match; - const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig"); - while ((match = iter.exec(contentDispositionStr)) !== null) { - let [, n, quot, part] = match; - n = parseInt(n, 10); - if (n in matches) { - if (n === 0) { - break; - } - continue; - } - matches[n] = [quot, part]; - } - const parts = []; - for (let n = 0; n < matches.length; ++n) { - if (!(n in matches)) { - break; - } - let [quot, part] = matches[n]; - part = rfc2616unquote(part); - if (quot) { - part = unescape(part); - if (n === 0) { - part = rfc5987decode(part); - } - } - parts.push(part); - } - return parts.join(""); - } - function rfc2616unquote(value) { - if (value.startsWith('"')) { - const parts = value.slice(1).split('\\"'); - for (let i = 0; i < parts.length; ++i) { - const quotindex = parts[i].indexOf('"'); - if (quotindex !== -1) { - parts[i] = parts[i].slice(0, quotindex); - parts.length = i + 1; - } - parts[i] = parts[i].replace(/\\(.)/g, "$1"); - } - value = parts.join('"'); - } - return value; - } - function rfc5987decode(extvalue) { - const encodingend = extvalue.indexOf("'"); - if (encodingend === -1) { - return extvalue; - } - const encoding = extvalue.slice(0, encodingend); - const langvalue = extvalue.slice(encodingend + 1); - const value = langvalue.replace(/^[^']*'/, ""); - return textdecode(encoding, value); - } - function rfc2047decode(value) { - if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) { - return value; - } - return value.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { - if (encoding === "q" || encoding === "Q") { - text = text.replace(/_/g, " "); - text = text.replace(/=([0-9a-fA-F]{2})/g, function (match, hex) { - return String.fromCharCode(parseInt(hex, 16)); - }); - return textdecode(charset, text); - } - try { - text = atob(text); - } catch (e) {} - return textdecode(charset, text); - }); - } - return ""; -} - -/***/ }), -/* 24 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.PDFNetworkStream = void 0; -var _util = __w_pdfjs_require__(1); -var _network_utils = __w_pdfjs_require__(22); -; -const OK_RESPONSE = 200; -const PARTIAL_CONTENT_RESPONSE = 206; -function getArrayBuffer(xhr) { - const data = xhr.response; - if (typeof data !== "string") { - return data; - } - return (0, _util.stringToBytes)(data).buffer; -} -class NetworkManager { - constructor(url, args = {}) { - this.url = url; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = this.isHttp && args.httpHeaders || Object.create(null); - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - this.currXhrId = 0; - this.pendingRequests = Object.create(null); - } - requestRange(begin, end, listeners) { - const args = { - begin, - end - }; - for (const prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - } - requestFull(listeners) { - return this.request(listeners); - } - request(args) { - const xhr = this.getXhr(); - const xhrId = this.currXhrId++; - const pendingRequest = this.pendingRequests[xhrId] = { - xhr - }; - xhr.open("GET", this.url); - xhr.withCredentials = this.withCredentials; - for (const property in this.httpHeaders) { - const value = this.httpHeaders[property]; - if (value === undefined) { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && "begin" in args && "end" in args) { - xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`); - pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE; - } else { - pendingRequest.expectedStatus = OK_RESPONSE; - } - xhr.responseType = "arraybuffer"; - if (args.onError) { - xhr.onerror = function (evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - xhr.send(null); - return xhrId; - } - onProgress(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - return; - } - pendingRequest.onProgress?.(evt); - } - onStateChange(xhrId, evt) { - const pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - return; - } - const xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - if (xhr.readyState !== 4) { - return; - } - if (!(xhrId in this.pendingRequests)) { - return; - } - delete this.pendingRequests[xhrId]; - if (xhr.status === 0 && this.isHttp) { - pendingRequest.onError?.(xhr.status); - return; - } - const xhrStatus = xhr.status || OK_RESPONSE; - const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) { - pendingRequest.onError?.(xhr.status); - return; - } - const chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - const rangeHeader = xhr.getResponseHeader("Content-Range"); - const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - pendingRequest.onDone({ - begin: parseInt(matches[1], 10), - chunk - }); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk - }); - } else { - pendingRequest.onError?.(xhr.status); - } - } - getRequestXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - } - isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - } - abortRequest(xhrId) { - const xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } -} -class PDFNetworkStream { - constructor(source) { - this._source = source; - this._manager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - this._rangeChunkSize = source.rangeChunkSize; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - _onRangeRequestReaderClosed(reader) { - const i = this._rangeRequestReaders.indexOf(reader); - if (i >= 0) { - this._rangeRequestReaders.splice(i, 1); - } - } - getFullReader() { - (0, _util.assert)(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source); - return this._fullRequestReader; - } - getRangeReader(begin, end) { - const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end); - reader.onClosed = this._onRangeRequestReaderClosed.bind(this); - this._rangeRequestReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} -exports.PDFNetworkStream = PDFNetworkStream; -class PDFNetworkStreamFullRequestReader { - constructor(manager, source) { - this._manager = manager; - const args = { - onHeadersReceived: this._onHeadersReceived.bind(this), - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = source.url; - this._fullRequestId = manager.requestFull(args); - this._headersReceivedCapability = (0, _util.createPromiseCapability)(); - this._disableRange = source.disableRange || false; - this._contentLength = source.length; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._isStreamingSupported = false; - this._isRangeSupported = false; - this._cachedChunks = []; - this._requests = []; - this._done = false; - this._storedError = undefined; - this._filename = null; - this.onProgress = null; - } - _onHeadersReceived() { - const fullRequestXhrId = this._fullRequestId; - const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId); - const getResponseHeader = name => { - return fullRequestXhr.getResponseHeader(name); - }; - const { - allowRangeRequests, - suggestedLength - } = (0, _network_utils.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: this._manager.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - if (allowRangeRequests) { - this._isRangeSupported = true; - } - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); - if (this._isRangeSupported) { - this._manager.abortRequest(fullRequestXhrId); - } - this._headersReceivedCapability.resolve(); - } - _onDone(data) { - if (data) { - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: data.chunk, - done: false - }); - } else { - this._cachedChunks.push(data.chunk); - } - } - this._done = true; - if (this._cachedChunks.length > 0) { - return; - } - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - } - _onError(status) { - this._storedError = (0, _network_utils.createResponseStatusError)(status, this._url); - this._headersReceivedCapability.reject(this._storedError); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); - } - this._requests.length = 0; - this._cachedChunks.length = 0; - } - _onProgress(evt) { - this.onProgress?.({ - loaded: evt.loaded, - total: evt.lengthComputable ? evt.total : this._contentLength - }); - } - get filename() { - return this._filename; - } - get isRangeSupported() { - return this._isRangeSupported; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - get contentLength() { - return this._contentLength; - } - get headersReady() { - return this._headersReceivedCapability.promise; - } - async read() { - if (this._storedError) { - throw this._storedError; - } - if (this._cachedChunks.length > 0) { - const chunk = this._cachedChunks.shift(); - return { - value: chunk, - done: false - }; - } - if (this._done) { - return { - value: undefined, - done: true - }; - } - const requestCapability = (0, _util.createPromiseCapability)(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - this._headersReceivedCapability.reject(reason); - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - if (this._manager.isPendingRequest(this._fullRequestId)) { - this._manager.abortRequest(this._fullRequestId); - } - this._fullRequestReader = null; - } -} -class PDFNetworkStreamRangeRequestReader { - constructor(manager, begin, end) { - this._manager = manager; - const args = { - onDone: this._onDone.bind(this), - onError: this._onError.bind(this), - onProgress: this._onProgress.bind(this) - }; - this._url = manager.url; - this._requestId = manager.requestRange(begin, end, args); - this._requests = []; - this._queuedChunk = null; - this._done = false; - this._storedError = undefined; - this.onProgress = null; - this.onClosed = null; - } - _close() { - this.onClosed?.(this); - } - _onDone(data) { - const chunk = data.chunk; - if (this._requests.length > 0) { - const requestCapability = this._requests.shift(); - requestCapability.resolve({ - value: chunk, - done: false - }); - } else { - this._queuedChunk = chunk; - } - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - this._close(); - } - _onError(status) { - this._storedError = (0, _network_utils.createResponseStatusError)(status, this._url); - for (const requestCapability of this._requests) { - requestCapability.reject(this._storedError); - } - this._requests.length = 0; - this._queuedChunk = null; - } - _onProgress(evt) { - if (!this.isStreamingSupported) { - this.onProgress?.({ - loaded: evt.loaded - }); - } - } - get isStreamingSupported() { - return false; - } - async read() { - if (this._storedError) { - throw this._storedError; - } - if (this._queuedChunk !== null) { - const chunk = this._queuedChunk; - this._queuedChunk = null; - return { - value: chunk, - done: false - }; - } - if (this._done) { - return { - value: undefined, - done: true - }; - } - const requestCapability = (0, _util.createPromiseCapability)(); - this._requests.push(requestCapability); - return requestCapability.promise; - } - cancel(reason) { - this._done = true; - for (const requestCapability of this._requests) { - requestCapability.resolve({ - value: undefined, - done: true - }); - } - this._requests.length = 0; - if (this._manager.isPendingRequest(this._requestId)) { - this._manager.abortRequest(this._requestId); - } - this._close(); - } -} - -/***/ }), -/* 25 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.PDFFetchStream = void 0; -var _util = __w_pdfjs_require__(1); -var _network_utils = __w_pdfjs_require__(22); -; -function createFetchOptions(headers, withCredentials, abortController) { - return { - method: "GET", - headers, - signal: abortController.signal, - mode: "cors", - credentials: withCredentials ? "include" : "same-origin", - redirect: "follow" - }; -} -function createHeaders(httpHeaders) { - const headers = new Headers(); - for (const property in httpHeaders) { - const value = httpHeaders[property]; - if (value === undefined) { - continue; - } - headers.append(property, value); - } - return headers; -} -function getArrayBuffer(val) { - if (val instanceof Uint8Array) { - return val.buffer; - } - if (val instanceof ArrayBuffer) { - return val; - } - (0, _util.warn)(`getArrayBuffer - unexpected data format: ${val}`); - return new Uint8Array(val).buffer; -} -class PDFFetchStream { - constructor(source) { - this.source = source; - this.isHttp = /^https?:/i.test(source.url); - this.httpHeaders = this.isHttp && source.httpHeaders || {}; - this._fullRequestReader = null; - this._rangeRequestReaders = []; - } - get _progressiveDataLength() { - return this._fullRequestReader?._loaded ?? 0; - } - getFullReader() { - (0, _util.assert)(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once."); - this._fullRequestReader = new PDFFetchStreamReader(this); - return this._fullRequestReader; - } - getRangeReader(begin, end) { - if (end <= this._progressiveDataLength) { - return null; - } - const reader = new PDFFetchStreamRangeReader(this, begin, end); - this._rangeRequestReaders.push(reader); - return reader; - } - cancelAllRequests(reason) { - this._fullRequestReader?.cancel(reason); - for (const reader of this._rangeRequestReaders.slice(0)) { - reader.cancel(reason); - } - } -} -exports.PDFFetchStream = PDFFetchStream; -class PDFFetchStreamReader { - constructor(stream) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - this._filename = null; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._contentLength = source.length; - this._headersCapability = (0, _util.createPromiseCapability)(); - this._disableRange = source.disableRange || false; - this._rangeChunkSize = source.rangeChunkSize; - if (!this._rangeChunkSize && !this._disableRange) { - this._disableRange = true; - } - this._abortController = new AbortController(); - this._isStreamingSupported = !source.disableStream; - this._isRangeSupported = !source.disableRange; - this._headers = createHeaders(this._stream.httpHeaders); - const url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { - if (!(0, _network_utils.validateResponseStatus)(response.status)) { - throw (0, _network_utils.createResponseStatusError)(response.status, url); - } - this._reader = response.body.getReader(); - this._headersCapability.resolve(); - const getResponseHeader = name => { - return response.headers.get(name); - }; - const { - allowRangeRequests, - suggestedLength - } = (0, _network_utils.validateRangeRequestCapabilities)({ - getResponseHeader, - isHttp: this._stream.isHttp, - rangeChunkSize: this._rangeChunkSize, - disableRange: this._disableRange - }); - this._isRangeSupported = allowRangeRequests; - this._contentLength = suggestedLength || this._contentLength; - this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader); - if (!this._isStreamingSupported && this._isRangeSupported) { - this.cancel(new _util.AbortException("Streaming is disabled.")); - } - }).catch(this._headersCapability.reject); - this.onProgress = null; - } - get headersReady() { - return this._headersCapability.promise; - } - get filename() { - return this._filename; - } - get contentLength() { - return this._contentLength; - } - get isRangeSupported() { - return this._isRangeSupported; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - async read() { - await this._headersCapability.promise; - const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value, - done - }; - } - this._loaded += value.byteLength; - this.onProgress?.({ - loaded: this._loaded, - total: this._contentLength - }); - return { - value: getArrayBuffer(value), - done: false - }; - } - cancel(reason) { - this._reader?.cancel(reason); - this._abortController.abort(); - } -} -class PDFFetchStreamRangeReader { - constructor(stream, begin, end) { - this._stream = stream; - this._reader = null; - this._loaded = 0; - const source = stream.source; - this._withCredentials = source.withCredentials || false; - this._readCapability = (0, _util.createPromiseCapability)(); - this._isStreamingSupported = !source.disableStream; - this._abortController = new AbortController(); - this._headers = createHeaders(this._stream.httpHeaders); - this._headers.append("Range", `bytes=${begin}-${end - 1}`); - const url = source.url; - fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(response => { - if (!(0, _network_utils.validateResponseStatus)(response.status)) { - throw (0, _network_utils.createResponseStatusError)(response.status, url); - } - this._readCapability.resolve(); - this._reader = response.body.getReader(); - }).catch(this._readCapability.reject); - this.onProgress = null; - } - get isStreamingSupported() { - return this._isStreamingSupported; - } - async read() { - await this._readCapability.promise; - const { - value, - done - } = await this._reader.read(); - if (done) { - return { - value, - done - }; - } - this._loaded += value.byteLength; - this.onProgress?.({ - loaded: this._loaded - }); - return { - value: getArrayBuffer(value), - done: false - }; - } - cancel(reason) { - this._reader?.cancel(reason); - this._abortController.abort(); - } -} - -/***/ }), -/* 26 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.TextLayerRenderTask = void 0; -exports.renderTextLayer = renderTextLayer; -exports.updateTextLayer = updateTextLayer; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -const MAX_TEXT_DIVS_TO_RENDER = 100000; -const DEFAULT_FONT_SIZE = 30; -const DEFAULT_FONT_ASCENT = 0.8; -const ascentCache = new Map(); -function getCtx(size, isOffscreenCanvasSupported) { - let ctx; - if (isOffscreenCanvasSupported && _util.FeatureTest.isOffscreenCanvasSupported) { - ctx = new OffscreenCanvas(size, size).getContext("2d", { - alpha: false - }); - } else { - const canvas = document.createElement("canvas"); - canvas.width = canvas.height = size; - ctx = canvas.getContext("2d", { - alpha: false - }); - } - return ctx; -} -function getAscent(fontFamily, isOffscreenCanvasSupported) { - const cachedAscent = ascentCache.get(fontFamily); - if (cachedAscent) { - return cachedAscent; - } - const ctx = getCtx(DEFAULT_FONT_SIZE, isOffscreenCanvasSupported); - ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`; - const metrics = ctx.measureText(""); - let ascent = metrics.fontBoundingBoxAscent; - let descent = Math.abs(metrics.fontBoundingBoxDescent); - if (ascent) { - const ratio = ascent / (ascent + descent); - ascentCache.set(fontFamily, ratio); - ctx.canvas.width = ctx.canvas.height = 0; - return ratio; - } - ctx.strokeStyle = "red"; - ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); - ctx.strokeText("g", 0, 0); - let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; - descent = 0; - for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) { - if (pixels[i] > 0) { - descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE); - break; - } - } - ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE); - ctx.strokeText("A", 0, DEFAULT_FONT_SIZE); - pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data; - ascent = 0; - for (let i = 0, ii = pixels.length; i < ii; i += 4) { - if (pixels[i] > 0) { - ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE); - break; - } - } - ctx.canvas.width = ctx.canvas.height = 0; - if (ascent) { - const ratio = ascent / (ascent + descent); - ascentCache.set(fontFamily, ratio); - return ratio; - } - ascentCache.set(fontFamily, DEFAULT_FONT_ASCENT); - return DEFAULT_FONT_ASCENT; -} -function appendText(task, geom, styles) { - const textDiv = document.createElement("span"); - const textDivProperties = { - angle: 0, - canvasWidth: 0, - hasText: geom.str !== "", - hasEOL: geom.hasEOL, - fontSize: 0 - }; - task._textDivs.push(textDiv); - const tx = _util.Util.transform(task._transform, geom.transform); - let angle = Math.atan2(tx[1], tx[0]); - const style = styles[geom.fontName]; - if (style.vertical) { - angle += Math.PI / 2; - } - const fontHeight = Math.hypot(tx[2], tx[3]); - const fontAscent = fontHeight * getAscent(style.fontFamily, task._isOffscreenCanvasSupported); - let left, top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + fontAscent * Math.sin(angle); - top = tx[5] - fontAscent * Math.cos(angle); - } - const scaleFactorStr = "calc(var(--scale-factor)*"; - const divStyle = textDiv.style; - if (task._container === task._rootContainer) { - divStyle.left = `${(100 * left / task._pageWidth).toFixed(2)}%`; - divStyle.top = `${(100 * top / task._pageHeight).toFixed(2)}%`; - } else { - divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; - divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; - } - divStyle.fontSize = `${scaleFactorStr}${fontHeight.toFixed(2)}px)`; - divStyle.fontFamily = style.fontFamily; - textDivProperties.fontSize = fontHeight; - textDiv.setAttribute("role", "presentation"); - textDiv.textContent = geom.str; - textDiv.dir = geom.dir; - if (task._fontInspectorEnabled) { - textDiv.dataset.fontName = geom.fontName; - } - if (angle !== 0) { - textDivProperties.angle = angle * (180 / Math.PI); - } - let shouldScaleText = false; - if (geom.str.length > 1) { - shouldScaleText = true; - } else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) { - const absScaleX = Math.abs(geom.transform[0]), - absScaleY = Math.abs(geom.transform[3]); - if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) { - shouldScaleText = true; - } - } - if (shouldScaleText) { - textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width; - } - task._textDivProperties.set(textDiv, textDivProperties); - if (task._isReadableStream) { - task._layoutText(textDiv); - } -} -function layout(params) { - const { - div, - scale, - properties, - ctx, - prevFontSize, - prevFontFamily - } = params; - const { - style - } = div; - let transform = ""; - if (properties.canvasWidth !== 0 && properties.hasText) { - const { - fontFamily - } = style; - const { - canvasWidth, - fontSize - } = properties; - if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) { - ctx.font = `${fontSize * scale}px ${fontFamily}`; - params.prevFontSize = fontSize; - params.prevFontFamily = fontFamily; - } - const { - width - } = ctx.measureText(div.textContent); - if (width > 0) { - transform = `scaleX(${canvasWidth * scale / width})`; - } - } - if (properties.angle !== 0) { - transform = `rotate(${properties.angle}deg) ${transform}`; - } - if (transform.length > 0) { - style.transform = transform; - } -} -function render(task) { - if (task._canceled) { - return; - } - const textDivs = task._textDivs; - const capability = task._capability; - const textDivsLength = textDivs.length; - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - capability.resolve(); - return; - } - if (!task._isReadableStream) { - for (const textDiv of textDivs) { - task._layoutText(textDiv); - } - } - capability.resolve(); -} -class TextLayerRenderTask { - constructor({ - textContentSource, - container, - viewport, - textDivs, - textDivProperties, - textContentItemsStr, - isOffscreenCanvasSupported - }) { - this._textContentSource = textContentSource; - this._isReadableStream = textContentSource instanceof ReadableStream; - this._container = this._rootContainer = container; - this._textDivs = textDivs || []; - this._textContentItemsStr = textContentItemsStr || []; - this._fontInspectorEnabled = !!globalThis.FontInspector?.enabled; - this._reader = null; - this._textDivProperties = textDivProperties || new WeakMap(); - this._canceled = false; - this._capability = (0, _util.createPromiseCapability)(); - this._layoutTextParams = { - prevFontSize: null, - prevFontFamily: null, - div: null, - scale: viewport.scale * (globalThis.devicePixelRatio || 1), - properties: null, - ctx: getCtx(0, isOffscreenCanvasSupported) - }; - const { - pageWidth, - pageHeight, - pageX, - pageY - } = viewport.rawDims; - this._transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; - this._pageWidth = pageWidth; - this._pageHeight = pageHeight; - (0, _display_utils.setLayerDimensions)(container, viewport); - this._capability.promise.finally(() => { - this._layoutTextParams = null; - }).catch(() => {}); - } - get promise() { - return this._capability.promise; - } - cancel() { - this._canceled = true; - if (this._reader) { - this._reader.cancel(new _util.AbortException("TextLayer task cancelled.")).catch(() => {}); - this._reader = null; - } - this._capability.reject(new _util.AbortException("TextLayer task cancelled.")); - } - _processItems(items, styleCache) { - for (const item of items) { - if (item.str === undefined) { - if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") { - const parent = this._container; - this._container = document.createElement("span"); - this._container.classList.add("markedContent"); - if (item.id !== null) { - this._container.setAttribute("id", `${item.id}`); - } - parent.append(this._container); - } else if (item.type === "endMarkedContent") { - this._container = this._container.parentNode; - } - continue; - } - this._textContentItemsStr.push(item.str); - appendText(this, item, styleCache); - } - } - _layoutText(textDiv) { - const textDivProperties = this._layoutTextParams.properties = this._textDivProperties.get(textDiv); - this._layoutTextParams.div = textDiv; - layout(this._layoutTextParams); - if (textDivProperties.hasText) { - this._container.append(textDiv); - } - if (textDivProperties.hasEOL) { - const br = document.createElement("br"); - br.setAttribute("role", "presentation"); - this._container.append(br); - } - } - _render() { - const capability = (0, _util.createPromiseCapability)(); - let styleCache = Object.create(null); - if (this._isReadableStream) { - const pump = () => { - this._reader.read().then(({ - value, - done - }) => { - if (done) { - capability.resolve(); - return; - } - Object.assign(styleCache, value.styles); - this._processItems(value.items, styleCache); - pump(); - }, capability.reject); - }; - this._reader = this._textContentSource.getReader(); - pump(); - } else if (this._textContentSource) { - const { - items, - styles - } = this._textContentSource; - this._processItems(items, styles); - capability.resolve(); - } else { - throw new Error('No "textContentSource" parameter specified.'); - } - capability.promise.then(() => { - styleCache = null; - render(this); - }, this._capability.reject); - } -} -exports.TextLayerRenderTask = TextLayerRenderTask; -function renderTextLayer(params) { - if (!params.textContentSource && (params.textContent || params.textContentStream)) { - (0, _display_utils.deprecated)("The TextLayerRender `textContent`/`textContentStream` parameters " + "will be removed in the future, please use `textContentSource` instead."); - params.textContentSource = params.textContent || params.textContentStream; - } - const task = new TextLayerRenderTask(params); - task._render(); - return task; -} -function updateTextLayer({ - container, - viewport, - textDivs, - textDivProperties, - isOffscreenCanvasSupported, - mustRotate = true, - mustRescale = true -}) { - if (mustRotate) { - (0, _display_utils.setLayerDimensions)(container, { - rotation: viewport.rotation - }); - } - if (mustRescale) { - const ctx = getCtx(0, isOffscreenCanvasSupported); - const scale = viewport.scale * (globalThis.devicePixelRatio || 1); - const params = { - prevFontSize: null, - prevFontFamily: null, - div: null, - scale, - properties: null, - ctx - }; - for (const div of textDivs) { - params.properties = textDivProperties.get(div); - params.div = div; - layout(params); - } - } -} - -/***/ }), -/* 27 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AnnotationEditorLayer = void 0; -var _util = __w_pdfjs_require__(1); -var _tools = __w_pdfjs_require__(5); -var _freetext = __w_pdfjs_require__(28); -var _ink = __w_pdfjs_require__(29); -var _display_utils = __w_pdfjs_require__(6); -class AnnotationEditorLayer { - #accessibilityManager; - #allowClick = false; - #boundPointerup = this.pointerup.bind(this); - #boundPointerdown = this.pointerdown.bind(this); - #editors = new Map(); - #hadPointerDown = false; - #isCleaningUp = false; - #uiManager; - static _initialized = false; - constructor(options) { - if (!AnnotationEditorLayer._initialized) { - AnnotationEditorLayer._initialized = true; - _freetext.FreeTextEditor.initialize(options.l10n); - _ink.InkEditor.initialize(options.l10n); - } - options.uiManager.registerEditorTypes([_freetext.FreeTextEditor, _ink.InkEditor]); - this.#uiManager = options.uiManager; - this.pageIndex = options.pageIndex; - this.div = options.div; - this.#accessibilityManager = options.accessibilityManager; - this.#uiManager.addLayer(this); - } - updateToolbar(mode) { - this.#uiManager.updateToolbar(mode); - } - updateMode(mode = this.#uiManager.getMode()) { - this.#cleanup(); - if (mode === _util.AnnotationEditorType.INK) { - this.addInkEditorIfNeeded(false); - this.disableClick(); - } else { - this.enableClick(); - } - this.#uiManager.unselectAll(); - this.div.classList.toggle("freeTextEditing", mode === _util.AnnotationEditorType.FREETEXT); - this.div.classList.toggle("inkEditing", mode === _util.AnnotationEditorType.INK); - } - addInkEditorIfNeeded(isCommitting) { - if (!isCommitting && this.#uiManager.getMode() !== _util.AnnotationEditorType.INK) { - return; - } - if (!isCommitting) { - for (const editor of this.#editors.values()) { - if (editor.isEmpty()) { - editor.setInBackground(); - return; - } - } - } - const editor = this.#createAndAddNewEditor({ - offsetX: 0, - offsetY: 0 - }); - editor.setInBackground(); - } - setEditingState(isEditing) { - this.#uiManager.setEditingState(isEditing); - } - addCommands(params) { - this.#uiManager.addCommands(params); - } - enable() { - this.div.style.pointerEvents = "auto"; - for (const editor of this.#editors.values()) { - editor.enableEditing(); - } - } - disable() { - this.div.style.pointerEvents = "none"; - for (const editor of this.#editors.values()) { - editor.disableEditing(); - } - } - setActiveEditor(editor) { - const currentActive = this.#uiManager.getActive(); - if (currentActive === editor) { - return; - } - this.#uiManager.setActiveEditor(editor); - } - enableClick() { - this.div.addEventListener("pointerdown", this.#boundPointerdown); - this.div.addEventListener("pointerup", this.#boundPointerup); - } - disableClick() { - this.div.removeEventListener("pointerdown", this.#boundPointerdown); - this.div.removeEventListener("pointerup", this.#boundPointerup); - } - attach(editor) { - this.#editors.set(editor.id, editor); - } - detach(editor) { - this.#editors.delete(editor.id); - this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); - } - remove(editor) { - this.#uiManager.removeEditor(editor); - this.detach(editor); - editor.div.style.display = "none"; - setTimeout(() => { - editor.div.style.display = ""; - editor.div.remove(); - editor.isAttachedToDOM = false; - if (document.activeElement === document.body) { - this.#uiManager.focusMainContainer(); - } - }, 0); - if (!this.#isCleaningUp) { - this.addInkEditorIfNeeded(false); - } - } - #changeParent(editor) { - if (editor.parent === this) { - return; - } - this.attach(editor); - editor.parent?.detach(editor); - editor.setParent(this); - if (editor.div && editor.isAttachedToDOM) { - editor.div.remove(); - this.div.append(editor.div); - } - } - add(editor) { - this.#changeParent(editor); - this.#uiManager.addEditor(editor); - this.attach(editor); - if (!editor.isAttachedToDOM) { - const div = editor.render(); - this.div.append(div); - editor.isAttachedToDOM = true; - } - this.moveEditorInDOM(editor); - editor.onceAdded(); - this.#uiManager.addToAnnotationStorage(editor); - } - moveEditorInDOM(editor) { - this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); - } - addOrRebuild(editor) { - if (editor.needsToBeRebuilt()) { - editor.rebuild(); - } else { - this.add(editor); - } - } - addANewEditor(editor) { - const cmd = () => { - this.addOrRebuild(editor); - }; - const undo = () => { - editor.remove(); - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); - } - addUndoableEditor(editor) { - const cmd = () => { - this.addOrRebuild(editor); - }; - const undo = () => { - editor.remove(); - }; - this.addCommands({ - cmd, - undo, - mustExec: false - }); - } - getNextId() { - return this.#uiManager.getId(); - } - #createNewEditor(params) { - switch (this.#uiManager.getMode()) { - case _util.AnnotationEditorType.FREETEXT: - return new _freetext.FreeTextEditor(params); - case _util.AnnotationEditorType.INK: - return new _ink.InkEditor(params); - } - return null; - } - deserialize(data) { - switch (data.annotationType) { - case _util.AnnotationEditorType.FREETEXT: - return _freetext.FreeTextEditor.deserialize(data, this, this.#uiManager); - case _util.AnnotationEditorType.INK: - return _ink.InkEditor.deserialize(data, this, this.#uiManager); - } - return null; - } - #createAndAddNewEditor(event) { - const id = this.getNextId(); - const editor = this.#createNewEditor({ - parent: this, - id, - x: event.offsetX, - y: event.offsetY, - uiManager: this.#uiManager - }); - if (editor) { - this.add(editor); - } - return editor; - } - setSelected(editor) { - this.#uiManager.setSelected(editor); - } - toggleSelected(editor) { - this.#uiManager.toggleSelected(editor); - } - isSelected(editor) { - return this.#uiManager.isSelected(editor); - } - unselect(editor) { - this.#uiManager.unselect(editor); - } - pointerup(event) { - const { - isMac - } = _util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { - return; - } - if (event.target !== this.div) { - return; - } - if (!this.#hadPointerDown) { - return; - } - this.#hadPointerDown = false; - if (!this.#allowClick) { - this.#allowClick = true; - return; - } - this.#createAndAddNewEditor(event); - } - pointerdown(event) { - const { - isMac - } = _util.FeatureTest.platform; - if (event.button !== 0 || event.ctrlKey && isMac) { - return; - } - if (event.target !== this.div) { - return; - } - this.#hadPointerDown = true; - const editor = this.#uiManager.getActive(); - this.#allowClick = !editor || editor.isEmpty(); - } - drop(event) { - const id = event.dataTransfer.getData("text/plain"); - const editor = this.#uiManager.getEditor(id); - if (!editor) { - return; - } - event.preventDefault(); - event.dataTransfer.dropEffect = "move"; - this.#changeParent(editor); - const rect = this.div.getBoundingClientRect(); - const endX = event.clientX - rect.x; - const endY = event.clientY - rect.y; - editor.translate(endX - editor.startX, endY - editor.startY); - this.moveEditorInDOM(editor); - editor.div.focus(); - } - dragover(event) { - event.preventDefault(); - } - destroy() { - if (this.#uiManager.getActive()?.parent === this) { - this.#uiManager.setActiveEditor(null); - } - for (const editor of this.#editors.values()) { - this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); - editor.setParent(null); - editor.isAttachedToDOM = false; - editor.div.remove(); - } - this.div = null; - this.#editors.clear(); - this.#uiManager.removeLayer(this); - } - #cleanup() { - this.#isCleaningUp = true; - for (const editor of this.#editors.values()) { - if (editor.isEmpty()) { - editor.remove(); - } - } - this.#isCleaningUp = false; - } - render({ - viewport - }) { - this.viewport = viewport; - (0, _display_utils.setLayerDimensions)(this.div, viewport); - (0, _tools.bindEvents)(this, this.div, ["dragover", "drop"]); - for (const editor of this.#uiManager.getEditors(this.pageIndex)) { - this.add(editor); - } - this.updateMode(); - } - update({ - viewport - }) { - this.#uiManager.commitOrRemove(); - this.viewport = viewport; - (0, _display_utils.setLayerDimensions)(this.div, { - rotation: viewport.rotation - }); - this.updateMode(); - } - get pageDimensions() { - const { - pageWidth, - pageHeight - } = this.viewport.rawDims; - return [pageWidth, pageHeight]; - } -} -exports.AnnotationEditorLayer = AnnotationEditorLayer; - -/***/ }), -/* 28 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.FreeTextEditor = void 0; -var _util = __w_pdfjs_require__(1); -var _tools = __w_pdfjs_require__(5); -var _editor = __w_pdfjs_require__(4); -class FreeTextEditor extends _editor.AnnotationEditor { - #boundEditorDivBlur = this.editorDivBlur.bind(this); - #boundEditorDivFocus = this.editorDivFocus.bind(this); - #boundEditorDivInput = this.editorDivInput.bind(this); - #boundEditorDivKeydown = this.editorDivKeydown.bind(this); - #color; - #content = ""; - #editorDivId = `${this.id}-editor`; - #hasAlreadyBeenCommitted = false; - #fontSize; - static _freeTextDefaultContent = ""; - static _l10nPromise; - static _internalPadding = 0; - static _defaultColor = null; - static _defaultFontSize = 10; - static _keyboardManager = new _tools.KeyboardManager([[["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], FreeTextEditor.prototype.commitOrRemove]]); - static _type = "freetext"; - constructor(params) { - super({ - ...params, - name: "freeTextEditor" - }); - this.#color = params.color || FreeTextEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor; - this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; - } - static initialize(l10n) { - this._l10nPromise = new Map(["free_text2_default_content", "editor_free_text2_aria_label"].map(str => [str, l10n.get(str)])); - const style = getComputedStyle(document.documentElement); - this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); - } - static updateDefaultParams(type, value) { - switch (type) { - case _util.AnnotationEditorParamsType.FREETEXT_SIZE: - FreeTextEditor._defaultFontSize = value; - break; - case _util.AnnotationEditorParamsType.FREETEXT_COLOR: - FreeTextEditor._defaultColor = value; - break; - } - } - updateParams(type, value) { - switch (type) { - case _util.AnnotationEditorParamsType.FREETEXT_SIZE: - this.#updateFontSize(value); - break; - case _util.AnnotationEditorParamsType.FREETEXT_COLOR: - this.#updateColor(value); - break; - } - } - static get defaultPropertiesToUpdate() { - return [[_util.AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [_util.AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor]]; - } - get propertiesToUpdate() { - return [[_util.AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [_util.AnnotationEditorParamsType.FREETEXT_COLOR, this.#color]]; - } - #updateFontSize(fontSize) { - const setFontsize = size => { - this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`; - this.translate(0, -(size - this.#fontSize) * this.parentScale); - this.#fontSize = size; - this.#setEditorDimensions(); - }; - const savedFontsize = this.#fontSize; - this.addCommands({ - cmd: () => { - setFontsize(fontSize); - }, - undo: () => { - setFontsize(savedFontsize); - }, - mustExec: true, - type: _util.AnnotationEditorParamsType.FREETEXT_SIZE, - overwriteIfSameType: true, - keepUndo: true - }); - } - #updateColor(color) { - const savedColor = this.#color; - this.addCommands({ - cmd: () => { - this.#color = this.editorDiv.style.color = color; - }, - undo: () => { - this.#color = this.editorDiv.style.color = savedColor; - }, - mustExec: true, - type: _util.AnnotationEditorParamsType.FREETEXT_COLOR, - overwriteIfSameType: true, - keepUndo: true - }); - } - getInitialTranslation() { - const scale = this.parentScale; - return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; - } - rebuild() { - super.rebuild(); - if (this.div === null) { - return; - } - if (!this.isAttachedToDOM) { - this.parent.add(this); - } - } - enableEditMode() { - if (this.isInEditMode()) { - return; - } - this.parent.setEditingState(false); - this.parent.updateToolbar(_util.AnnotationEditorType.FREETEXT); - super.enableEditMode(); - this.overlayDiv.classList.remove("enabled"); - this.editorDiv.contentEditable = true; - this.div.draggable = false; - this.div.removeAttribute("aria-activedescendant"); - this.editorDiv.addEventListener("keydown", this.#boundEditorDivKeydown); - this.editorDiv.addEventListener("focus", this.#boundEditorDivFocus); - this.editorDiv.addEventListener("blur", this.#boundEditorDivBlur); - this.editorDiv.addEventListener("input", this.#boundEditorDivInput); - } - disableEditMode() { - if (!this.isInEditMode()) { - return; - } - this.parent.setEditingState(true); - super.disableEditMode(); - this.overlayDiv.classList.add("enabled"); - this.editorDiv.contentEditable = false; - this.div.setAttribute("aria-activedescendant", this.#editorDivId); - this.div.draggable = true; - this.editorDiv.removeEventListener("keydown", this.#boundEditorDivKeydown); - this.editorDiv.removeEventListener("focus", this.#boundEditorDivFocus); - this.editorDiv.removeEventListener("blur", this.#boundEditorDivBlur); - this.editorDiv.removeEventListener("input", this.#boundEditorDivInput); - this.div.focus({ - preventScroll: true - }); - this.isEditing = false; - this.parent.div.classList.add("freeTextEditing"); - } - focusin(event) { - super.focusin(event); - if (event.target !== this.editorDiv) { - this.editorDiv.focus(); - } - } - onceAdded() { - if (this.width) { - return; - } - this.enableEditMode(); - this.editorDiv.focus(); - } - isEmpty() { - return !this.editorDiv || this.editorDiv.innerText.trim() === ""; - } - remove() { - this.isEditing = false; - this.parent.setEditingState(true); - this.parent.div.classList.add("freeTextEditing"); - super.remove(); - } - #extractText() { - const divs = this.editorDiv.getElementsByTagName("div"); - if (divs.length === 0) { - return this.editorDiv.innerText; - } - const buffer = []; - for (const div of divs) { - buffer.push(div.innerText.replace(/\r\n?|\n/, "")); - } - return buffer.join("\n"); - } - #setEditorDimensions() { - const [parentWidth, parentHeight] = this.parentDimensions; - let rect; - if (this.isAttachedToDOM) { - rect = this.div.getBoundingClientRect(); - } else { - const { - currentLayer, - div - } = this; - const savedDisplay = div.style.display; - div.style.display = "hidden"; - currentLayer.div.append(this.div); - rect = div.getBoundingClientRect(); - div.remove(); - div.style.display = savedDisplay; - } - this.width = rect.width / parentWidth; - this.height = rect.height / parentHeight; - } - commit() { - if (!this.isInEditMode()) { - return; - } - super.commit(); - if (!this.#hasAlreadyBeenCommitted) { - this.#hasAlreadyBeenCommitted = true; - this.parent.addUndoableEditor(this); - } - this.disableEditMode(); - this.#content = this.#extractText().trimEnd(); - this.#setEditorDimensions(); - } - shouldGetKeyboardEvents() { - return this.isInEditMode(); - } - dblclick(event) { - this.enableEditMode(); - this.editorDiv.focus(); - } - keydown(event) { - if (event.target === this.div && event.key === "Enter") { - this.enableEditMode(); - this.editorDiv.focus(); - } - } - editorDivKeydown(event) { - FreeTextEditor._keyboardManager.exec(this, event); - } - editorDivFocus(event) { - this.isEditing = true; - } - editorDivBlur(event) { - this.isEditing = false; - } - editorDivInput(event) { - this.parent.div.classList.toggle("freeTextEditing", this.isEmpty()); - } - disableEditing() { - this.editorDiv.setAttribute("role", "comment"); - this.editorDiv.removeAttribute("aria-multiline"); - } - enableEditing() { - this.editorDiv.setAttribute("role", "textbox"); - this.editorDiv.setAttribute("aria-multiline", true); - } - render() { - if (this.div) { - return this.div; - } - let baseX, baseY; - if (this.width) { - baseX = this.x; - baseY = this.y; - } - super.render(); - this.editorDiv = document.createElement("div"); - this.editorDiv.className = "internal"; - this.editorDiv.setAttribute("id", this.#editorDivId); - this.enableEditing(); - FreeTextEditor._l10nPromise.get("editor_free_text2_aria_label").then(msg => this.editorDiv?.setAttribute("aria-label", msg)); - FreeTextEditor._l10nPromise.get("free_text2_default_content").then(msg => this.editorDiv?.setAttribute("default-content", msg)); - this.editorDiv.contentEditable = true; - const { - style - } = this.editorDiv; - style.fontSize = `calc(${this.#fontSize}px * var(--scale-factor))`; - style.color = this.#color; - this.div.append(this.editorDiv); - this.overlayDiv = document.createElement("div"); - this.overlayDiv.classList.add("overlay", "enabled"); - this.div.append(this.overlayDiv); - (0, _tools.bindEvents)(this, this.div, ["dblclick", "keydown"]); - if (this.width) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); - for (const line of this.#content.split("\n")) { - const div = document.createElement("div"); - div.append(line ? document.createTextNode(line) : document.createElement("br")); - this.editorDiv.append(div); - } - this.div.draggable = true; - this.editorDiv.contentEditable = false; - } else { - this.div.draggable = false; - this.editorDiv.contentEditable = true; - } - return this.div; - } - get contentDiv() { - return this.editorDiv; - } - static deserialize(data, parent, uiManager) { - const editor = super.deserialize(data, parent, uiManager); - editor.#fontSize = data.fontSize; - editor.#color = _util.Util.makeHexColor(...data.color); - editor.#content = data.value; - return editor; - } - serialize() { - if (this.isEmpty()) { - return null; - } - const padding = FreeTextEditor._internalPadding * this.parentScale; - const rect = this.getRect(padding, padding); - const color = _editor.AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.#color); - return { - annotationType: _util.AnnotationEditorType.FREETEXT, - color, - fontSize: this.#fontSize, - value: this.#content, - pageIndex: this.pageIndex, - rect, - rotation: this.rotation - }; - } -} -exports.FreeTextEditor = FreeTextEditor; - -/***/ }), -/* 29 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.InkEditor = void 0; -Object.defineProperty(exports, "fitCurve", ({ - enumerable: true, - get: function () { - return _pdfjsFitCurve.fitCurve; - } -})); -var _util = __w_pdfjs_require__(1); -var _editor = __w_pdfjs_require__(4); -var _pdfjsFitCurve = __w_pdfjs_require__(30); -var _tools = __w_pdfjs_require__(5); -const RESIZER_SIZE = 16; -const TIME_TO_WAIT_BEFORE_FIXING_DIMS = 100; -class InkEditor extends _editor.AnnotationEditor { - #aspectRatio = 0; - #baseHeight = 0; - #baseWidth = 0; - #boundCanvasPointermove = this.canvasPointermove.bind(this); - #boundCanvasPointerleave = this.canvasPointerleave.bind(this); - #boundCanvasPointerup = this.canvasPointerup.bind(this); - #boundCanvasPointerdown = this.canvasPointerdown.bind(this); - #disableEditing = false; - #isCanvasInitialized = false; - #lastPoint = null; - #observer = null; - #realWidth = 0; - #realHeight = 0; - #requestFrameCallback = null; - static _defaultColor = null; - static _defaultOpacity = 1; - static _defaultThickness = 1; - static _l10nPromise; - static _type = "ink"; - constructor(params) { - super({ - ...params, - name: "inkEditor" - }); - this.color = params.color || null; - this.thickness = params.thickness || null; - this.opacity = params.opacity || null; - this.paths = []; - this.bezierPath2D = []; - this.currentPath = []; - this.scaleFactor = 1; - this.translationX = this.translationY = 0; - this.x = 0; - this.y = 0; - } - static initialize(l10n) { - this._l10nPromise = new Map(["editor_ink_canvas_aria_label", "editor_ink2_aria_label"].map(str => [str, l10n.get(str)])); - } - static updateDefaultParams(type, value) { - switch (type) { - case _util.AnnotationEditorParamsType.INK_THICKNESS: - InkEditor._defaultThickness = value; - break; - case _util.AnnotationEditorParamsType.INK_COLOR: - InkEditor._defaultColor = value; - break; - case _util.AnnotationEditorParamsType.INK_OPACITY: - InkEditor._defaultOpacity = value / 100; - break; - } - } - updateParams(type, value) { - switch (type) { - case _util.AnnotationEditorParamsType.INK_THICKNESS: - this.#updateThickness(value); - break; - case _util.AnnotationEditorParamsType.INK_COLOR: - this.#updateColor(value); - break; - case _util.AnnotationEditorParamsType.INK_OPACITY: - this.#updateOpacity(value); - break; - } - } - static get defaultPropertiesToUpdate() { - return [[_util.AnnotationEditorParamsType.INK_THICKNESS, InkEditor._defaultThickness], [_util.AnnotationEditorParamsType.INK_COLOR, InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor], [_util.AnnotationEditorParamsType.INK_OPACITY, Math.round(InkEditor._defaultOpacity * 100)]]; - } - get propertiesToUpdate() { - return [[_util.AnnotationEditorParamsType.INK_THICKNESS, this.thickness || InkEditor._defaultThickness], [_util.AnnotationEditorParamsType.INK_COLOR, this.color || InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor], [_util.AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * (this.opacity ?? InkEditor._defaultOpacity))]]; - } - #updateThickness(thickness) { - const savedThickness = this.thickness; - this.addCommands({ - cmd: () => { - this.thickness = thickness; - this.#fitToContent(); - }, - undo: () => { - this.thickness = savedThickness; - this.#fitToContent(); - }, - mustExec: true, - type: _util.AnnotationEditorParamsType.INK_THICKNESS, - overwriteIfSameType: true, - keepUndo: true - }); - } - #updateColor(color) { - const savedColor = this.color; - this.addCommands({ - cmd: () => { - this.color = color; - this.#redraw(); - }, - undo: () => { - this.color = savedColor; - this.#redraw(); - }, - mustExec: true, - type: _util.AnnotationEditorParamsType.INK_COLOR, - overwriteIfSameType: true, - keepUndo: true - }); - } - #updateOpacity(opacity) { - opacity /= 100; - const savedOpacity = this.opacity; - this.addCommands({ - cmd: () => { - this.opacity = opacity; - this.#redraw(); - }, - undo: () => { - this.opacity = savedOpacity; - this.#redraw(); - }, - mustExec: true, - type: _util.AnnotationEditorParamsType.INK_OPACITY, - overwriteIfSameType: true, - keepUndo: true - }); - } - rebuild() { - super.rebuild(); - if (this.div === null) { - return; - } - if (!this.canvas) { - this.#createCanvas(); - this.#createObserver(); - } - if (!this.isAttachedToDOM) { - this.parent.add(this); - this.#setCanvasDims(); - } - this.#fitToContent(); - } - remove() { - if (this.canvas === null) { - return; - } - if (!this.isEmpty()) { - this.commit(); - } - this.canvas.width = this.canvas.height = 0; - this.canvas.remove(); - this.canvas = null; - this.#observer.disconnect(); - this.#observer = null; - super.remove(); - } - setParent(parent) { - if (!this.parent && parent) { - this._uiManager.removeShouldRescale(this); - } else if (this.parent && parent === null) { - this._uiManager.addShouldRescale(this); - } - super.setParent(parent); - } - onScaleChanging() { - const [parentWidth, parentHeight] = this.parentDimensions; - const width = this.width * parentWidth; - const height = this.height * parentHeight; - this.setDimensions(width, height); - } - enableEditMode() { - if (this.#disableEditing || this.canvas === null) { - return; - } - super.enableEditMode(); - this.div.draggable = false; - this.canvas.addEventListener("pointerdown", this.#boundCanvasPointerdown); - this.canvas.addEventListener("pointerup", this.#boundCanvasPointerup); - } - disableEditMode() { - if (!this.isInEditMode() || this.canvas === null) { - return; - } - super.disableEditMode(); - this.div.draggable = !this.isEmpty(); - this.div.classList.remove("editing"); - this.canvas.removeEventListener("pointerdown", this.#boundCanvasPointerdown); - this.canvas.removeEventListener("pointerup", this.#boundCanvasPointerup); - } - onceAdded() { - this.div.draggable = !this.isEmpty(); - } - isEmpty() { - return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0; - } - #getInitialBBox() { - const { - parentRotation, - parentDimensions: [width, height] - } = this; - switch (parentRotation) { - case 90: - return [0, height, height, width]; - case 180: - return [width, height, width, height]; - case 270: - return [width, 0, height, width]; - default: - return [0, 0, width, height]; - } - } - #setStroke() { - const { - ctx, - color, - opacity, - thickness, - parentScale, - scaleFactor - } = this; - ctx.lineWidth = thickness * parentScale / scaleFactor; - ctx.lineCap = "round"; - ctx.lineJoin = "round"; - ctx.miterLimit = 10; - ctx.strokeStyle = `${color}${(0, _tools.opacityToHex)(opacity)}`; - } - #startDrawing(x, y) { - this.isEditing = true; - if (!this.#isCanvasInitialized) { - this.#isCanvasInitialized = true; - this.#setCanvasDims(); - this.thickness ||= InkEditor._defaultThickness; - this.color ||= InkEditor._defaultColor || _editor.AnnotationEditor._defaultLineColor; - this.opacity ??= InkEditor._defaultOpacity; - } - this.currentPath.push([x, y]); - this.#lastPoint = null; - this.#setStroke(); - this.ctx.beginPath(); - this.ctx.moveTo(x, y); - this.#requestFrameCallback = () => { - if (!this.#requestFrameCallback) { - return; - } - if (this.#lastPoint) { - if (this.isEmpty()) { - this.ctx.setTransform(1, 0, 0, 1, 0, 0); - this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - } else { - this.#redraw(); - } - this.ctx.lineTo(...this.#lastPoint); - this.#lastPoint = null; - this.ctx.stroke(); - } - window.requestAnimationFrame(this.#requestFrameCallback); - }; - window.requestAnimationFrame(this.#requestFrameCallback); - } - #draw(x, y) { - const [lastX, lastY] = this.currentPath.at(-1); - if (x === lastX && y === lastY) { - return; - } - this.currentPath.push([x, y]); - this.#lastPoint = [x, y]; - } - #stopDrawing(x, y) { - this.ctx.closePath(); - this.#requestFrameCallback = null; - x = Math.min(Math.max(x, 0), this.canvas.width); - y = Math.min(Math.max(y, 0), this.canvas.height); - const [lastX, lastY] = this.currentPath.at(-1); - if (x !== lastX || y !== lastY) { - this.currentPath.push([x, y]); - } - let bezier; - if (this.currentPath.length !== 1) { - bezier = (0, _pdfjsFitCurve.fitCurve)(this.currentPath, 30, null); - } else { - const xy = [x, y]; - bezier = [[xy, xy.slice(), xy.slice(), xy]]; - } - const path2D = InkEditor.#buildPath2D(bezier); - this.currentPath.length = 0; - const cmd = () => { - this.paths.push(bezier); - this.bezierPath2D.push(path2D); - this.rebuild(); - }; - const undo = () => { - this.paths.pop(); - this.bezierPath2D.pop(); - if (this.paths.length === 0) { - this.remove(); - } else { - if (!this.canvas) { - this.#createCanvas(); - this.#createObserver(); - } - this.#fitToContent(); - } - }; - this.addCommands({ - cmd, - undo, - mustExec: true - }); - } - #redraw() { - if (this.isEmpty()) { - this.#updateTransform(); - return; - } - this.#setStroke(); - const { - canvas, - ctx - } = this; - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.clearRect(0, 0, canvas.width, canvas.height); - this.#updateTransform(); - for (const path of this.bezierPath2D) { - ctx.stroke(path); - } - } - commit() { - if (this.#disableEditing) { - return; - } - super.commit(); - this.isEditing = false; - this.disableEditMode(); - this.setInForeground(); - this.#disableEditing = true; - this.div.classList.add("disabled"); - this.#fitToContent(true); - this.parent.addInkEditorIfNeeded(true); - this.parent.moveEditorInDOM(this); - this.div.focus({ - preventScroll: true - }); - } - focusin(event) { - super.focusin(event); - this.enableEditMode(); - } - canvasPointerdown(event) { - if (event.button !== 0 || !this.isInEditMode() || this.#disableEditing) { - return; - } - this.setInForeground(); - if (event.type !== "mouse") { - this.div.focus(); - } - event.stopPropagation(); - this.canvas.addEventListener("pointerleave", this.#boundCanvasPointerleave); - this.canvas.addEventListener("pointermove", this.#boundCanvasPointermove); - this.#startDrawing(event.offsetX, event.offsetY); - } - canvasPointermove(event) { - event.stopPropagation(); - this.#draw(event.offsetX, event.offsetY); - } - canvasPointerup(event) { - if (event.button !== 0) { - return; - } - if (this.isInEditMode() && this.currentPath.length !== 0) { - event.stopPropagation(); - this.#endDrawing(event); - this.setInBackground(); - } - } - canvasPointerleave(event) { - this.#endDrawing(event); - this.setInBackground(); - } - #endDrawing(event) { - this.#stopDrawing(event.offsetX, event.offsetY); - this.canvas.removeEventListener("pointerleave", this.#boundCanvasPointerleave); - this.canvas.removeEventListener("pointermove", this.#boundCanvasPointermove); - this.addToAnnotationStorage(); - } - #createCanvas() { - this.canvas = document.createElement("canvas"); - this.canvas.width = this.canvas.height = 0; - this.canvas.className = "inkEditorCanvas"; - InkEditor._l10nPromise.get("editor_ink_canvas_aria_label").then(msg => this.canvas?.setAttribute("aria-label", msg)); - this.div.append(this.canvas); - this.ctx = this.canvas.getContext("2d"); - } - #createObserver() { - let timeoutId = null; - this.#observer = new ResizeObserver(entries => { - const rect = entries[0].contentRect; - if (rect.width && rect.height) { - if (timeoutId !== null) { - clearTimeout(timeoutId); - } - timeoutId = setTimeout(() => { - this.fixDims(); - timeoutId = null; - }, TIME_TO_WAIT_BEFORE_FIXING_DIMS); - this.setDimensions(rect.width, rect.height); - } - }); - this.#observer.observe(this.div); - } - render() { - if (this.div) { - return this.div; - } - let baseX, baseY; - if (this.width) { - baseX = this.x; - baseY = this.y; - } - super.render(); - InkEditor._l10nPromise.get("editor_ink2_aria_label").then(msg => this.div?.setAttribute("aria-label", msg)); - const [x, y, w, h] = this.#getInitialBBox(); - this.setAt(x, y, 0, 0); - this.setDims(w, h); - this.#createCanvas(); - if (this.width) { - const [parentWidth, parentHeight] = this.parentDimensions; - this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); - this.#isCanvasInitialized = true; - this.#setCanvasDims(); - this.setDims(this.width * parentWidth, this.height * parentHeight); - this.#redraw(); - this.#setMinDims(); - this.div.classList.add("disabled"); - } else { - this.div.classList.add("editing"); - this.enableEditMode(); - } - this.#createObserver(); - return this.div; - } - #setCanvasDims() { - if (!this.#isCanvasInitialized) { - return; - } - const [parentWidth, parentHeight] = this.parentDimensions; - this.canvas.width = Math.ceil(this.width * parentWidth); - this.canvas.height = Math.ceil(this.height * parentHeight); - this.#updateTransform(); - } - setDimensions(width, height) { - const roundedWidth = Math.round(width); - const roundedHeight = Math.round(height); - if (this.#realWidth === roundedWidth && this.#realHeight === roundedHeight) { - return; - } - this.#realWidth = roundedWidth; - this.#realHeight = roundedHeight; - this.canvas.style.visibility = "hidden"; - if (this.#aspectRatio && Math.abs(this.#aspectRatio - width / height) > 1e-2) { - height = Math.ceil(width / this.#aspectRatio); - this.setDims(width, height); - } - const [parentWidth, parentHeight] = this.parentDimensions; - this.width = width / parentWidth; - this.height = height / parentHeight; - if (this.#disableEditing) { - this.#setScaleFactor(width, height); - } - this.#setCanvasDims(); - this.#redraw(); - this.canvas.style.visibility = "visible"; - } - #setScaleFactor(width, height) { - const padding = this.#getPadding(); - const scaleFactorW = (width - padding) / this.#baseWidth; - const scaleFactorH = (height - padding) / this.#baseHeight; - this.scaleFactor = Math.min(scaleFactorW, scaleFactorH); - } - #updateTransform() { - const padding = this.#getPadding() / 2; - this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding); - } - static #buildPath2D(bezier) { - const path2D = new Path2D(); - for (let i = 0, ii = bezier.length; i < ii; i++) { - const [first, control1, control2, second] = bezier[i]; - if (i === 0) { - path2D.moveTo(...first); - } - path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]); - } - return path2D; - } - #serializePaths(s, tx, ty, h) { - const NUMBER_OF_POINTS_ON_BEZIER_CURVE = 4; - const paths = []; - const padding = this.thickness / 2; - let buffer, points; - for (const bezier of this.paths) { - buffer = []; - points = []; - for (let i = 0, ii = bezier.length; i < ii; i++) { - const [first, control1, control2, second] = bezier[i]; - const p10 = s * (first[0] + tx) + padding; - const p11 = h - s * (first[1] + ty) - padding; - const p20 = s * (control1[0] + tx) + padding; - const p21 = h - s * (control1[1] + ty) - padding; - const p30 = s * (control2[0] + tx) + padding; - const p31 = h - s * (control2[1] + ty) - padding; - const p40 = s * (second[0] + tx) + padding; - const p41 = h - s * (second[1] + ty) - padding; - if (i === 0) { - buffer.push(p10, p11); - points.push(p10, p11); - } - buffer.push(p20, p21, p30, p31, p40, p41); - this.#extractPointsOnBezier(p10, p11, p20, p21, p30, p31, p40, p41, NUMBER_OF_POINTS_ON_BEZIER_CURVE, points); - } - paths.push({ - bezier: buffer, - points - }); - } - return paths; - } - #extractPointsOnBezier(p10, p11, p20, p21, p30, p31, p40, p41, n, points) { - if (this.#isAlmostFlat(p10, p11, p20, p21, p30, p31, p40, p41)) { - points.push(p40, p41); - return; - } - for (let i = 1; i < n - 1; i++) { - const t = i / n; - const mt = 1 - t; - let q10 = t * p10 + mt * p20; - let q11 = t * p11 + mt * p21; - let q20 = t * p20 + mt * p30; - let q21 = t * p21 + mt * p31; - const q30 = t * p30 + mt * p40; - const q31 = t * p31 + mt * p41; - q10 = t * q10 + mt * q20; - q11 = t * q11 + mt * q21; - q20 = t * q20 + mt * q30; - q21 = t * q21 + mt * q31; - q10 = t * q10 + mt * q20; - q11 = t * q11 + mt * q21; - points.push(q10, q11); - } - points.push(p40, p41); - } - #isAlmostFlat(p10, p11, p20, p21, p30, p31, p40, p41) { - const tol = 10; - const ax = (3 * p20 - 2 * p10 - p40) ** 2; - const ay = (3 * p21 - 2 * p11 - p41) ** 2; - const bx = (3 * p30 - p10 - 2 * p40) ** 2; - const by = (3 * p31 - p11 - 2 * p41) ** 2; - return Math.max(ax, bx) + Math.max(ay, by) <= tol; - } - #getBbox() { - let xMin = Infinity; - let xMax = -Infinity; - let yMin = Infinity; - let yMax = -Infinity; - for (const path of this.paths) { - for (const [first, control1, control2, second] of path) { - const bbox = _util.Util.bezierBoundingBox(...first, ...control1, ...control2, ...second); - xMin = Math.min(xMin, bbox[0]); - yMin = Math.min(yMin, bbox[1]); - xMax = Math.max(xMax, bbox[2]); - yMax = Math.max(yMax, bbox[3]); - } - } - return [xMin, yMin, xMax, yMax]; - } - #getPadding() { - return this.#disableEditing ? Math.ceil(this.thickness * this.parentScale) : 0; - } - #fitToContent(firstTime = false) { - if (this.isEmpty()) { - return; - } - if (!this.#disableEditing) { - this.#redraw(); - return; - } - const bbox = this.#getBbox(); - const padding = this.#getPadding(); - this.#baseWidth = Math.max(RESIZER_SIZE, bbox[2] - bbox[0]); - this.#baseHeight = Math.max(RESIZER_SIZE, bbox[3] - bbox[1]); - const width = Math.ceil(padding + this.#baseWidth * this.scaleFactor); - const height = Math.ceil(padding + this.#baseHeight * this.scaleFactor); - const [parentWidth, parentHeight] = this.parentDimensions; - this.width = width / parentWidth; - this.height = height / parentHeight; - this.#aspectRatio = width / height; - this.#setMinDims(); - const prevTranslationX = this.translationX; - const prevTranslationY = this.translationY; - this.translationX = -bbox[0]; - this.translationY = -bbox[1]; - this.#setCanvasDims(); - this.#redraw(); - this.#realWidth = width; - this.#realHeight = height; - this.setDims(width, height); - const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0; - this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding); - } - #setMinDims() { - const { - style - } = this.div; - if (this.#aspectRatio >= 1) { - style.minHeight = `${RESIZER_SIZE}px`; - style.minWidth = `${Math.round(this.#aspectRatio * RESIZER_SIZE)}px`; - } else { - style.minWidth = `${RESIZER_SIZE}px`; - style.minHeight = `${Math.round(RESIZER_SIZE / this.#aspectRatio)}px`; - } - } - static deserialize(data, parent, uiManager) { - const editor = super.deserialize(data, parent, uiManager); - editor.thickness = data.thickness; - editor.color = _util.Util.makeHexColor(...data.color); - editor.opacity = data.opacity; - const [pageWidth, pageHeight] = editor.pageDimensions; - const width = editor.width * pageWidth; - const height = editor.height * pageHeight; - const scaleFactor = editor.parentScale; - const padding = data.thickness / 2; - editor.#aspectRatio = width / height; - editor.#disableEditing = true; - editor.#realWidth = Math.round(width); - editor.#realHeight = Math.round(height); - for (const { - bezier - } of data.paths) { - const path = []; - editor.paths.push(path); - let p0 = scaleFactor * (bezier[0] - padding); - let p1 = scaleFactor * (height - bezier[1] - padding); - for (let i = 2, ii = bezier.length; i < ii; i += 6) { - const p10 = scaleFactor * (bezier[i] - padding); - const p11 = scaleFactor * (height - bezier[i + 1] - padding); - const p20 = scaleFactor * (bezier[i + 2] - padding); - const p21 = scaleFactor * (height - bezier[i + 3] - padding); - const p30 = scaleFactor * (bezier[i + 4] - padding); - const p31 = scaleFactor * (height - bezier[i + 5] - padding); - path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]); - p0 = p30; - p1 = p31; - } - const path2D = this.#buildPath2D(path); - editor.bezierPath2D.push(path2D); - } - const bbox = editor.#getBbox(); - editor.#baseWidth = Math.max(RESIZER_SIZE, bbox[2] - bbox[0]); - editor.#baseHeight = Math.max(RESIZER_SIZE, bbox[3] - bbox[1]); - editor.#setScaleFactor(width, height); - return editor; - } - serialize() { - if (this.isEmpty()) { - return null; - } - const rect = this.getRect(0, 0); - const height = this.rotation % 180 === 0 ? rect[3] - rect[1] : rect[2] - rect[0]; - const color = _editor.AnnotationEditor._colorManager.convert(this.ctx.strokeStyle); - return { - annotationType: _util.AnnotationEditorType.INK, - color, - thickness: this.thickness, - opacity: this.opacity, - paths: this.#serializePaths(this.scaleFactor / this.parentScale, this.translationX, this.translationY, height), - pageIndex: this.pageIndex, - rect, - rotation: this.rotation - }; - } -} -exports.InkEditor = InkEditor; - -/***/ }), -/* 30 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.fitCurve = void 0; -const fitCurve = __w_pdfjs_require__(31); -exports.fitCurve = fitCurve; - -/***/ }), -/* 31 */ -/***/ ((module) => { - - - -function fitCurve(points, maxError, progressCallback) { - if (!Array.isArray(points)) { - throw new TypeError("First argument should be an array"); - } - points.forEach(point => { - if (!Array.isArray(point) || point.some(item => typeof item !== 'number') || point.length !== points[0].length) { - throw Error("Each point should be an array of numbers. Each point should have the same amount of numbers."); - } - }); - points = points.filter((point, i) => i === 0 || !point.every((val, j) => val === points[i - 1][j])); - if (points.length < 2) { - return []; - } - const len = points.length; - const leftTangent = createTangent(points[1], points[0]); - const rightTangent = createTangent(points[len - 2], points[len - 1]); - return fitCubic(points, leftTangent, rightTangent, maxError, progressCallback); -} -function fitCubic(points, leftTangent, rightTangent, error, progressCallback) { - const MaxIterations = 20; - var bezCurve, u, uPrime, maxError, prevErr, splitPoint, prevSplit, centerVector, toCenterTangent, fromCenterTangent, beziers, dist, i; - if (points.length === 2) { - dist = maths.vectorLen(maths.subtract(points[0], points[1])) / 3.0; - bezCurve = [points[0], maths.addArrays(points[0], maths.mulItems(leftTangent, dist)), maths.addArrays(points[1], maths.mulItems(rightTangent, dist)), points[1]]; - return [bezCurve]; - } - u = chordLengthParameterize(points); - [bezCurve, maxError, splitPoint] = generateAndReport(points, u, u, leftTangent, rightTangent, progressCallback); - if (maxError === 0 || maxError < error) { - return [bezCurve]; - } - if (maxError < error * error) { - uPrime = u; - prevErr = maxError; - prevSplit = splitPoint; - for (i = 0; i < MaxIterations; i++) { - uPrime = reparameterize(bezCurve, points, uPrime); - [bezCurve, maxError, splitPoint] = generateAndReport(points, u, uPrime, leftTangent, rightTangent, progressCallback); - if (maxError < error) { - return [bezCurve]; - } else if (splitPoint === prevSplit) { - let errChange = maxError / prevErr; - if (errChange > .9999 && errChange < 1.0001) { - break; - } - } - prevErr = maxError; - prevSplit = splitPoint; - } - } - beziers = []; - centerVector = maths.subtract(points[splitPoint - 1], points[splitPoint + 1]); - if (centerVector.every(val => val === 0)) { - centerVector = maths.subtract(points[splitPoint - 1], points[splitPoint]); - [centerVector[0], centerVector[1]] = [-centerVector[1], centerVector[0]]; - } - toCenterTangent = maths.normalize(centerVector); - fromCenterTangent = maths.mulItems(toCenterTangent, -1); - beziers = beziers.concat(fitCubic(points.slice(0, splitPoint + 1), leftTangent, toCenterTangent, error, progressCallback)); - beziers = beziers.concat(fitCubic(points.slice(splitPoint), fromCenterTangent, rightTangent, error, progressCallback)); - return beziers; -} -; -function generateAndReport(points, paramsOrig, paramsPrime, leftTangent, rightTangent, progressCallback) { - var bezCurve, maxError, splitPoint; - bezCurve = generateBezier(points, paramsPrime, leftTangent, rightTangent, progressCallback); - [maxError, splitPoint] = computeMaxError(points, bezCurve, paramsOrig); - if (progressCallback) { - progressCallback({ - bez: bezCurve, - points: points, - params: paramsOrig, - maxErr: maxError, - maxPoint: splitPoint - }); - } - return [bezCurve, maxError, splitPoint]; -} -function generateBezier(points, parameters, leftTangent, rightTangent) { - var bezCurve, - A, - a, - C, - X, - det_C0_C1, - det_C0_X, - det_X_C1, - alpha_l, - alpha_r, - epsilon, - segLength, - i, - len, - tmp, - u, - ux, - firstPoint = points[0], - lastPoint = points[points.length - 1]; - bezCurve = [firstPoint, null, null, lastPoint]; - A = maths.zeros_Xx2x2(parameters.length); - for (i = 0, len = parameters.length; i < len; i++) { - u = parameters[i]; - ux = 1 - u; - a = A[i]; - a[0] = maths.mulItems(leftTangent, 3 * u * (ux * ux)); - a[1] = maths.mulItems(rightTangent, 3 * ux * (u * u)); - } - C = [[0, 0], [0, 0]]; - X = [0, 0]; - for (i = 0, len = points.length; i < len; i++) { - u = parameters[i]; - a = A[i]; - C[0][0] += maths.dot(a[0], a[0]); - C[0][1] += maths.dot(a[0], a[1]); - C[1][0] += maths.dot(a[0], a[1]); - C[1][1] += maths.dot(a[1], a[1]); - tmp = maths.subtract(points[i], bezier.q([firstPoint, firstPoint, lastPoint, lastPoint], u)); - X[0] += maths.dot(a[0], tmp); - X[1] += maths.dot(a[1], tmp); - } - det_C0_C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1]; - det_C0_X = C[0][0] * X[1] - C[1][0] * X[0]; - det_X_C1 = X[0] * C[1][1] - X[1] * C[0][1]; - alpha_l = det_C0_C1 === 0 ? 0 : det_X_C1 / det_C0_C1; - alpha_r = det_C0_C1 === 0 ? 0 : det_C0_X / det_C0_C1; - segLength = maths.vectorLen(maths.subtract(firstPoint, lastPoint)); - epsilon = 1.0e-6 * segLength; - if (alpha_l < epsilon || alpha_r < epsilon) { - bezCurve[1] = maths.addArrays(firstPoint, maths.mulItems(leftTangent, segLength / 3.0)); - bezCurve[2] = maths.addArrays(lastPoint, maths.mulItems(rightTangent, segLength / 3.0)); - } else { - bezCurve[1] = maths.addArrays(firstPoint, maths.mulItems(leftTangent, alpha_l)); - bezCurve[2] = maths.addArrays(lastPoint, maths.mulItems(rightTangent, alpha_r)); - } - return bezCurve; -} -; -function reparameterize(bezier, points, parameters) { - return parameters.map((p, i) => newtonRaphsonRootFind(bezier, points[i], p)); -} -; -function newtonRaphsonRootFind(bez, point, u) { - var d = maths.subtract(bezier.q(bez, u), point), - qprime = bezier.qprime(bez, u), - numerator = maths.mulMatrix(d, qprime), - denominator = maths.sum(maths.squareItems(qprime)) + 2 * maths.mulMatrix(d, bezier.qprimeprime(bez, u)); - if (denominator === 0) { - return u; - } else { - return u - numerator / denominator; - } -} -; -function chordLengthParameterize(points) { - var u = [], - currU, - prevU, - prevP; - points.forEach((p, i) => { - currU = i ? prevU + maths.vectorLen(maths.subtract(p, prevP)) : 0; - u.push(currU); - prevU = currU; - prevP = p; - }); - u = u.map(x => x / prevU); - return u; -} -; -function computeMaxError(points, bez, parameters) { - var dist, maxDist, splitPoint, v, i, count, point, t; - maxDist = 0; - splitPoint = Math.floor(points.length / 2); - const t_distMap = mapTtoRelativeDistances(bez, 10); - for (i = 0, count = points.length; i < count; i++) { - point = points[i]; - t = find_t(bez, parameters[i], t_distMap, 10); - v = maths.subtract(bezier.q(bez, t), point); - dist = v[0] * v[0] + v[1] * v[1]; - if (dist > maxDist) { - maxDist = dist; - splitPoint = i; - } - } - return [maxDist, splitPoint]; -} -; -var mapTtoRelativeDistances = function (bez, B_parts) { - var B_t_curr; - var B_t_dist = [0]; - var B_t_prev = bez[0]; - var sumLen = 0; - for (var i = 1; i <= B_parts; i++) { - B_t_curr = bezier.q(bez, i / B_parts); - sumLen += maths.vectorLen(maths.subtract(B_t_curr, B_t_prev)); - B_t_dist.push(sumLen); - B_t_prev = B_t_curr; - } - B_t_dist = B_t_dist.map(x => x / sumLen); - return B_t_dist; -}; -function find_t(bez, param, t_distMap, B_parts) { - if (param < 0) { - return 0; - } - if (param > 1) { - return 1; - } - var lenMax, lenMin, tMax, tMin, t; - for (var i = 1; i <= B_parts; i++) { - if (param <= t_distMap[i]) { - tMin = (i - 1) / B_parts; - tMax = i / B_parts; - lenMin = t_distMap[i - 1]; - lenMax = t_distMap[i]; - t = (param - lenMin) / (lenMax - lenMin) * (tMax - tMin) + tMin; - break; - } - } - return t; -} -function createTangent(pointA, pointB) { - return maths.normalize(maths.subtract(pointA, pointB)); -} -class maths { - static zeros_Xx2x2(x) { - var zs = []; - while (x--) { - zs.push([0, 0]); - } - return zs; - } - static mulItems(items, multiplier) { - return items.map(x => x * multiplier); - } - static mulMatrix(m1, m2) { - return m1.reduce((sum, x1, i) => sum + x1 * m2[i], 0); - } - static subtract(arr1, arr2) { - return arr1.map((x1, i) => x1 - arr2[i]); - } - static addArrays(arr1, arr2) { - return arr1.map((x1, i) => x1 + arr2[i]); - } - static addItems(items, addition) { - return items.map(x => x + addition); - } - static sum(items) { - return items.reduce((sum, x) => sum + x); - } - static dot(m1, m2) { - return maths.mulMatrix(m1, m2); - } - static vectorLen(v) { - return Math.hypot(...v); - } - static divItems(items, divisor) { - return items.map(x => x / divisor); - } - static squareItems(items) { - return items.map(x => x * x); - } - static normalize(v) { - return this.divItems(v, this.vectorLen(v)); - } -} -class bezier { - static q(ctrlPoly, t) { - var tx = 1.0 - t; - var pA = maths.mulItems(ctrlPoly[0], tx * tx * tx), - pB = maths.mulItems(ctrlPoly[1], 3 * tx * tx * t), - pC = maths.mulItems(ctrlPoly[2], 3 * tx * t * t), - pD = maths.mulItems(ctrlPoly[3], t * t * t); - return maths.addArrays(maths.addArrays(pA, pB), maths.addArrays(pC, pD)); - } - static qprime(ctrlPoly, t) { - var tx = 1.0 - t; - var pA = maths.mulItems(maths.subtract(ctrlPoly[1], ctrlPoly[0]), 3 * tx * tx), - pB = maths.mulItems(maths.subtract(ctrlPoly[2], ctrlPoly[1]), 6 * tx * t), - pC = maths.mulItems(maths.subtract(ctrlPoly[3], ctrlPoly[2]), 3 * t * t); - return maths.addArrays(maths.addArrays(pA, pB), pC); - } - static qprimeprime(ctrlPoly, t) { - return maths.addArrays(maths.mulItems(maths.addArrays(maths.subtract(ctrlPoly[2], maths.mulItems(ctrlPoly[1], 2)), ctrlPoly[0]), 6 * (1.0 - t)), maths.mulItems(maths.addArrays(maths.subtract(ctrlPoly[3], maths.mulItems(ctrlPoly[2], 2)), ctrlPoly[1]), 6 * t)); - } -} -module.exports = fitCurve; -module.exports.fitCubic = fitCubic; -module.exports.createTangent = createTangent; - -/***/ }), -/* 32 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AnnotationLayer = void 0; -var _util = __w_pdfjs_require__(1); -var _display_utils = __w_pdfjs_require__(6); -var _annotation_storage = __w_pdfjs_require__(3); -var _scripting_utils = __w_pdfjs_require__(33); -var _xfa_layer = __w_pdfjs_require__(34); -const DEFAULT_TAB_INDEX = 1000; -const DEFAULT_FONT_SIZE = 9; -const GetElementsByNameSet = new WeakSet(); -function getRectDims(rect) { - return { - width: rect[2] - rect[0], - height: rect[3] - rect[1] - }; -} -class AnnotationElementFactory { - static create(parameters) { - const subtype = parameters.data.annotationType; - switch (subtype) { - case _util.AnnotationType.LINK: - return new LinkAnnotationElement(parameters); - case _util.AnnotationType.TEXT: - return new TextAnnotationElement(parameters); - case _util.AnnotationType.WIDGET: - const fieldType = parameters.data.fieldType; - switch (fieldType) { - case "Tx": - return new TextWidgetAnnotationElement(parameters); - case "Btn": - if (parameters.data.radioButton) { - return new RadioButtonWidgetAnnotationElement(parameters); - } else if (parameters.data.checkBox) { - return new CheckboxWidgetAnnotationElement(parameters); - } - return new PushButtonWidgetAnnotationElement(parameters); - case "Ch": - return new ChoiceWidgetAnnotationElement(parameters); - } - return new WidgetAnnotationElement(parameters); - case _util.AnnotationType.POPUP: - return new PopupAnnotationElement(parameters); - case _util.AnnotationType.FREETEXT: - return new FreeTextAnnotationElement(parameters); - case _util.AnnotationType.LINE: - return new LineAnnotationElement(parameters); - case _util.AnnotationType.SQUARE: - return new SquareAnnotationElement(parameters); - case _util.AnnotationType.CIRCLE: - return new CircleAnnotationElement(parameters); - case _util.AnnotationType.POLYLINE: - return new PolylineAnnotationElement(parameters); - case _util.AnnotationType.CARET: - return new CaretAnnotationElement(parameters); - case _util.AnnotationType.INK: - return new InkAnnotationElement(parameters); - case _util.AnnotationType.POLYGON: - return new PolygonAnnotationElement(parameters); - case _util.AnnotationType.HIGHLIGHT: - return new HighlightAnnotationElement(parameters); - case _util.AnnotationType.UNDERLINE: - return new UnderlineAnnotationElement(parameters); - case _util.AnnotationType.SQUIGGLY: - return new SquigglyAnnotationElement(parameters); - case _util.AnnotationType.STRIKEOUT: - return new StrikeOutAnnotationElement(parameters); - case _util.AnnotationType.STAMP: - return new StampAnnotationElement(parameters); - case _util.AnnotationType.FILEATTACHMENT: - return new FileAttachmentAnnotationElement(parameters); - default: - return new AnnotationElement(parameters); - } - } -} -class AnnotationElement { - constructor(parameters, { - isRenderable = false, - ignoreBorder = false, - createQuadrilaterals = false - } = {}) { - this.isRenderable = isRenderable; - this.data = parameters.data; - this.layer = parameters.layer; - this.page = parameters.page; - this.viewport = parameters.viewport; - this.linkService = parameters.linkService; - this.downloadManager = parameters.downloadManager; - this.imageResourcesPath = parameters.imageResourcesPath; - this.renderForms = parameters.renderForms; - this.svgFactory = parameters.svgFactory; - this.annotationStorage = parameters.annotationStorage; - this.enableScripting = parameters.enableScripting; - this.hasJSActions = parameters.hasJSActions; - this._fieldObjects = parameters.fieldObjects; - if (isRenderable) { - this.container = this._createContainer(ignoreBorder); - } - if (createQuadrilaterals) { - this.quadrilaterals = this._createQuadrilaterals(ignoreBorder); - } - } - _createContainer(ignoreBorder = false) { - const { - data, - page, - viewport - } = this; - const container = document.createElement("section"); - container.setAttribute("data-annotation-id", data.id); - const { - pageWidth, - pageHeight, - pageX, - pageY - } = viewport.rawDims; - const { - width, - height - } = getRectDims(data.rect); - const rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]); - if (!ignoreBorder && data.borderStyle.width > 0) { - container.style.borderWidth = `${data.borderStyle.width}px`; - const horizontalRadius = data.borderStyle.horizontalCornerRadius; - const verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`; - container.style.borderRadius = radius; - } else if (this instanceof RadioButtonWidgetAnnotationElement) { - const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`; - container.style.borderRadius = radius; - } - switch (data.borderStyle.style) { - case _util.AnnotationBorderStyleType.SOLID: - container.style.borderStyle = "solid"; - break; - case _util.AnnotationBorderStyleType.DASHED: - container.style.borderStyle = "dashed"; - break; - case _util.AnnotationBorderStyleType.BEVELED: - (0, _util.warn)("Unimplemented border style: beveled"); - break; - case _util.AnnotationBorderStyleType.INSET: - (0, _util.warn)("Unimplemented border style: inset"); - break; - case _util.AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = "solid"; - break; - default: - break; - } - const borderColor = data.borderColor || null; - if (borderColor) { - container.style.borderColor = _util.Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); - } else { - container.style.borderWidth = 0; - } - } - container.style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; - container.style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; - const { - rotation - } = data; - if (data.hasOwnCanvas || rotation === 0) { - container.style.width = `${100 * width / pageWidth}%`; - container.style.height = `${100 * height / pageHeight}%`; - } else { - this.setRotation(rotation, container); - } - return container; - } - setRotation(angle, container = this.container) { - const { - pageWidth, - pageHeight - } = this.viewport.rawDims; - const { - width, - height - } = getRectDims(this.data.rect); - let elementWidth, elementHeight; - if (angle % 180 === 0) { - elementWidth = 100 * width / pageWidth; - elementHeight = 100 * height / pageHeight; - } else { - elementWidth = 100 * height / pageWidth; - elementHeight = 100 * width / pageHeight; - } - container.style.width = `${elementWidth}%`; - container.style.height = `${elementHeight}%`; - container.setAttribute("data-main-rotation", (360 - angle) % 360); - } - get _commonActions() { - const setColor = (jsName, styleName, event) => { - const color = event.detail[jsName]; - event.target.style[styleName] = _scripting_utils.ColorConverters[`${color[0]}_HTML`](color.slice(1)); - }; - return (0, _util.shadow)(this, "_commonActions", { - display: event => { - const hidden = event.detail.display % 2 === 1; - this.container.style.visibility = hidden ? "hidden" : "visible"; - this.annotationStorage.setValue(this.data.id, { - hidden, - print: event.detail.display === 0 || event.detail.display === 3 - }); - }, - print: event => { - this.annotationStorage.setValue(this.data.id, { - print: event.detail.print - }); - }, - hidden: event => { - this.container.style.visibility = event.detail.hidden ? "hidden" : "visible"; - this.annotationStorage.setValue(this.data.id, { - hidden: event.detail.hidden - }); - }, - focus: event => { - setTimeout(() => event.target.focus({ - preventScroll: false - }), 0); - }, - userName: event => { - event.target.title = event.detail.userName; - }, - readonly: event => { - if (event.detail.readonly) { - event.target.setAttribute("readonly", ""); - } else { - event.target.removeAttribute("readonly"); - } - }, - required: event => { - this._setRequired(event.target, event.detail.required); - }, - bgColor: event => { - setColor("bgColor", "backgroundColor", event); - }, - fillColor: event => { - setColor("fillColor", "backgroundColor", event); - }, - fgColor: event => { - setColor("fgColor", "color", event); - }, - textColor: event => { - setColor("textColor", "color", event); - }, - borderColor: event => { - setColor("borderColor", "borderColor", event); - }, - strokeColor: event => { - setColor("strokeColor", "borderColor", event); - }, - rotation: event => { - const angle = event.detail.rotation; - this.setRotation(angle); - this.annotationStorage.setValue(this.data.id, { - rotation: angle - }); - } - }); - } - _dispatchEventFromSandbox(actions, jsEvent) { - const commonActions = this._commonActions; - for (const name of Object.keys(jsEvent.detail)) { - const action = actions[name] || commonActions[name]; - action?.(jsEvent); - } - } - _setDefaultPropertiesFromJS(element) { - if (!this.enableScripting) { - return; - } - const storedData = this.annotationStorage.getRawValue(this.data.id); - if (!storedData) { - return; - } - const commonActions = this._commonActions; - for (const [actionName, detail] of Object.entries(storedData)) { - const action = commonActions[actionName]; - if (action) { - const eventProxy = { - detail: { - [actionName]: detail - }, - target: element - }; - action(eventProxy); - delete storedData[actionName]; - } - } - } - _createQuadrilaterals(ignoreBorder = false) { - if (!this.data.quadPoints) { - return null; - } - const quadrilaterals = []; - const savedRect = this.data.rect; - for (const quadPoint of this.data.quadPoints) { - this.data.rect = [quadPoint[2].x, quadPoint[2].y, quadPoint[1].x, quadPoint[1].y]; - quadrilaterals.push(this._createContainer(ignoreBorder)); - } - this.data.rect = savedRect; - return quadrilaterals; - } - _createPopup(trigger, data) { - let container = this.container; - if (this.quadrilaterals) { - trigger = trigger || this.quadrilaterals; - container = this.quadrilaterals[0]; - } - if (!trigger) { - trigger = document.createElement("div"); - trigger.className = "popupTriggerArea"; - container.append(trigger); - } - const popupElement = new PopupElement({ - container, - trigger, - color: data.color, - titleObj: data.titleObj, - modificationDate: data.modificationDate, - contentsObj: data.contentsObj, - richText: data.richText, - hideWrapper: true - }); - const popup = popupElement.render(); - popup.style.left = "100%"; - container.append(popup); - } - _renderQuadrilaterals(className) { - for (const quadrilateral of this.quadrilaterals) { - quadrilateral.className = className; - } - return this.quadrilaterals; - } - render() { - (0, _util.unreachable)("Abstract method `AnnotationElement.render` called"); - } - _getElementsByName(name, skipId = null) { - const fields = []; - if (this._fieldObjects) { - const fieldObj = this._fieldObjects[name]; - if (fieldObj) { - for (const { - page, - id, - exportValues - } of fieldObj) { - if (page === -1) { - continue; - } - if (id === skipId) { - continue; - } - const exportValue = typeof exportValues === "string" ? exportValues : null; - const domElement = document.querySelector(`[data-element-id="${id}"]`); - if (domElement && !GetElementsByNameSet.has(domElement)) { - (0, _util.warn)(`_getElementsByName - element not allowed: ${id}`); - continue; - } - fields.push({ - id, - exportValue, - domElement - }); - } - } - return fields; - } - for (const domElement of document.getElementsByName(name)) { - const { - exportValue - } = domElement; - const id = domElement.getAttribute("data-element-id"); - if (id === skipId) { - continue; - } - if (!GetElementsByNameSet.has(domElement)) { - continue; - } - fields.push({ - id, - exportValue, - domElement - }); - } - return fields; - } -} -class LinkAnnotationElement extends AnnotationElement { - constructor(parameters, options = null) { - super(parameters, { - isRenderable: true, - ignoreBorder: !!options?.ignoreBorder, - createQuadrilaterals: true - }); - this.isTooltipOnly = parameters.data.isTooltipOnly; - } - render() { - const { - data, - linkService - } = this; - const link = document.createElement("a"); - link.setAttribute("data-element-id", data.id); - let isBound = false; - if (data.url) { - linkService.addLinkAttributes(link, data.url, data.newWindow); - isBound = true; - } else if (data.action) { - this._bindNamedAction(link, data.action); - isBound = true; - } else if (data.attachment) { - this._bindAttachment(link, data.attachment); - isBound = true; - } else if (data.setOCGState) { - this.#bindSetOCGState(link, data.setOCGState); - isBound = true; - } else if (data.dest) { - this._bindLink(link, data.dest); - isBound = true; - } else { - if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) { - this._bindJSAction(link, data); - isBound = true; - } - if (data.resetForm) { - this._bindResetFormAction(link, data.resetForm); - isBound = true; - } else if (this.isTooltipOnly && !isBound) { - this._bindLink(link, ""); - isBound = true; - } - } - if (this.quadrilaterals) { - return this._renderQuadrilaterals("linkAnnotation").map((quadrilateral, index) => { - const linkElement = index === 0 ? link : link.cloneNode(); - quadrilateral.append(linkElement); - return quadrilateral; - }); - } - this.container.className = "linkAnnotation"; - if (isBound) { - this.container.append(link); - } - return this.container; - } - #setInternalLink() { - this.container.setAttribute("data-internal-link", ""); - } - _bindLink(link, destination) { - link.href = this.linkService.getDestinationHash(destination); - link.onclick = () => { - if (destination) { - this.linkService.goToDestination(destination); - } - return false; - }; - if (destination || destination === "") { - this.#setInternalLink(); - } - } - _bindNamedAction(link, action) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.linkService.executeNamedAction(action); - return false; - }; - this.#setInternalLink(); - } - _bindAttachment(link, attachment) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.downloadManager?.openOrDownloadData(this.container, attachment.content, attachment.filename); - return false; - }; - this.#setInternalLink(); - } - #bindSetOCGState(link, action) { - link.href = this.linkService.getAnchorUrl(""); - link.onclick = () => { - this.linkService.executeSetOCGState(action); - return false; - }; - this.#setInternalLink(); - } - _bindJSAction(link, data) { - link.href = this.linkService.getAnchorUrl(""); - const map = new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]); - for (const name of Object.keys(data.actions)) { - const jsName = map.get(name); - if (!jsName) { - continue; - } - link[jsName] = () => { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: data.id, - name - } - }); - return false; - }; - } - if (!link.onclick) { - link.onclick = () => false; - } - this.#setInternalLink(); - } - _bindResetFormAction(link, resetForm) { - const otherClickAction = link.onclick; - if (!otherClickAction) { - link.href = this.linkService.getAnchorUrl(""); - } - this.#setInternalLink(); - if (!this._fieldObjects) { - (0, _util.warn)(`_bindResetFormAction - "resetForm" action not supported, ` + "ensure that the `fieldObjects` parameter is provided."); - if (!otherClickAction) { - link.onclick = () => false; - } - return; - } - link.onclick = () => { - otherClickAction?.(); - const { - fields: resetFormFields, - refs: resetFormRefs, - include - } = resetForm; - const allFields = []; - if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) { - const fieldIds = new Set(resetFormRefs); - for (const fieldName of resetFormFields) { - const fields = this._fieldObjects[fieldName] || []; - for (const { - id - } of fields) { - fieldIds.add(id); - } - } - for (const fields of Object.values(this._fieldObjects)) { - for (const field of fields) { - if (fieldIds.has(field.id) === include) { - allFields.push(field); - } - } - } - } else { - for (const fields of Object.values(this._fieldObjects)) { - allFields.push(...fields); - } - } - const storage = this.annotationStorage; - const allIds = []; - for (const field of allFields) { - const { - id - } = field; - allIds.push(id); - switch (field.type) { - case "text": - { - const value = field.defaultValue || ""; - storage.setValue(id, { - value - }); - break; - } - case "checkbox": - case "radiobutton": - { - const value = field.defaultValue === field.exportValues; - storage.setValue(id, { - value - }); - break; - } - case "combobox": - case "listbox": - { - const value = field.defaultValue || ""; - storage.setValue(id, { - value - }); - break; - } - default: - continue; - } - const domElement = document.querySelector(`[data-element-id="${id}"]`); - if (!domElement) { - continue; - } else if (!GetElementsByNameSet.has(domElement)) { - (0, _util.warn)(`_bindResetFormAction - element not allowed: ${id}`); - continue; - } - domElement.dispatchEvent(new Event("resetform")); - } - if (this.enableScripting) { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: "app", - ids: allIds, - name: "ResetForm" - } - }); - } - return false; - }; - } -} -class TextAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable - }); - } - render() { - this.container.className = "textAnnotation"; - const image = document.createElement("img"); - image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; - image.alt = "[{{type}} Annotation]"; - image.dataset.l10nId = "text_annotation_type"; - image.dataset.l10nArgs = JSON.stringify({ - type: this.data.name - }); - if (!this.data.hasPopup) { - this._createPopup(image, this.data); - } - this.container.append(image); - return this.container; - } -} -class WidgetAnnotationElement extends AnnotationElement { - render() { - if (this.data.alternativeText) { - this.container.title = this.data.alternativeText; - } - return this.container; - } - _getKeyModifier(event) { - const { - isWin, - isMac - } = _util.FeatureTest.platform; - return isWin && event.ctrlKey || isMac && event.metaKey; - } - _setEventListener(element, baseName, eventName, valueGetter) { - if (baseName.includes("mouse")) { - element.addEventListener(baseName, event => { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: this.data.id, - name: eventName, - value: valueGetter(event), - shift: event.shiftKey, - modifier: this._getKeyModifier(event) - } - }); - }); - } else { - element.addEventListener(baseName, event => { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id: this.data.id, - name: eventName, - value: valueGetter(event) - } - }); - }); - } - } - _setEventListeners(element, names, getter) { - for (const [baseName, eventName] of names) { - if (eventName === "Action" || this.data.actions?.[eventName]) { - this._setEventListener(element, baseName, eventName, getter); - } - } - } - _setBackgroundColor(element) { - const color = this.data.backgroundColor || null; - element.style.backgroundColor = color === null ? "transparent" : _util.Util.makeHexColor(color[0], color[1], color[2]); - } - _setTextStyle(element) { - const TEXT_ALIGNMENT = ["left", "center", "right"]; - const { - fontColor - } = this.data.defaultAppearanceData; - const fontSize = this.data.defaultAppearanceData.fontSize || DEFAULT_FONT_SIZE; - const style = element.style; - let computedFontSize; - const BORDER_SIZE = 2; - const roundToOneDecimal = x => Math.round(10 * x) / 10; - if (this.data.multiLine) { - const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); - const numberOfLines = Math.round(height / (_util.LINE_FACTOR * fontSize)) || 1; - const lineHeight = height / numberOfLines; - computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / _util.LINE_FACTOR)); - } else { - const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); - computedFontSize = Math.min(fontSize, roundToOneDecimal(height / _util.LINE_FACTOR)); - } - style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`; - style.color = _util.Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]); - if (this.data.textAlignment !== null) { - style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment]; - } - } - _setRequired(element, isRequired) { - if (isRequired) { - element.setAttribute("required", true); - } else { - element.removeAttribute("required"); - } - element.setAttribute("aria-required", isRequired); - } -} -class TextWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - const isRenderable = parameters.renderForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue; - super(parameters, { - isRenderable - }); - } - setPropertyOnSiblings(base, key, value, keyInStorage) { - const storage = this.annotationStorage; - for (const element of this._getElementsByName(base.name, base.id)) { - if (element.domElement) { - element.domElement[key] = value; - } - storage.setValue(element.id, { - [keyInStorage]: value - }); - } - } - render() { - const storage = this.annotationStorage; - const id = this.data.id; - this.container.className = "textWidgetAnnotation"; - let element = null; - if (this.renderForms) { - const storedData = storage.getValue(id, { - value: this.data.fieldValue - }); - let textContent = storedData.formattedValue || storedData.value || ""; - const maxLen = storage.getValue(id, { - charLimit: this.data.maxLen - }).charLimit; - if (maxLen && textContent.length > maxLen) { - textContent = textContent.slice(0, maxLen); - } - const elementData = { - userValue: textContent, - formattedValue: null, - lastCommittedValue: null, - commitKey: 1 - }; - if (this.data.multiLine) { - element = document.createElement("textarea"); - element.textContent = textContent; - if (this.data.doNotScroll) { - element.style.overflowY = "hidden"; - } - } else { - element = document.createElement("input"); - element.type = "text"; - element.setAttribute("value", textContent); - if (this.data.doNotScroll) { - element.style.overflowX = "hidden"; - } - } - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = this.data.readOnly; - element.name = this.data.fieldName; - element.tabIndex = DEFAULT_TAB_INDEX; - this._setRequired(element, this.data.required); - if (maxLen) { - element.maxLength = maxLen; - } - element.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - this.setPropertyOnSiblings(element, "value", event.target.value, "value"); - }); - element.addEventListener("resetform", event => { - const defaultValue = this.data.defaultFieldValue ?? ""; - element.value = elementData.userValue = defaultValue; - elementData.formattedValue = null; - }); - let blurListener = event => { - const { - formattedValue - } = elementData; - if (formattedValue !== null && formattedValue !== undefined) { - event.target.value = formattedValue; - } - event.target.scrollLeft = 0; - }; - if (this.enableScripting && this.hasJSActions) { - element.addEventListener("focus", event => { - const { - target - } = event; - if (elementData.userValue) { - target.value = elementData.userValue; - } - elementData.lastCommittedValue = target.value; - elementData.commitKey = 1; - }); - element.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value(event) { - elementData.userValue = event.detail.value ?? ""; - storage.setValue(id, { - value: elementData.userValue.toString() - }); - event.target.value = elementData.userValue; - }, - formattedValue(event) { - const { - formattedValue - } = event.detail; - elementData.formattedValue = formattedValue; - if (formattedValue !== null && formattedValue !== undefined && event.target !== document.activeElement) { - event.target.value = formattedValue; - } - storage.setValue(id, { - formattedValue - }); - }, - selRange(event) { - event.target.setSelectionRange(...event.detail.selRange); - }, - charLimit: event => { - const { - charLimit - } = event.detail; - const { - target - } = event; - if (charLimit === 0) { - target.removeAttribute("maxLength"); - return; - } - target.setAttribute("maxLength", charLimit); - let value = elementData.userValue; - if (!value || value.length <= charLimit) { - return; - } - value = value.slice(0, charLimit); - target.value = elementData.userValue = value; - storage.setValue(id, { - value - }); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey: 1, - selStart: target.selectionStart, - selEnd: target.selectionEnd - } - }); - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - element.addEventListener("keydown", event => { - elementData.commitKey = 1; - let commitKey = -1; - if (event.key === "Escape") { - commitKey = 0; - } else if (event.key === "Enter" && !this.data.multiLine) { - commitKey = 2; - } else if (event.key === "Tab") { - elementData.commitKey = 3; - } - if (commitKey === -1) { - return; - } - const { - value - } = event.target; - if (elementData.lastCommittedValue === value) { - return; - } - elementData.lastCommittedValue = value; - elementData.userValue = value; - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey, - selStart: event.target.selectionStart, - selEnd: event.target.selectionEnd - } - }); - }); - const _blurListener = blurListener; - blurListener = null; - element.addEventListener("blur", event => { - if (!event.relatedTarget) { - return; - } - const { - value - } = event.target; - elementData.userValue = value; - if (elementData.lastCommittedValue !== value) { - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - willCommit: true, - commitKey: elementData.commitKey, - selStart: event.target.selectionStart, - selEnd: event.target.selectionEnd - } - }); - } - _blurListener(event); - }); - if (this.data.actions?.Keystroke) { - element.addEventListener("beforeinput", event => { - elementData.lastCommittedValue = null; - const { - data, - target - } = event; - const { - value, - selectionStart, - selectionEnd - } = target; - let selStart = selectionStart, - selEnd = selectionEnd; - switch (event.inputType) { - case "deleteWordBackward": - { - const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/); - if (match) { - selStart -= match[0].length; - } - break; - } - case "deleteWordForward": - { - const match = value.substring(selectionStart).match(/^[^\w]*\w*/); - if (match) { - selEnd += match[0].length; - } - break; - } - case "deleteContentBackward": - if (selectionStart === selectionEnd) { - selStart -= 1; - } - break; - case "deleteContentForward": - if (selectionStart === selectionEnd) { - selEnd += 1; - } - break; - } - event.preventDefault(); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value, - change: data || "", - willCommit: false, - selStart, - selEnd - } - }); - }); - } - this._setEventListeners(element, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.value); - } - if (blurListener) { - element.addEventListener("blur", blurListener); - } - if (this.data.comb) { - const fieldWidth = this.data.rect[2] - this.data.rect[0]; - const combWidth = fieldWidth / maxLen; - element.classList.add("comb"); - element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`; - } - } else { - element = document.createElement("div"); - element.textContent = this.data.fieldValue; - element.style.verticalAlign = "middle"; - element.style.display = "table-cell"; - } - this._setTextStyle(element); - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; - } -} -class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms - }); - } - render() { - const storage = this.annotationStorage; - const data = this.data; - const id = data.id; - let value = storage.getValue(id, { - value: data.exportValue === data.fieldValue - }).value; - if (typeof value === "string") { - value = value !== "Off"; - storage.setValue(id, { - value - }); - } - this.container.className = "buttonWidgetAnnotation checkBox"; - const element = document.createElement("input"); - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = data.readOnly; - this._setRequired(element, this.data.required); - element.type = "checkbox"; - element.name = data.fieldName; - if (value) { - element.setAttribute("checked", true); - } - element.setAttribute("exportValue", data.exportValue); - element.tabIndex = DEFAULT_TAB_INDEX; - element.addEventListener("change", event => { - const { - name, - checked - } = event.target; - for (const checkbox of this._getElementsByName(name, id)) { - const curChecked = checked && checkbox.exportValue === data.exportValue; - if (checkbox.domElement) { - checkbox.domElement.checked = curChecked; - } - storage.setValue(checkbox.id, { - value: curChecked - }); - } - storage.setValue(id, { - value: checked - }); - }); - element.addEventListener("resetform", event => { - const defaultValue = data.defaultFieldValue || "Off"; - event.target.checked = defaultValue === data.exportValue; - }); - if (this.enableScripting && this.hasJSActions) { - element.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value(event) { - event.target.checked = event.detail.value !== "Off"; - storage.setValue(id, { - value: event.target.checked - }); - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); - } - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; - } -} -class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms - }); - } - render() { - this.container.className = "buttonWidgetAnnotation radioButton"; - const storage = this.annotationStorage; - const data = this.data; - const id = data.id; - let value = storage.getValue(id, { - value: data.fieldValue === data.buttonValue - }).value; - if (typeof value === "string") { - value = value !== data.buttonValue; - storage.setValue(id, { - value - }); - } - const element = document.createElement("input"); - GetElementsByNameSet.add(element); - element.setAttribute("data-element-id", id); - element.disabled = data.readOnly; - this._setRequired(element, this.data.required); - element.type = "radio"; - element.name = data.fieldName; - if (value) { - element.setAttribute("checked", true); - } - element.tabIndex = DEFAULT_TAB_INDEX; - element.addEventListener("change", event => { - const { - name, - checked - } = event.target; - for (const radio of this._getElementsByName(name, id)) { - storage.setValue(radio.id, { - value: false - }); - } - storage.setValue(id, { - value: checked - }); - }); - element.addEventListener("resetform", event => { - const defaultValue = data.defaultFieldValue; - event.target.checked = defaultValue !== null && defaultValue !== undefined && defaultValue === data.buttonValue; - }); - if (this.enableScripting && this.hasJSActions) { - const pdfButtonValue = data.buttonValue; - element.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value: event => { - const checked = pdfButtonValue === event.detail.value; - for (const radio of this._getElementsByName(event.target.name)) { - const curChecked = checked && radio.id === id; - if (radio.domElement) { - radio.domElement.checked = curChecked; - } - storage.setValue(radio.id, { - value: curChecked - }); - } - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - this._setEventListeners(element, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], event => event.target.checked); - } - this._setBackgroundColor(element); - this._setDefaultPropertiesFromJS(element); - this.container.append(element); - return this.container; - } -} -class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { - constructor(parameters) { - super(parameters, { - ignoreBorder: parameters.data.hasAppearance - }); - } - render() { - const container = super.render(); - container.className = "buttonWidgetAnnotation pushButton"; - if (this.data.alternativeText) { - container.title = this.data.alternativeText; - } - const linkElement = container.lastChild; - if (this.enableScripting && this.hasJSActions && linkElement) { - this._setDefaultPropertiesFromJS(linkElement); - linkElement.addEventListener("updatefromsandbox", jsEvent => { - this._dispatchEventFromSandbox({}, jsEvent); - }); - } - return container; - } -} -class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: parameters.renderForms - }); - } - render() { - this.container.className = "choiceWidgetAnnotation"; - const storage = this.annotationStorage; - const id = this.data.id; - const storedData = storage.getValue(id, { - value: this.data.fieldValue - }); - const selectElement = document.createElement("select"); - GetElementsByNameSet.add(selectElement); - selectElement.setAttribute("data-element-id", id); - selectElement.disabled = this.data.readOnly; - this._setRequired(selectElement, this.data.required); - selectElement.name = this.data.fieldName; - selectElement.tabIndex = DEFAULT_TAB_INDEX; - let addAnEmptyEntry = this.data.combo && this.data.options.length > 0; - if (!this.data.combo) { - selectElement.size = this.data.options.length; - if (this.data.multiSelect) { - selectElement.multiple = true; - } - } - selectElement.addEventListener("resetform", event => { - const defaultValue = this.data.defaultFieldValue; - for (const option of selectElement.options) { - option.selected = option.value === defaultValue; - } - }); - for (const option of this.data.options) { - const optionElement = document.createElement("option"); - optionElement.textContent = option.displayValue; - optionElement.value = option.exportValue; - if (storedData.value.includes(option.exportValue)) { - optionElement.setAttribute("selected", true); - addAnEmptyEntry = false; - } - selectElement.append(optionElement); - } - let removeEmptyEntry = null; - if (addAnEmptyEntry) { - const noneOptionElement = document.createElement("option"); - noneOptionElement.value = " "; - noneOptionElement.setAttribute("hidden", true); - noneOptionElement.setAttribute("selected", true); - selectElement.prepend(noneOptionElement); - removeEmptyEntry = () => { - noneOptionElement.remove(); - selectElement.removeEventListener("input", removeEmptyEntry); - removeEmptyEntry = null; - }; - selectElement.addEventListener("input", removeEmptyEntry); - } - const getValue = isExport => { - const name = isExport ? "value" : "textContent"; - const { - options, - multiple - } = selectElement; - if (!multiple) { - return options.selectedIndex === -1 ? null : options[options.selectedIndex][name]; - } - return Array.prototype.filter.call(options, option => option.selected).map(option => option[name]); - }; - let selectedValues = getValue(false); - const getItems = event => { - const options = event.target.options; - return Array.prototype.map.call(options, option => { - return { - displayValue: option.textContent, - exportValue: option.value - }; - }); - }; - if (this.enableScripting && this.hasJSActions) { - selectElement.addEventListener("updatefromsandbox", jsEvent => { - const actions = { - value(event) { - removeEmptyEntry?.(); - const value = event.detail.value; - const values = new Set(Array.isArray(value) ? value : [value]); - for (const option of selectElement.options) { - option.selected = values.has(option.value); - } - storage.setValue(id, { - value: getValue(true) - }); - selectedValues = getValue(false); - }, - multipleSelection(event) { - selectElement.multiple = true; - }, - remove(event) { - const options = selectElement.options; - const index = event.detail.remove; - options[index].selected = false; - selectElement.remove(index); - if (options.length > 0) { - const i = Array.prototype.findIndex.call(options, option => option.selected); - if (i === -1) { - options[0].selected = true; - } - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - clear(event) { - while (selectElement.length !== 0) { - selectElement.remove(0); - } - storage.setValue(id, { - value: null, - items: [] - }); - selectedValues = getValue(false); - }, - insert(event) { - const { - index, - displayValue, - exportValue - } = event.detail.insert; - const selectChild = selectElement.children[index]; - const optionElement = document.createElement("option"); - optionElement.textContent = displayValue; - optionElement.value = exportValue; - if (selectChild) { - selectChild.before(optionElement); - } else { - selectElement.append(optionElement); - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - items(event) { - const { - items - } = event.detail; - while (selectElement.length !== 0) { - selectElement.remove(0); - } - for (const item of items) { - const { - displayValue, - exportValue - } = item; - const optionElement = document.createElement("option"); - optionElement.textContent = displayValue; - optionElement.value = exportValue; - selectElement.append(optionElement); - } - if (selectElement.options.length > 0) { - selectElement.options[0].selected = true; - } - storage.setValue(id, { - value: getValue(true), - items: getItems(event) - }); - selectedValues = getValue(false); - }, - indices(event) { - const indices = new Set(event.detail.indices); - for (const option of event.target.options) { - option.selected = indices.has(option.index); - } - storage.setValue(id, { - value: getValue(true) - }); - selectedValues = getValue(false); - }, - editable(event) { - event.target.disabled = !event.detail.editable; - } - }; - this._dispatchEventFromSandbox(actions, jsEvent); - }); - selectElement.addEventListener("input", event => { - const exportValue = getValue(true); - storage.setValue(id, { - value: exportValue - }); - event.preventDefault(); - this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { - source: this, - detail: { - id, - name: "Keystroke", - value: selectedValues, - changeEx: exportValue, - willCommit: false, - commitKey: 1, - keyDown: false - } - }); - }); - this._setEventListeners(selectElement, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"]], event => event.target.checked); - } else { - selectElement.addEventListener("input", function (event) { - storage.setValue(id, { - value: getValue(true) - }); - }); - } - if (this.data.combo) { - this._setTextStyle(selectElement); - } else {} - this._setBackgroundColor(selectElement); - this._setDefaultPropertiesFromJS(selectElement); - this.container.append(selectElement); - return this.container; - } -} -class PopupAnnotationElement extends AnnotationElement { - static IGNORE_TYPES = new Set(["Line", "Square", "Circle", "PolyLine", "Polygon", "Ink"]); - constructor(parameters) { - const { - data - } = parameters; - const isRenderable = !PopupAnnotationElement.IGNORE_TYPES.has(data.parentType) && !!(data.titleObj?.str || data.contentsObj?.str || data.richText?.str); - super(parameters, { - isRenderable - }); - } - render() { - this.container.className = "popupAnnotation"; - const parentElements = this.layer.querySelectorAll(`[data-annotation-id="${this.data.parentId}"]`); - if (parentElements.length === 0) { - return this.container; - } - const popup = new PopupElement({ - container: this.container, - trigger: Array.from(parentElements), - color: this.data.color, - titleObj: this.data.titleObj, - modificationDate: this.data.modificationDate, - contentsObj: this.data.contentsObj, - richText: this.data.richText - }); - const page = this.page; - const rect = _util.Util.normalizeRect([this.data.parentRect[0], page.view[3] - this.data.parentRect[1] + page.view[1], this.data.parentRect[2], page.view[3] - this.data.parentRect[3] + page.view[1]]); - const popupLeft = rect[0] + this.data.parentRect[2] - this.data.parentRect[0]; - const popupTop = rect[1]; - const { - pageWidth, - pageHeight, - pageX, - pageY - } = this.viewport.rawDims; - this.container.style.left = `${100 * (popupLeft - pageX) / pageWidth}%`; - this.container.style.top = `${100 * (popupTop - pageY) / pageHeight}%`; - this.container.append(popup.render()); - return this.container; - } -} -class PopupElement { - constructor(parameters) { - this.container = parameters.container; - this.trigger = parameters.trigger; - this.color = parameters.color; - this.titleObj = parameters.titleObj; - this.modificationDate = parameters.modificationDate; - this.contentsObj = parameters.contentsObj; - this.richText = parameters.richText; - this.hideWrapper = parameters.hideWrapper || false; - this.pinned = false; - } - render() { - const BACKGROUND_ENLIGHT = 0.7; - const wrapper = document.createElement("div"); - wrapper.className = "popupWrapper"; - this.hideElement = this.hideWrapper ? wrapper : this.container; - this.hideElement.hidden = true; - const popup = document.createElement("div"); - popup.className = "popup"; - const color = this.color; - if (color) { - const r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; - const g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; - const b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - popup.style.backgroundColor = _util.Util.makeHexColor(r | 0, g | 0, b | 0); - } - const title = document.createElement("h1"); - title.dir = this.titleObj.dir; - title.textContent = this.titleObj.str; - popup.append(title); - const dateObject = _display_utils.PDFDateString.toDateObject(this.modificationDate); - if (dateObject) { - const modificationDate = document.createElement("span"); - modificationDate.className = "popupDate"; - modificationDate.textContent = "{{date}}, {{time}}"; - modificationDate.dataset.l10nId = "annotation_date_string"; - modificationDate.dataset.l10nArgs = JSON.stringify({ - date: dateObject.toLocaleDateString(), - time: dateObject.toLocaleTimeString() - }); - popup.append(modificationDate); - } - if (this.richText?.str && (!this.contentsObj?.str || this.contentsObj.str === this.richText.str)) { - _xfa_layer.XfaLayer.render({ - xfaHtml: this.richText.html, - intent: "richText", - div: popup - }); - popup.lastChild.className = "richText popupContent"; - } else { - const contents = this._formatContents(this.contentsObj); - popup.append(contents); - } - if (!Array.isArray(this.trigger)) { - this.trigger = [this.trigger]; - } - for (const element of this.trigger) { - element.addEventListener("click", this._toggle.bind(this)); - element.addEventListener("mouseover", this._show.bind(this, false)); - element.addEventListener("mouseout", this._hide.bind(this, false)); - } - popup.addEventListener("click", this._hide.bind(this, true)); - wrapper.append(popup); - return wrapper; - } - _formatContents({ - str, - dir - }) { - const p = document.createElement("p"); - p.className = "popupContent"; - p.dir = dir; - const lines = str.split(/(?:\r\n?|\n)/); - for (let i = 0, ii = lines.length; i < ii; ++i) { - const line = lines[i]; - p.append(document.createTextNode(line)); - if (i < ii - 1) { - p.append(document.createElement("br")); - } - } - return p; - } - _toggle() { - if (this.pinned) { - this._hide(true); - } else { - this._show(true); - } - } - _show(pin = false) { - if (pin) { - this.pinned = true; - } - if (this.hideElement.hidden) { - this.hideElement.hidden = false; - this.container.style.zIndex = parseInt(this.container.style.zIndex) + 1000; - } - } - _hide(unpin = true) { - if (unpin) { - this.pinned = false; - } - if (!this.hideElement.hidden && !this.pinned) { - this.hideElement.hidden = true; - this.container.style.zIndex = parseInt(this.container.style.zIndex) - 1000; - } - } -} -class FreeTextAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - this.textContent = parameters.data.textContent; - } - render() { - this.container.className = "freeTextAnnotation"; - if (this.textContent) { - const content = document.createElement("div"); - content.className = "annotationTextContent"; - content.setAttribute("role", "comment"); - for (const line of this.textContent) { - const lineSpan = document.createElement("span"); - lineSpan.textContent = line; - content.append(lineSpan); - } - this.container.append(content); - } - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - return this.container; - } -} -class LineAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - } - render() { - this.container.className = "lineAnnotation"; - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const line = this.svgFactory.createElement("svg:line"); - line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]); - line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]); - line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]); - line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]); - line.setAttribute("stroke-width", data.borderStyle.width || 1); - line.setAttribute("stroke", "transparent"); - line.setAttribute("fill", "transparent"); - svg.append(line); - this.container.append(svg); - this._createPopup(line, data); - return this.container; - } -} -class SquareAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - } - render() { - this.container.className = "squareAnnotation"; - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const borderWidth = data.borderStyle.width; - const square = this.svgFactory.createElement("svg:rect"); - square.setAttribute("x", borderWidth / 2); - square.setAttribute("y", borderWidth / 2); - square.setAttribute("width", width - borderWidth); - square.setAttribute("height", height - borderWidth); - square.setAttribute("stroke-width", borderWidth || 1); - square.setAttribute("stroke", "transparent"); - square.setAttribute("fill", "transparent"); - svg.append(square); - this.container.append(svg); - this._createPopup(square, data); - return this.container; - } -} -class CircleAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - } - render() { - this.container.className = "circleAnnotation"; - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - const borderWidth = data.borderStyle.width; - const circle = this.svgFactory.createElement("svg:ellipse"); - circle.setAttribute("cx", width / 2); - circle.setAttribute("cy", height / 2); - circle.setAttribute("rx", width / 2 - borderWidth / 2); - circle.setAttribute("ry", height / 2 - borderWidth / 2); - circle.setAttribute("stroke-width", borderWidth || 1); - circle.setAttribute("stroke", "transparent"); - circle.setAttribute("fill", "transparent"); - svg.append(circle); - this.container.append(svg); - this._createPopup(circle, data); - return this.container; - } -} -class PolylineAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - this.containerClassName = "polylineAnnotation"; - this.svgElementName = "svg:polyline"; - } - render() { - this.container.className = this.containerClassName; - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - let points = []; - for (const coordinate of data.vertices) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; - points.push(x + "," + y); - } - points = points.join(" "); - const polyline = this.svgFactory.createElement(this.svgElementName); - polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); - polyline.setAttribute("stroke", "transparent"); - polyline.setAttribute("fill", "transparent"); - svg.append(polyline); - this.container.append(svg); - this._createPopup(polyline, data); - return this.container; - } -} -class PolygonAnnotationElement extends PolylineAnnotationElement { - constructor(parameters) { - super(parameters); - this.containerClassName = "polygonAnnotation"; - this.svgElementName = "svg:polygon"; - } -} -class CaretAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - } - render() { - this.container.className = "caretAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - return this.container; - } -} -class InkAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - this.containerClassName = "inkAnnotation"; - this.svgElementName = "svg:polyline"; - } - render() { - this.container.className = this.containerClassName; - const data = this.data; - const { - width, - height - } = getRectDims(data.rect); - const svg = this.svgFactory.create(width, height, true); - for (const inkList of data.inkLists) { - let points = []; - for (const coordinate of inkList) { - const x = coordinate.x - data.rect[0]; - const y = data.rect[3] - coordinate.y; - points.push(`${x},${y}`); - } - points = points.join(" "); - const polyline = this.svgFactory.createElement(this.svgElementName); - polyline.setAttribute("points", points); - polyline.setAttribute("stroke-width", data.borderStyle.width || 1); - polyline.setAttribute("stroke", "transparent"); - polyline.setAttribute("fill", "transparent"); - this._createPopup(polyline, data); - svg.append(polyline); - } - this.container.append(svg); - return this.container; - } -} -class HighlightAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true, - createQuadrilaterals: true - }); - } - render() { - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - if (this.quadrilaterals) { - return this._renderQuadrilaterals("highlightAnnotation"); - } - this.container.className = "highlightAnnotation"; - return this.container; - } -} -class UnderlineAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true, - createQuadrilaterals: true - }); - } - render() { - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - if (this.quadrilaterals) { - return this._renderQuadrilaterals("underlineAnnotation"); - } - this.container.className = "underlineAnnotation"; - return this.container; - } -} -class SquigglyAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true, - createQuadrilaterals: true - }); - } - render() { - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - if (this.quadrilaterals) { - return this._renderQuadrilaterals("squigglyAnnotation"); - } - this.container.className = "squigglyAnnotation"; - return this.container; - } -} -class StrikeOutAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true, - createQuadrilaterals: true - }); - } - render() { - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - if (this.quadrilaterals) { - return this._renderQuadrilaterals("strikeoutAnnotation"); - } - this.container.className = "strikeoutAnnotation"; - return this.container; - } -} -class StampAnnotationElement extends AnnotationElement { - constructor(parameters) { - const isRenderable = !!(parameters.data.hasPopup || parameters.data.titleObj?.str || parameters.data.contentsObj?.str || parameters.data.richText?.str); - super(parameters, { - isRenderable, - ignoreBorder: true - }); - } - render() { - this.container.className = "stampAnnotation"; - if (!this.data.hasPopup) { - this._createPopup(null, this.data); - } - return this.container; - } -} -class FileAttachmentAnnotationElement extends AnnotationElement { - constructor(parameters) { - super(parameters, { - isRenderable: true - }); - const { - filename, - content - } = this.data.file; - this.filename = (0, _display_utils.getFilenameFromUrl)(filename, true); - this.content = content; - this.linkService.eventBus?.dispatch("fileattachmentannotation", { - source: this, - filename, - content - }); - } - render() { - this.container.className = "fileAttachmentAnnotation"; - let trigger; - if (this.data.hasAppearance) { - trigger = document.createElement("div"); - } else { - trigger = document.createElement("img"); - trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(this.data.name) ? "paperclip" : "pushpin"}.svg`; - } - trigger.className = "popupTriggerArea"; - trigger.addEventListener("dblclick", this._download.bind(this)); - if (!this.data.hasPopup && (this.data.titleObj?.str || this.data.contentsObj?.str || this.data.richText)) { - this._createPopup(trigger, this.data); - } - this.container.append(trigger); - return this.container; - } - _download() { - this.downloadManager?.openOrDownloadData(this.container, this.content, this.filename); - } -} -class AnnotationLayer { - static #appendElement(element, id, div, accessibilityManager) { - const contentElement = element.firstChild || element; - contentElement.id = `${_display_utils.AnnotationPrefix}${id}`; - div.append(element); - accessibilityManager?.moveElementInDOM(div, element, contentElement, false); - } - static render(params) { - const { - annotations, - div, - viewport, - accessibilityManager - } = params; - (0, _display_utils.setLayerDimensions)(div, viewport); - const elementParams = { - data: null, - layer: div, - page: params.page, - viewport, - linkService: params.linkService, - downloadManager: params.downloadManager, - imageResourcesPath: params.imageResourcesPath || "", - renderForms: params.renderForms !== false, - svgFactory: new _display_utils.DOMSVGFactory(), - annotationStorage: params.annotationStorage || new _annotation_storage.AnnotationStorage(), - enableScripting: params.enableScripting === true, - hasJSActions: params.hasJSActions, - fieldObjects: params.fieldObjects - }; - let zIndex = 0; - for (const data of annotations) { - if (data.annotationType !== _util.AnnotationType.POPUP) { - const { - width, - height - } = getRectDims(data.rect); - if (width <= 0 || height <= 0) { - continue; - } - } - elementParams.data = data; - const element = AnnotationElementFactory.create(elementParams); - if (!element.isRenderable) { - continue; - } - const rendered = element.render(); - if (data.hidden) { - rendered.style.visibility = "hidden"; - } - if (Array.isArray(rendered)) { - for (const renderedElement of rendered) { - renderedElement.style.zIndex = zIndex++; - AnnotationLayer.#appendElement(renderedElement, data.id, div, accessibilityManager); - } - } else { - rendered.style.zIndex = zIndex++; - if (element instanceof PopupAnnotationElement) { - div.prepend(rendered); - } else { - AnnotationLayer.#appendElement(rendered, data.id, div, accessibilityManager); - } - } - } - this.#setAnnotationCanvasMap(div, params.annotationCanvasMap); - } - static update(params) { - const { - annotationCanvasMap, - div, - viewport - } = params; - (0, _display_utils.setLayerDimensions)(div, { - rotation: viewport.rotation - }); - this.#setAnnotationCanvasMap(div, annotationCanvasMap); - div.hidden = false; - } - static #setAnnotationCanvasMap(div, annotationCanvasMap) { - if (!annotationCanvasMap) { - return; - } - for (const [id, canvas] of annotationCanvasMap) { - const element = div.querySelector(`[data-annotation-id="${id}"]`); - if (!element) { - continue; - } - const { - firstChild - } = element; - if (!firstChild) { - element.append(canvas); - } else if (firstChild.nodeName === "CANVAS") { - firstChild.replaceWith(canvas); - } else { - firstChild.before(canvas); - } - } - annotationCanvasMap.clear(); - } -} -exports.AnnotationLayer = AnnotationLayer; - -/***/ }), -/* 33 */ -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.ColorConverters = void 0; -function makeColorComp(n) { - return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); -} -class ColorConverters { - static CMYK_G([c, y, m, k]) { - return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; - } - static G_CMYK([g]) { - return ["CMYK", 0, 0, 0, 1 - g]; - } - static G_RGB([g]) { - return ["RGB", g, g, g]; - } - static G_HTML([g]) { - const G = makeColorComp(g); - return `#${G}${G}${G}`; - } - static RGB_G([r, g, b]) { - return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; - } - static RGB_HTML([r, g, b]) { - const R = makeColorComp(r); - const G = makeColorComp(g); - const B = makeColorComp(b); - return `#${R}${G}${B}`; - } - static T_HTML() { - return "#00000000"; - } - static CMYK_RGB([c, y, m, k]) { - return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; - } - static CMYK_HTML(components) { - const rgb = this.CMYK_RGB(components).slice(1); - return this.RGB_HTML(rgb); - } - static RGB_CMYK([r, g, b]) { - const c = 1 - r; - const m = 1 - g; - const y = 1 - b; - const k = Math.min(c, m, y); - return ["CMYK", c, m, y, k]; - } -} -exports.ColorConverters = ColorConverters; - -/***/ }), -/* 34 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.XfaLayer = void 0; -var _xfa_text = __w_pdfjs_require__(19); -class XfaLayer { - static setupStorage(html, id, element, storage, intent) { - const storedData = storage.getValue(id, { - value: null - }); - switch (element.name) { - case "textarea": - if (storedData.value !== null) { - html.textContent = storedData.value; - } - if (intent === "print") { - break; - } - html.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - }); - break; - case "input": - if (element.attributes.type === "radio" || element.attributes.type === "checkbox") { - if (storedData.value === element.attributes.xfaOn) { - html.setAttribute("checked", true); - } else if (storedData.value === element.attributes.xfaOff) { - html.removeAttribute("checked"); - } - if (intent === "print") { - break; - } - html.addEventListener("change", event => { - storage.setValue(id, { - value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff") - }); - }); - } else { - if (storedData.value !== null) { - html.setAttribute("value", storedData.value); - } - if (intent === "print") { - break; - } - html.addEventListener("input", event => { - storage.setValue(id, { - value: event.target.value - }); - }); - } - break; - case "select": - if (storedData.value !== null) { - for (const option of element.children) { - if (option.attributes.value === storedData.value) { - option.attributes.selected = true; - } - } - } - html.addEventListener("input", event => { - const options = event.target.options; - const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value; - storage.setValue(id, { - value - }); - }); - break; - } - } - static setAttributes({ - html, - element, - storage = null, - intent, - linkService - }) { - const { - attributes - } = element; - const isHTMLAnchorElement = html instanceof HTMLAnchorElement; - if (attributes.type === "radio") { - attributes.name = `${attributes.name}-${intent}`; - } - for (const [key, value] of Object.entries(attributes)) { - if (value === null || value === undefined) { - continue; - } - switch (key) { - case "class": - if (value.length) { - html.setAttribute(key, value.join(" ")); - } - break; - case "dataId": - break; - case "id": - html.setAttribute("data-element-id", value); - break; - case "style": - Object.assign(html.style, value); - break; - case "textContent": - html.textContent = value; - break; - default: - if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") { - html.setAttribute(key, value); - } - } - } - if (isHTMLAnchorElement) { - linkService.addLinkAttributes(html, attributes.href, attributes.newWindow); - } - if (storage && attributes.dataId) { - this.setupStorage(html, attributes.dataId, element, storage); - } - } - static render(parameters) { - const storage = parameters.annotationStorage; - const linkService = parameters.linkService; - const root = parameters.xfaHtml; - const intent = parameters.intent || "display"; - const rootHtml = document.createElement(root.name); - if (root.attributes) { - this.setAttributes({ - html: rootHtml, - element: root, - intent, - linkService - }); - } - const stack = [[root, -1, rootHtml]]; - const rootDiv = parameters.div; - rootDiv.append(rootHtml); - if (parameters.viewport) { - const transform = `matrix(${parameters.viewport.transform.join(",")})`; - rootDiv.style.transform = transform; - } - if (intent !== "richText") { - rootDiv.setAttribute("class", "xfaLayer xfaFont"); - } - const textDivs = []; - while (stack.length > 0) { - const [parent, i, html] = stack.at(-1); - if (i + 1 === parent.children.length) { - stack.pop(); - continue; - } - const child = parent.children[++stack.at(-1)[1]]; - if (child === null) { - continue; - } - const { - name - } = child; - if (name === "#text") { - const node = document.createTextNode(child.value); - textDivs.push(node); - html.append(node); - continue; - } - let childHtml; - if (child?.attributes?.xmlns) { - childHtml = document.createElementNS(child.attributes.xmlns, name); - } else { - childHtml = document.createElement(name); - } - html.append(childHtml); - if (child.attributes) { - this.setAttributes({ - html: childHtml, - element: child, - storage, - intent, - linkService - }); - } - if (child.children && child.children.length > 0) { - stack.push([child, -1, childHtml]); - } else if (child.value) { - const node = document.createTextNode(child.value); - if (_xfa_text.XfaText.shouldBuildText(name)) { - textDivs.push(node); - } - childHtml.append(node); - } - } - for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) { - el.setAttribute("readOnly", true); - } - return { - textDivs - }; - } - static update(parameters) { - const transform = `matrix(${parameters.viewport.transform.join(",")})`; - parameters.div.style.transform = transform; - parameters.div.hidden = false; - } -} -exports.XfaLayer = XfaLayer; - -/***/ }), -/* 35 */ -/***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.SVGGraphics = void 0; -var _display_utils = __w_pdfjs_require__(6); -var _util = __w_pdfjs_require__(1); -var _is_node = __w_pdfjs_require__(10); -let SVGGraphics = class { - constructor() { - (0, _util.unreachable)("Not implemented: SVGGraphics"); - } -}; -exports.SVGGraphics = SVGGraphics; -{ - const SVG_DEFAULTS = { - fontStyle: "normal", - fontWeight: "normal", - fillColor: "#000000" - }; - const XML_NS = "http://www.w3.org/XML/1998/namespace"; - const XLINK_NS = "http://www.w3.org/1999/xlink"; - const LINE_CAP_STYLES = ["butt", "round", "square"]; - const LINE_JOIN_STYLES = ["miter", "round", "bevel"]; - const createObjectURL = function (data, contentType = "", forceDataSchema = false) { - if (URL.createObjectURL && typeof Blob !== "undefined" && !forceDataSchema) { - return URL.createObjectURL(new Blob([data], { - type: contentType - })); - } - const digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - let buffer = `data:${contentType};base64,`; - for (let i = 0, ii = data.length; i < ii; i += 3) { - const b1 = data[i] & 0xff; - const b2 = data[i + 1] & 0xff; - const b3 = data[i + 2] & 0xff; - const d1 = b1 >> 2, - d2 = (b1 & 3) << 4 | b2 >> 4; - const d3 = i + 1 < ii ? (b2 & 0xf) << 2 | b3 >> 6 : 64; - const d4 = i + 2 < ii ? b3 & 0x3f : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; - const convertImgDataToPng = function () { - const PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); - const CHUNK_WRAPPER_SIZE = 12; - const crcTable = new Int32Array(256); - for (let i = 0; i < 256; i++) { - let c = i; - for (let h = 0; h < 8; h++) { - if (c & 1) { - c = 0xedb88320 ^ c >> 1 & 0x7fffffff; - } else { - c = c >> 1 & 0x7fffffff; - } - } - crcTable[i] = c; - } - function crc32(data, start, end) { - let crc = -1; - for (let i = start; i < end; i++) { - const a = (crc ^ data[i]) & 0xff; - const b = crcTable[a]; - crc = crc >>> 8 ^ b; - } - return crc ^ -1; - } - function writePngChunk(type, body, data, offset) { - let p = offset; - const len = body.length; - data[p] = len >> 24 & 0xff; - data[p + 1] = len >> 16 & 0xff; - data[p + 2] = len >> 8 & 0xff; - data[p + 3] = len & 0xff; - p += 4; - data[p] = type.charCodeAt(0) & 0xff; - data[p + 1] = type.charCodeAt(1) & 0xff; - data[p + 2] = type.charCodeAt(2) & 0xff; - data[p + 3] = type.charCodeAt(3) & 0xff; - p += 4; - data.set(body, p); - p += body.length; - const crc = crc32(data, offset + 4, p); - data[p] = crc >> 24 & 0xff; - data[p + 1] = crc >> 16 & 0xff; - data[p + 2] = crc >> 8 & 0xff; - data[p + 3] = crc & 0xff; - } - function adler32(data, start, end) { - let a = 1; - let b = 0; - for (let i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; - b = (b + a) % 65521; - } - return b << 16 | a; - } - function deflateSync(literals) { - if (!_is_node.isNodeJS) { - return deflateSyncUncompressed(literals); - } - try { - let input; - if (parseInt(process.versions.node) >= 8) { - input = literals; - } else { - input = Buffer.from(literals); - } - const output = require("zlib").deflateSync(input, { - level: 9 - }); - return output instanceof Uint8Array ? output : new Uint8Array(output); - } catch (e) { - (0, _util.warn)("Not compressing PNG because zlib.deflateSync is unavailable: " + e); - } - return deflateSyncUncompressed(literals); - } - function deflateSyncUncompressed(literals) { - let len = literals.length; - const maxBlockLength = 0xffff; - const deflateBlocks = Math.ceil(len / maxBlockLength); - const idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); - let pi = 0; - idat[pi++] = 0x78; - idat[pi++] = 0x9c; - let pos = 0; - while (len > maxBlockLength) { - idat[pi++] = 0x00; - idat[pi++] = 0xff; - idat[pi++] = 0xff; - idat[pi++] = 0x00; - idat[pi++] = 0x00; - idat.set(literals.subarray(pos, pos + maxBlockLength), pi); - pi += maxBlockLength; - pos += maxBlockLength; - len -= maxBlockLength; - } - idat[pi++] = 0x01; - idat[pi++] = len & 0xff; - idat[pi++] = len >> 8 & 0xff; - idat[pi++] = ~len & 0xffff & 0xff; - idat[pi++] = (~len & 0xffff) >> 8 & 0xff; - idat.set(literals.subarray(pos), pi); - pi += literals.length - pos; - const adler = adler32(literals, 0, literals.length); - idat[pi++] = adler >> 24 & 0xff; - idat[pi++] = adler >> 16 & 0xff; - idat[pi++] = adler >> 8 & 0xff; - idat[pi++] = adler & 0xff; - return idat; - } - function encode(imgData, kind, forceDataSchema, isMask) { - const width = imgData.width; - const height = imgData.height; - let bitDepth, colorType, lineSize; - const bytes = imgData.data; - switch (kind) { - case _util.ImageKind.GRAYSCALE_1BPP: - colorType = 0; - bitDepth = 1; - lineSize = width + 7 >> 3; - break; - case _util.ImageKind.RGB_24BPP: - colorType = 2; - bitDepth = 8; - lineSize = width * 3; - break; - case _util.ImageKind.RGBA_32BPP: - colorType = 6; - bitDepth = 8; - lineSize = width * 4; - break; - default: - throw new Error("invalid format"); - } - const literals = new Uint8Array((1 + lineSize) * height); - let offsetLiterals = 0, - offsetBytes = 0; - for (let y = 0; y < height; ++y) { - literals[offsetLiterals++] = 0; - literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals); - offsetBytes += lineSize; - offsetLiterals += lineSize; - } - if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) { - offsetLiterals = 0; - for (let y = 0; y < height; y++) { - offsetLiterals++; - for (let i = 0; i < lineSize; i++) { - literals[offsetLiterals++] ^= 0xff; - } - } - } - const ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]); - const idat = deflateSync(literals); - const pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length; - const data = new Uint8Array(pngLength); - let offset = 0; - data.set(PNG_HEADER, offset); - offset += PNG_HEADER.length; - writePngChunk("IHDR", ihdr, data, offset); - offset += CHUNK_WRAPPER_SIZE + ihdr.length; - writePngChunk("IDATA", idat, data, offset); - offset += CHUNK_WRAPPER_SIZE + idat.length; - writePngChunk("IEND", new Uint8Array(0), data, offset); - return createObjectURL(data, "image/png", forceDataSchema); - } - return function convertImgDataToPng(imgData, forceDataSchema, isMask) { - const kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind; - return encode(imgData, kind, forceDataSchema, isMask); - }; - }(); - class SVGExtraState { - constructor() { - this.fontSizeScale = 1; - this.fontWeight = SVG_DEFAULTS.fontWeight; - this.fontSize = 0; - this.textMatrix = _util.IDENTITY_MATRIX; - this.fontMatrix = _util.FONT_IDENTITY_MATRIX; - this.leading = 0; - this.textRenderingMode = _util.TextRenderingMode.FILL; - this.textMatrixScale = 1; - this.x = 0; - this.y = 0; - this.lineX = 0; - this.lineY = 0; - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRise = 0; - this.fillColor = SVG_DEFAULTS.fillColor; - this.strokeColor = "#000000"; - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.lineJoin = ""; - this.lineCap = ""; - this.miterLimit = 0; - this.dashArray = []; - this.dashPhase = 0; - this.dependencies = []; - this.activeClipUrl = null; - this.clipGroup = null; - this.maskId = ""; - } - clone() { - return Object.create(this); - } - setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - } - function opListToTree(opList) { - let opTree = []; - const tmp = []; - for (const opListElement of opList) { - if (opListElement.fn === "save") { - opTree.push({ - fnId: 92, - fn: "group", - items: [] - }); - tmp.push(opTree); - opTree = opTree.at(-1).items; - continue; - } - if (opListElement.fn === "restore") { - opTree = tmp.pop(); - } else { - opTree.push(opListElement); - } - } - return opTree; - } - function pf(value) { - if (Number.isInteger(value)) { - return value.toString(); - } - const s = value.toFixed(10); - let i = s.length - 1; - if (s[i] !== "0") { - return s; - } - do { - i--; - } while (s[i] === "0"); - return s.substring(0, s[i] === "." ? i : i + 1); - } - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ""; - } - return `scale(${pf(m[0])} ${pf(m[3])})`; - } - if (m[0] === m[3] && m[1] === -m[2]) { - const a = Math.acos(m[0]) * 180 / Math.PI; - return `rotate(${pf(a)})`; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return `translate(${pf(m[4])} ${pf(m[5])})`; - } - } - return `matrix(${pf(m[0])} ${pf(m[1])} ${pf(m[2])} ${pf(m[3])} ${pf(m[4])} ` + `${pf(m[5])})`; - } - let clipCount = 0; - let maskCount = 0; - let shadingCount = 0; - exports.SVGGraphics = SVGGraphics = class { - constructor(commonObjs, objs, forceDataSchema = false) { - (0, _display_utils.deprecated)("The SVG back-end is no longer maintained and *may* be removed in the future."); - this.svgFactory = new _display_utils.DOMSVGFactory(); - this.current = new SVGExtraState(); - this.transformMatrix = _util.IDENTITY_MATRIX; - this.transformStack = []; - this.extraStack = []; - this.commonObjs = commonObjs; - this.objs = objs; - this.pendingClip = null; - this.pendingEOFill = false; - this.embedFonts = false; - this.embeddedFonts = Object.create(null); - this.cssStyle = null; - this.forceDataSchema = !!forceDataSchema; - this._operatorIdMapping = []; - for (const op in _util.OPS) { - this._operatorIdMapping[_util.OPS[op]] = op; - } - } - getObject(data, fallback = null) { - if (typeof data === "string") { - return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data); - } - return fallback; - } - save() { - this.transformStack.push(this.transformMatrix); - const old = this.current; - this.extraStack.push(old); - this.current = old.clone(); - } - restore() { - this.transformMatrix = this.transformStack.pop(); - this.current = this.extraStack.pop(); - this.pendingClip = null; - this.tgrp = null; - } - group(items) { - this.save(); - this.executeOpTree(items); - this.restore(); - } - loadDependencies(operatorList) { - const fnArray = operatorList.fnArray; - const argsArray = operatorList.argsArray; - for (let i = 0, ii = fnArray.length; i < ii; i++) { - if (fnArray[i] !== _util.OPS.dependency) { - continue; - } - for (const obj of argsArray[i]) { - const objsPool = obj.startsWith("g_") ? this.commonObjs : this.objs; - const promise = new Promise(resolve => { - objsPool.get(obj, resolve); - }); - this.current.dependencies.push(promise); - } - } - return Promise.all(this.current.dependencies); - } - transform(a, b, c, d, e, f) { - const transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix); - this.tgrp = null; - } - getSVG(operatorList, viewport) { - this.viewport = viewport; - const svgElement = this._initialize(viewport); - return this.loadDependencies(operatorList).then(() => { - this.transformMatrix = _util.IDENTITY_MATRIX; - this.executeOpTree(this.convertOpList(operatorList)); - return svgElement; - }); - } - convertOpList(operatorList) { - const operatorIdMapping = this._operatorIdMapping; - const argsArray = operatorList.argsArray; - const fnArray = operatorList.fnArray; - const opList = []; - for (let i = 0, ii = fnArray.length; i < ii; i++) { - const fnId = fnArray[i]; - opList.push({ - fnId, - fn: operatorIdMapping[fnId], - args: argsArray[i] - }); - } - return opListToTree(opList); - } - executeOpTree(opTree) { - for (const opTreeElement of opTree) { - const fn = opTreeElement.fn; - const fnId = opTreeElement.fnId; - const args = opTreeElement.args; - switch (fnId | 0) { - case _util.OPS.beginText: - this.beginText(); - break; - case _util.OPS.dependency: - break; - case _util.OPS.setLeading: - this.setLeading(args); - break; - case _util.OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; - case _util.OPS.setFont: - this.setFont(args); - break; - case _util.OPS.showText: - this.showText(args[0]); - break; - case _util.OPS.showSpacedText: - this.showText(args[0]); - break; - case _util.OPS.endText: - this.endText(); - break; - case _util.OPS.moveText: - this.moveText(args[0], args[1]); - break; - case _util.OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; - case _util.OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; - case _util.OPS.setHScale: - this.setHScale(args[0]); - break; - case _util.OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]); - break; - case _util.OPS.setTextRise: - this.setTextRise(args[0]); - break; - case _util.OPS.setTextRenderingMode: - this.setTextRenderingMode(args[0]); - break; - case _util.OPS.setLineWidth: - this.setLineWidth(args[0]); - break; - case _util.OPS.setLineJoin: - this.setLineJoin(args[0]); - break; - case _util.OPS.setLineCap: - this.setLineCap(args[0]); - break; - case _util.OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; - case _util.OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; - case _util.OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; - case _util.OPS.setStrokeColorN: - this.setStrokeColorN(args); - break; - case _util.OPS.setFillColorN: - this.setFillColorN(args); - break; - case _util.OPS.shadingFill: - this.shadingFill(args[0]); - break; - case _util.OPS.setDash: - this.setDash(args[0], args[1]); - break; - case _util.OPS.setRenderingIntent: - this.setRenderingIntent(args[0]); - break; - case _util.OPS.setFlatness: - this.setFlatness(args[0]); - break; - case _util.OPS.setGState: - this.setGState(args[0]); - break; - case _util.OPS.fill: - this.fill(); - break; - case _util.OPS.eoFill: - this.eoFill(); - break; - case _util.OPS.stroke: - this.stroke(); - break; - case _util.OPS.fillStroke: - this.fillStroke(); - break; - case _util.OPS.eoFillStroke: - this.eoFillStroke(); - break; - case _util.OPS.clip: - this.clip("nonzero"); - break; - case _util.OPS.eoClip: - this.clip("evenodd"); - break; - case _util.OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; - case _util.OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; - case _util.OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; - case _util.OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; - case _util.OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; - case _util.OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; - case _util.OPS.closePath: - this.closePath(); - break; - case _util.OPS.closeStroke: - this.closeStroke(); - break; - case _util.OPS.closeFillStroke: - this.closeFillStroke(); - break; - case _util.OPS.closeEOFillStroke: - this.closeEOFillStroke(); - break; - case _util.OPS.nextLine: - this.nextLine(); - break; - case _util.OPS.transform: - this.transform(args[0], args[1], args[2], args[3], args[4], args[5]); - break; - case _util.OPS.constructPath: - this.constructPath(args[0], args[1]); - break; - case _util.OPS.endPath: - this.endPath(); - break; - case 92: - this.group(opTreeElement.items); - break; - default: - (0, _util.warn)(`Unimplemented operator ${fn}`); - break; - } - } - } - setWordSpacing(wordSpacing) { - this.current.wordSpacing = wordSpacing; - } - setCharSpacing(charSpacing) { - this.current.charSpacing = charSpacing; - } - nextLine() { - this.moveText(0, this.current.leading); - } - setTextMatrix(a, b, c, d, e, f) { - const current = this.current; - current.textMatrix = current.lineMatrix = [a, b, c, d, e, f]; - current.textMatrixScale = Math.hypot(a, b); - current.x = current.lineX = 0; - current.y = current.lineY = 0; - current.xcoords = []; - current.ycoords = []; - current.tspan = this.svgFactory.createElement("svg:tspan"); - current.tspan.setAttributeNS(null, "font-family", current.fontFamily); - current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); - current.tspan.setAttributeNS(null, "y", pf(-current.y)); - current.txtElement = this.svgFactory.createElement("svg:text"); - current.txtElement.append(current.tspan); - } - beginText() { - const current = this.current; - current.x = current.lineX = 0; - current.y = current.lineY = 0; - current.textMatrix = _util.IDENTITY_MATRIX; - current.lineMatrix = _util.IDENTITY_MATRIX; - current.textMatrixScale = 1; - current.tspan = this.svgFactory.createElement("svg:tspan"); - current.txtElement = this.svgFactory.createElement("svg:text"); - current.txtgrp = this.svgFactory.createElement("svg:g"); - current.xcoords = []; - current.ycoords = []; - } - moveText(x, y) { - const current = this.current; - current.x = current.lineX += x; - current.y = current.lineY += y; - current.xcoords = []; - current.ycoords = []; - current.tspan = this.svgFactory.createElement("svg:tspan"); - current.tspan.setAttributeNS(null, "font-family", current.fontFamily); - current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); - current.tspan.setAttributeNS(null, "y", pf(-current.y)); - } - showText(glyphs) { - const current = this.current; - const font = current.font; - const fontSize = current.fontSize; - if (fontSize === 0) { - return; - } - const fontSizeScale = current.fontSizeScale; - const charSpacing = current.charSpacing; - const wordSpacing = current.wordSpacing; - const fontDirection = current.fontDirection; - const textHScale = current.textHScale * fontDirection; - const vertical = font.vertical; - const spacingDir = vertical ? 1 : -1; - const defaultVMetrics = font.defaultVMetrics; - const widthAdvanceScale = fontSize * current.fontMatrix[0]; - let x = 0; - for (const glyph of glyphs) { - if (glyph === null) { - x += fontDirection * wordSpacing; - continue; - } else if (typeof glyph === "number") { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - const character = glyph.fontChar; - let scaledX, scaledY; - let width = glyph.width; - if (vertical) { - let vx; - const vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - const vy = vmetric[2] * widthAdvanceScale; - width = vmetric ? -vmetric[0] : width; - scaledX = vx / fontSizeScale; - scaledY = (x + vy) / fontSizeScale; - } else { - scaledX = x / fontSizeScale; - scaledY = 0; - } - if (glyph.isInFont || font.missingFile) { - current.xcoords.push(current.x + scaledX); - if (vertical) { - current.ycoords.push(-current.y + scaledY); - } - current.tspan.textContent += character; - } else {} - let charWidth; - if (vertical) { - charWidth = width * widthAdvanceScale - spacing * fontDirection; - } else { - charWidth = width * widthAdvanceScale + spacing * fontDirection; - } - x += charWidth; - } - current.tspan.setAttributeNS(null, "x", current.xcoords.map(pf).join(" ")); - if (vertical) { - current.tspan.setAttributeNS(null, "y", current.ycoords.map(pf).join(" ")); - } else { - current.tspan.setAttributeNS(null, "y", pf(-current.y)); - } - if (vertical) { - current.y -= x; - } else { - current.x += x * textHScale; - } - current.tspan.setAttributeNS(null, "font-family", current.fontFamily); - current.tspan.setAttributeNS(null, "font-size", `${pf(current.fontSize)}px`); - if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { - current.tspan.setAttributeNS(null, "font-style", current.fontStyle); - } - if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { - current.tspan.setAttributeNS(null, "font-weight", current.fontWeight); - } - const fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - if (current.fillColor !== SVG_DEFAULTS.fillColor) { - current.tspan.setAttributeNS(null, "fill", current.fillColor); - } - if (current.fillAlpha < 1) { - current.tspan.setAttributeNS(null, "fill-opacity", current.fillAlpha); - } - } else if (current.textRenderingMode === _util.TextRenderingMode.ADD_TO_PATH) { - current.tspan.setAttributeNS(null, "fill", "transparent"); - } else { - current.tspan.setAttributeNS(null, "fill", "none"); - } - if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) { - const lineWidthScale = 1 / (current.textMatrixScale || 1); - this._setStrokeAttributes(current.tspan, lineWidthScale); - } - let textMatrix = current.textMatrix; - if (current.textRise !== 0) { - textMatrix = textMatrix.slice(); - textMatrix[5] += current.textRise; - } - current.txtElement.setAttributeNS(null, "transform", `${pm(textMatrix)} scale(${pf(textHScale)}, -1)`); - current.txtElement.setAttributeNS(XML_NS, "xml:space", "preserve"); - current.txtElement.append(current.tspan); - current.txtgrp.append(current.txtElement); - this._ensureTransformGroup().append(current.txtElement); - } - setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - } - addFontStyle(fontObj) { - if (!fontObj.data) { - throw new Error("addFontStyle: No font data available, " + 'ensure that the "fontExtraProperties" API parameter is set.'); - } - if (!this.cssStyle) { - this.cssStyle = this.svgFactory.createElement("svg:style"); - this.cssStyle.setAttributeNS(null, "type", "text/css"); - this.defs.append(this.cssStyle); - } - const url = createObjectURL(fontObj.data, fontObj.mimetype, this.forceDataSchema); - this.cssStyle.textContent += `@font-face { font-family: "${fontObj.loadedName}";` + ` src: url(${url}); }\n`; - } - setFont(details) { - const current = this.current; - const fontObj = this.commonObjs.get(details[0]); - let size = details[1]; - current.font = fontObj; - if (this.embedFonts && !fontObj.missingFile && !this.embeddedFonts[fontObj.loadedName]) { - this.addFontStyle(fontObj); - this.embeddedFonts[fontObj.loadedName] = fontObj; - } - current.fontMatrix = fontObj.fontMatrix || _util.FONT_IDENTITY_MATRIX; - let bold = "normal"; - if (fontObj.black) { - bold = "900"; - } else if (fontObj.bold) { - bold = "bold"; - } - const italic = fontObj.italic ? "italic" : "normal"; - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - current.fontSize = size; - current.fontFamily = fontObj.loadedName; - current.fontWeight = bold; - current.fontStyle = italic; - current.tspan = this.svgFactory.createElement("svg:tspan"); - current.tspan.setAttributeNS(null, "y", pf(-current.y)); - current.xcoords = []; - current.ycoords = []; - } - endText() { - const current = this.current; - if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement?.hasChildNodes()) { - current.element = current.txtElement; - this.clip("nonzero"); - this.endPath(); - } - } - setLineWidth(width) { - if (width > 0) { - this.current.lineWidth = width; - } - } - setLineCap(style) { - this.current.lineCap = LINE_CAP_STYLES[style]; - } - setLineJoin(style) { - this.current.lineJoin = LINE_JOIN_STYLES[style]; - } - setMiterLimit(limit) { - this.current.miterLimit = limit; - } - setStrokeAlpha(strokeAlpha) { - this.current.strokeAlpha = strokeAlpha; - } - setStrokeRGBColor(r, g, b) { - this.current.strokeColor = _util.Util.makeHexColor(r, g, b); - } - setFillAlpha(fillAlpha) { - this.current.fillAlpha = fillAlpha; - } - setFillRGBColor(r, g, b) { - this.current.fillColor = _util.Util.makeHexColor(r, g, b); - this.current.tspan = this.svgFactory.createElement("svg:tspan"); - this.current.xcoords = []; - this.current.ycoords = []; - } - setStrokeColorN(args) { - this.current.strokeColor = this._makeColorN_Pattern(args); - } - setFillColorN(args) { - this.current.fillColor = this._makeColorN_Pattern(args); - } - shadingFill(args) { - const width = this.viewport.width; - const height = this.viewport.height; - const inv = _util.Util.inverseTransform(this.transformMatrix); - const bl = _util.Util.applyTransform([0, 0], inv); - const br = _util.Util.applyTransform([0, height], inv); - const ul = _util.Util.applyTransform([width, 0], inv); - const ur = _util.Util.applyTransform([width, height], inv); - const x0 = Math.min(bl[0], br[0], ul[0], ur[0]); - const y0 = Math.min(bl[1], br[1], ul[1], ur[1]); - const x1 = Math.max(bl[0], br[0], ul[0], ur[0]); - const y1 = Math.max(bl[1], br[1], ul[1], ur[1]); - const rect = this.svgFactory.createElement("svg:rect"); - rect.setAttributeNS(null, "x", x0); - rect.setAttributeNS(null, "y", y0); - rect.setAttributeNS(null, "width", x1 - x0); - rect.setAttributeNS(null, "height", y1 - y0); - rect.setAttributeNS(null, "fill", this._makeShadingPattern(args)); - if (this.current.fillAlpha < 1) { - rect.setAttributeNS(null, "fill-opacity", this.current.fillAlpha); - } - this._ensureTransformGroup().append(rect); - } - _makeColorN_Pattern(args) { - if (args[0] === "TilingPattern") { - return this._makeTilingPattern(args); - } - return this._makeShadingPattern(args); - } - _makeTilingPattern(args) { - const color = args[1]; - const operatorList = args[2]; - const matrix = args[3] || _util.IDENTITY_MATRIX; - const [x0, y0, x1, y1] = args[4]; - const xstep = args[5]; - const ystep = args[6]; - const paintType = args[7]; - const tilingId = `shading${shadingCount++}`; - const [tx0, ty0, tx1, ty1] = _util.Util.normalizeRect([..._util.Util.applyTransform([x0, y0], matrix), ..._util.Util.applyTransform([x1, y1], matrix)]); - const [xscale, yscale] = _util.Util.singularValueDecompose2dScale(matrix); - const txstep = xstep * xscale; - const tystep = ystep * yscale; - const tiling = this.svgFactory.createElement("svg:pattern"); - tiling.setAttributeNS(null, "id", tilingId); - tiling.setAttributeNS(null, "patternUnits", "userSpaceOnUse"); - tiling.setAttributeNS(null, "width", txstep); - tiling.setAttributeNS(null, "height", tystep); - tiling.setAttributeNS(null, "x", `${tx0}`); - tiling.setAttributeNS(null, "y", `${ty0}`); - const svg = this.svg; - const transformMatrix = this.transformMatrix; - const fillColor = this.current.fillColor; - const strokeColor = this.current.strokeColor; - const bbox = this.svgFactory.create(tx1 - tx0, ty1 - ty0); - this.svg = bbox; - this.transformMatrix = matrix; - if (paintType === 2) { - const cssColor = _util.Util.makeHexColor(...color); - this.current.fillColor = cssColor; - this.current.strokeColor = cssColor; - } - this.executeOpTree(this.convertOpList(operatorList)); - this.svg = svg; - this.transformMatrix = transformMatrix; - this.current.fillColor = fillColor; - this.current.strokeColor = strokeColor; - tiling.append(bbox.childNodes[0]); - this.defs.append(tiling); - return `url(#${tilingId})`; - } - _makeShadingPattern(args) { - if (typeof args === "string") { - args = this.objs.get(args); - } - switch (args[0]) { - case "RadialAxial": - const shadingId = `shading${shadingCount++}`; - const colorStops = args[3]; - let gradient; - switch (args[1]) { - case "axial": - const point0 = args[4]; - const point1 = args[5]; - gradient = this.svgFactory.createElement("svg:linearGradient"); - gradient.setAttributeNS(null, "id", shadingId); - gradient.setAttributeNS(null, "gradientUnits", "userSpaceOnUse"); - gradient.setAttributeNS(null, "x1", point0[0]); - gradient.setAttributeNS(null, "y1", point0[1]); - gradient.setAttributeNS(null, "x2", point1[0]); - gradient.setAttributeNS(null, "y2", point1[1]); - break; - case "radial": - const focalPoint = args[4]; - const circlePoint = args[5]; - const focalRadius = args[6]; - const circleRadius = args[7]; - gradient = this.svgFactory.createElement("svg:radialGradient"); - gradient.setAttributeNS(null, "id", shadingId); - gradient.setAttributeNS(null, "gradientUnits", "userSpaceOnUse"); - gradient.setAttributeNS(null, "cx", circlePoint[0]); - gradient.setAttributeNS(null, "cy", circlePoint[1]); - gradient.setAttributeNS(null, "r", circleRadius); - gradient.setAttributeNS(null, "fx", focalPoint[0]); - gradient.setAttributeNS(null, "fy", focalPoint[1]); - gradient.setAttributeNS(null, "fr", focalRadius); - break; - default: - throw new Error(`Unknown RadialAxial type: ${args[1]}`); - } - for (const colorStop of colorStops) { - const stop = this.svgFactory.createElement("svg:stop"); - stop.setAttributeNS(null, "offset", colorStop[0]); - stop.setAttributeNS(null, "stop-color", colorStop[1]); - gradient.append(stop); - } - this.defs.append(gradient); - return `url(#${shadingId})`; - case "Mesh": - (0, _util.warn)("Unimplemented pattern Mesh"); - return null; - case "Dummy": - return "hotpink"; - default: - throw new Error(`Unknown IR type: ${args[0]}`); - } - } - setDash(dashArray, dashPhase) { - this.current.dashArray = dashArray; - this.current.dashPhase = dashPhase; - } - constructPath(ops, args) { - const current = this.current; - let x = current.x, - y = current.y; - let d = []; - let j = 0; - for (const op of ops) { - switch (op | 0) { - case _util.OPS.rectangle: - x = args[j++]; - y = args[j++]; - const width = args[j++]; - const height = args[j++]; - const xw = x + width; - const yh = y + height; - d.push("M", pf(x), pf(y), "L", pf(xw), pf(y), "L", pf(xw), pf(yh), "L", pf(x), pf(yh), "Z"); - break; - case _util.OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push("M", pf(x), pf(y)); - break; - case _util.OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push("L", pf(x), pf(y)); - break; - case _util.OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push("C", pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; - case _util.OPS.curveTo2: - d.push("C", pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3])); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case _util.OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push("C", pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y)); - j += 4; - break; - case _util.OPS.closePath: - d.push("Z"); - break; - } - } - d = d.join(" "); - if (current.path && ops.length > 0 && ops[0] !== _util.OPS.rectangle && ops[0] !== _util.OPS.moveTo) { - d = current.path.getAttributeNS(null, "d") + d; - } else { - current.path = this.svgFactory.createElement("svg:path"); - this._ensureTransformGroup().append(current.path); - } - current.path.setAttributeNS(null, "d", d); - current.path.setAttributeNS(null, "fill", "none"); - current.element = current.path; - current.setCurrentPoint(x, y); - } - endPath() { - const current = this.current; - current.path = null; - if (!this.pendingClip) { - return; - } - if (!current.element) { - this.pendingClip = null; - return; - } - const clipId = `clippath${clipCount++}`; - const clipPath = this.svgFactory.createElement("svg:clipPath"); - clipPath.setAttributeNS(null, "id", clipId); - clipPath.setAttributeNS(null, "transform", pm(this.transformMatrix)); - const clipElement = current.element.cloneNode(true); - if (this.pendingClip === "evenodd") { - clipElement.setAttributeNS(null, "clip-rule", "evenodd"); - } else { - clipElement.setAttributeNS(null, "clip-rule", "nonzero"); - } - this.pendingClip = null; - clipPath.append(clipElement); - this.defs.append(clipPath); - if (current.activeClipUrl) { - current.clipGroup = null; - for (const prev of this.extraStack) { - prev.clipGroup = null; - } - clipPath.setAttributeNS(null, "clip-path", current.activeClipUrl); - } - current.activeClipUrl = `url(#${clipId})`; - this.tgrp = null; - } - clip(type) { - this.pendingClip = type; - } - closePath() { - const current = this.current; - if (current.path) { - const d = `${current.path.getAttributeNS(null, "d")}Z`; - current.path.setAttributeNS(null, "d", d); - } - } - setLeading(leading) { - this.current.leading = -leading; - } - setTextRise(textRise) { - this.current.textRise = textRise; - } - setTextRenderingMode(textRenderingMode) { - this.current.textRenderingMode = textRenderingMode; - } - setHScale(scale) { - this.current.textHScale = scale / 100; - } - setRenderingIntent(intent) {} - setFlatness(flatness) {} - setGState(states) { - for (const [key, value] of states) { - switch (key) { - case "LW": - this.setLineWidth(value); - break; - case "LC": - this.setLineCap(value); - break; - case "LJ": - this.setLineJoin(value); - break; - case "ML": - this.setMiterLimit(value); - break; - case "D": - this.setDash(value[0], value[1]); - break; - case "RI": - this.setRenderingIntent(value); - break; - case "FL": - this.setFlatness(value); - break; - case "Font": - this.setFont(value); - break; - case "CA": - this.setStrokeAlpha(value); - break; - case "ca": - this.setFillAlpha(value); - break; - default: - (0, _util.warn)(`Unimplemented graphic state operator ${key}`); - break; - } - } - } - fill() { - const current = this.current; - if (current.element) { - current.element.setAttributeNS(null, "fill", current.fillColor); - current.element.setAttributeNS(null, "fill-opacity", current.fillAlpha); - this.endPath(); - } - } - stroke() { - const current = this.current; - if (current.element) { - this._setStrokeAttributes(current.element); - current.element.setAttributeNS(null, "fill", "none"); - this.endPath(); - } - } - _setStrokeAttributes(element, lineWidthScale = 1) { - const current = this.current; - let dashArray = current.dashArray; - if (lineWidthScale !== 1 && dashArray.length > 0) { - dashArray = dashArray.map(function (value) { - return lineWidthScale * value; - }); - } - element.setAttributeNS(null, "stroke", current.strokeColor); - element.setAttributeNS(null, "stroke-opacity", current.strokeAlpha); - element.setAttributeNS(null, "stroke-miterlimit", pf(current.miterLimit)); - element.setAttributeNS(null, "stroke-linecap", current.lineCap); - element.setAttributeNS(null, "stroke-linejoin", current.lineJoin); - element.setAttributeNS(null, "stroke-width", pf(lineWidthScale * current.lineWidth) + "px"); - element.setAttributeNS(null, "stroke-dasharray", dashArray.map(pf).join(" ")); - element.setAttributeNS(null, "stroke-dashoffset", pf(lineWidthScale * current.dashPhase) + "px"); - } - eoFill() { - this.current.element?.setAttributeNS(null, "fill-rule", "evenodd"); - this.fill(); - } - fillStroke() { - this.stroke(); - this.fill(); - } - eoFillStroke() { - this.current.element?.setAttributeNS(null, "fill-rule", "evenodd"); - this.fillStroke(); - } - closeStroke() { - this.closePath(); - this.stroke(); - } - closeFillStroke() { - this.closePath(); - this.fillStroke(); - } - closeEOFillStroke() { - this.closePath(); - this.eoFillStroke(); - } - paintSolidColorImageMask() { - const rect = this.svgFactory.createElement("svg:rect"); - rect.setAttributeNS(null, "x", "0"); - rect.setAttributeNS(null, "y", "0"); - rect.setAttributeNS(null, "width", "1px"); - rect.setAttributeNS(null, "height", "1px"); - rect.setAttributeNS(null, "fill", this.current.fillColor); - this._ensureTransformGroup().append(rect); - } - paintImageXObject(objId) { - const imgData = this.getObject(objId); - if (!imgData) { - (0, _util.warn)(`Dependent image with object ID ${objId} is not ready yet`); - return; - } - this.paintInlineImageXObject(imgData); - } - paintInlineImageXObject(imgData, mask) { - const width = imgData.width; - const height = imgData.height; - const imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask); - const cliprect = this.svgFactory.createElement("svg:rect"); - cliprect.setAttributeNS(null, "x", "0"); - cliprect.setAttributeNS(null, "y", "0"); - cliprect.setAttributeNS(null, "width", pf(width)); - cliprect.setAttributeNS(null, "height", pf(height)); - this.current.element = cliprect; - this.clip("nonzero"); - const imgEl = this.svgFactory.createElement("svg:image"); - imgEl.setAttributeNS(XLINK_NS, "xlink:href", imgSrc); - imgEl.setAttributeNS(null, "x", "0"); - imgEl.setAttributeNS(null, "y", pf(-height)); - imgEl.setAttributeNS(null, "width", pf(width) + "px"); - imgEl.setAttributeNS(null, "height", pf(height) + "px"); - imgEl.setAttributeNS(null, "transform", `scale(${pf(1 / width)} ${pf(-1 / height)})`); - if (mask) { - mask.append(imgEl); - } else { - this._ensureTransformGroup().append(imgEl); - } - } - paintImageMaskXObject(img) { - const imgData = this.getObject(img.data, img); - if (imgData.bitmap) { - (0, _util.warn)("paintImageMaskXObject: ImageBitmap support is not implemented, " + "ensure that the `isOffscreenCanvasSupported` API parameter is disabled."); - return; - } - const current = this.current; - const width = imgData.width; - const height = imgData.height; - const fillColor = current.fillColor; - current.maskId = `mask${maskCount++}`; - const mask = this.svgFactory.createElement("svg:mask"); - mask.setAttributeNS(null, "id", current.maskId); - const rect = this.svgFactory.createElement("svg:rect"); - rect.setAttributeNS(null, "x", "0"); - rect.setAttributeNS(null, "y", "0"); - rect.setAttributeNS(null, "width", pf(width)); - rect.setAttributeNS(null, "height", pf(height)); - rect.setAttributeNS(null, "fill", fillColor); - rect.setAttributeNS(null, "mask", `url(#${current.maskId})`); - this.defs.append(mask); - this._ensureTransformGroup().append(rect); - this.paintInlineImageXObject(imgData, mask); - } - paintFormXObjectBegin(matrix, bbox) { - if (Array.isArray(matrix) && matrix.length === 6) { - this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); - } - if (bbox) { - const width = bbox[2] - bbox[0]; - const height = bbox[3] - bbox[1]; - const cliprect = this.svgFactory.createElement("svg:rect"); - cliprect.setAttributeNS(null, "x", bbox[0]); - cliprect.setAttributeNS(null, "y", bbox[1]); - cliprect.setAttributeNS(null, "width", pf(width)); - cliprect.setAttributeNS(null, "height", pf(height)); - this.current.element = cliprect; - this.clip("nonzero"); - this.endPath(); - } - } - paintFormXObjectEnd() {} - _initialize(viewport) { - const svg = this.svgFactory.create(viewport.width, viewport.height); - const definitions = this.svgFactory.createElement("svg:defs"); - svg.append(definitions); - this.defs = definitions; - const rootGroup = this.svgFactory.createElement("svg:g"); - rootGroup.setAttributeNS(null, "transform", pm(viewport.transform)); - svg.append(rootGroup); - this.svg = rootGroup; - return svg; - } - _ensureClipGroup() { - if (!this.current.clipGroup) { - const clipGroup = this.svgFactory.createElement("svg:g"); - clipGroup.setAttributeNS(null, "clip-path", this.current.activeClipUrl); - this.svg.append(clipGroup); - this.current.clipGroup = clipGroup; - } - return this.current.clipGroup; - } - _ensureTransformGroup() { - if (!this.tgrp) { - this.tgrp = this.svgFactory.createElement("svg:g"); - this.tgrp.setAttributeNS(null, "transform", pm(this.transformMatrix)); - if (this.current.activeClipUrl) { - this._ensureClipGroup().append(this.tgrp); - } else { - this.svg.append(this.tgrp); - } - } - return this.tgrp; - } - }; -} - -/***/ }) -/******/ ]); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __w_pdfjs_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -var exports = __webpack_exports__; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "AbortException", ({ - enumerable: true, - get: function () { - return _util.AbortException; - } -})); -Object.defineProperty(exports, "AnnotationEditorLayer", ({ - enumerable: true, - get: function () { - return _annotation_editor_layer.AnnotationEditorLayer; - } -})); -Object.defineProperty(exports, "AnnotationEditorParamsType", ({ - enumerable: true, - get: function () { - return _util.AnnotationEditorParamsType; - } -})); -Object.defineProperty(exports, "AnnotationEditorType", ({ - enumerable: true, - get: function () { - return _util.AnnotationEditorType; - } -})); -Object.defineProperty(exports, "AnnotationEditorUIManager", ({ - enumerable: true, - get: function () { - return _tools.AnnotationEditorUIManager; - } -})); -Object.defineProperty(exports, "AnnotationLayer", ({ - enumerable: true, - get: function () { - return _annotation_layer.AnnotationLayer; - } -})); -Object.defineProperty(exports, "AnnotationMode", ({ - enumerable: true, - get: function () { - return _util.AnnotationMode; - } -})); -Object.defineProperty(exports, "CMapCompressionType", ({ - enumerable: true, - get: function () { - return _util.CMapCompressionType; - } -})); -Object.defineProperty(exports, "GlobalWorkerOptions", ({ - enumerable: true, - get: function () { - return _worker_options.GlobalWorkerOptions; - } -})); -Object.defineProperty(exports, "InvalidPDFException", ({ - enumerable: true, - get: function () { - return _util.InvalidPDFException; - } -})); -Object.defineProperty(exports, "MissingPDFException", ({ - enumerable: true, - get: function () { - return _util.MissingPDFException; - } -})); -Object.defineProperty(exports, "OPS", ({ - enumerable: true, - get: function () { - return _util.OPS; - } -})); -Object.defineProperty(exports, "PDFDataRangeTransport", ({ - enumerable: true, - get: function () { - return _api.PDFDataRangeTransport; - } -})); -Object.defineProperty(exports, "PDFDateString", ({ - enumerable: true, - get: function () { - return _display_utils.PDFDateString; - } -})); -Object.defineProperty(exports, "PDFWorker", ({ - enumerable: true, - get: function () { - return _api.PDFWorker; - } -})); -Object.defineProperty(exports, "PasswordResponses", ({ - enumerable: true, - get: function () { - return _util.PasswordResponses; - } -})); -Object.defineProperty(exports, "PermissionFlag", ({ - enumerable: true, - get: function () { - return _util.PermissionFlag; - } -})); -Object.defineProperty(exports, "PixelsPerInch", ({ - enumerable: true, - get: function () { - return _display_utils.PixelsPerInch; - } -})); -Object.defineProperty(exports, "RenderingCancelledException", ({ - enumerable: true, - get: function () { - return _display_utils.RenderingCancelledException; - } -})); -Object.defineProperty(exports, "SVGGraphics", ({ - enumerable: true, - get: function () { - return _svg.SVGGraphics; - } -})); -Object.defineProperty(exports, "UNSUPPORTED_FEATURES", ({ - enumerable: true, - get: function () { - return _util.UNSUPPORTED_FEATURES; - } -})); -Object.defineProperty(exports, "UnexpectedResponseException", ({ - enumerable: true, - get: function () { - return _util.UnexpectedResponseException; - } -})); -Object.defineProperty(exports, "Util", ({ - enumerable: true, - get: function () { - return _util.Util; - } -})); -Object.defineProperty(exports, "VerbosityLevel", ({ - enumerable: true, - get: function () { - return _util.VerbosityLevel; - } -})); -Object.defineProperty(exports, "XfaLayer", ({ - enumerable: true, - get: function () { - return _xfa_layer.XfaLayer; - } -})); -Object.defineProperty(exports, "build", ({ - enumerable: true, - get: function () { - return _api.build; - } -})); -Object.defineProperty(exports, "createPromiseCapability", ({ - enumerable: true, - get: function () { - return _util.createPromiseCapability; - } -})); -Object.defineProperty(exports, "createValidAbsoluteUrl", ({ - enumerable: true, - get: function () { - return _util.createValidAbsoluteUrl; - } -})); -Object.defineProperty(exports, "getDocument", ({ - enumerable: true, - get: function () { - return _api.getDocument; - } -})); -Object.defineProperty(exports, "getFilenameFromUrl", ({ - enumerable: true, - get: function () { - return _display_utils.getFilenameFromUrl; - } -})); -Object.defineProperty(exports, "getPdfFilenameFromUrl", ({ - enumerable: true, - get: function () { - return _display_utils.getPdfFilenameFromUrl; - } -})); -Object.defineProperty(exports, "getXfaPageViewport", ({ - enumerable: true, - get: function () { - return _display_utils.getXfaPageViewport; - } -})); -Object.defineProperty(exports, "isDataScheme", ({ - enumerable: true, - get: function () { - return _display_utils.isDataScheme; - } -})); -Object.defineProperty(exports, "isPdfFile", ({ - enumerable: true, - get: function () { - return _display_utils.isPdfFile; - } -})); -Object.defineProperty(exports, "loadScript", ({ - enumerable: true, - get: function () { - return _display_utils.loadScript; - } -})); -Object.defineProperty(exports, "renderTextLayer", ({ - enumerable: true, - get: function () { - return _text_layer.renderTextLayer; - } -})); -Object.defineProperty(exports, "setLayerDimensions", ({ - enumerable: true, - get: function () { - return _display_utils.setLayerDimensions; - } -})); -Object.defineProperty(exports, "shadow", ({ - enumerable: true, - get: function () { - return _util.shadow; - } -})); -Object.defineProperty(exports, "updateTextLayer", ({ - enumerable: true, - get: function () { - return _text_layer.updateTextLayer; - } -})); -Object.defineProperty(exports, "version", ({ - enumerable: true, - get: function () { - return _api.version; - } -})); -var _util = __w_pdfjs_require__(1); -var _api = __w_pdfjs_require__(2); -var _display_utils = __w_pdfjs_require__(6); -var _text_layer = __w_pdfjs_require__(26); -var _annotation_editor_layer = __w_pdfjs_require__(27); -var _tools = __w_pdfjs_require__(5); -var _annotation_layer = __w_pdfjs_require__(32); -var _worker_options = __w_pdfjs_require__(14); -var _svg = __w_pdfjs_require__(35); -var _xfa_layer = __w_pdfjs_require__(34); -const pdfjsVersion = '3.3.122'; -const pdfjsBuild = '562045607'; -})(); - -/******/ return __webpack_exports__; -/******/ })() -; -}); -//# sourceMappingURL=pdf.js.map \ No newline at end of file diff --git a/src/main/resources/static/pdfjs/pdf.js.map b/src/main/resources/static/pdfjs/pdf.js.map deleted file mode 100644 index 5713d322..00000000 --- a/src/main/resources/static/pdfjs/pdf.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"pdf.js","mappings":"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","sources":["webpack://pdfjs-dist/build/pdf/webpack/universalModuleDefinition","webpack://pdfjs-dist/build/pdf/src/shared/util.js","webpack://pdfjs-dist/build/pdf/src/display/api.js","webpack://pdfjs-dist/build/pdf/src/display/annotation_storage.js","webpack://pdfjs-dist/build/pdf/src/display/editor/editor.js","webpack://pdfjs-dist/build/pdf/src/display/editor/tools.js","webpack://pdfjs-dist/build/pdf/src/display/display_utils.js","webpack://pdfjs-dist/build/pdf/src/display/base_factory.js","webpack://pdfjs-dist/build/pdf/src/shared/murmurhash3.js","webpack://pdfjs-dist/build/pdf/src/display/font_loader.js","webpack://pdfjs-dist/build/pdf/src/shared/is_node.js","webpack://pdfjs-dist/build/pdf/src/display/canvas.js","webpack://pdfjs-dist/build/pdf/src/display/pattern_helper.js","webpack://pdfjs-dist/build/pdf/src/shared/image_utils.js","webpack://pdfjs-dist/build/pdf/src/display/worker_options.js","webpack://pdfjs-dist/build/pdf/src/shared/message_handler.js","webpack://pdfjs-dist/build/pdf/src/display/metadata.js","webpack://pdfjs-dist/build/pdf/src/display/optional_content_config.js","webpack://pdfjs-dist/build/pdf/src/display/transport_stream.js","webpack://pdfjs-dist/build/pdf/src/display/xfa_text.js","webpack://pdfjs-dist/build/pdf/src/display/node_utils.js","webpack://pdfjs-dist/build/pdf/src/display/node_stream.js","webpack://pdfjs-dist/build/pdf/src/display/network_utils.js","webpack://pdfjs-dist/build/pdf/src/display/content_disposition.js","webpack://pdfjs-dist/build/pdf/src/display/network.js","webpack://pdfjs-dist/build/pdf/src/display/fetch_stream.js","webpack://pdfjs-dist/build/pdf/src/display/text_layer.js","webpack://pdfjs-dist/build/pdf/src/display/editor/annotation_editor_layer.js","webpack://pdfjs-dist/build/pdf/src/display/editor/freetext.js","webpack://pdfjs-dist/build/pdf/src/display/editor/ink.js","webpack://pdfjs-dist/build/pdf/src/display/editor/fit_curve.js","webpack://pdfjs-dist/build/pdf/node_modules/fit-curve/src/fit-curve.js","webpack://pdfjs-dist/build/pdf/src/display/annotation_layer.js","webpack://pdfjs-dist/build/pdf/src/shared/scripting_utils.js","webpack://pdfjs-dist/build/pdf/src/display/xfa_layer.js","webpack://pdfjs-dist/build/pdf/src/display/svg.js","webpack://pdfjs-dist/build/pdf/webpack/bootstrap","webpack://pdfjs-dist/build/pdf/src/pdf.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf\"] = factory();\n})(globalThis, () => {\nreturn ","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Skip compatibility checks for modern builds and if we already ran the module.\nif (\n typeof PDFJSDev !== \"undefined\" &&\n !PDFJSDev.test(\"SKIP_BABEL\") &&\n !globalThis._pdfjsCompatibilityChecked\n) {\n globalThis._pdfjsCompatibilityChecked = true;\n require(\"./compatibility.js\");\n}\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\n// Represent the percentage of the height of a single-line field over\n// the font size. Acrobat seems to use this value.\nconst LINE_FACTOR = 1.35;\nconst LINE_DESCENT_FACTOR = 0.35;\nconst BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;\n\n/**\n * Refer to the `WorkerTransport.getRenderingIntent`-method in the API, to see\n * how these flags are being used:\n * - ANY, DISPLAY, and PRINT are the normal rendering intents, note the\n * `PDFPageProxy.{render, getOperatorList, getAnnotations}`-methods.\n * - ANNOTATIONS_FORMS, ANNOTATIONS_STORAGE, ANNOTATIONS_DISABLE control which\n * annotations are rendered onto the canvas (i.e. by being included in the\n * operatorList), note the `PDFPageProxy.{render, getOperatorList}`-methods\n * and their `annotationMode`-option.\n * - OPLIST is used with the `PDFPageProxy.getOperatorList`-method, note the\n * `OperatorList`-constructor (on the worker-thread).\n */\nconst RenderingIntentFlag = {\n ANY: 0x01,\n DISPLAY: 0x02,\n PRINT: 0x04,\n SAVE: 0x08,\n ANNOTATIONS_FORMS: 0x10,\n ANNOTATIONS_STORAGE: 0x20,\n ANNOTATIONS_DISABLE: 0x40,\n OPLIST: 0x100,\n};\n\nconst AnnotationMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_FORMS: 2,\n ENABLE_STORAGE: 3,\n};\n\nconst AnnotationEditorPrefix = \"pdfjs_internal_editor_\";\n\nconst AnnotationEditorType = {\n DISABLE: -1,\n NONE: 0,\n FREETEXT: 3,\n INK: 15,\n};\n\nconst AnnotationEditorParamsType = {\n FREETEXT_SIZE: 1,\n FREETEXT_COLOR: 2,\n FREETEXT_OPACITY: 3,\n INK_COLOR: 11,\n INK_THICKNESS: 12,\n INK_OPACITY: 13,\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n PRINT: 0x04,\n MODIFY_CONTENTS: 0x08,\n COPY: 0x10,\n MODIFY_ANNOTATIONS: 0x20,\n FILL_INTERACTIVE_FORMS: 0x100,\n COPY_FOR_ACCESSIBILITY: 0x200,\n ASSEMBLE: 0x400,\n PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n FILL: 0,\n STROKE: 1,\n FILL_STROKE: 2,\n INVISIBLE: 3,\n FILL_ADD_TO_PATH: 4,\n STROKE_ADD_TO_PATH: 5,\n FILL_STROKE_ADD_TO_PATH: 6,\n ADD_TO_PATH: 7,\n FILL_STROKE_MASK: 3,\n ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n GRAYSCALE_1BPP: 1,\n RGB_24BPP: 2,\n RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n TEXT: 1,\n LINK: 2,\n FREETEXT: 3,\n LINE: 4,\n SQUARE: 5,\n CIRCLE: 6,\n POLYGON: 7,\n POLYLINE: 8,\n HIGHLIGHT: 9,\n UNDERLINE: 10,\n SQUIGGLY: 11,\n STRIKEOUT: 12,\n STAMP: 13,\n CARET: 14,\n INK: 15,\n POPUP: 16,\n FILEATTACHMENT: 17,\n SOUND: 18,\n MOVIE: 19,\n WIDGET: 20,\n SCREEN: 21,\n PRINTERMARK: 22,\n TRAPNET: 23,\n WATERMARK: 24,\n THREED: 25,\n REDACT: 26,\n};\n\nconst AnnotationStateModelType = {\n MARKED: \"Marked\",\n REVIEW: \"Review\",\n};\n\nconst AnnotationMarkedState = {\n MARKED: \"Marked\",\n UNMARKED: \"Unmarked\",\n};\n\nconst AnnotationReviewState = {\n ACCEPTED: \"Accepted\",\n REJECTED: \"Rejected\",\n CANCELLED: \"Cancelled\",\n COMPLETED: \"Completed\",\n NONE: \"None\",\n};\n\nconst AnnotationReplyType = {\n GROUP: \"Group\",\n REPLY: \"R\",\n};\n\nconst AnnotationFlag = {\n INVISIBLE: 0x01,\n HIDDEN: 0x02,\n PRINT: 0x04,\n NOZOOM: 0x08,\n NOROTATE: 0x10,\n NOVIEW: 0x20,\n READONLY: 0x40,\n LOCKED: 0x80,\n TOGGLENOVIEW: 0x100,\n LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n READONLY: 0x0000001,\n REQUIRED: 0x0000002,\n NOEXPORT: 0x0000004,\n MULTILINE: 0x0001000,\n PASSWORD: 0x0002000,\n NOTOGGLETOOFF: 0x0004000,\n RADIO: 0x0008000,\n PUSHBUTTON: 0x0010000,\n COMBO: 0x0020000,\n EDIT: 0x0040000,\n SORT: 0x0080000,\n FILESELECT: 0x0100000,\n MULTISELECT: 0x0200000,\n DONOTSPELLCHECK: 0x0400000,\n DONOTSCROLL: 0x0800000,\n COMB: 0x1000000,\n RICHTEXT: 0x2000000,\n RADIOSINUNISON: 0x2000000,\n COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n SOLID: 1,\n DASHED: 2,\n BEVELED: 3,\n INSET: 4,\n UNDERLINE: 5,\n};\n\nconst AnnotationActionEventType = {\n E: \"Mouse Enter\",\n X: \"Mouse Exit\",\n D: \"Mouse Down\",\n U: \"Mouse Up\",\n Fo: \"Focus\",\n Bl: \"Blur\",\n PO: \"PageOpen\",\n PC: \"PageClose\",\n PV: \"PageVisible\",\n PI: \"PageInvisible\",\n K: \"Keystroke\",\n F: \"Format\",\n V: \"Validate\",\n C: \"Calculate\",\n};\n\nconst DocumentActionEventType = {\n WC: \"WillClose\",\n WS: \"WillSave\",\n DS: \"DidSave\",\n WP: \"WillPrint\",\n DP: \"DidPrint\",\n};\n\nconst PageActionEventType = {\n O: \"PageOpen\",\n C: \"PageClose\",\n};\n\nconst VerbosityLevel = {\n ERRORS: 0,\n WARNINGS: 1,\n INFOS: 5,\n};\n\nconst CMapCompressionType = {\n NONE: 0,\n BINARY: 1,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n // Intentionally start from 1 so it is easy to spot bad operators that will be\n // 0's.\n // PLEASE NOTE: We purposely keep any removed operators commented out, since\n // re-numbering the list would risk breaking third-party users.\n dependency: 1,\n setLineWidth: 2,\n setLineCap: 3,\n setLineJoin: 4,\n setMiterLimit: 5,\n setDash: 6,\n setRenderingIntent: 7,\n setFlatness: 8,\n setGState: 9,\n save: 10,\n restore: 11,\n transform: 12,\n moveTo: 13,\n lineTo: 14,\n curveTo: 15,\n curveTo2: 16,\n curveTo3: 17,\n closePath: 18,\n rectangle: 19,\n stroke: 20,\n closeStroke: 21,\n fill: 22,\n eoFill: 23,\n fillStroke: 24,\n eoFillStroke: 25,\n closeFillStroke: 26,\n closeEOFillStroke: 27,\n endPath: 28,\n clip: 29,\n eoClip: 30,\n beginText: 31,\n endText: 32,\n setCharSpacing: 33,\n setWordSpacing: 34,\n setHScale: 35,\n setLeading: 36,\n setFont: 37,\n setTextRenderingMode: 38,\n setTextRise: 39,\n moveText: 40,\n setLeadingMoveText: 41,\n setTextMatrix: 42,\n nextLine: 43,\n showText: 44,\n showSpacedText: 45,\n nextLineShowText: 46,\n nextLineSetSpacingShowText: 47,\n setCharWidth: 48,\n setCharWidthAndBounds: 49,\n setStrokeColorSpace: 50,\n setFillColorSpace: 51,\n setStrokeColor: 52,\n setStrokeColorN: 53,\n setFillColor: 54,\n setFillColorN: 55,\n setStrokeGray: 56,\n setFillGray: 57,\n setStrokeRGBColor: 58,\n setFillRGBColor: 59,\n setStrokeCMYKColor: 60,\n setFillCMYKColor: 61,\n shadingFill: 62,\n beginInlineImage: 63,\n beginImageData: 64,\n endInlineImage: 65,\n paintXObject: 66,\n markPoint: 67,\n markPointProps: 68,\n beginMarkedContent: 69,\n beginMarkedContentProps: 70,\n endMarkedContent: 71,\n beginCompat: 72,\n endCompat: 73,\n paintFormXObjectBegin: 74,\n paintFormXObjectEnd: 75,\n beginGroup: 76,\n endGroup: 77,\n // beginAnnotations: 78,\n // endAnnotations: 79,\n beginAnnotation: 80,\n endAnnotation: 81,\n // paintJpegXObject: 82,\n paintImageMaskXObject: 83,\n paintImageMaskXObjectGroup: 84,\n paintImageXObject: 85,\n paintInlineImageXObject: 86,\n paintInlineImageXObjectGroup: 87,\n paintImageXObjectRepeat: 88,\n paintImageMaskXObjectRepeat: 89,\n paintSolidColorImageMask: 90,\n constructPath: 91,\n};\n\nconst UNSUPPORTED_FEATURES =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n ? {\n forms: \"forms\",\n javaScript: \"javaScript\",\n signatures: \"signatures\",\n smask: \"smask\",\n shadingPattern: \"shadingPattern\",\n errorTilingPattern: \"errorTilingPattern\",\n errorExtGState: \"errorExtGState\",\n errorXObject: \"errorXObject\",\n errorFontLoadType3: \"errorFontLoadType3\",\n errorFontState: \"errorFontState\",\n errorFontMissing: \"errorFontMissing\",\n errorFontTranslate: \"errorFontTranslate\",\n errorColorSpace: \"errorColorSpace\",\n errorOperatorList: \"errorOperatorList\",\n errorFontToUnicode: \"errorFontToUnicode\",\n errorFontLoadNative: \"errorFontLoadNative\",\n errorFontBuildPath: \"errorFontBuildPath\",\n errorFontGetPath: \"errorFontGetPath\",\n errorMarkedContent: \"errorMarkedContent\",\n errorContentSubStream: \"errorContentSubStream\",\n }\n : null;\n\nconst PasswordResponses = {\n NEED_PASSWORD: 1,\n INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n if (Number.isInteger(level)) {\n verbosity = level;\n }\n}\n\nfunction getVerbosityLevel() {\n return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n if (verbosity >= VerbosityLevel.INFOS) {\n console.log(`Info: ${msg}`);\n }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n if (verbosity >= VerbosityLevel.WARNINGS) {\n console.log(`Warning: ${msg}`);\n }\n}\n\nfunction unreachable(msg) {\n throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n if (!cond) {\n unreachable(msg);\n }\n}\n\n// Checks if URLs use one of the allowed protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n if (!url) {\n return false;\n }\n switch (url.protocol) {\n case \"http:\":\n case \"https:\":\n case \"ftp:\":\n case \"mailto:\":\n case \"tel:\":\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} [baseUrl] - An absolute URL.\n * @param {Object} [options]\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl = null, options = null) {\n if (!url) {\n return null;\n }\n try {\n if (options && typeof url === \"string\") {\n // Let URLs beginning with \"www.\" default to using the \"http://\" protocol.\n if (options.addDefaultProtocol && url.startsWith(\"www.\")) {\n const dots = url.match(/\\./g);\n // Avoid accidentally matching a *relative* URL pointing to a file named\n // e.g. \"www.pdf\" or similar.\n if (dots && dots.length >= 2) {\n url = `http://${url}`;\n }\n }\n\n // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see bug 1122280.\n if (options.tryConvertEncoding) {\n try {\n url = stringToUTF8String(url);\n } catch (ex) {}\n }\n }\n\n const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n if (_isValidProtocol(absoluteUrl)) {\n return absoluteUrl;\n }\n } catch (ex) {\n /* `new URL()` will throw on incorrect data. */\n }\n return null;\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || TESTING\")\n ) {\n assert(\n prop in obj,\n `shadow: Property \"${prop && prop.toString()}\" not found in object.`\n );\n }\n Object.defineProperty(obj, prop, {\n value,\n enumerable: !nonSerializable,\n configurable: true,\n writable: false,\n });\n return value;\n}\n\n/**\n * @type {any}\n */\nconst BaseException = (function BaseExceptionClosure() {\n // eslint-disable-next-line no-shadow\n function BaseException(message, name) {\n if (this.constructor === BaseException) {\n unreachable(\"Cannot initialize BaseException.\");\n }\n this.message = message;\n this.name = name;\n }\n BaseException.prototype = new Error();\n BaseException.constructor = BaseException;\n\n return BaseException;\n})();\n\nclass PasswordException extends BaseException {\n constructor(msg, code) {\n super(msg, \"PasswordException\");\n this.code = code;\n }\n}\n\nclass UnknownErrorException extends BaseException {\n constructor(msg, details) {\n super(msg, \"UnknownErrorException\");\n this.details = details;\n }\n}\n\nclass InvalidPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"InvalidPDFException\");\n }\n}\n\nclass MissingPDFException extends BaseException {\n constructor(msg) {\n super(msg, \"MissingPDFException\");\n }\n}\n\nclass UnexpectedResponseException extends BaseException {\n constructor(msg, status) {\n super(msg, \"UnexpectedResponseException\");\n this.status = status;\n }\n}\n\n/**\n * Error caused during parsing PDF data.\n */\nclass FormatError extends BaseException {\n constructor(msg) {\n super(msg, \"FormatError\");\n }\n}\n\n/**\n * Error used to indicate task cancellation.\n */\nclass AbortException extends BaseException {\n constructor(msg) {\n super(msg, \"AbortException\");\n }\n}\n\nfunction bytesToString(bytes) {\n if (\n typeof bytes !== \"object\" ||\n bytes === null ||\n bytes.length === undefined\n ) {\n unreachable(\"Invalid argument for bytesToString\");\n }\n const length = bytes.length;\n const MAX_ARGUMENT_COUNT = 8192;\n if (length < MAX_ARGUMENT_COUNT) {\n return String.fromCharCode.apply(null, bytes);\n }\n const strBuf = [];\n for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n const chunk = bytes.subarray(i, chunkEnd);\n strBuf.push(String.fromCharCode.apply(null, chunk));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToBytes(str) {\n if (typeof str !== \"string\") {\n unreachable(\"Invalid argument for stringToBytes\");\n }\n const length = str.length;\n const bytes = new Uint8Array(length);\n for (let i = 0; i < length; ++i) {\n bytes[i] = str.charCodeAt(i) & 0xff;\n }\n return bytes;\n}\n\n/**\n * Gets length of the array (Array, Uint8Array, or string) in bytes.\n * @param {Array|Uint8Array|string} arr\n * @returns {number}\n */\n// eslint-disable-next-line consistent-return\nfunction arrayByteLength(arr) {\n if (arr.length !== undefined) {\n return arr.length;\n }\n if (arr.byteLength !== undefined) {\n return arr.byteLength;\n }\n unreachable(\"Invalid argument for arrayByteLength\");\n}\n\n/**\n * Combines array items (arrays) into single Uint8Array object.\n * @param {Array|Uint8Array|string>} arr - the array of the arrays\n * (Array, Uint8Array, or string).\n * @returns {Uint8Array}\n */\nfunction arraysToBytes(arr) {\n const length = arr.length;\n // Shortcut: if first and only item is Uint8Array, return it.\n if (length === 1 && arr[0] instanceof Uint8Array) {\n return arr[0];\n }\n let resultLength = 0;\n for (let i = 0; i < length; i++) {\n resultLength += arrayByteLength(arr[i]);\n }\n let pos = 0;\n const data = new Uint8Array(resultLength);\n for (let i = 0; i < length; i++) {\n let item = arr[i];\n if (!(item instanceof Uint8Array)) {\n if (typeof item === \"string\") {\n item = stringToBytes(item);\n } else {\n item = new Uint8Array(item);\n }\n }\n const itemLength = item.byteLength;\n data.set(item, pos);\n pos += itemLength;\n }\n return data;\n}\n\nfunction string32(value) {\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || TESTING\")\n ) {\n assert(\n typeof value === \"number\" && Math.abs(value) < 2 ** 32,\n `string32: Unexpected input \"${value}\".`\n );\n }\n return String.fromCharCode(\n (value >> 24) & 0xff,\n (value >> 16) & 0xff,\n (value >> 8) & 0xff,\n value & 0xff\n );\n}\n\nfunction objectSize(obj) {\n return Object.keys(obj).length;\n}\n\n// Ensure that the returned Object has a `null` prototype; hence why\n// `Object.fromEntries(...)` is not used.\nfunction objectFromMap(map) {\n const obj = Object.create(null);\n for (const [key, value] of map) {\n obj[key] = value;\n }\n return obj;\n}\n\n// Checks the endianness of the platform.\nfunction isLittleEndian() {\n const buffer8 = new Uint8Array(4);\n buffer8[0] = 1;\n const view32 = new Uint32Array(buffer8.buffer, 0, 1);\n return view32[0] === 1;\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n try {\n new Function(\"\"); // eslint-disable-line no-new, no-new-func\n return true;\n } catch (e) {\n return false;\n }\n}\n\nclass FeatureTest {\n static get isLittleEndian() {\n return shadow(this, \"isLittleEndian\", isLittleEndian());\n }\n\n static get isEvalSupported() {\n return shadow(this, \"isEvalSupported\", isEvalSupported());\n }\n\n static get isOffscreenCanvasSupported() {\n return shadow(\n this,\n \"isOffscreenCanvasSupported\",\n typeof OffscreenCanvas !== \"undefined\"\n );\n }\n\n static get platform() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof navigator === \"undefined\"\n ) {\n return shadow(this, \"platform\", { isWin: false, isMac: false });\n }\n return shadow(this, \"platform\", {\n isWin: navigator.platform.includes(\"Win\"),\n isMac: navigator.platform.includes(\"Mac\"),\n });\n }\n}\n\nconst hexNumbers = [...Array(256).keys()].map(n =>\n n.toString(16).padStart(2, \"0\")\n);\n\nclass Util {\n static makeHexColor(r, g, b) {\n return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;\n }\n\n // Apply a scaling matrix to some min/max values.\n // If a scaling factor is negative then min and max must be\n // swaped.\n static scaleMinMax(transform, minMax) {\n let temp;\n if (transform[0]) {\n if (transform[0] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n }\n minMax[0] *= transform[0];\n minMax[1] *= transform[0];\n\n if (transform[3] < 0) {\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n }\n minMax[2] *= transform[3];\n minMax[3] *= transform[3];\n } else {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n\n if (transform[1] < 0) {\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n }\n minMax[2] *= transform[1];\n minMax[3] *= transform[1];\n\n if (transform[2] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n }\n minMax[0] *= transform[2];\n minMax[1] *= transform[2];\n }\n minMax[0] += transform[4];\n minMax[1] += transform[4];\n minMax[2] += transform[5];\n minMax[3] += transform[5];\n }\n\n // Concatenates two transformation matrices together and returns the result.\n static transform(m1, m2) {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ];\n }\n\n // For 2d affine transforms\n static applyTransform(p, m) {\n const xt = p[0] * m[0] + p[1] * m[2] + m[4];\n const yt = p[0] * m[1] + p[1] * m[3] + m[5];\n return [xt, yt];\n }\n\n static applyInverseTransform(p, m) {\n const d = m[0] * m[3] - m[1] * m[2];\n const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n return [xt, yt];\n }\n\n // Applies the transform to the rectangle and finds the minimum axially\n // aligned bounding box.\n static getAxialAlignedBoundingBox(r, m) {\n const p1 = Util.applyTransform(r, m);\n const p2 = Util.applyTransform(r.slice(2, 4), m);\n const p3 = Util.applyTransform([r[0], r[3]], m);\n const p4 = Util.applyTransform([r[2], r[1]], m);\n return [\n Math.min(p1[0], p2[0], p3[0], p4[0]),\n Math.min(p1[1], p2[1], p3[1], p4[1]),\n Math.max(p1[0], p2[0], p3[0], p4[0]),\n Math.max(p1[1], p2[1], p3[1], p4[1]),\n ];\n }\n\n static inverseTransform(m) {\n const d = m[0] * m[3] - m[1] * m[2];\n return [\n m[3] / d,\n -m[1] / d,\n -m[2] / d,\n m[0] / d,\n (m[2] * m[5] - m[4] * m[3]) / d,\n (m[4] * m[1] - m[5] * m[0]) / d,\n ];\n }\n\n // This calculation uses Singular Value Decomposition.\n // The SVD can be represented with formula A = USV. We are interested in the\n // matrix S here because it represents the scale values.\n static singularValueDecompose2dScale(m) {\n const transpose = [m[0], m[2], m[1], m[3]];\n\n // Multiply matrix m with its transpose.\n const a = m[0] * transpose[0] + m[1] * transpose[2];\n const b = m[0] * transpose[1] + m[1] * transpose[3];\n const c = m[2] * transpose[0] + m[3] * transpose[2];\n const d = m[2] * transpose[1] + m[3] * transpose[3];\n\n // Solve the second degree polynomial to get roots.\n const first = (a + d) / 2;\n const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;\n const sx = first + second || 1;\n const sy = first - second || 1;\n\n // Scale values are the square roots of the eigenvalues.\n return [Math.sqrt(sx), Math.sqrt(sy)];\n }\n\n // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n // For coordinate systems whose origin lies in the bottom-left, this\n // means normalization to (BL,TR) ordering. For systems with origin in the\n // top-left, this means (TL,BR) ordering.\n static normalizeRect(rect) {\n const r = rect.slice(0); // clone rect\n if (rect[0] > rect[2]) {\n r[0] = rect[2];\n r[2] = rect[0];\n }\n if (rect[1] > rect[3]) {\n r[1] = rect[3];\n r[3] = rect[1];\n }\n return r;\n }\n\n // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n // intersection of rect1 and rect2. If no intersection, returns 'null'\n // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n static intersect(rect1, rect2) {\n const xLow = Math.max(\n Math.min(rect1[0], rect1[2]),\n Math.min(rect2[0], rect2[2])\n );\n const xHigh = Math.min(\n Math.max(rect1[0], rect1[2]),\n Math.max(rect2[0], rect2[2])\n );\n if (xLow > xHigh) {\n return null;\n }\n const yLow = Math.max(\n Math.min(rect1[1], rect1[3]),\n Math.min(rect2[1], rect2[3])\n );\n const yHigh = Math.min(\n Math.max(rect1[1], rect1[3]),\n Math.max(rect2[1], rect2[3])\n );\n if (yLow > yHigh) {\n return null;\n }\n\n return [xLow, yLow, xHigh, yHigh];\n }\n\n // From https://github.com/adobe-webplatform/Snap.svg/blob/b365287722a72526000ac4bfcf0ce4cac2faa015/src/path.js#L852\n static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3) {\n const tvalues = [],\n bounds = [[], []];\n let a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n for (let i = 0; i < 2; ++i) {\n if (i === 0) {\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n } else {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n sqrtb2ac = Math.sqrt(b2ac);\n if (b2ac < 0) {\n continue;\n }\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n let j = tvalues.length,\n mt;\n const jlen = j;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n bounds[0][j] =\n mt * mt * mt * x0 +\n 3 * mt * mt * t * x1 +\n 3 * mt * t * t * x2 +\n t * t * t * x3;\n bounds[1][j] =\n mt * mt * mt * y0 +\n 3 * mt * mt * t * y1 +\n 3 * mt * t * t * y2 +\n t * t * t * y3;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n bounds[0].length = bounds[1].length = jlen + 2;\n\n return [\n Math.min(...bounds[0]),\n Math.min(...bounds[1]),\n Math.max(...bounds[0]),\n Math.max(...bounds[1]),\n ];\n }\n}\n\nconst PDFStringTranslateTable = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8,\n 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192,\n 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,\n 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d,\n 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac,\n];\n\nfunction stringToPDFString(str) {\n if (str[0] >= \"\\xEF\") {\n let encoding;\n if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n encoding = \"utf-16be\";\n } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n encoding = \"utf-16le\";\n } else if (str[0] === \"\\xEF\" && str[1] === \"\\xBB\" && str[2] === \"\\xBF\") {\n encoding = \"utf-8\";\n }\n\n if (encoding) {\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(str);\n return decoder.decode(buffer);\n } catch (ex) {\n warn(`stringToPDFString: \"${ex}\".`);\n }\n }\n }\n // ISO Latin 1\n const strBuf = [];\n for (let i = 0, ii = str.length; i < ii; i++) {\n const code = PDFStringTranslateTable[str.charCodeAt(i)];\n strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n }\n return strBuf.join(\"\");\n}\n\nfunction stringToUTF8String(str) {\n return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n return unescape(encodeURIComponent(str));\n}\n\nfunction isArrayBuffer(v) {\n return typeof v === \"object\" && v !== null && v.byteLength !== undefined;\n}\n\nfunction isArrayEqual(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, ii = arr1.length; i < ii; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction getModificationDate(date = new Date()) {\n const buffer = [\n date.getUTCFullYear().toString(),\n (date.getUTCMonth() + 1).toString().padStart(2, \"0\"),\n date.getUTCDate().toString().padStart(2, \"0\"),\n date.getUTCHours().toString().padStart(2, \"0\"),\n date.getUTCMinutes().toString().padStart(2, \"0\"),\n date.getUTCSeconds().toString().padStart(2, \"0\"),\n ];\n\n return buffer.join(\"\");\n}\n\n/**\n * Promise Capability object.\n *\n * @typedef {Object} PromiseCapability\n * @property {Promise} promise - A Promise object.\n * @property {boolean} settled - If the Promise has been fulfilled/rejected.\n * @property {function} resolve - Fulfills the Promise.\n * @property {function} reject - Rejects the Promise.\n */\n\n/**\n * Creates a promise capability object.\n * @alias createPromiseCapability\n *\n * @returns {PromiseCapability}\n */\nfunction createPromiseCapability() {\n const capability = Object.create(null);\n let isSettled = false;\n\n Object.defineProperty(capability, \"settled\", {\n get() {\n return isSettled;\n },\n });\n capability.promise = new Promise(function (resolve, reject) {\n capability.resolve = function (data) {\n isSettled = true;\n resolve(data);\n };\n capability.reject = function (reason) {\n isSettled = true;\n reject(reason);\n };\n });\n return capability;\n}\n\nexport {\n AbortException,\n AnnotationActionEventType,\n AnnotationBorderStyleType,\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n AnnotationFieldFlag,\n AnnotationFlag,\n AnnotationMarkedState,\n AnnotationMode,\n AnnotationReplyType,\n AnnotationReviewState,\n AnnotationStateModelType,\n AnnotationType,\n arrayByteLength,\n arraysToBytes,\n assert,\n BaseException,\n BASELINE_FACTOR,\n bytesToString,\n CMapCompressionType,\n createPromiseCapability,\n createValidAbsoluteUrl,\n DocumentActionEventType,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n FormatError,\n getModificationDate,\n getVerbosityLevel,\n IDENTITY_MATRIX,\n ImageKind,\n info,\n InvalidPDFException,\n isArrayBuffer,\n isArrayEqual,\n LINE_DESCENT_FACTOR,\n LINE_FACTOR,\n MissingPDFException,\n objectFromMap,\n objectSize,\n OPS,\n PageActionEventType,\n PasswordException,\n PasswordResponses,\n PermissionFlag,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n string32,\n stringToBytes,\n stringToPDFString,\n stringToUTF8String,\n TextRenderingMode,\n UnexpectedResponseException,\n UnknownErrorException,\n unreachable,\n UNSUPPORTED_FEATURES,\n utf8StringToString,\n Util,\n VerbosityLevel,\n warn,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @module pdfjsLib\n */\n\nimport {\n AbortException,\n AnnotationMode,\n assert,\n createPromiseCapability,\n getVerbosityLevel,\n info,\n InvalidPDFException,\n isArrayBuffer,\n MissingPDFException,\n PasswordException,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n stringToBytes,\n UnexpectedResponseException,\n UnknownErrorException,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport {\n AnnotationStorage,\n PrintAnnotationStorage,\n} from \"./annotation_storage.js\";\nimport {\n deprecated,\n DOMCanvasFactory,\n DOMCMapReaderFactory,\n DOMStandardFontDataFactory,\n isDataScheme,\n isValidFetchUrl,\n loadScript,\n PageViewport,\n RenderingCancelledException,\n StatTimer,\n} from \"./display_utils.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { isNodeJS } from \"../shared/is_node.js\";\nimport { MessageHandler } from \"../shared/message_handler.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\n\nlet DefaultCanvasFactory = DOMCanvasFactory;\nlet DefaultCMapReaderFactory = DOMCMapReaderFactory;\nlet DefaultStandardFontDataFactory = DOMStandardFontDataFactory;\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS) {\n const {\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeStandardFontDataFactory,\n } = require(\"./node_utils.js\");\n\n DefaultCanvasFactory = NodeCanvasFactory;\n DefaultCMapReaderFactory = NodeCMapReaderFactory;\n DefaultStandardFontDataFactory = NodeStandardFontDataFactory;\n}\n\nlet createPDFNetworkStream;\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"PRODUCTION\")) {\n const streamsPromise = Promise.all([\n import(\"./network.js\"),\n import(\"./fetch_stream.js\"),\n ]);\n\n createPDFNetworkStream = async params => {\n const [{ PDFNetworkStream }, { PDFFetchStream }] = await streamsPromise;\n\n return isValidFetchUrl(params.url)\n ? new PDFFetchStream(params)\n : new PDFNetworkStream(params);\n };\n} else if (PDFJSDev.test(\"GENERIC || CHROME\")) {\n if (PDFJSDev.test(\"GENERIC\") && isNodeJS) {\n const { PDFNodeStream } = require(\"./node_stream.js\");\n\n createPDFNetworkStream = params => {\n return new PDFNodeStream(params);\n };\n } else {\n const { PDFNetworkStream } = require(\"./network.js\");\n const { PDFFetchStream } = require(\"./fetch_stream.js\");\n\n createPDFNetworkStream = params => {\n return isValidFetchUrl(params.url)\n ? new PDFFetchStream(params)\n : new PDFNetworkStream(params);\n };\n }\n}\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n * Int16Array | Uint16Array |\n * Int32Array | Uint32Array | Float32Array |\n * Float64Array\n * } TypedArray\n */\n\n/**\n * @typedef { TypedArray | ArrayBuffer | Array | string } BinaryData\n */\n\n/**\n * @typedef {Object} RefProxy\n * @property {number} num\n * @property {number} gen\n */\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string | URL} [url] - The URL of the PDF.\n * @property {BinaryData} [data] - Binary PDF data.\n * Use TypedArrays (Uint8Array) to improve the memory usage. If PDF data is\n * BASE64-encoded, use `atob()` to convert it to a binary string first.\n *\n * NOTE: If TypedArrays are used they will generally be transferred to the\n * worker-thread. This will help reduce main-thread memory usage, however\n * it will take ownership of the TypedArrays.\n * @property {Object} [httpHeaders] - Basic authentication headers.\n * @property {boolean} [withCredentials] - Indicates whether or not\n * cross-site Access-Control requests should be made using credentials such\n * as cookies or authorization headers. The default is `false`.\n * @property {string} [password] - For decrypting password-protected PDFs.\n * @property {number} [length] - The PDF file length. It's used for progress\n * reports and range requests operations.\n * @property {PDFDataRangeTransport} [range] - Allows for using a custom range\n * transport implementation.\n * @property {number} [rangeChunkSize] - Specify maximum number of bytes fetched\n * per range request. The default value is {@link DEFAULT_RANGE_CHUNK_SIZE}.\n * @property {PDFWorker} [worker] - The worker that will be used for loading and\n * parsing the PDF data.\n * @property {number} [verbosity] - Controls the logging level; the constants\n * from {@link VerbosityLevel} should be used.\n * @property {string} [docBaseUrl] - The base URL of the document, used when\n * attempting to recover valid absolute URLs for annotations, and outline\n * items, that (incorrectly) only specify relative URLs.\n * @property {string} [cMapUrl] - The URL where the predefined Adobe CMaps are\n * located. Include the trailing slash.\n * @property {boolean} [cMapPacked] - Specifies if the Adobe CMaps are binary\n * packed or not.\n * @property {Object} [CMapReaderFactory] - The factory that will be used when\n * reading built-in CMap files. Providing a custom factory is useful for\n * environments without Fetch API or `XMLHttpRequest` support, such as\n * Node.js. The default value is {DOMCMapReaderFactory}.\n * @property {boolean} [useSystemFonts] - When `true`, fonts that aren't\n * embedded in the PDF document will fallback to a system font.\n * The default value is `true` in web environments and `false` in Node.js;\n * unless `disableFontFace === true` in which case this defaults to `false`\n * regardless of the environment (to prevent completely broken fonts).\n * @property {string} [standardFontDataUrl] - The URL where the standard font\n * files are located. Include the trailing slash.\n * @property {Object} [StandardFontDataFactory] - The factory that will be used\n * when reading the standard font files. Providing a custom factory is useful\n * for environments without Fetch API or `XMLHttpRequest` support, such as\n * Node.js. The default value is {DOMStandardFontDataFactory}.\n * @property {boolean} [useWorkerFetch] - Enable using the Fetch API in the\n * worker-thread when reading CMap and standard font files. When `true`,\n * the `CMapReaderFactory` and `StandardFontDataFactory` options are ignored.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [stopAtErrors] - Reject certain promises, e.g.\n * `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n * PDF data cannot be successfully parsed, instead of attempting to recover\n * whatever possible of the data. The default value is `false`.\n * @property {number} [maxImageSize] - The maximum allowed image size in total\n * pixels, i.e. width * height. Images above this value will not be rendered.\n * Use -1 for no limit, which is also the default value.\n * @property {boolean} [isEvalSupported] - Determines if we can evaluate strings\n * as JavaScript. Primarily used to improve performance of font rendering, and\n * when parsing PDF functions. The default value is `true`.\n * @property {boolean} [isOffscreenCanvasSupported] - Determines if we can use\n * `OffscreenCanvas` in the worker. Primarily used to improve performance of\n * image conversion/rendering.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [disableFontFace] - By default fonts are converted to\n * OpenType fonts and loaded via the Font Loading API or `@font-face` rules.\n * If disabled, fonts will be rendered using a built-in font renderer that\n * constructs the glyphs with primitive path commands.\n * The default value is `false` in web environments and `true` in Node.js.\n * @property {boolean} [fontExtraProperties] - Include additional properties,\n * which are unused during rendering of PDF documents, when exporting the\n * parsed font data from the worker-thread. This may be useful for debugging\n * purposes (and backwards compatibility), but note that it will lead to\n * increased memory usage. The default value is `false`.\n * @property {boolean} [enableXfa] - Render Xfa forms if any.\n * The default value is `false`.\n * @property {HTMLDocument} [ownerDocument] - Specify an explicit document\n * context to create elements with and to load resources, such as fonts,\n * into. Defaults to the current document.\n * @property {boolean} [disableRange] - Disable range request loading of PDF\n * files. When enabled, and if the server supports partial content requests,\n * then the PDF will be fetched in chunks. The default value is `false`.\n * @property {boolean} [disableStream] - Disable streaming of PDF file data.\n * By default PDF.js attempts to load PDF files in chunks. The default value\n * is `false`.\n * @property {boolean} [disableAutoFetch] - Disable pre-fetching of PDF file\n * data. When range requests are enabled PDF.js will automatically keep\n * fetching more data even if it isn't needed to display the current page.\n * The default value is `false`.\n *\n * NOTE: It is also necessary to disable streaming, see above, in order for\n * disabling of pre-fetching to work correctly.\n * @property {boolean} [pdfBug] - Enables special hooks for debugging PDF.js\n * (see `web/debugger.js`). The default value is `false`.\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n *\n * NOTE: If a URL is used to fetch the PDF data a standard Fetch API call (or\n * XHR as fallback) is used, which means it must follow same origin rules,\n * e.g. no cross-domain requests without CORS.\n *\n * @param {string | URL | TypedArray | ArrayBuffer | DocumentInitParameters}\n * src - Can be a URL where a PDF file is located, a typed array (Uint8Array)\n * already populated with data, or a parameter object.\n * @returns {PDFDocumentLoadingTask}\n */\nfunction getDocument(src) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (typeof src === \"string\" || src instanceof URL) {\n src = { url: src };\n } else if (isArrayBuffer(src)) {\n src = { data: src };\n } else if (src instanceof PDFDataRangeTransport) {\n deprecated(\n \"`PDFDataRangeTransport`-instance, \" +\n \"please use a parameter object with `range`-property instead.\"\n );\n src = { range: src };\n } else {\n if (typeof src !== \"object\") {\n throw new Error(\n \"Invalid parameter in getDocument, \" +\n \"need either string, URL, TypedArray, or parameter object.\"\n );\n }\n }\n } else if (typeof src !== \"object\") {\n throw new Error(\"Invalid parameter in getDocument, need parameter object.\");\n }\n if (!src.url && !src.data && !src.range) {\n throw new Error(\n \"Invalid parameter object: need either .data, .range or .url\"\n );\n }\n const task = new PDFDocumentLoadingTask();\n\n const params = Object.create(null);\n let rangeTransport = null,\n worker = null;\n\n for (const key in src) {\n const val = src[key];\n\n switch (key) {\n case \"url\":\n if (val instanceof URL) {\n params[key] = val.href;\n continue;\n }\n try {\n // The full path is required in the 'url' field.\n params[key] = new URL(val, window.location).href;\n continue;\n } catch (ex) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS &&\n typeof val === \"string\"\n ) {\n break; // Use the url as-is in Node.js environments.\n }\n }\n throw new Error(\n \"Invalid PDF url data: \" +\n \"either string or URL-object is expected in the url property.\"\n );\n case \"range\":\n rangeTransport = val;\n continue;\n case \"worker\":\n worker = val;\n continue;\n case \"data\":\n // Converting string or array-like data to Uint8Array.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS &&\n typeof Buffer !== \"undefined\" && // eslint-disable-line no-undef\n val instanceof Buffer // eslint-disable-line no-undef\n ) {\n params[key] = new Uint8Array(val);\n } else if (\n val instanceof Uint8Array &&\n val.byteLength === val.buffer.byteLength\n ) {\n // Use the data as-is when it's already a Uint8Array that completely\n // \"utilizes\" its underlying ArrayBuffer, to prevent any possible\n // issues when transferring it to the worker-thread.\n break;\n } else if (typeof val === \"string\") {\n params[key] = stringToBytes(val);\n } else if (\n (typeof val === \"object\" && val !== null && !isNaN(val.length)) ||\n isArrayBuffer(val)\n ) {\n params[key] = new Uint8Array(val);\n } else {\n throw new Error(\n \"Invalid PDF binary data: either TypedArray, \" +\n \"string, or array-like object is expected in the data property.\"\n );\n }\n continue;\n }\n params[key] = val;\n }\n\n params.CMapReaderFactory =\n params.CMapReaderFactory || DefaultCMapReaderFactory;\n params.StandardFontDataFactory =\n params.StandardFontDataFactory || DefaultStandardFontDataFactory;\n params.ignoreErrors = params.stopAtErrors !== true;\n params.fontExtraProperties = params.fontExtraProperties === true;\n params.pdfBug = params.pdfBug === true;\n params.enableXfa = params.enableXfa === true;\n\n if (!Number.isInteger(params.rangeChunkSize) || params.rangeChunkSize < 1) {\n params.rangeChunkSize = DEFAULT_RANGE_CHUNK_SIZE;\n }\n if (\n typeof params.docBaseUrl !== \"string\" ||\n isDataScheme(params.docBaseUrl)\n ) {\n // Ignore \"data:\"-URLs, since they can't be used to recover valid absolute\n // URLs anyway. We want to avoid sending them to the worker-thread, since\n // they contain the *entire* PDF document and can thus be arbitrarily long.\n params.docBaseUrl = null;\n }\n if (!Number.isInteger(params.maxImageSize) || params.maxImageSize < -1) {\n params.maxImageSize = -1;\n }\n if (typeof params.cMapUrl !== \"string\") {\n params.cMapUrl = null;\n }\n if (typeof params.standardFontDataUrl !== \"string\") {\n params.standardFontDataUrl = null;\n }\n if (typeof params.useWorkerFetch !== \"boolean\") {\n params.useWorkerFetch =\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n (params.CMapReaderFactory === DOMCMapReaderFactory &&\n params.StandardFontDataFactory === DOMStandardFontDataFactory &&\n isValidFetchUrl(params.cMapUrl, document.baseURI) &&\n isValidFetchUrl(params.standardFontDataUrl, document.baseURI));\n }\n if (typeof params.isEvalSupported !== \"boolean\") {\n params.isEvalSupported = true;\n }\n if (typeof params.isOffscreenCanvasSupported !== \"boolean\") {\n params.isOffscreenCanvasSupported = !isNodeJS;\n }\n if (typeof params.disableFontFace !== \"boolean\") {\n params.disableFontFace = isNodeJS;\n }\n if (typeof params.useSystemFonts !== \"boolean\") {\n params.useSystemFonts = !isNodeJS && !params.disableFontFace;\n }\n if (\n typeof params.ownerDocument !== \"object\" ||\n params.ownerDocument === null\n ) {\n params.ownerDocument = globalThis.document;\n }\n\n if (typeof params.disableRange !== \"boolean\") {\n params.disableRange = false;\n }\n if (typeof params.disableStream !== \"boolean\") {\n params.disableStream = false;\n }\n if (typeof params.disableAutoFetch !== \"boolean\") {\n params.disableAutoFetch = false;\n }\n\n // Set the main-thread verbosity level.\n setVerbosityLevel(params.verbosity);\n\n if (!worker) {\n const workerParams = {\n verbosity: params.verbosity,\n port: GlobalWorkerOptions.workerPort,\n };\n // Worker was not provided -- creating and owning our own. If message port\n // is specified in global worker options, using it.\n worker = workerParams.port\n ? PDFWorker.fromPort(workerParams)\n : new PDFWorker(workerParams);\n task._worker = worker;\n }\n const docId = task.docId;\n worker.promise\n .then(function () {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n\n const workerIdPromise = _fetchDocument(\n worker,\n params,\n rangeTransport,\n docId\n );\n const networkStreamPromise = new Promise(function (resolve) {\n let networkStream;\n if (rangeTransport) {\n networkStream = new PDFDataTransportStream(\n {\n length: params.length,\n initialData: params.initialData,\n progressiveDone: params.progressiveDone,\n contentDispositionFilename: params.contentDispositionFilename,\n disableRange: params.disableRange,\n disableStream: params.disableStream,\n },\n rangeTransport\n );\n } else if (!params.data) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: createPDFNetworkStream\");\n }\n networkStream = createPDFNetworkStream({\n url: params.url,\n length: params.length,\n httpHeaders: params.httpHeaders,\n withCredentials: params.withCredentials,\n rangeChunkSize: params.rangeChunkSize,\n disableRange: params.disableRange,\n disableStream: params.disableStream,\n });\n }\n resolve(networkStream);\n });\n\n return Promise.all([workerIdPromise, networkStreamPromise]).then(\n function ([workerId, networkStream]) {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n\n const messageHandler = new MessageHandler(\n docId,\n workerId,\n worker.port\n );\n const transport = new WorkerTransport(\n messageHandler,\n task,\n networkStream,\n params\n );\n task._transport = transport;\n messageHandler.send(\"Ready\", null);\n }\n );\n })\n .catch(task._capability.reject);\n\n return task;\n}\n\n/**\n * Starts fetching of specified PDF document/data.\n *\n * @param {PDFWorker} worker\n * @param {Object} source\n * @param {PDFDataRangeTransport} pdfDataRangeTransport\n * @param {string} docId - Unique document ID, used in `MessageHandler`.\n * @returns {Promise} A promise that is resolved when the worker ID of\n * the `MessageHandler` is known.\n * @private\n */\nasync function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n if (pdfDataRangeTransport) {\n source.length = pdfDataRangeTransport.length;\n source.initialData = pdfDataRangeTransport.initialData;\n source.progressiveDone = pdfDataRangeTransport.progressiveDone;\n source.contentDispositionFilename =\n pdfDataRangeTransport.contentDispositionFilename;\n }\n const transfers = source.data ? [source.data.buffer] : null;\n\n const workerId = await worker.messageHandler.sendWithPromise(\n \"GetDocRequest\",\n // Only send the required properties, and *not* the entire `source` object.\n {\n docId,\n apiVersion:\n typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n : null,\n data: source.data,\n password: source.password,\n disableAutoFetch: source.disableAutoFetch,\n rangeChunkSize: source.rangeChunkSize,\n length: source.length,\n docBaseUrl: source.docBaseUrl,\n enableXfa: source.enableXfa,\n evaluatorOptions: {\n maxImageSize: source.maxImageSize,\n disableFontFace: source.disableFontFace,\n ignoreErrors: source.ignoreErrors,\n isEvalSupported: source.isEvalSupported,\n isOffscreenCanvasSupported: source.isOffscreenCanvasSupported,\n fontExtraProperties: source.fontExtraProperties,\n useSystemFonts: source.useSystemFonts,\n cMapUrl: source.useWorkerFetch ? source.cMapUrl : null,\n standardFontDataUrl: source.useWorkerFetch\n ? source.standardFontDataUrl\n : null,\n },\n },\n transfers\n );\n\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n return workerId;\n}\n\n/**\n * @typedef {Object} OnProgressParameters\n * @property {number} loaded - Currently loaded number of bytes.\n * @property {number} total - Total number of bytes in the PDF file.\n */\n\n/**\n * The loading task controls the operations required to load a PDF document\n * (such as network requests) and provides a way to listen for completion,\n * after which individual pages can be rendered.\n */\nclass PDFDocumentLoadingTask {\n static #docId = 0;\n\n #onUnsupportedFeature = null;\n\n constructor() {\n this._capability = createPromiseCapability();\n this._transport = null;\n this._worker = null;\n\n /**\n * Unique identifier for the document loading task.\n * @type {string}\n */\n this.docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n /**\n * Whether the loading task is destroyed or not.\n * @type {boolean}\n */\n this.destroyed = false;\n\n /**\n * Callback to request a password if a wrong or no password was provided.\n * The callback receives two parameters: a function that should be called\n * with the new password, and a reason (see {@link PasswordResponses}).\n * @type {function}\n */\n this.onPassword = null;\n\n /**\n * Callback to be able to monitor the loading progress of the PDF file\n * (necessary to implement e.g. a loading bar).\n * The callback receives an {@link OnProgressParameters} argument.\n * @type {function}\n */\n this.onProgress = null;\n }\n\n /**\n * @type {function | null} The current callback used with unsupported\n * features.\n */\n get onUnsupportedFeature() {\n return this.#onUnsupportedFeature;\n }\n\n /**\n * Callback for when an unsupported feature is used in the PDF document.\n * The callback receives an {@link UNSUPPORTED_FEATURES} argument.\n * @type {function}\n */\n set onUnsupportedFeature(callback) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n deprecated(\n \"The PDFDocumentLoadingTask onUnsupportedFeature property will be removed in the future.\"\n );\n this.#onUnsupportedFeature = callback;\n }\n }\n\n /**\n * Promise for document loading task completion.\n * @type {Promise}\n */\n get promise() {\n return this._capability.promise;\n }\n\n /**\n * Abort all network requests and destroy the worker.\n * @returns {Promise} A promise that is resolved when destruction is\n * completed.\n */\n async destroy() {\n this.destroyed = true;\n await this._transport?.destroy();\n\n this._transport = null;\n if (this._worker) {\n this._worker.destroy();\n this._worker = null;\n }\n }\n}\n\n/**\n * Abstract class to support range requests file loading.\n *\n * NOTE: The TypedArrays passed to the constructor and relevant methods below\n * will generally be transferred to the worker-thread. This will help reduce\n * main-thread memory usage, however it will take ownership of the TypedArrays.\n */\nclass PDFDataRangeTransport {\n /**\n * @param {number} length\n * @param {Uint8Array|null} initialData\n * @param {boolean} [progressiveDone]\n * @param {string} [contentDispositionFilename]\n */\n constructor(\n length,\n initialData,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this.length = length;\n this.initialData = initialData;\n this.progressiveDone = progressiveDone;\n this.contentDispositionFilename = contentDispositionFilename;\n\n this._rangeListeners = [];\n this._progressListeners = [];\n this._progressiveReadListeners = [];\n this._progressiveDoneListeners = [];\n this._readyCapability = createPromiseCapability();\n }\n\n /**\n * @param {function} listener\n */\n addRangeListener(listener) {\n this._rangeListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressListener(listener) {\n this._progressListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveReadListener(listener) {\n this._progressiveReadListeners.push(listener);\n }\n\n /**\n * @param {function} listener\n */\n addProgressiveDoneListener(listener) {\n this._progressiveDoneListeners.push(listener);\n }\n\n /**\n * @param {number} begin\n * @param {Uint8Array|null} chunk\n */\n onDataRange(begin, chunk) {\n for (const listener of this._rangeListeners) {\n listener(begin, chunk);\n }\n }\n\n /**\n * @param {number} loaded\n * @param {number|undefined} total\n */\n onDataProgress(loaded, total) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressListeners) {\n listener(loaded, total);\n }\n });\n }\n\n /**\n * @param {Uint8Array|null} chunk\n */\n onDataProgressiveRead(chunk) {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveReadListeners) {\n listener(chunk);\n }\n });\n }\n\n onDataProgressiveDone() {\n this._readyCapability.promise.then(() => {\n for (const listener of this._progressiveDoneListeners) {\n listener();\n }\n });\n }\n\n transportReady() {\n this._readyCapability.resolve();\n }\n\n /**\n * @param {number} begin\n * @param {number} end\n */\n requestDataRange(begin, end) {\n unreachable(\"Abstract method PDFDataRangeTransport.requestDataRange\");\n }\n\n abort() {}\n}\n\n/**\n * Proxy to a `PDFDocument` in the worker thread.\n */\nclass PDFDocumentProxy {\n constructor(pdfInfo, transport) {\n this._pdfInfo = pdfInfo;\n this._transport = transport;\n }\n\n /**\n * @type {AnnotationStorage} Storage for annotation data in forms.\n */\n get annotationStorage() {\n return this._transport.annotationStorage;\n }\n\n /**\n * @type {number} Total number of pages in the PDF file.\n */\n get numPages() {\n return this._pdfInfo.numPages;\n }\n\n /**\n * @type {Array} A (not guaranteed to be) unique ID to\n * identify the PDF document.\n * NOTE: The first element will always be defined for all PDF documents,\n * whereas the second element is only defined for *modified* PDF documents.\n */\n get fingerprints() {\n return this._pdfInfo.fingerprints;\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n *\n * @type {Object | null} An object representing a HTML tree structure\n * to render the XFA, or `null` when no XFA form exists.\n */\n get allXfaHtml() {\n return this._transport._htmlForXfa;\n }\n\n /**\n * @param {number} pageNumber - The page number to get. The first page is 1.\n * @returns {Promise} A promise that is resolved with\n * a {@link PDFPageProxy} object.\n */\n getPage(pageNumber) {\n return this._transport.getPage(pageNumber);\n }\n\n /**\n * @param {RefProxy} ref - The page reference.\n * @returns {Promise} A promise that is resolved with the page index,\n * starting from zero, that is associated with the reference.\n */\n getPageIndex(ref) {\n return this._transport.getPageIndex(ref);\n }\n\n /**\n * @returns {Promise>>} A promise that is resolved\n * with a mapping from named destinations to references.\n *\n * This can be slow for large documents. Use `getDestination` instead.\n */\n getDestinations() {\n return this._transport.getDestinations();\n }\n\n /**\n * @param {string} id - The named destination to get.\n * @returns {Promise | null>} A promise that is resolved with all\n * information of the given named destination, or `null` when the named\n * destination is not present in the PDF file.\n */\n getDestination(id) {\n return this._transport.getDestination(id);\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} containing the page labels that correspond to the page\n * indexes, or `null` when no page labels are present in the PDF file.\n */\n getPageLabels() {\n return this._transport.getPageLabels();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page layout name.\n */\n getPageLayout() {\n return this._transport.getPageLayout();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a {string}\n * containing the page mode name.\n */\n getPageMode() {\n return this._transport.getPageMode();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} containing the viewer preferences, or `null` when no viewer\n * preferences are present in the PDF file.\n */\n getViewerPreferences() {\n return this._transport.getViewerPreferences();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an {Array}\n * containing the destination, or `null` when no open action is present\n * in the PDF.\n */\n getOpenAction() {\n return this._transport.getOpenAction();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a lookup table\n * for mapping named attachments to their content.\n */\n getAttachments() {\n return this._transport.getAttachments();\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} of all the JavaScript strings in the name tree, or `null`\n * if no JavaScript exists.\n */\n getJavaScript() {\n return this._transport.getJavaScript();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with the JavaScript actions:\n * - from the name tree (like getJavaScript);\n * - from A or AA entries in the catalog dictionary.\n * , or `null` if no JavaScript exists.\n */\n getJSActions() {\n return this._transport.getDocJSActions();\n }\n\n /**\n * @typedef {Object} OutlineNode\n * @property {string} title\n * @property {boolean} bold\n * @property {boolean} italic\n * @property {Uint8ClampedArray} color - The color in RGB format to use for\n * display purposes.\n * @property {string | Array | null} dest\n * @property {string | null} url\n * @property {string | undefined} unsafeUrl\n * @property {boolean | undefined} newWindow\n * @property {number | undefined} count\n * @property {Array} items\n */\n\n /**\n * @returns {Promise>} A promise that is resolved with an\n * {Array} that is a tree outline (if it has one) of the PDF file.\n */\n getOutline() {\n return this._transport.getOutline();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {@link OptionalContentConfig} that contains all the optional content\n * groups (assuming that the document has any).\n */\n getOptionalContentConfig() {\n return this._transport.getOptionalContentConfig();\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with\n * an {Array} that contains the permission flags for the PDF document, or\n * `null` when no permissions are present in the PDF file.\n */\n getPermissions() {\n return this._transport.getPermissions();\n }\n\n /**\n * @returns {Promise<{ info: Object, metadata: Metadata }>} A promise that is\n * resolved with an {Object} that has `info` and `metadata` properties.\n * `info` is an {Object} filled with anything available in the information\n * dictionary and similarly `metadata` is a {Metadata} object with\n * information from the metadata section of the PDF.\n */\n getMetadata() {\n return this._transport.getMetadata();\n }\n\n /**\n * @typedef {Object} MarkInfo\n * Properties correspond to Table 321 of the PDF 32000-1:2008 spec.\n * @property {boolean} Marked\n * @property {boolean} UserProperties\n * @property {boolean} Suspects\n */\n\n /**\n * @returns {Promise} A promise that is resolved with\n * a {MarkInfo} object that contains the MarkInfo flags for the PDF\n * document, or `null` when no MarkInfo values are present in the PDF file.\n */\n getMarkInfo() {\n return this._transport.getMarkInfo();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the raw data of the PDF document.\n */\n getData() {\n return this._transport.getData();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {Uint8Array} containing the full data of the saved document.\n */\n saveDocument() {\n return this._transport.saveDocument();\n }\n\n /**\n * @returns {Promise<{ length: number }>} A promise that is resolved when the\n * document's data is loaded. It is resolved with an {Object} that contains\n * the `length` property that indicates size of the PDF data in bytes.\n */\n getDownloadInfo() {\n return this._transport.downloadInfoCapability.promise;\n }\n\n /**\n * Cleans up resources allocated by the document on both the main and worker\n * threads.\n *\n * NOTE: Do not, under any circumstances, call this method when rendering is\n * currently ongoing since that may lead to rendering errors.\n *\n * @param {boolean} [keepLoadedFonts] - Let fonts remain attached to the DOM.\n * NOTE: This will increase persistent memory usage, hence don't use this\n * option unless absolutely necessary. The default value is `false`.\n * @returns {Promise} A promise that is resolved when clean-up has finished.\n */\n cleanup(keepLoadedFonts = false) {\n return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);\n }\n\n /**\n * Destroys the current document instance and terminates the worker.\n */\n destroy() {\n return this.loadingTask.destroy();\n }\n\n /**\n * @type {DocumentInitParameters} A subset of the current\n * {DocumentInitParameters}, which are needed in the viewer.\n */\n get loadingParams() {\n return this._transport.loadingParams;\n }\n\n /**\n * @type {PDFDocumentLoadingTask} The loadingTask for the current document.\n */\n get loadingTask() {\n return this._transport.loadingTask;\n }\n\n /**\n * @returns {Promise> | null>} A promise that is\n * resolved with an {Object} containing /AcroForm field data for the JS\n * sandbox, or `null` when no field data is present in the PDF file.\n */\n getFieldObjects() {\n return this._transport.getFieldObjects();\n }\n\n /**\n * @returns {Promise} A promise that is resolved with `true`\n * if some /AcroForm fields have JavaScript actions.\n */\n hasJSActions() {\n return this._transport.hasJSActions();\n }\n\n /**\n * @returns {Promise | null>} A promise that is resolved with an\n * {Array} containing IDs of annotations that have a calculation\n * action, or `null` when no such annotations are present in the PDF file.\n */\n getCalculationOrderIds() {\n return this._transport.getCalculationOrderIds();\n }\n}\n\n/**\n * Page getViewport parameters.\n *\n * @typedef {Object} GetViewportParameters\n * @property {number} scale - The desired scale of the viewport.\n * @property {number} [rotation] - The desired rotation, in degrees, of\n * the viewport. If omitted it defaults to the page rotation.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be\n * flipped. The default value is `false`.\n */\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} disableCombineTextItems - Do not attempt to combine\n * same line {@link TextItem}'s. The default value is `false`.\n * @property {boolean} [includeMarkedContent] - When true include marked\n * content items in the items array of TextContent. The default is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {Array} items - Array of\n * {@link TextItem} and {@link TextMarkedContent} objects. TextMarkedContent\n * items are included when includeMarkedContent is true.\n * @property {Object} styles - {@link TextStyle} objects,\n * indexed by font name.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - Text content.\n * @property {string} dir - Text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {Array} transform - Transformation matrix.\n * @property {number} width - Width in device space.\n * @property {number} height - Height in device space.\n * @property {string} fontName - Font name used by PDF.js for converted font.\n * @property {boolean} hasEOL - Indicating if the text content is followed by a\n * line-break.\n */\n\n/**\n * Page text marked content part.\n *\n * @typedef {Object} TextMarkedContent\n * @property {string} type - Either 'beginMarkedContent',\n * 'beginMarkedContentProps', or 'endMarkedContent'.\n * @property {string} id - The marked content identifier. Only used for type\n * 'beginMarkedContentProps'.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - Font ascent.\n * @property {number} descent - Font descent.\n * @property {boolean} vertical - Whether or not the text is in vertical mode.\n * @property {string} fontFamily - The possible font family.\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} [intent] - Determines the annotations that are fetched,\n * can be 'display' (viewable annotations), 'print' (printable annotations),\n * or 'any' (all annotations). The default value is 'display'.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {Object} canvasContext - A 2D context of a DOM Canvas object.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n * the `PDFPageProxy.getViewport` method.\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are rendered\n * onto the canvas, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {Array} [transform] - Additional transform, applied just\n * before viewport transform.\n * @property {Object} [canvasFactory] - The factory instance that will be used\n * when creating canvases. The default value is {new DOMCanvasFactory()}.\n * @property {Object | string} [background] - Background to use for the canvas.\n * Any valid `canvas.fillStyle` can be used: a `DOMString` parsed as CSS\n * value, a `CanvasGradient` object (a linear or radial gradient) or\n * a `CanvasPattern` object (a repetitive image). The default value is\n * 'rgb(255,255,255)'.\n *\n * NOTE: This option may be partially, or completely, ignored when the\n * `pageColors`-option is used.\n * @property {Object} [pageColors] - Overwrites background and foreground colors\n * with user defined ones in order to improve readability in high contrast\n * mode.\n * @property {Promise} [optionalContentConfigPromise] -\n * A promise that should resolve with an {@link OptionalContentConfig}\n * created from `PDFDocumentProxy.getOptionalContentConfig`. If `null`,\n * the configuration will be fetched automatically with the default visibility\n * states set.\n * @property {Map} [annotationCanvasMap] - Map some\n * annotation ids with canvases used to render them.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n */\n\n/**\n * Page getOperatorList parameters.\n *\n * @typedef {Object} GetOperatorListParameters\n * @property {string} [intent] - Rendering intent, can be 'display', 'print',\n * or 'any'. The default value is 'display'.\n * @property {number} [annotationMode] Controls which annotations are included\n * in the operatorList, for annotations with appearance-data; the values from\n * {@link AnnotationMode} should be used. The following values are supported:\n * - `AnnotationMode.DISABLE`, which disables all annotations.\n * - `AnnotationMode.ENABLE`, which includes all possible annotations (thus\n * it also depends on the `intent`-option, see above).\n * - `AnnotationMode.ENABLE_FORMS`, which excludes annotations that contain\n * interactive form elements (those will be rendered in the display layer).\n * - `AnnotationMode.ENABLE_STORAGE`, which includes all possible annotations\n * (as above) but where interactive form elements are updated with data\n * from the {@link AnnotationStorage}-instance; useful e.g. for printing.\n * The default value is `AnnotationMode.ENABLE`.\n * @property {PrintAnnotationStorage} [printAnnotationStorage]\n */\n\n/**\n * Structure tree node. The root node will have a role \"Root\".\n *\n * @typedef {Object} StructTreeNode\n * @property {Array} children - Array of\n * {@link StructTreeNode} and {@link StructTreeContent} objects.\n * @property {string} role - element's role, already mapped if a role map exists\n * in the PDF.\n */\n\n/**\n * Structure tree content.\n *\n * @typedef {Object} StructTreeContent\n * @property {string} type - either \"content\" for page and stream structure\n * elements or \"object\" for object references.\n * @property {string} id - unique id that will map to the text layer.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array} fnArray - Array containing the operator functions.\n * @property {Array} argsArray - Array containing the arguments of the\n * functions.\n */\n\n/**\n * Proxy to a `PDFPage` in the worker thread.\n */\nclass PDFPageProxy {\n constructor(pageIndex, pageInfo, transport, ownerDocument, pdfBug = false) {\n this._pageIndex = pageIndex;\n this._pageInfo = pageInfo;\n this._ownerDocument = ownerDocument;\n this._transport = transport;\n this._stats = pdfBug ? new StatTimer() : null;\n this._pdfBug = pdfBug;\n /** @type {PDFObjects} */\n this.commonObjs = transport.commonObjs;\n this.objs = new PDFObjects();\n\n this._bitmaps = new Set();\n\n this.cleanupAfterRender = false;\n this.pendingCleanup = false;\n this._intentStates = new Map();\n this.destroyed = false;\n }\n\n /**\n * @type {number} Page number of the page. First page is 1.\n */\n get pageNumber() {\n return this._pageIndex + 1;\n }\n\n /**\n * @type {number} The number of degrees the page is rotated clockwise.\n */\n get rotate() {\n return this._pageInfo.rotate;\n }\n\n /**\n * @type {RefProxy | null} The reference that points to this page.\n */\n get ref() {\n return this._pageInfo.ref;\n }\n\n /**\n * @type {number} The default size of units in 1/72nds of an inch.\n */\n get userUnit() {\n return this._pageInfo.userUnit;\n }\n\n /**\n * @type {Array} An array of the visible portion of the PDF page in\n * user space units [x1, y1, x2, y2].\n */\n get view() {\n return this._pageInfo.view;\n }\n\n /**\n * @param {GetViewportParameters} params - Viewport parameters.\n * @returns {PageViewport} Contains 'width' and 'height' properties\n * along with transforms required for rendering.\n */\n getViewport({\n scale,\n rotation = this.rotate,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.view,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * @param {GetAnnotationsParameters} params - Annotation parameters.\n * @returns {Promise>} A promise that is resolved with an\n * {Array} of the annotation objects.\n */\n getAnnotations({ intent = \"display\" } = {}) {\n const intentArgs = this._transport.getRenderingIntent(intent);\n\n return this._transport.getAnnotations(\n this._pageIndex,\n intentArgs.renderingIntent\n );\n }\n\n /**\n * @returns {Promise} A promise that is resolved with an\n * {Object} with JS actions.\n */\n getJSActions() {\n return this._transport.getPageJSActions(this._pageIndex);\n }\n\n /**\n * @type {boolean} True if only XFA form.\n */\n get isPureXfa() {\n return shadow(this, \"isPureXfa\", !!this._transport._htmlForXfa);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with a fake DOM object (a tree structure where elements\n * are {Object} with a name, attributes (class, style, ...), value and\n * children, very similar to a HTML DOM tree), or `null` if no XFA exists.\n */\n async getXfa() {\n return this._transport._htmlForXfa?.children[this._pageIndex] || null;\n }\n\n /**\n * Begins the process of rendering a page to the desired context.\n *\n * @param {RenderParameters} params - Page render parameters.\n * @returns {RenderTask} An object that contains a promise that is\n * resolved when the page finishes rendering.\n */\n render({\n canvasContext,\n viewport,\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n transform = null,\n canvasFactory = null,\n background = null,\n optionalContentConfigPromise = null,\n annotationCanvasMap = null,\n pageColors = null,\n printAnnotationStorage = null,\n }) {\n this._stats?.time(\"Overall\");\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage\n );\n // If there was a pending destroy, cancel it so no cleanup happens during\n // this call to render.\n this.pendingCleanup = false;\n\n if (!optionalContentConfigPromise) {\n optionalContentConfigPromise = this._transport.getOptionalContentConfig();\n }\n\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n const canvasFactoryInstance =\n canvasFactory ||\n new DefaultCanvasFactory({ ownerDocument: this._ownerDocument });\n const intentPrint = !!(\n intentArgs.renderingIntent & RenderingIntentFlag.PRINT\n );\n\n // If there's no displayReadyCapability yet, then the operatorList\n // was never requested before. Make the request and create the promise.\n if (!intentState.displayReadyCapability) {\n intentState.displayReadyCapability = createPromiseCapability();\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n\n const complete = error => {\n intentState.renderTasks.delete(internalRenderTask);\n\n // Attempt to reduce memory usage during *printing*, by always running\n // cleanup once rendering has finished (regardless of cleanupAfterRender).\n if (this.cleanupAfterRender || intentPrint) {\n this.pendingCleanup = true;\n }\n this._tryCleanup();\n\n if (error) {\n internalRenderTask.capability.reject(error);\n\n this._abortOperatorList({\n intentState,\n reason: error instanceof Error ? error : new Error(error),\n });\n } else {\n internalRenderTask.capability.resolve();\n }\n\n this._stats?.timeEnd(\"Rendering\");\n this._stats?.timeEnd(\"Overall\");\n };\n\n const internalRenderTask = new InternalRenderTask({\n callback: complete,\n // Only include the required properties, and *not* the entire object.\n params: {\n canvasContext,\n viewport,\n transform,\n background,\n },\n objs: this.objs,\n commonObjs: this.commonObjs,\n annotationCanvasMap,\n operatorList: intentState.operatorList,\n pageIndex: this._pageIndex,\n canvasFactory: canvasFactoryInstance,\n useRequestAnimationFrame: !intentPrint,\n pdfBug: this._pdfBug,\n pageColors,\n });\n\n (intentState.renderTasks ||= new Set()).add(internalRenderTask);\n const renderTask = internalRenderTask.task;\n\n Promise.all([\n intentState.displayReadyCapability.promise,\n optionalContentConfigPromise,\n ])\n .then(([transparency, optionalContentConfig]) => {\n if (this.pendingCleanup) {\n complete();\n return;\n }\n this._stats?.time(\"Rendering\");\n\n internalRenderTask.initializeGraphics({\n transparency,\n optionalContentConfig,\n });\n internalRenderTask.operatorListChanged();\n })\n .catch(complete);\n\n return renderTask;\n }\n\n /**\n * @param {GetOperatorListParameters} params - Page getOperatorList\n * parameters.\n * @returns {Promise} A promise resolved with an\n * {@link PDFOperatorList} object that represents the page's operator list.\n */\n getOperatorList({\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n printAnnotationStorage = null,\n } = {}) {\n function operatorListChanged() {\n if (intentState.operatorList.lastChunk) {\n intentState.opListReadCapability.resolve(intentState.operatorList);\n\n intentState.renderTasks.delete(opListTask);\n }\n }\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage,\n /* isOpList = */ true\n );\n let intentState = this._intentStates.get(intentArgs.cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(intentArgs.cacheKey, intentState);\n }\n let opListTask;\n\n if (!intentState.opListReadCapability) {\n opListTask = Object.create(null);\n opListTask.operatorListChanged = operatorListChanged;\n intentState.opListReadCapability = createPromiseCapability();\n (intentState.renderTasks ||= new Set()).add(opListTask);\n intentState.operatorList = {\n fnArray: [],\n argsArray: [],\n lastChunk: false,\n separateAnnots: null,\n };\n\n this._stats?.time(\"Page Request\");\n this._pumpOperatorList(intentArgs);\n }\n return intentState.opListReadCapability.promise;\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {ReadableStream} Stream for reading text content chunks.\n */\n streamTextContent({\n disableCombineTextItems = false,\n includeMarkedContent = false,\n } = {}) {\n const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n return this._transport.messageHandler.sendWithStream(\n \"GetTextContent\",\n {\n pageIndex: this._pageIndex,\n combineTextItems: disableCombineTextItems !== true,\n includeMarkedContent: includeMarkedContent === true,\n },\n {\n highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n size(textContent) {\n return textContent.items.length;\n },\n }\n );\n }\n\n /**\n * NOTE: All occurrences of whitespace will be replaced by\n * standard spaces (0x20).\n *\n * @param {getTextContentParameters} params - getTextContent parameters.\n * @returns {Promise} A promise that is resolved with a\n * {@link TextContent} object that represents the page's text content.\n */\n getTextContent(params = {}) {\n if (this._transport._htmlForXfa) {\n // TODO: We need to revisit this once the XFA foreground patch lands and\n // only do this for non-foreground XFA.\n return this.getXfa().then(xfa => {\n return XfaText.textContent(xfa);\n });\n }\n const readableStream = this.streamTextContent(params);\n\n return new Promise(function (resolve, reject) {\n function pump() {\n reader.read().then(function ({ value, done }) {\n if (done) {\n resolve(textContent);\n return;\n }\n Object.assign(textContent.styles, value.styles);\n textContent.items.push(...value.items);\n pump();\n }, reject);\n }\n\n const reader = readableStream.getReader();\n const textContent = {\n items: [],\n styles: Object.create(null),\n };\n pump();\n });\n }\n\n /**\n * @returns {Promise} A promise that is resolved with a\n * {@link StructTreeNode} object that represents the page's structure tree,\n * or `null` when no structure tree is present for the current page.\n */\n getStructTree() {\n return this._transport.getStructTree(this._pageIndex);\n }\n\n /**\n * Destroys the page object.\n * @private\n */\n _destroy() {\n this.destroyed = true;\n\n const waitOn = [];\n for (const intentState of this._intentStates.values()) {\n this._abortOperatorList({\n intentState,\n reason: new Error(\"Page was destroyed.\"),\n force: true,\n });\n\n if (intentState.opListReadCapability) {\n // Avoid errors below, since the renderTasks are just stubs.\n continue;\n }\n for (const internalRenderTask of intentState.renderTasks) {\n waitOn.push(internalRenderTask.completed);\n internalRenderTask.cancel();\n }\n }\n this.objs.clear();\n for (const bitmap of this._bitmaps) {\n bitmap.close();\n }\n this._bitmaps.clear();\n this.pendingCleanup = false;\n return Promise.all(waitOn);\n }\n\n /**\n * Cleans up resources allocated by the page.\n *\n * @param {boolean} [resetStats] - Reset page stats, if enabled.\n * The default value is `false`.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n cleanup(resetStats = false) {\n this.pendingCleanup = true;\n return this._tryCleanup(resetStats);\n }\n\n /**\n * Attempts to clean up if rendering is in a state where that's possible.\n * @private\n */\n _tryCleanup(resetStats = false) {\n if (!this.pendingCleanup) {\n return false;\n }\n for (const { renderTasks, operatorList } of this._intentStates.values()) {\n if (renderTasks.size > 0 || !operatorList.lastChunk) {\n return false;\n }\n }\n\n this._intentStates.clear();\n this.objs.clear();\n if (resetStats && this._stats) {\n this._stats = new StatTimer();\n }\n for (const bitmap of this._bitmaps) {\n bitmap.close();\n }\n this._bitmaps.clear();\n this.pendingCleanup = false;\n return true;\n }\n\n /**\n * @private\n */\n _startRenderPage(transparency, cacheKey) {\n const intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n return; // Rendering was cancelled.\n }\n this._stats?.timeEnd(\"Page Request\");\n\n // TODO Refactor RenderPageRequest to separate rendering\n // and operator list logic\n intentState.displayReadyCapability?.resolve(transparency);\n }\n\n /**\n * @private\n */\n _renderPageChunk(operatorListChunk, intentState) {\n // Add the new chunk to the current operator list.\n for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {\n intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);\n }\n intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;\n\n // Notify all the rendering tasks there are more operators to be consumed.\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n\n if (operatorListChunk.lastChunk) {\n this._tryCleanup();\n }\n }\n\n /**\n * @private\n */\n _pumpOperatorList({ renderingIntent, cacheKey, annotationStorageMap }) {\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || TESTING\")\n ) {\n assert(\n Number.isInteger(renderingIntent) && renderingIntent > 0,\n '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n );\n }\n\n const readableStream = this._transport.messageHandler.sendWithStream(\n \"GetOperatorList\",\n {\n pageIndex: this._pageIndex,\n intent: renderingIntent,\n cacheKey,\n annotationStorage: annotationStorageMap,\n }\n );\n const reader = readableStream.getReader();\n\n const intentState = this._intentStates.get(cacheKey);\n intentState.streamReader = reader;\n\n const pump = () => {\n reader.read().then(\n ({ value, done }) => {\n if (done) {\n intentState.streamReader = null;\n return;\n }\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n this._renderPageChunk(value, intentState);\n pump();\n },\n reason => {\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n if (intentState.operatorList) {\n // Mark operator list as complete.\n intentState.operatorList.lastChunk = true;\n\n for (const internalRenderTask of intentState.renderTasks) {\n internalRenderTask.operatorListChanged();\n }\n this._tryCleanup();\n }\n\n if (intentState.displayReadyCapability) {\n intentState.displayReadyCapability.reject(reason);\n } else if (intentState.opListReadCapability) {\n intentState.opListReadCapability.reject(reason);\n } else {\n throw reason;\n }\n }\n );\n };\n pump();\n }\n\n /**\n * @private\n */\n _abortOperatorList({ intentState, reason, force = false }) {\n if (\n typeof PDFJSDev === \"undefined\" ||\n PDFJSDev.test(\"!PRODUCTION || TESTING\")\n ) {\n assert(\n reason instanceof Error,\n '_abortOperatorList: Expected valid \"reason\" argument.'\n );\n }\n\n if (!intentState.streamReader) {\n return;\n }\n // Ensure that a pending `streamReader` cancel timeout is always aborted.\n if (intentState.streamReaderCancelTimeout) {\n clearTimeout(intentState.streamReaderCancelTimeout);\n intentState.streamReaderCancelTimeout = null;\n }\n\n if (!force) {\n // Ensure that an Error occurring in *only* one `InternalRenderTask`, e.g.\n // multiple render() calls on the same canvas, won't break all rendering.\n if (intentState.renderTasks.size > 0) {\n return;\n }\n // Don't immediately abort parsing on the worker-thread when rendering is\n // cancelled, since that will unnecessarily delay re-rendering when (for\n // partially parsed pages) e.g. zooming/rotation occurs in the viewer.\n if (reason instanceof RenderingCancelledException) {\n let delay = RENDERING_CANCELLED_TIMEOUT;\n if (reason.extraDelay > 0 && reason.extraDelay < /* ms = */ 1000) {\n // Above, we prevent the total delay from becoming arbitrarily large.\n delay += reason.extraDelay;\n }\n\n intentState.streamReaderCancelTimeout = setTimeout(() => {\n intentState.streamReaderCancelTimeout = null;\n this._abortOperatorList({ intentState, reason, force: true });\n }, delay);\n return;\n }\n }\n intentState.streamReader\n .cancel(new AbortException(reason.message))\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n intentState.streamReader = null;\n\n if (this._transport.destroyed) {\n return; // Ignore any pending requests if the worker was terminated.\n }\n // Remove the current `intentState`, since a cancelled `getOperatorList`\n // call on the worker-thread cannot be re-started...\n for (const [curCacheKey, curIntentState] of this._intentStates) {\n if (curIntentState === intentState) {\n this._intentStates.delete(curCacheKey);\n break;\n }\n }\n // ... and force clean-up to ensure that any old state is always removed.\n this.cleanup();\n }\n\n /**\n * @type {Object} Returns page stats, if enabled; returns `null` otherwise.\n */\n get stats() {\n return this._stats;\n }\n}\n\nclass LoopbackPort {\n #listeners = [];\n\n #deferred = Promise.resolve();\n\n postMessage(obj, transfers) {\n const event = {\n data: structuredClone(obj, transfers),\n };\n\n this.#deferred.then(() => {\n for (const listener of this.#listeners) {\n listener.call(this, event);\n }\n });\n }\n\n addEventListener(name, listener) {\n this.#listeners.push(listener);\n }\n\n removeEventListener(name, listener) {\n const i = this.#listeners.indexOf(listener);\n this.#listeners.splice(i, 1);\n }\n\n terminate() {\n this.#listeners.length = 0;\n }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Object} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n * the constants from {@link VerbosityLevel} should be used.\n */\n\nconst PDFWorkerUtil = {\n isWorkerDisabled: false,\n fallbackWorkerSrc: null,\n fakeWorkerId: 0,\n};\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // eslint-disable-next-line no-undef\n if (isNodeJS && typeof __non_webpack_require__ === \"function\") {\n // Workers aren't supported in Node.js, force-disabling them there.\n PDFWorkerUtil.isWorkerDisabled = true;\n\n PDFWorkerUtil.fallbackWorkerSrc = PDFJSDev.test(\"LIB\")\n ? \"../pdf.worker.js\"\n : \"./pdf.worker.js\";\n } else if (typeof document === \"object\") {\n const pdfjsFilePath = document?.currentScript?.src;\n if (pdfjsFilePath) {\n PDFWorkerUtil.fallbackWorkerSrc = pdfjsFilePath.replace(\n /(\\.(?:min\\.)?js)(\\?.*)?$/i,\n \".worker$1$2\"\n );\n }\n }\n\n // Check if URLs have the same origin. For non-HTTP based URLs, returns false.\n PDFWorkerUtil.isSameOrigin = function (baseUrl, otherUrl) {\n let base;\n try {\n base = new URL(baseUrl);\n if (!base.origin || base.origin === \"null\") {\n return false; // non-HTTP url\n }\n } catch (e) {\n return false;\n }\n\n const other = new URL(otherUrl, base);\n return base.origin === other.origin;\n };\n\n PDFWorkerUtil.createCDNWrapper = function (url) {\n // We will rely on blob URL's property to specify origin.\n // We want this function to fail in case if createObjectURL or Blob do not\n // exist or fail for some reason -- our Worker creation will fail anyway.\n const wrapper = `importScripts(\"${url}\");`;\n return URL.createObjectURL(new Blob([wrapper]));\n };\n}\n\n/**\n * PDF.js web worker abstraction that controls the instantiation of PDF\n * documents. Message handlers are used to pass information from the main\n * thread to the worker thread and vice versa. If the creation of a web\n * worker is not possible, a \"fake\" worker will be used instead.\n *\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\nclass PDFWorker {\n static #workerPorts = new WeakMap();\n\n constructor({\n name = null,\n port = null,\n verbosity = getVerbosityLevel(),\n } = {}) {\n if (port && PDFWorker.#workerPorts.has(port)) {\n throw new Error(\"Cannot use more than one PDFWorker per port.\");\n }\n\n this.name = name;\n this.destroyed = false;\n this.verbosity = verbosity;\n\n this._readyCapability = createPromiseCapability();\n this._port = null;\n this._webWorker = null;\n this._messageHandler = null;\n\n if (port) {\n PDFWorker.#workerPorts.set(port, this);\n this._initializeFromPort(port);\n return;\n }\n this._initialize();\n }\n\n /**\n * Promise for worker initialization completion.\n * @type {Promise}\n */\n get promise() {\n return this._readyCapability.promise;\n }\n\n /**\n * The current `workerPort`, when it exists.\n * @type {Worker}\n */\n get port() {\n return this._port;\n }\n\n /**\n * The current MessageHandler-instance.\n * @type {MessageHandler}\n */\n get messageHandler() {\n return this._messageHandler;\n }\n\n _initializeFromPort(port) {\n this._port = port;\n this._messageHandler = new MessageHandler(\"main\", \"worker\", port);\n this._messageHandler.on(\"ready\", function () {\n // Ignoring \"ready\" event -- MessageHandler should already be initialized\n // and ready to accept messages.\n });\n this._readyCapability.resolve();\n // Send global setting, e.g. verbosity level.\n this._messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\n }\n\n _initialize() {\n // If worker support isn't disabled explicit and the browser has worker\n // support, create a new web worker and test if it/the browser fulfills\n // all requirements to run parts of pdf.js in a web worker.\n // Right now, the requirement is, that an Uint8Array is still an\n // Uint8Array as it arrives on the worker. (Chrome added this with v.15.)\n if (\n !PDFWorkerUtil.isWorkerDisabled &&\n !PDFWorker._mainThreadWorkerMessageHandler\n ) {\n let { workerSrc } = PDFWorker;\n\n try {\n // Wraps workerSrc path into blob URL, if the former does not belong\n // to the same origin.\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n !PDFWorkerUtil.isSameOrigin(window.location.href, workerSrc)\n ) {\n workerSrc = PDFWorkerUtil.createCDNWrapper(\n new URL(workerSrc, window.location).href\n );\n }\n\n // Some versions of FF can't create a worker on localhost, see:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=683280\n const worker = new Worker(workerSrc);\n const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n const terminateEarly = () => {\n worker.removeEventListener(\"error\", onWorkerError);\n messageHandler.destroy();\n worker.terminate();\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n } else {\n // Fall back to fake worker if the termination is caused by an\n // error (e.g. NetworkError / SecurityError).\n this._setupFakeWorker();\n }\n };\n\n const onWorkerError = () => {\n if (!this._webWorker) {\n // Worker failed to initialize due to an error. Clean up and fall\n // back to the fake worker.\n terminateEarly();\n }\n };\n worker.addEventListener(\"error\", onWorkerError);\n\n messageHandler.on(\"test\", data => {\n worker.removeEventListener(\"error\", onWorkerError);\n if (this.destroyed) {\n terminateEarly();\n return; // worker was destroyed\n }\n if (data) {\n this._messageHandler = messageHandler;\n this._port = worker;\n this._webWorker = worker;\n\n this._readyCapability.resolve();\n // Send global setting, e.g. verbosity level.\n messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\n } else {\n this._setupFakeWorker();\n messageHandler.destroy();\n worker.terminate();\n }\n });\n\n messageHandler.on(\"ready\", data => {\n worker.removeEventListener(\"error\", onWorkerError);\n if (this.destroyed) {\n terminateEarly();\n return; // worker was destroyed\n }\n try {\n sendTest();\n } catch (e) {\n // We need fallback to a faked worker.\n this._setupFakeWorker();\n }\n });\n\n const sendTest = () => {\n const testObj = new Uint8Array();\n // Ensure that we can use `postMessage` transfers.\n messageHandler.send(\"test\", testObj, [testObj.buffer]);\n };\n\n // It might take time for the worker to initialize. We will try to send\n // the \"test\" message immediately, and once the \"ready\" message arrives.\n // The worker shall process only the first received \"test\" message.\n sendTest();\n return;\n } catch (e) {\n info(\"The worker has been disabled.\");\n }\n }\n // Either workers are disabled, not supported or have thrown an exception.\n // Thus, we fallback to a faked worker.\n this._setupFakeWorker();\n }\n\n _setupFakeWorker() {\n if (!PDFWorkerUtil.isWorkerDisabled) {\n warn(\"Setting up fake worker.\");\n PDFWorkerUtil.isWorkerDisabled = true;\n }\n\n PDFWorker._setupFakeWorkerGlobal\n .then(WorkerMessageHandler => {\n if (this.destroyed) {\n this._readyCapability.reject(new Error(\"Worker was destroyed\"));\n return;\n }\n const port = new LoopbackPort();\n this._port = port;\n\n // All fake workers use the same port, making id unique.\n const id = `fake${PDFWorkerUtil.fakeWorkerId++}`;\n\n // If the main thread is our worker, setup the handling for the\n // messages -- the main thread sends to it self.\n const workerHandler = new MessageHandler(id + \"_worker\", id, port);\n WorkerMessageHandler.setup(workerHandler, port);\n\n const messageHandler = new MessageHandler(id, id + \"_worker\", port);\n this._messageHandler = messageHandler;\n this._readyCapability.resolve();\n // Send global setting, e.g. verbosity level.\n messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\n })\n .catch(reason => {\n this._readyCapability.reject(\n new Error(`Setting up fake worker failed: \"${reason.message}\".`)\n );\n });\n }\n\n /**\n * Destroys the worker instance.\n */\n destroy() {\n this.destroyed = true;\n if (this._webWorker) {\n // We need to terminate only web worker created resource.\n this._webWorker.terminate();\n this._webWorker = null;\n }\n PDFWorker.#workerPorts.delete(this._port);\n this._port = null;\n if (this._messageHandler) {\n this._messageHandler.destroy();\n this._messageHandler = null;\n }\n }\n\n /**\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n */\n static fromPort(params) {\n if (!params?.port) {\n throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n }\n if (this.#workerPorts.has(params.port)) {\n return this.#workerPorts.get(params.port);\n }\n return new PDFWorker(params);\n }\n\n /**\n * The current `workerSrc`, when it exists.\n * @type {string}\n */\n static get workerSrc() {\n if (GlobalWorkerOptions.workerSrc) {\n return GlobalWorkerOptions.workerSrc;\n }\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n PDFWorkerUtil.fallbackWorkerSrc !== null\n ) {\n if (!isNodeJS) {\n deprecated('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n return PDFWorkerUtil.fallbackWorkerSrc;\n }\n throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n\n static get _mainThreadWorkerMessageHandler() {\n try {\n return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n } catch (ex) {\n return null;\n }\n }\n\n // Loads worker code into the main-thread.\n static get _setupFakeWorkerGlobal() {\n const loader = async () => {\n const mainWorkerMessageHandler = this._mainThreadWorkerMessageHandler;\n\n if (mainWorkerMessageHandler) {\n // The worker was already loaded using e.g. a ` - - -
- -

Sync browser settings with Account

-
-

Settings Comparison:

- - - - - - - - - - - -
PropertyAccount SettingWeb Browser Setting
- -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - diff --git a/src/main/resources/templates/addUsers.html b/src/main/resources/templates/addUsers.html deleted file mode 100644 index 4ab59a8b..00000000 --- a/src/main/resources/templates/addUsers.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -
-
-
-

-
-
-
- - -

Admin User Control Settings

- - - - - - - - - - - - - - - - - - - -
UsernameRolesActions
-
- -
-
- - - -

Add New User

-
- Default message if not found -
-
-
- - -
-
- - -
-
- - -
-
- - -
- - - -
-
-
-
- -
-
-
- - diff --git a/src/main/resources/templates/auto-split-pdf.html b/src/main/resources/templates/auto-split-pdf.html deleted file mode 100644 index 4cc39c99..00000000 --- a/src/main/resources/templates/auto-split-pdf.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - -
-
-
-

-
-
-
-

- -

-
    -
  • -
  • -
  • -
  • -
-
-

-
-
- - -
-

-

- -
-
-
-
- -
-
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/change-creds.html b/src/main/resources/templates/change-creds.html deleted file mode 100644 index 94b87b64..00000000 --- a/src/main/resources/templates/change-creds.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -
-
-
-

-
-
-
- - -

User Settings

-
- -
- Default message if not found -
-
- Default message if not found -
-
- Default message if not found -
-
- Default message if not found -
- - -

User!

- - - -

-

Change Username and password

-
-
- - -
-
- - -
-
- - -
-
- - -
-
- -
-
- - -
- - - - - -
-
- -
-
-
- - diff --git a/src/main/resources/templates/convert/file-to-pdf.html b/src/main/resources/templates/convert/file-to-pdf.html deleted file mode 100644 index fe56c164..00000000 --- a/src/main/resources/templates/convert/file-to-pdf.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/convert/html-to-pdf.html b/src/main/resources/templates/convert/html-to-pdf.html deleted file mode 100644 index 546ef1fc..00000000 --- a/src/main/resources/templates/convert/html-to-pdf.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
-
- - -
-

-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/convert/img-to-pdf.html b/src/main/resources/templates/convert/img-to-pdf.html deleted file mode 100644 index ae38143c..00000000 --- a/src/main/resources/templates/convert/img-to-pdf.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - -
-
-
-

-
-
-
-

- -
- - - -
- -
- - -
- - -
- - -
-
- - -
-
- -
- - -
- -

- - - -
-
-
-
- -
-
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/convert/markdown-to-pdf.html b/src/main/resources/templates/convert/markdown-to-pdf.html deleted file mode 100644 index 7b8be463..00000000 --- a/src/main/resources/templates/convert/markdown-to-pdf.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
-
- - -
-

-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/convert/pdf-to-html.html b/src/main/resources/templates/convert/pdf-to-html.html deleted file mode 100644 index 671ff034..00000000 --- a/src/main/resources/templates/convert/pdf-to-html.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
-
- - -
-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/convert/pdf-to-img.html b/src/main/resources/templates/convert/pdf-to-img.html deleted file mode 100644 index 5d5a6ae7..00000000 --- a/src/main/resources/templates/convert/pdf-to-img.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - -
-
-
- -

-
-
-
-

-

-
-
-
- - -
-
- - -
-
- - -
-
- - -
- -
- -
-
-
- -
-
-
- - diff --git a/src/main/resources/templates/convert/pdf-to-pdfa.html b/src/main/resources/templates/convert/pdf-to-pdfa.html deleted file mode 100644 index dfddb792..00000000 --- a/src/main/resources/templates/convert/pdf-to-pdfa.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - -
-
-
-

-
-
-
-

-

Currently doesn't work for multiple inputs at once

-
-
-
- -
-

-
-
-
- -
-
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/convert/pdf-to-presentation.html b/src/main/resources/templates/convert/pdf-to-presentation.html deleted file mode 100644 index 51a0440b..00000000 --- a/src/main/resources/templates/convert/pdf-to-presentation.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
- -
- - -
-
- - -
-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/convert/pdf-to-text.html b/src/main/resources/templates/convert/pdf-to-text.html deleted file mode 100644 index 0f479178..00000000 --- a/src/main/resources/templates/convert/pdf-to-text.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
- -
- - -
-
- - -
-

-
-
-
-
-
-
\ No newline at end of file diff --git a/src/main/resources/templates/convert/pdf-to-word.html b/src/main/resources/templates/convert/pdf-to-word.html deleted file mode 100644 index d2531084..00000000 --- a/src/main/resources/templates/convert/pdf-to-word.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
- -
- - -
-
- - -
-

-
-
-
-
-
-
- - - - - diff --git a/src/main/resources/templates/convert/pdf-to-xml.html b/src/main/resources/templates/convert/pdf-to-xml.html deleted file mode 100644 index d32ba5dc..00000000 --- a/src/main/resources/templates/convert/pdf-to-xml.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
-
-
- - -
-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/convert/url-to-pdf.html b/src/main/resources/templates/convert/url-to-pdf.html deleted file mode 100644 index 09a0d35a..00000000 --- a/src/main/resources/templates/convert/url-to-pdf.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - -
-
-
-

-
-
-
-

-
- -
- - -
-

-
-
-
-
-
-
- - diff --git a/src/main/resources/templates/crop.html b/src/main/resources/templates/crop.html deleted file mode 100644 index b0347477..00000000 --- a/src/main/resources/templates/crop.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -
-
-
-

-
-
-
-

-
-
- - - - - -
-
- - -
- - - -
-
-
-
-
-
- - diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html deleted file mode 100644 index dff3fab4..00000000 --- a/src/main/resources/templates/error.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - Error! :( - - - - - -
-
- -
-
-
- -
-

Oops!

-

We can't seem to find the page you're looking for.

-

Something went wrong

- -
-

Need help / Found a issue?

-

If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord:

- - Go back to homepage -
-
-
-
-
- - - - - diff --git a/src/main/resources/templates/extract-page.html b/src/main/resources/templates/extract-page.html deleted file mode 100644 index d8ae7fb5..00000000 --- a/src/main/resources/templates/extract-page.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - -
-
-
-

-
-
-
-

-
-
- -
- - -
- - -
-
-
-
-
-
-
- - \ No newline at end of file diff --git a/src/main/resources/templates/fragments/card.html b/src/main/resources/templates/fragments/card.html deleted file mode 100644 index c3583da6..00000000 --- a/src/main/resources/templates/fragments/card.html +++ /dev/null @@ -1,12 +0,0 @@ -
- -
- Icon -
-
-

-
-
- Favorite -
-
diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html deleted file mode 100644 index 36ee712a..00000000 --- a/src/main/resources/templates/fragments/common.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
Lives: 3
-
Score: 0
-
High Score: 0
-
Level: 1
- -
- -
-
- - - - - -
-
- -
-
-
- - - - - - - - -
\ No newline at end of file diff --git a/src/main/resources/templates/fragments/errorBanner.html b/src/main/resources/templates/fragments/errorBanner.html deleted file mode 100644 index cdba311a..00000000 --- a/src/main/resources/templates/fragments/errorBanner.html +++ /dev/null @@ -1,87 +0,0 @@ - - - -
- - -
\ No newline at end of file diff --git a/src/main/resources/templates/fragments/errorBannerPerPage.html b/src/main/resources/templates/fragments/errorBannerPerPage.html deleted file mode 100644 index ccc2f7b4..00000000 --- a/src/main/resources/templates/fragments/errorBannerPerPage.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html deleted file mode 100644 index 0bff58e6..00000000 --- a/src/main/resources/templates/fragments/footer.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
- - - - -
Powered by Stirling PDF
-
-
\ No newline at end of file diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html deleted file mode 100644 index 1ebed837..00000000 --- a/src/main/resources/templates/fragments/languages.html +++ /dev/null @@ -1,62 +0,0 @@ - - - icon Български - - - icon العربية - - - icon Català - - - icon 简体中文 - - - icon Deutsch - - - icon English (GB) - - - icon English (US) - - - icon Euskara - - - icon Español - - - icon Français - - - icon Italiano - - - icon Nederlands - - - icon Polski - - - icon Português (BR) - - - icon Romanian - - - icon Svenska - - - icon Русский - - - icon 한국어 - - - icon 日本語 - - - icon Ελληνικά - - diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html deleted file mode 100644 index 4326afcc..00000000 --- a/src/main/resources/templates/fragments/navbar.html +++ /dev/null @@ -1,312 +0,0 @@ -
- - - - - - - - - -
- - - - - - - - -
diff --git a/src/main/resources/templates/fragments/navbarEntry.html b/src/main/resources/templates/fragments/navbarEntry.html deleted file mode 100644 index 1cd33be6..00000000 --- a/src/main/resources/templates/fragments/navbarEntry.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html deleted file mode 100644 index dcea42b8..00000000 --- a/src/main/resources/templates/home.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - -
-
-
- -
-
-

-

-
-
-
- - - -
-
- -
- - - - -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- - -
-
-
- -
-
-
-
-
-
-
-
- - - - -
-
-
-
- - - diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html deleted file mode 100644 index fa9fb279..00000000 --- a/src/main/resources/templates/login.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - -
-
-
-
- - - -
- -
- Default message if not found -
-
- -

Stirling-PDF

-

Please sign in

- -
- -
-
- -
- -
- -
- -
-
- -
- - - -
-
Invalid username or - password.
-
Your account has been locked. -
-
- -
- - -
-
- - - - diff --git a/src/main/resources/templates/merge-pdfs.html b/src/main/resources/templates/merge-pdfs.html deleted file mode 100644 index 05982d26..00000000 --- a/src/main/resources/templates/merge-pdfs.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - -
-
-
-

-
-
-
-

-
-
- -
- -
-
-
    -
    -
    - - - -
    -
    - - -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/add-image.html b/src/main/resources/templates/misc/add-image.html deleted file mode 100644 index c26cbd48..00000000 --- a/src/main/resources/templates/misc/add-image.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - - -
    - - -
    -
    -
    - -
    -
    - - -
    - - -
    - - - -
    - -
    - - -
    - -
    - -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/add-page-numbers.html b/src/main/resources/templates/misc/add-page-numbers.html deleted file mode 100644 index 1ede15f8..00000000 --- a/src/main/resources/templates/misc/add-page-numbers.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    -
    - -
    - - - -
    - -
    -
    1
    -
    2
    -
    3
    -
    4
    -
    5
    -
    6
    -
    7
    -
    8
    -
    9
    -
    -
    - - -
    - -
    -
    - -
    -
    - -
    - -
    - -
    -
    -
    - - -
    -
    -
    - - diff --git a/src/main/resources/templates/misc/adjust-contrast.html b/src/main/resources/templates/misc/adjust-contrast.html deleted file mode 100644 index 90c31df3..00000000 --- a/src/main/resources/templates/misc/adjust-contrast.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -
    -
    - -
    -
    -

    -
    -
    -
    -
    - - -
    -
    - - - - - -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/misc/auto-crop.html b/src/main/resources/templates/misc/auto-crop.html deleted file mode 100644 index d3a8970f..00000000 --- a/src/main/resources/templates/misc/auto-crop.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - -
    -

    -
    -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/auto-rename.html b/src/main/resources/templates/misc/auto-rename.html deleted file mode 100644 index 137c4290..00000000 --- a/src/main/resources/templates/misc/auto-rename.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    - - diff --git a/src/main/resources/templates/misc/change-metadata.html b/src/main/resources/templates/misc/change-metadata.html deleted file mode 100644 index 68e4fa1c..00000000 --- a/src/main/resources/templates/misc/change-metadata.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -

    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - -
    -
    - - -
    - -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/misc/compare.html b/src/main/resources/templates/misc/compare.html deleted file mode 100644 index aeb83aee..00000000 --- a/src/main/resources/templates/misc/compare.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - - - -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - - -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/src/main/resources/templates/misc/compress-pdf.html b/src/main/resources/templates/misc/compress-pdf.html deleted file mode 100644 index ab8e3964..00000000 --- a/src/main/resources/templates/misc/compress-pdf.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    -
    -

    - - -
    -
    - -
    -
    -

    - - -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/extract-image-scans.html b/src/main/resources/templates/misc/extract-image-scans.html deleted file mode 100644 index 42a0544b..00000000 --- a/src/main/resources/templates/misc/extract-image-scans.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    - - - -
    -
    - - - -
    -
    - - - -
    -
    - - - -
    -
    - - - -
    - -
    - -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/extract-images.html b/src/main/resources/templates/misc/extract-images.html deleted file mode 100644 index f3f1d4a5..00000000 --- a/src/main/resources/templates/misc/extract-images.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    - - -
    - -
    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/flatten.html b/src/main/resources/templates/misc/flatten.html deleted file mode 100644 index 2dd32463..00000000 --- a/src/main/resources/templates/misc/flatten.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    -
    - - - - -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/ocr-pdf.html b/src/main/resources/templates/misc/ocr-pdf.html deleted file mode 100644 index 8b9dc454..00000000 --- a/src/main/resources/templates/misc/ocr-pdf.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    -
    -
    - - -
    -
    - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - - -
    - - -
    -
    - -
    -

    -

    - https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/remove-blanks.html b/src/main/resources/templates/misc/remove-blanks.html deleted file mode 100644 index a4d017ec..00000000 --- a/src/main/resources/templates/misc/remove-blanks.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    - - - -
    -
    - - - -
    - -
    -
    -
    -
    -
    -
    -
    - - - diff --git a/src/main/resources/templates/misc/repair.html b/src/main/resources/templates/misc/repair.html deleted file mode 100644 index c8ecef40..00000000 --- a/src/main/resources/templates/misc/repair.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/misc/show-javascript.html b/src/main/resources/templates/misc/show-javascript.html deleted file mode 100644 index eab3e99b..00000000 --- a/src/main/resources/templates/misc/show-javascript.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - - -
    -
    - -
    - -
    - - - -
    - - -
    -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/multi-page-layout.html b/src/main/resources/templates/multi-page-layout.html deleted file mode 100644 index 35cfd50f..00000000 --- a/src/main/resources/templates/multi-page-layout.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - - -
    -
    - - -
    - -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html deleted file mode 100644 index 167d6849..00000000 --- a/src/main/resources/templates/multi-tool.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - -
    -
    -
    -
    -

    -
    -
    -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - -
    -
    -
    - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - diff --git a/src/main/resources/templates/pdf-organizer.html b/src/main/resources/templates/pdf-organizer.html deleted file mode 100644 index 67b9ba94..00000000 --- a/src/main/resources/templates/pdf-organizer.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    - - -
    -
    - - -
    - - -
    - -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/pdf-to-single-page.html b/src/main/resources/templates/pdf-to-single-page.html deleted file mode 100644 index e95a5d43..00000000 --- a/src/main/resources/templates/pdf-to-single-page.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/pipeline.html b/src/main/resources/templates/pipeline.html deleted file mode 100644 index fa26ff29..00000000 --- a/src/main/resources/templates/pipeline.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - -
    -
    -
    - -

    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - - - - - - - -
    -
    -
    - -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/remove-pages.html b/src/main/resources/templates/remove-pages.html deleted file mode 100644 index 63c171dd..00000000 --- a/src/main/resources/templates/remove-pages.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    - - -
    - -
    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/rotate-pdf.html b/src/main/resources/templates/rotate-pdf.html deleted file mode 100644 index edf93d70..00000000 --- a/src/main/resources/templates/rotate-pdf.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - - - -
    - -
    -
    -
    -
    -
    -
    - - - - - - \ No newline at end of file diff --git a/src/main/resources/templates/scale-pages.html b/src/main/resources/templates/scale-pages.html deleted file mode 100644 index 1b59e38f..00000000 --- a/src/main/resources/templates/scale-pages.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - - -
    -
    - - -
    - -
    -
    -
    -
    -
    -
    -
    - - - \ No newline at end of file diff --git a/src/main/resources/templates/security/add-password.html b/src/main/resources/templates/security/add-password.html deleted file mode 100644 index 093f226c..00000000 --- a/src/main/resources/templates/security/add-password.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    - -
    - -
    -
    - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/add-watermark.html b/src/main/resources/templates/security/add-watermark.html deleted file mode 100644 index 1943b365..00000000 --- a/src/main/resources/templates/security/add-watermark.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - -
    - -
    -
    - -
    - - -
    -
    - - -
    -
    - - -
    - - - -
    - - -
    -
    - - - -
    - - - - -
    - - -
    -
    - - -
    -
    - - -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/auto-redact.html b/src/main/resources/templates/security/auto-redact.html deleted file mode 100644 index ec355781..00000000 --- a/src/main/resources/templates/security/auto-redact.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    - -
    - -
    - - -
    - -
    - - -
    - - - - - - - - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - - -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/cert-sign.html b/src/main/resources/templates/security/cert-sign.html deleted file mode 100644 index 87957667..00000000 --- a/src/main/resources/templates/security/cert-sign.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - -
    -
    -
    - -
    - - - - - -
    - -
    - -
    - -
    - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/change-permissions.html b/src/main/resources/templates/security/change-permissions.html deleted file mode 100644 index f40ee7b2..00000000 --- a/src/main/resources/templates/security/change-permissions.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -

    -
    -
    - -
    -
    -
    - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/get-info-on-pdf.html b/src/main/resources/templates/security/get-info-on-pdf.html deleted file mode 100644 index f2de0919..00000000 --- a/src/main/resources/templates/security/get-info-on-pdf.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - -
    -
    -
    -

    -
    -
    -
    -

    -
    -
    -
    - - -
    -
    - -
    - -
    - - - -
    - -
    -
    -
    - -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/security/remove-password.html b/src/main/resources/templates/security/remove-password.html deleted file mode 100644 index af8675d1..00000000 --- a/src/main/resources/templates/security/remove-password.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - -
    -
    -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/remove-watermark.html b/src/main/resources/templates/security/remove-watermark.html deleted file mode 100644 index 8f818998..00000000 --- a/src/main/resources/templates/security/remove-watermark.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    - -
    -
    -
    - - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/security/sanitize-pdf.html b/src/main/resources/templates/security/sanitize-pdf.html deleted file mode 100644 index bac18a2e..00000000 --- a/src/main/resources/templates/security/sanitize-pdf.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - -
    -
    -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    -
    - - diff --git a/src/main/resources/templates/sign.html b/src/main/resources/templates/sign.html deleted file mode 100644 index a58298d1..00000000 --- a/src/main/resources/templates/sign.html +++ /dev/null @@ -1,333 +0,0 @@ - - - - - - - - - - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    - - -
    - - -
    -
    -
    - -
    -
    - -
    - - - - -
    -
    - - - - -
    - -
    - - - - - - - - - -
    -
    - - -
    - - -
    - - - -
    - -
    - - -
    - -
    - - -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/src/main/resources/templates/split-pdfs.html b/src/main/resources/templates/split-pdfs.html deleted file mode 100644 index 5ba3a57a..00000000 --- a/src/main/resources/templates/split-pdfs.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - -
    -
    -
    -

    -
    -
    -
    -

    -

    -

    -

    -

    -

    -

    -

    -

    - -
    -
    - -
    - - -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file